diff --git a/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c b/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c index 1c74a88..9f3a6bd 100755 --- a/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c +++ b/amp/src/ddl/vcodec/comp_vdec/source/ddl_vdec.c @@ -233,6 +233,7 @@ typedef struct { // for dump FILE *fpYUV; FILE *fpES; + FILE *fpES2; // for checking allocate memory size UINT32 uiPrevYuvWidth; UINT32 uiPrevYuvHeight; @@ -298,7 +299,7 @@ static const UINT32 uiBlockSize = 64; static HRESULT putGuardBlock(COMPONENT hInstance, AMP_BD_HANDLE hBD, INT32 x, INT32 y); static HRESULT dumpYUV(COMPONENT hInstance, AMP_BD_HANDLE hBD); -static HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD); +static HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD, BOOL input); static UINT32 g_bIsGuardEntering = 0; static UINT32 g_bIsGuardLeaving = 0; @@ -687,6 +688,12 @@ static HRESULT DDL_VDEC_doDestroy(COMPONENT hInstance) fclose(pHld->fpES); pHld->fpES = NULL; } + if (pHld->fpES2) { + VDEC_LOGI("dump es done before return\n"); + fclose(pHld->fpES2); + pHld->fpES2 = NULL; + } + if (pHld->fpYUV) { VDEC_LOGI("dump yuv done\n"); fclose(pHld->fpYUV); @@ -883,7 +890,9 @@ HRESULT DDL_VDEC_Open(COMPONENT hInstance, pPort->stInfo.pMediaCap[0] = 0xf000000; pHld->uMode = config->mode; - pHld->uCBufSize = config->uiSHMSize; + if ((config->uiFlag & AMP_VDEC_MODE_FRAME_IN) == 0) { + pHld->uCBufSize = config->uiSHMSize; + } pHld->hLastBD = NULL; pHld->hVdec = NULL; @@ -1523,11 +1532,15 @@ static HRESULT handleSetupPort(COMPONENT hInstance, AMP_PORT_IO ePortIo, PORT *pPeerPort = &hPeerInstance->pPort[AMP_PORT_OUTPUT][pPort->stConn.uiPeerPortIdx]; pHld->uCBufSize = pPeerPort->stInfo.uiBufSize; DDL_COMPONENT_UnlockConnection(hInstance, AMP_PORT_INPUT, uiPortIdx); - VDEC_LOGH("NOTE: DMX SetupPort, uCBufSize=0x%x\n", pHld->uCBufSize); + if(!VDec_IsFrameInMode(pHld->hVdec)) { + VDEC_LOGH("NOTE: DMX SetupPort, uCBufSize=0x%x\n", pHld->uCBufSize); - result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0, - pHld->uWrapBufAddr, pHld->uWrapBufAddrVir); - DDLAssertReturn(result); + result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0, + pHld->uWrapBufAddr, pHld->uWrapBufAddrVir); + DDLAssertReturn(result); + } else { + VDEC_LOGH("NOTE: not set CBUF pool size under frame in mode, uCBufSize=0x%x\n", pHld->uCBufSize); + } } else { VDEC_LOGH("NOTE: OMX or others SetupPort, uCBufSize = 0x%x\n", pHld->uCBufSize); result = Vdec_ConfigCBlock(pHld->hVdec, pHld->uCBufSize, 0, 0, @@ -2404,6 +2417,7 @@ HRESULT DDL_Callback(UINT32 uiEvent, UINT32 uiParam1, UINT32 uiParam2, DDLAssertReturn(DescPoolSetFlagByAddr(pHld->hStrmDescPool, pVmetaDescTag->uDesc, VMETA_DESC_SLOT_FREE)); + dumpES(hInstance, hBD, FALSE); DDLAssertReturn(AMP_BDTAG_DelTail(hBD)); hRet = BDTagGetVMetaDesc(hBD, &pVmetaDescTag); if (hRet == SUCCESS) { @@ -2412,8 +2426,9 @@ HRESULT DDL_Callback(UINT32 uiEvent, UINT32 uiParam1, UINT32 uiParam2, } UINT32 uNum = 0; DDLAssertReturn(DescPoolGetBusyNumber(pHld->hStrmDescPool, &uNum)); - VDEC_LOGM(COMPVDEC"Return Stream BD=%p bdid=%d left (%d)\n", - hBD, AMP_BD_GET_BDID(hBD), uNum); + VDEC_LOGH(COMPVDEC"Return Stream BD=%p bdid=%d size:%d, left (%d)\n", + hBD, AMP_BD_GET_BDID(hBD), pTag->uSize, uNum); + DDLAssertCheck(AMP_SHM_Unref(pTag->uMemHandle)); DDLAssertReturn(releaseStrmBuf(hInstance, hBD)); } @@ -2695,7 +2710,7 @@ HRESULT VDEC_ACTION_PushBuf(VDEC_HLD *pHld, AMP_BD_HANDLE hBD) { 0, 0, FALSE)); } #endif - VDEC_LOGM(COMPVDEC"Push stream %p (%x)\n", hBD, AMP_BD_GET_BDID(hBD)); + VDEC_LOGH(COMPVDEC"Push stream %p (%x), size:%d\n", hBD, AMP_BD_GET_BDID(hBD), pDesc->size); if ((pTag->uFlag & AMP_MEMINFO_FLAG_FLUSH_MASK) != 0) { DDLAssertCleanup(fillFlushBDBuffer(hInstance, pTag->uFlag)); @@ -2718,7 +2733,7 @@ HRESULT VDEC_ACTION_PushBuf(VDEC_HLD *pHld, AMP_BD_HANDLE hBD) { } BDResetUnitStart(pHld->hVdec, hBD); - dumpES(hInstance, hBD); + dumpES(hInstance, hBD, TRUE); DDLAssertCleanup(Vdec_EmptyThisBuffer(pHld->hVdec, hBD)); return hRet; @@ -3183,7 +3198,7 @@ Exit: return SUCCESS; } -HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD) +HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD, BOOL input) { #ifndef ENABLE_VDEC_DUMP_ES MV_UNUSED(hInstance); @@ -3192,6 +3207,7 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD) VDEC_HLD *pHld = hInstance->pHld; VDecoder *pVDec; FILE **fpp = &(pHld->fpES); + FILE **fpp2 = &(pHld->fpES2); HRESULT ret = SUCCESS; VOID *pVirtAddr = NULL; VOID *pPhyAddr = NULL; @@ -3209,6 +3225,12 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD) fclose(*fpp); *fpp = NULL; } + if (*fpp2 != NULL) { + VDEC_LOGH("dump es done\n"); + fclose(*fpp2); + *fpp2 = NULL; + } + return SUCCESS; } @@ -3252,6 +3274,37 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD) } } + if (*fpp2 == NULL) { + char filename[FILENAME_LEN] = {0}; + char *dirname; + if (g_pDumpDirName[0] == '\0') { + dirname = checkDumpDir(); + if (dirname == NULL) { + return VDEC_IOFAIL; + } + } else { + dirname = g_pDumpDirName; + } + char *timebuf = getFTime(); + if (timebuf == NULL) { + return HRESULT_GEN(VDEC, ERR_NOSWRSC); + } + ret = snprintf(filename, FILENAME_LEN, "%s/vdec_%s_%p_%s_bak.es", + dirname, showFmtId(pVDec->strmCfg.format), pVDec, timebuf); + free(timebuf); + if (ret > FILENAME_LEN) { + VDEC_LOGE("filename %s greater than %d\n", filename, FILENAME_LEN); + return HRESULT_GEN(VDEC, ERR_NOSWRSC); + } + VDEC_LOGH("vdec %p dump es to file %s\n", pHld, filename); + *fpp2 = fopen(filename, "w"); + if (*fpp2 == NULL) { + VDEC_LOGE("open file fail %d %s\n", errno, strerror(errno)); + return VDEC_IOFAIL; + } + } + + if (ShmType & AMP_SHM_FLAG_SECURE) { #ifdef TZ_DUMP if (register_debugTA() == SUCCESS) { @@ -3289,8 +3342,14 @@ HRESULT dumpES(COMPONENT hInstance, AMP_BD_HANDLE hBD) } BD_SwConsume(hBD, pVDec->pTeeCtx); - fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp); - fflush(*fpp); + + if (input) { + fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp); + fflush(*fpp); + } else { + fwrite((UINT8 *)pVirtAddr, 1, pStrmBufDesc->size, *fpp2); + fflush(*fpp2); + } #endif return SUCCESS; diff --git a/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c b/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c index 2351249..cf71064 100755 --- a/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c +++ b/amp/src/ddl/vcodec/comp_vdec/source/internal_vdec_api.c @@ -3178,7 +3178,7 @@ static HRESULT consume_user_data_sei(VDecoder *pVDec, USER_DATA_BLOCK_HEADER *pH pVDec->sHdrInfo.MaxFALL = readU16(p + 2); return SUCCESS; default: - VDEC_LOGH("%p: ignore user_data SEI type=%x", pVDec, pHeader->m_type); + VDEC_LOGL("%p: ignore user_data SEI type=%x", pVDec, pHeader->m_type); return ERR_UNHANDLED; } } @@ -4454,6 +4454,7 @@ static HRESULT return_str_buf(VDecoder *pVDec) { pVDec->uNoDecStrmSize -= pStrmBufDescInChecking->size; if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) { + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBDInChecking); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32)hBDInChecking, 0, pVDec->uiCBData)) } @@ -4541,6 +4542,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) { for (i = 0; i < uNum; i++) { VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pvMetaBufQueue, &hBD)) if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) { + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)) } @@ -4550,6 +4552,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) { for (i = 0; i < uNum; i++) { VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pStrmBufQueue, &hBD)) if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) { + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)) } @@ -4571,6 +4574,7 @@ static HRESULT internal_stop_stream(VDecoder *pVDec) { case CMD_IBUFNOTIFY: if (pVDec->uiDecodeMode != AMP_VDEC_IOPARAM_DECODE_REVERSE) { unpackMsgIBuf(msg, &hBD, NULL); + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32)hBD, 0, pVDec->uiCBData)) } @@ -5906,7 +5910,6 @@ HRESULT decode_video(VDecoder *pVDec) { VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir; MV_UNUSED(pCblk); - VDECPRT("tony trace inside decode_stream_main_loop - 2-1. enter decode_video() \n", __LINE__); if (pHalDecoder->check_strm_buffer && (pVDec->bInFlush == false) && (pCblk->uFrameInMode == FRAME_IN_NO_32B_ALIGN) @@ -5927,6 +5930,7 @@ HRESULT decode_video(VDecoder *pVDec) { SETSTATE(pVDec->eState, VDEC_STATE_WAIT_INPUT_BUFFER) VDEC_LOGH("%p:"BUFSTR"Check Stream Count %d\n", pVDec, pVDec->uiPushedStrmBufCount); + updateStrmThreshFrameCheck(pVDec); return SUCCESS; } } @@ -5941,7 +5945,6 @@ HRESULT decode_video(VDecoder *pVDec) { return SUCCESS; VdecAssertReturn(hRet); - VDECPRT("tony trace inside decode_stream_main_loop - 2-2. before pHalDecoder->decode_stream() \n", __LINE__); while (1) { int dret = 0; int ud; @@ -5958,7 +5961,6 @@ HRESULT decode_video(VDecoder *pVDec) { VDEC_LOGE("%p: pHalDecode recoverable error=%d, continue to decode", pVDec, dret); } - VDECPRT("tony trace inside decode_stream_main_loop - 2-3. before waitIRQ() \n", __LINE__); if(pHalDecoder->waitIRQ){ if (pVdecStrmStatus->wait_for_int) { //VDECPRT("%p:before Int\n", pVDec); @@ -5969,7 +5971,6 @@ HRESULT decode_video(VDecoder *pVDec) { } } - VDECPRT("tony trace inside decode_stream_main_loop - 2-4. after waitIRQ() \n", __LINE__); performance_monitor(pVDec, pVdecStrmStatus, ud); #ifndef TRUSTZONE if((pVdecStrmStatus->event_id == VDEC_EVENT_SYNCWORD) && (pCblk->uiUserDataMask != 0)){ @@ -5999,7 +6000,6 @@ HRESULT decode_video(VDecoder *pVDec) { break; } - VDECPRT("tony trace inside decode_stream_main_loop - 2-5. if we reach here.... () \n", __LINE__); // if we reach here, // 1) One frame decoding finished, switch point comes // 2) VDEC_EVENT_ALLOC_STR_BUF @@ -6133,12 +6133,14 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) { if (uEndPos < pVDec->uGopStartPos) { VDECPRT("%p:"REVERSE" recycle stream buffer %p\n", pVDec, hBD); VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pRevStrmQueue, &hBD)); + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)); } else if (uEndPos - pVDec->uGopStartPos > uiThresh) { VDECPRT("%p:"REVERSE" recycle stream buffer %p\n", pVDec, hBD); VDECLOGIFERR(AMP_BDCHAIN_PopItem(pVDec->pRevStrmQueue, &hBD)); + VDEC_LOGH("pVDec:%p, return_es, hBD:%p\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)); } else { @@ -6185,7 +6187,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) { // Maybe need to come up with better solution in up layer API. // // If user want to cache, then cache in PAUSE. - VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state.\n", pVDec, hBD); + VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state, return_es\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)) } else { @@ -6245,7 +6247,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) { } if (VdecProcessBD(pVDec, hBD) == false || pBigDesc->uSize == 0) { - VDECPRT("%p:"BUFSTR"skip strm hBD=%p as no meminfo or size is 0", + VDEC_LOGH("%p:"BUFSTR"skip strm hBD=%p as no meminfo or size is 0, return_es\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32)hBD, 0, pVDec->uiCBData)); @@ -6258,7 +6260,7 @@ static void decode_stream_process_msg(VDecoder *pVDec, MV_CC_MSG_t *pMsg) { // Maybe need to come up with better solution in up layer API. // // If user want to cache, then cache in PAUSE. - VDECPRT("%p:"BUFSTR" Receive BD %p in idle state.\n", pVDec, hBD); + VDEC_LOGH("%p:"BUFSTR" Receive BD %p in idle state, return_es\n", pVDec, hBD); VDECLOGIFERR(pVDec->hCB(AMP_VDEC_EVENT_EMPTY_ES_DONE, (UINT32) hBD, 0, pVDec->uiCBData)) } else { @@ -6475,7 +6477,6 @@ INT decode_stream_main_loop(VDecoder *pVDec) { SETSTATE(pVDec->eState, VDEC_STATE_WAIT_INPUT_BUFFER); return 0; } - VDECPRT("tony trace inside decode_stream_main_loop - 1. after VDEC_STATE_WAIT_INPUT_BUFFER \n", __LINE__); if (pVDec->uiDecodedIndex > 0) { // judge the display buffer number, in case the VDEC_EVENT_ALLOC_DIS_BUF event unsigned int uNum; @@ -6485,24 +6486,20 @@ INT decode_stream_main_loop(VDecoder *pVDec) { return 0; } } - VDECPRT("tony trace inside decode_stream_main_loop - 2. after VDEC_STATE_WAIT_OUTPUT_BUFFER \n", __LINE__); if (decode_video(pVDec) != SUCCESS) break; - VDECPRT("tony trace inside decode_stream_main_loop - 3. after decode_video \n", __LINE__); msg.m_MsgID = CMD_NONE; while (MV_CC_MsgQ_TryGetMsg(pVDec->hDecodeMsgQueue, &msg) == S_OK) { AMP_ASSERT(msg.m_MsgID != (UINT32) CMD_NONE); if (msg.m_MsgID == CMD_FREEZE) { msg.m_Param2 = TRUE; VDECLOGIFERR(MV_CC_MsgQ_PostMsg(pVDec->hDecodeMsgQueue, &msg)); - VDECPRT("tony trace inside decode_stream_main_loop - 4. hDecodeMsgQueue \n", __LINE__); return 0; } decode_stream_process_msg(pVDec, &msg); if (msg.m_MsgID == CMD_TERMINATE) { VDECPRT("%p Exit Decode task\n", pVDec); - VDECPRT("tony trace inside decode_stream_main_loop : 5. CMD_TERMINATE proceeded \n", __LINE__); return -1; } msg.m_MsgID = CMD_NONE; @@ -6654,12 +6651,9 @@ VOID VDec_Decode_Task(VOID *hVDec) { VDECLOGIFERR(MV_Timer_CreateEx(&pVDec->hStatusLogTimer, pVDec->uiStatusLogPeriod * 1000, VideoStatusProcess, hVDec, "VideoStatusProcess")); VDECLOGIFERR(MV_Timer_Start(&pVDec->hStatusLogTimer)); - pid_t tid = gettid(); while (1) { msg.m_MsgID = CMD_NONE; - VDEC_LOGH("tony trace VDec comp event loop before(tid=%d) - tony_counter=%d\n", tid, ++tony_counter); MV_CC_MsgQ_GetMsg(pVDec->hDecodeMsgQueue, &msg); - VDEC_LOGH("tony trace VDec comp event loop after(msgID = %d(%s), (tid=%d)) - tony_counter=%d\n", msg.m_MsgID, msgtostr(msg.m_MsgID), tid, --tony_counter); AMP_ASSERT(msg.m_MsgID != (UINT32) CMD_NONE); if (msg.m_MsgID == CMD_FREEZE) { VDEC_LOGH("%p:receive freeze\n", pVDec); @@ -6681,13 +6675,10 @@ VOID VDec_Decode_Task(VOID *hVDec) { if (bStreamFreeze == FALSE) { decode_stream_process_msg(pVDec, &msg); - VDEC_LOGH("tony trace before decode_stream_main_loop() state = %d\n", pVDec->eState); if (decode_stream_main_loop(pVDec) < 0) { - VDEC_LOGH("tony trace ERROR in decode_stream_main_loop() state = %d\n", pVDec->eState); VDEC_LOGH("%p:Exit Decode task\n", pVDec); return; } - VDEC_LOGH("tony trace after decode_stream_main_loop() state = %d\n", pVDec->eState); } } } diff --git a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c index 2f12854..81c68b3 100755 --- a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c +++ b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.c @@ -66,6 +66,7 @@ #define THRESH_FRAME_NUM 3 #define THRESH_B_FRAME_NUM 20 #define SEQUENCE_CHECK_COUNT 4 +#define THRESH_ES_NUM 10 HRESULT initThreshFrameCheck(VDecoder *pVDec) { VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir; @@ -136,3 +137,30 @@ HRESULT updateThreshFrameCheck(VDecoder *pVDec, EVENT_CELL *pEventCell) { #endif return SUCCESS; } + +HRESULT updateStrmThreshFrameCheck(VDecoder *pVDec) { +#ifdef DYNAMIC_THRESH + VMETA_CBLOCK *pCblk = pVDec->pStrmCtrlBlock->pVir; + UINT32 uTempThreshold = 0; + UINT32 uCurTiming = 0; + + if (pVDec->uiLastFrameTime) { + uCurTiming = AMP_GetCurrentTimeMS() - pVDec->uiLastFrameTime; + } + + if (uCurTiming > 40) { + if (pVDec->uiPushedStrmBufCount > THRESH_ES_NUM) { + uTempThreshold = pVDec->uNoDecStrmSize/pVDec->uiPushedStrmBufCount; + if (uTempThreshold < pCblk->uThreshFrameCheck) { + pCblk->uThreshFrameCheck = uTempThreshold; + + VDECPRT("%p: update thresh: %d BDs (%d bytes) in HWVDEC, " + "timing=%dms, uThreshFrameCheck=%d\n", + pVDec, pVDec->uiPushedStrmBufCount, pVDec->uNoDecStrmSize, + uCurTiming, pCblk->uThreshFrameCheck); + } + } + } +#endif + return SUCCESS; +} diff --git a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h index 4221bbb..9183bc2 100644 --- a/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h +++ b/amp/src/ddl/vcodec/comp_vdec/source/vdec_misc.h @@ -51,6 +51,7 @@ HRESULT initThreshFrameCheck(VDecoder *pVDec); HRESULT updateBitRateThreshFrameCheck(VDecoder *pVDec, UINT32 bit_rate); HRESULT updateThreshFrameCheck(VDecoder *pVDec, EVENT_CELL *pEventCell); +HRESULT updateStrmThreshFrameCheck(VDecoder *pVDec); #endif