Int32 AlgLink_scdAlgRtPrmUpdate(AlgLink_ScdObj * pObj, AlgLink_ScdChObj *pChObj, FVID2_Frame *pFrame) { System_FrameInfo *pFrameInfo; System_LinkChInfo *pChInfo; UInt32 oldIntState; pFrameInfo = (System_FrameInfo *)pFrame->appData; if(pFrameInfo==NULL) return FVID2_EFAIL; if(pFrameInfo->rtChInfoUpdate==FALSE) return FVID2_SOK; pChInfo = &pFrameInfo->rtChInfo; oldIntState = Hwi_disable(); if(pChInfo->width != pChObj->width || pChInfo->height != pChObj->height ) { pChObj->rtPrmUpdate = TRUE; pChObj->algReset = TRUE; } pChObj->width = SystemUtils_floor(pChInfo->width, ALG_LINK_SIMCOP_SCD_WIDTH_ALIGN); pChObj->height = pChInfo->height; if(pChObj->width>pObj->algCreatePrm.maxWidth) pChObj->width = pObj->algCreatePrm.maxWidth; if(pChObj->height>pObj->algCreatePrm.maxHeight) pChObj->height = pObj->algCreatePrm.maxHeight; Hwi_restore(oldIntState); return FVID2_SOK; }
Int32 AlgLink_scdAlgChCreate(AlgLink_ScdObj * pObj) { AlgLink_ScdChObj *pChObj; AlgLink_ScdCreateParams *pCreateArgs; AlgLink_ScdChParams *pChPrm; System_LinkChInfo *pChInfo; UInt32 blockId, chId, i; pCreateArgs = &pObj->scdCreateParams; for(chId=0; chId<ALG_LINK_SIMCOP_SCD_MAX_CH; chId++) { pChObj = &pObj->chObj[chId]; memset(pChObj, 0, sizeof(*pChObj)); pChObj->enableScd = FALSE; pChObj->scdMode = ALG_LINK_SCD_DETECTMODE_DISABLE; } for(i=0; i<pCreateArgs->numValidChForSCD; i++) { pChPrm = &pCreateArgs->chDefaultParams[i]; chId = pChPrm->chId; pChObj = &pObj->chObj[chId]; pChInfo = &pObj->inQueInfo->chInfo[chId]; pChObj->enableScd = TRUE; pChObj->scdMode = ALG_LINK_SCD_DETECTMODE_MONITOR_FULL_FRAME; pChObj->algReset = TRUE; pChObj->skipInitialFrames = TRUE; pChObj->startTime = 0; pChObj->width = SystemUtils_floor(pChInfo->width, ALG_LINK_SIMCOP_SCD_WIDTH_ALIGN); pChObj->height = pChInfo->height; pChObj->rtPrmUpdate = FALSE; if(pChObj->width>pObj->algCreatePrm.maxWidth) pChObj->width = pObj->algCreatePrm.maxWidth; if(pChObj->height>pObj->algCreatePrm.maxHeight) pChObj->height = pObj->algCreatePrm.maxHeight; pChObj->frameSkipContext.inputFrameRate = pCreateArgs->inputFrameRate; pChObj->frameSkipContext.outputFrameRate = pCreateArgs->outputFrameRate; pChObj->frameSkipContext.firstTime = TRUE; pChObj->chId = pChPrm->chId; pChObj->scdStatus = ALG_LINK_SCD_DETECTOR_UNAVAILABLE; pChObj->prevScdStatus = ALG_LINK_SCD_DETECTOR_UNAVAILABLE; pChObj->algProcessPrm.chanId = chId; pChObj->algProcessPrm.width = pChObj->width; pChObj->algProcessPrm.height = pChObj->height; pChObj->algProcessPrm.pitch = SystemUtils_align(pChInfo->width, ALG_LINK_SIMCOP_SCD_WIDTH_ALIGN); pChObj->algProcessPrm.mode = SCD_DETECTMODE_MONITOR_FULL_FRAME; pChObj->algProcessPrm.frmSensitivity = (SCD_Sensitivity)pChPrm->frmSensitivity; pChObj->algProcessPrm.frmIgnoreLightsON = pChPrm->frmIgnoreLightsON; pChObj->algProcessPrm.frmIgnoreLightsOFF = pChPrm->frmIgnoreLightsOFF; pChObj->algProcessPrm.fps = SCD_FPS_05; pChObj->algProcessPrm.pAlgImageBuf = &pChObj->algTmpImageBufs; pChObj->algProcessPrm.inAddr = NULL; pChObj->algProcessPrm.prevInAddr = NULL; pChObj->algProcessPrm.numSecs2WaitAfterFrmAlert = pCreateArgs->numSecs2WaitAfterFrmAlert; pChObj->algInitMeanVarMHIPrm.chanId = chId; pChObj->algInitMeanVarMHIPrm.width = pChObj->algProcessPrm.width; pChObj->algInitMeanVarMHIPrm.height = pChObj->algProcessPrm.height; pChObj->algInitMeanVarMHIPrm.pitch = pChObj->algProcessPrm.pitch; pChObj->algInitMeanVarMHIPrm.pAlgImageBuf = &pChObj->algTmpImageBufs; pChObj->algInitMeanVarMHIPrm.inAddr = NULL; for(blockId=0; blockId<pObj->algPerChMemAllocPrm.numMemBlocks; blockId++) { #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf(" %d: SCD: CH%d: MEM REQUEST %d: of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), chId, blockId, pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); #endif pChObj->memBlockAddr[blockId] = Utils_memAlloc( pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); UTILS_assert(pChObj->memBlockAddr[blockId]!=NULL); #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf(" %d: SCD: CH%d: MEM ALLOC %d: @ 0x%08x of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), chId, blockId, pChObj->memBlockAddr[blockId], pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); #endif } pChObj->algTmpImageBufs.pBkgrdMeanSQ8_7 = pChObj->memBlockAddr[0]; pChObj->algTmpImageBufs.pBkgrdVarianceSQ12_3= pChObj->memBlockAddr[1]; pChObj->algTmpImageBufs.pMHIimageUQ8_0 = pChObj->memBlockAddr[2]; { FVID2_Frame *pFrame; UInt32 frameId; Int32 status; pChObj->pPrevProcessFrame = NULL; status = Utils_queCreate(&pChObj->freeQ, ALG_LINK_MAX_PROCESS_FRAMES, pChObj->freeQMem, UTILS_QUE_FLAG_NO_BLOCK_QUE ); UTILS_assert(status==FVID2_SOK); pChObj->processFrameSize = pChObj->algProcessPrm.pitch*pChObj->algProcessPrm.height; /* alloc channel process buffer memory */ for(frameId=0; frameId<ALG_LINK_MAX_PROCESS_FRAMES; frameId++) { pFrame = &pChObj->processFrames[frameId]; pFrame->addr[0][0] = Utils_memAlloc( pChObj->processFrameSize, VPS_BUFFER_ALIGNMENT ); UTILS_assert(pFrame->addr[0][0]!=NULL); status = Utils_quePut(&pChObj->freeQ, pFrame, BIOS_NO_WAIT); UTILS_assert(status==FVID2_SOK); } } } return FVID2_SOK; }
Int32 AlgLink_scdAlgChCreate(AlgLink_ScdObj * pObj) { AlgLink_ScdChObj *pChObj; AlgLink_ScdCreateParams *pCreateArgs; AlgLink_ScdChParams *pChPrm; System_LinkChInfo *pChInfo; UInt32 blockId, chId, i; pCreateArgs = &pObj->scdCreateParams; for(chId=0; chId<ALG_LINK_SIMCOP_SCD_MAX_CH; chId++) { pChObj = &pObj->chObj[chId]; memset(pChObj, 0, sizeof(*pChObj)); pChObj->enableScd = FALSE; } for(i=0; i<pCreateArgs->numValidChForSCD; i++) { pChPrm = &pCreateArgs->chDefaultParams[i]; chId = pChPrm->chId; pChObj = &pObj->chObj[chId]; pChInfo = &pObj->inQueInfo->chInfo[chId]; pChObj->enableScd = TRUE; pChObj->skipInitialFrames = TRUE; pChObj->startTime = 0; pChObj->isTiledMode = FALSE; if(pChInfo->memType==SYSTEM_MT_TILEDMEM) pChObj->isTiledMode = TRUE; pChObj->frameSkipContext.inputFrameRate = pCreateArgs->inputFrameRate; pChObj->frameSkipContext.outputFrameRate = pCreateArgs->outputFrameRate; pChObj->frameSkipContext.firstTime = TRUE; pChObj->chId = pChPrm->chId; pChObj->scdStatus = ALG_LINK_SCD_DETECTOR_UNAVAILABLE; pChObj->prevScdStatus = ALG_LINK_SCD_DETECTOR_UNAVAILABLE; pChObj->algProcessPrm.chanId = chId; /* need 32 pixel alignment for SCD */ pChObj->algProcessPrm.width = SystemUtils_floor(pChInfo->width, 16); pChObj->algProcessPrm.height = pChInfo->height; pChObj->algProcessPrm.pitch = pChInfo->pitch[0]; pChObj->algProcessPrm.mode = SCD_DETECTMODE_MONITOR_FULL_FRAME; pChObj->algProcessPrm.frmSensitivity = (SCD_Sensitivity)pChPrm->frmSensitivity; pChObj->algProcessPrm.frmIgnoreLightsON = pChPrm->frmIgnoreLightsON; pChObj->algProcessPrm.frmIgnoreLightsOFF = pChPrm->frmIgnoreLightsOFF; pChObj->algProcessPrm.fps = SCD_FPS_05; pChObj->algProcessPrm.pAlgImageBuf = &pChObj->algTmpImageBufs; pChObj->algProcessPrm.inAddr = NULL; pChObj->algProcessPrm.prevInAddr = NULL; pChObj->algProcessPrm.numSecs2WaitAfterFrmAlert = pCreateArgs->numSecs2WaitAfterFrmAlert; pChObj->algInitMeanVarMHIPrm.chanId = chId; pChObj->algInitMeanVarMHIPrm.width = pChInfo->width; pChObj->algInitMeanVarMHIPrm.height = pChInfo->height; pChObj->algInitMeanVarMHIPrm.pitch = pChInfo->pitch[0]; pChObj->algInitMeanVarMHIPrm.pAlgImageBuf = &pChObj->algTmpImageBufs; pChObj->algInitMeanVarMHIPrm.inAddr = NULL; for(blockId=0; blockId<pObj->algPerChMemAllocPrm.numMemBlocks; blockId++) { Vps_printf(" %d: SCD: CH%d: MEM REQUEST %d: of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), chId, blockId, pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); pChObj->memBlockAddr[blockId] = Utils_memAlloc( pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); UTILS_assert(pChObj->memBlockAddr[blockId]!=NULL); Vps_printf(" %d: SCD: CH%d: MEM ALLOC %d: @ 0x%08x of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), chId, blockId, pChObj->memBlockAddr[blockId], pObj->algPerChMemAllocPrm.memBlockSize[blockId], pObj->algPerChMemAllocPrm.memBlockAlign[blockId] ); } pChObj->algTmpImageBufs.pBkgrdMeanSQ8_7 = pChObj->memBlockAddr[0]; pChObj->algTmpImageBufs.pBkgrdVarianceSQ12_3= pChObj->memBlockAddr[1]; pChObj->algTmpImageBufs.pMHIimageUQ8_0 = pChObj->memBlockAddr[2]; pChObj->algTmpImageBufs.pUpdateMaskMHIUQ8_0 = pChObj->memBlockAddr[3]; } return FVID2_SOK; }