Int32 AlgLink_scdAlgProcessFrames(Utils_TskHndl *pTsk, AlgLink_ScdObj * pObj, FVID2_FrameList *pFrameList) { Int32 status = FVID2_SOK; UInt32 frameId; FVID2_Frame *pFrame; AlgLink_ScdChObj *pChObj; Bool skipFrame; if(pObj->processFrameCount==0) { AlgLink_scdAlgResetStatistics(pObj); } for(frameId=0; frameId<pFrameList->numFrames; frameId++) { pFrame = pFrameList->frames[frameId]; if(pFrame==NULL) continue; if(!AlgLink_scdAlgIsValidCh(pObj, pFrame->channelNum)) { continue; } pChObj = &pObj->chObj[pFrame->channelNum]; pChObj->inFrameRecvCount++; AlgLink_scdAlgRtPrmUpdate(pObj, pChObj, pFrame); skipFrame = Utils_doSkipFrame(&pChObj->frameSkipContext); if(skipFrame) { pChObj->inFrameSkipCount++; continue; } if(pChObj->scdMode != ALG_LINK_SCD_DETECTMODE_MONITOR_FULL_FRAME) { /* SCD is disabled for this channel */ pChObj->inFrameSkipCount++; /* reset the alg so that next it starts from initial condition */ pChObj->algReset = TRUE; continue; } if(AlgLink_scdAlgSkipInitialFrames(pObj, pChObj)) continue; AlgLink_scdAlgSubmitFrame(pObj, pChObj, pFrame); } return status; }
Int32 AlgLink_scdAlgProcessFrames(Utils_TskHndl *pTsk, AlgLink_ScdObj * pObj, FVID2_FrameList *pFrameList) { Int32 status = FVID2_SOK; UInt32 frameId; FVID2_Frame *pFrame; AlgLink_ScdChObj *pChObj; Bool skipFrame; if(pObj->processFrameCount==0) { AlgLink_scdAlgResetStatistics(pObj); } for(frameId=0; frameId<pFrameList->numFrames; frameId++) { pFrame = pFrameList->frames[frameId]; if(pFrame==NULL) continue; if(!AlgLink_scdAlgIsValidCh(pObj, pFrame->channelNum)) { continue; } pChObj = &pObj->chObj[pFrame->channelNum]; pChObj->inFrameRecvCount++; skipFrame = Utils_doSkipFrame(&pChObj->frameSkipContext); if(skipFrame) { pChObj->inFrameSkipCount++; continue; } pChObj->inFrameProcessCount++; pObj->processFrameCount++; #if 0 AlgLink_scdAlgRtPrmUpdate(pObj, pChObj, pFrame); #endif if(AlgLink_scdAlgSkipInitialFrames(pObj, pChObj)) continue; status = AlgLink_scdAlgDoTmpFrameInit(pObj, pChObj, pFrame); if(status!=FVID2_SOK) continue; AlgLink_scdAlgDoProcessFrame(pObj, pChObj, pFrame); } return status; }
Int32 AlgLink_ScdalgProcessData(AlgLink_ScdObj * pObj, FVID2_FrameList *frameList, Utils_BitBufHndl *bufOutQue) { UInt32 frameId, curTime; FVID2_Frame *pFrame; Int32 chIdx, status; Int32 frameFound; Bitstream_Buf *pOutBuf; Bitstream_BufList outBitBufList; System_FrameInfo *pInFrameInfo; outBitBufList.numBufs = 0; outBitBufList.appData = NULL; AlgLink_ScdChObj *pChObj; pObj->totalFrameCount += frameList->numFrames; status = FVID2_EFAIL; if (frameList->numFrames) { for(frameId=0; frameId< frameList->numFrames; frameId++) { Bool doFrameDrop; pFrame = frameList->frames[frameId]; //chIdx = pFrame->channelNum - pObj->createArgs.startChNoForSCD; frameFound = 0; for(chIdx = 0; chIdx < pObj->createArgs.numValidChForSCD; chIdx++) { if(pFrame->channelNum == pObj->createArgs.chDefaultParams[chIdx].chId) { frameFound = 1; break; } } if (frameFound == 0) continue; pChObj = &pObj->chObj[chIdx]; pChObj->inFrameRecvCount++; doFrameDrop = Utils_doSkipFrame(&pChObj->frameSkipCtx); if(doFrameDrop == FALSE) { pOutBuf = NULL; status = Utils_bitbufGetEmptyBuf(bufOutQue, &pOutBuf, 0, //pObj->outObj.ch2poolMap[chIdx], /*Need to change later.*/ BIOS_NO_WAIT); if(!((status == FVID2_SOK) && (pOutBuf))) { doFrameDrop = TRUE; } } if(doFrameDrop == FALSE) { pObj->chParams[chIdx].curFrame = pFrame->addr[0][0]; pInFrameInfo = (System_FrameInfo *) pFrame->appData; pOutBuf->lowerTimeStamp = (UInt32)(pInFrameInfo->ts64 & 0xFFFFFFFF); pOutBuf->upperTimeStamp = (UInt32)(pInFrameInfo->ts64 >> 32); pOutBuf->channelNum = pFrame->channelNum; pOutBuf->fillLength = sizeof(AlgLink_ScdResult); pOutBuf->frameWidth = pObj->chParams[chIdx].width; pOutBuf->frameHeight = pObj->chParams[chIdx].height; curTime = Utils_getCurTimeInMsec(); // AlgLink_ScdalgProcess(pObj, pFrame->channelNum, (AlgLink_ScdResult *) pOutBuf->addr); AlgLink_ScdalgProcess(pObj, chIdx, (AlgLink_ScdResult *) pOutBuf->addr); pObj->chParams[chIdx].chBlkConfigUpdate = FALSE; pChObj->inFrameProcessTime += (Utils_getCurTimeInMsec() - curTime); pChObj->inFrameProcessCount++; outBitBufList.bufs[outBitBufList.numBufs] = pOutBuf; outBitBufList.numBufs++; } else { pChObj->inFrameUserSkipCount++; } }
Int32 IpcOutM3Link_processFrames(IpcOutM3Link_Obj * pObj) { System_LinkInQueParams *pInQueParams; FVID2_FrameList frameList; FVID2_Frame *pFrame; SystemIpcM3_ListElem *pListElem; Int32 status; Int32 frameId; IpcOutM3Link_ChObj *pChObj; pInQueParams = &pObj->createArgs.inQueParams; System_getLinksFullFrames(pInQueParams->prevLinkId, pInQueParams->prevLinkQueId, &frameList); pObj->freeFrameList.numFrames = 0; if (frameList.numFrames) { #ifdef SYSTEM_DEBUG_IPC_RT Vps_printf(" %d: IPC_OUT_M3 : Received %d frames !!!\n", Utils_getCurTimeInMsec(), frameList.numFrames); #endif pObj->totalFrameCount += frameList.numFrames; for (frameId = 0; frameId < frameList.numFrames; frameId++) { Bool doFrameDrop; pFrame = frameList.frames[frameId]; pChObj = &pObj->chObj[pFrame->channelNum]; pChObj->inFrameRecvCount++; doFrameDrop = Utils_doSkipFrame(&(pChObj->frameSkipCtx)); /* frame skipped due to user setting */ if(doFrameDrop) { pChObj->inFrameUserSkipCount++; pObj->freeFrameList.frames[pObj->freeFrameList.numFrames] = pFrame; pObj->freeFrameList.numFrames++; UTILS_assert(pObj->freeFrameList.numFrames <= FVID2_MAX_FVID_FRAME_PTR); continue;; } status = Utils_queGet(&pObj->listElemQue, (Ptr *) & pListElem, 1, BIOS_NO_WAIT); if (status != FVID2_SOK) { /* normally this condition should not happen, if it happens * return the frame back to its generator */ #if 0 Vps_printf(" IPC_OUT: Dropping frame\n"); #endif pObj->freeFrameList.frames[pObj->freeFrameList.numFrames] = pFrame; pObj->freeFrameList.numFrames++; UTILS_assert(pObj->freeFrameList.numFrames <= FVID2_MAX_FVID_FRAME_PTR); pChObj->inFrameUserSkipCount++; continue; } pListElem->pFrame = pFrame; /* no need to do cache ops since this is inter-M3 list */ status = ListMP_putTail(pObj->listMPOutHndl, &pListElem->listElem); UTILS_assert(status == ListMP_S_SUCCESS); pChObj->inFrameProcessCount++; } if (pObj->freeFrameList.numFrames) { System_putLinksEmptyFrames(pInQueParams->prevLinkId, pInQueParams->prevLinkQueId, &pObj->freeFrameList); } if (pObj->createArgs.notifyNextLink) { UTILS_assert(pObj->createArgs.numOutQue == 1); System_ipcSendNotify(pObj->createArgs.outQueParams[0].nextLink); } if (TRUE == pObj->createArgs.noNotifyMode) { if (FALSE == pObj->prd.clkStarted) { IpcOutM3Link_startPrdObj(pObj, IPC_M3OUT_LINK_DONE_PERIOD_MS, FALSE); } } } return FVID2_SOK; }