Int32 System_allocBlankFrame() { UInt32 memSize; memSize = SYSTEM_BLANK_FRAME_WIDTH*SYSTEM_BLANK_FRAME_HEIGHT*SYSTEM_BLANK_FRAME_BYTES_PER_PIXEL; gSystem_objVpss.nonTiledBlankFrameAddr = Utils_memAlloc(memSize, VPS_BUFFER_ALIGNMENT*2); UTILS_assert(gSystem_objVpss.nonTiledBlankFrameAddr!=NULL); return 0; }
Int32 AlgLink_scdAlgAllocMem(AlgLink_ScdObj * pObj) { UInt32 blockId; Int32 status; status = SCD_getAllocInfo(&pObj->algObj, &pObj->algMemAllocPrm, &pObj->algPerChMemAllocPrm); UTILS_assert(status==FVID2_SOK); for(blockId=0; blockId<pObj->algMemAllocPrm.numMemBlocks; blockId++) { #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf(" %d: SCD: MEM REQUEST %d: of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), blockId, pObj->algMemAllocPrm.memBlockSize[blockId], pObj->algMemAllocPrm.memBlockAlign[blockId] ); #endif pObj->algMemAllocPrm.memBlockAddr[blockId] = Utils_memAlloc( pObj->algMemAllocPrm.memBlockSize[blockId], pObj->algMemAllocPrm.memBlockAlign[blockId] ); UTILS_assert(pObj->algMemAllocPrm.memBlockAddr[blockId]!=NULL); #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf(" %d: SCD: MEM ALLOC %d: @ 0x%08x of size %d B (align=%d)\n", Utils_getCurTimeInMsec(), blockId, pObj->algMemAllocPrm.memBlockAddr[blockId], pObj->algMemAllocPrm.memBlockSize[blockId], pObj->algMemAllocPrm.memBlockAlign[blockId] ); #endif } status = SCD_setAllocInfo(&pObj->algObj, &pObj->algMemAllocPrm); 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; }
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 Utils_memFrameAlloc(FVID2_Format * pFormat, FVID2_Frame * pFrame, UInt16 numFrames) { UInt32 size, cOffset, frameId; Int32 status; UInt8 *pBaseAddr; /* init FVID2_Frame to 0's */ memset(pFrame, 0, sizeof(*pFrame)); /* align height to multiple of 2 */ pFormat->height = VpsUtils_align(pFormat->height, 2); /* get frame size for given pFormat */ status = Utils_memFrameGetSize(pFormat, &size, &cOffset); if (status == 0) { /* allocate the memory for 'numFrames' */ /* for all 'numFrames' memory is contigously allocated */ pBaseAddr = Utils_memAlloc(size * numFrames, VPS_BUFFER_ALIGNMENT); if (pBaseAddr == NULL) { status = -1; /* Error in * allocation, * exit with error */ } } if (status == 0) { /* init memory pointer for 'numFrames' */ for (frameId = 0; frameId < numFrames; frameId++) { /* copy channelNum to FVID2_Frame from FVID2_Format */ pFrame->channelNum = pFormat->channelNum; pFrame->addr[0][0] = pBaseAddr; switch (pFormat->dataFormat) { case FVID2_DF_RAW_VBI: case FVID2_DF_YUV422I_UYVY: case FVID2_DF_YUV422I_VYUY: case FVID2_DF_YUV422I_YUYV: case FVID2_DF_YUV422I_YVYU: case FVID2_DF_YUV444I: case FVID2_DF_RGB24_888: break; case FVID2_DF_YUV422SP_UV: case FVID2_DF_YUV420SP_UV: /* assign pointer for C plane */ pFrame->addr[0][1] = (UInt8 *) pFrame->addr[0][0] + cOffset; break; default: /* illegal data format */ status = -1; break; } /* go to next frame */ pFrame++; /* increment base address */ pBaseAddr += size; } } if (status != 0) Vps_printf("Memory allocation failed due to insufficient free memory \n"); /* commented out, so please always check the status immediately after the * Utils_memFrameAlloc() call and handle accordingly */ // UTILS_assert(status == 0); return status; }