海康播放器sdk開發中的PlayM4_SetDecCallBack函數的調用

該函數如下:

BOOL   PlayM4_SetDecCallBack(LONG nPort,void (CALLBACK* DecCBFun)(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo,  long nReserved1,long nReserved2))

之前一直爲怎麼定義一個調用它煩惱,主要是不知道這個callback函數該怎麼定義,後來在demon中看到了例子(如下),終於瞭解了。但是接下來問題又來了,編譯總是提示

error C2601:local function definitions are illegal

確實很頭痛啊,網上找都是說什麼少了個“{"或者是"}“,怎麼看怎麼沒少,後來才知道,這個callback函數要放在main函數外面,海康你太坑人了,也不提醒下啊。糾結幾天啊。

關於回調函數,請注意以下幾點:

1、回調函數必須有關鍵詞 CALLBACK;
2、回調函數本身必須是全局函數或者靜態函數,不可定義爲某個特定的類的成員函數

2 回調函數並不由開發者直接調用執行(只是使用系統接口API函數作爲起點)
3 回調函數通常作爲參數傳遞給系統API,由該API來調用
4 回調函數可能被系統API調用一次,也可能被循環調用多次



// Function: The dec call back funtion.
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,
   FRAME_INFO * pFrameInfo, 
   long nReserved1,long /*nReserved2*/)
{
// OutputDebugString("解碼回調");
// DWORD dwTime = PlayM4_GetSpecialData(nPort);
//// TRACE("nPort=%d, TYPE=%d; Width=%d; Height=%d\n", nPort, pFrameInfo->nType, pFrameInfo->nWidth, pFrameInfo->nHeight);
// TRACE("wptest==============Time: Year is %d, Month is %d, Day is %d, Hour is %d, %d, %d", GET_YEAR(dwTime),
// GET_MONTH(dwTime), GET_DAY(dwTime), GET_HOUR(dwTime), GET_MINUTE(dwTime), GET_SECOND(dwTime));
/*
CPlayerDlg* pDlg = (CPlayerDlg *)nReserved1;


if ( pFrameInfo->nType == T_YV12 ) 
{   
if(g_classAVI.IsWriteAVIHdr())
{
g_classAVI.SetFPS(pFrameInfo->nFrameRate);
g_classAVI.WriteHeaders();
}


// ntsc qcif
if(pFrameInfo->nHeight == 128)
{
if(pDlg->m_pQcifTempBuf == NULL)
{
pDlg->m_pQcifTempBuf = new BYTE[nSize];
}

int nPos = 0;
// Y 分量
for(int i = 0; i < 4; i++)
{
CopyMemory(pDlg->m_pQcifTempBuf + i * pFrameInfo->nWidth, pBuf, pFrameInfo->nWidth);
}


CopyMemory(pDlg->m_pQcifTempBuf + 4 * pFrameInfo->nWidth, pBuf, pFrameInfo->nWidth * 120);
for(i = 0; i < 4; i++)
{
CopyMemory(pDlg->m_pQcifTempBuf + (124 + i) * pFrameInfo->nWidth, pBuf + pFrameInfo->nWidth * 119, pFrameInfo->nWidth);
}


nPos += nSize*2/3;

int w = pFrameInfo->nWidth/2; 
// U/V分量
for(int j = 0; j < 2; j++)
{
for(i = 0; i < 2; i++)
{
CopyMemory(pDlg->m_pQcifTempBuf + i * w + nPos,  pBuf + nPos, w);
}
CopyMemory(pDlg->m_pQcifTempBuf + w * 2 + nPos, pBuf + nPos, w * 60);
for(i = 0; i < 2; i++)
{
CopyMemory(pDlg->m_pQcifTempBuf + w * (62 + i) + nPos, pBuf + w * 59 + nPos, w);
}
nPos += nSize*1/6;
}


g_classAVI.AddFileToAVI((char*)pDlg->m_pQcifTempBuf, nSize);
}
else
{
g_classAVI.AddFileToAVI(pBuf, nSize);
}


if(g_classAVI.IsExceedMaxFileLen())
{
SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_FILE_END,m_lPort,0);    
}
}
*/
// Sleep(1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章