Int32 MpSclrLink_putEmptyFrames(Utils_TskHndl * pTsk, UInt16 queId, FVID2_FrameList * pFrameList) { Int32 status; UInt32 i, currIndex; FVID2_Frame *pFrame; FVID2_FrameList freeFrameList; MpSclrLink_Obj *pObj = (MpSclrLink_Obj *) pTsk->appData; status = FVID2_SOK; /* Check if the frame belong to MP SCLR, if not put back to previous link */ currIndex = 0; for (i = 0; i < pFrameList->numFrames; i++) { pFrame = pFrameList->frames[i]; if ((((System_FrameInfo *)pFrame->appData)->isMpFrame) == 0) { /* Frame belongs to previous link */ freeFrameList.frames[currIndex] = pFrame; currIndex++; } else { /* This frame belongs to MP SCLR */ debugMpSclrPrintFrame(pFrame, "Next Link Return Output Frame"); status = Utils_bufPutEmptyFrame(&pObj->linkBufQ, pFrame); } } if (currIndex) { freeFrameList.numFrames = currIndex; status = System_putLinksEmptyFrames(pObj->createArgs.inQueParams.prevLinkId, pObj->createArgs.inQueParams.prevLinkQueId, &freeFrameList); } return status; }
Int32 NullSrcLink_drvCreate(NullSrcLink_Obj * pObj, NullSrcLink_CreateParams * pPrm) { Int32 status; UInt32 chId, frameId; Clock_Params clockParams; System_LinkChInfo *pChInfo; FVID2_Frame *pFrame; #ifdef SYSTEM_DEBUG_SWMS Vps_printf(" %d: NULL_SRC: Create in progress !!!\n", Utils_getCurTimeInMsec()); #endif memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); UTILS_assert(pPrm->inputInfo.numCh <= SYSTEM_MAX_CH_PER_OUT_QUE); status = Utils_bufCreate(&pObj->bufOutQue, FALSE, FALSE); UTILS_assert(status == FVID2_SOK); if (pPrm->timerPeriod == 0 || pPrm->timerPeriod > 200) pPrm->timerPeriod = 16; Clock_Params_init(&clockParams); clockParams.period = pPrm->timerPeriod; clockParams.arg = (UArg) pObj; pObj->timer = Clock_create(NullSrcLink_drvTimerCb, pPrm->timerPeriod, &clockParams, NULL); UTILS_assert(pObj->timer != NULL); pObj->info.numQue = 1; pObj->info.queInfo[0].numCh = pPrm->inputInfo.numCh; pChInfo = &pPrm->inputInfo.chInfo[0]; pObj->outFormat.channelNum = 0; pObj->outFormat.width = pChInfo->width; pObj->outFormat.height = pChInfo->height; pObj->outFormat.pitch[0] = pChInfo->pitch[0]; pObj->outFormat.pitch[1] = pChInfo->pitch[1]; pObj->outFormat.pitch[2] = pChInfo->pitch[2]; pObj->outFormat.fieldMerged[0] = FALSE; pObj->outFormat.fieldMerged[1] = FALSE; pObj->outFormat.fieldMerged[2] = FALSE; pObj->outFormat.dataFormat = pChInfo->dataFormat; pObj->outFormat.scanFormat = pChInfo->scanFormat; pObj->outFormat.bpp = FVID2_BPP_BITS16; pObj->outFormat.reserved = NULL; status = Utils_memFrameAlloc(&pObj->outFormat, pObj->outFrames, 1); UTILS_assert(status == FVID2_SOK); NullSrcLink_fillDataPattern(&pObj->outFormat, pObj->outFrames, 1); #ifndef SYSTEM_USE_TILER if (pObj->createArgs.tilerEnable) { Vps_printf("NULLSRC:!!WARNING.FORCIBLY DISABLING TILER since tiler is disabled at build time"); pObj->createArgs.tilerEnable = FALSE; } #endif for (chId = 0; chId < pPrm->inputInfo.numCh; chId++) { memcpy(&pObj->info.queInfo[0].chInfo[chId], &pPrm->inputInfo.chInfo[chId], sizeof(pPrm->inputInfo.chInfo[chId])); pObj->info.queInfo[0].chInfo[chId].memType = VPS_VPDMA_MT_NONTILEDMEM; if (pObj->createArgs.tilerEnable) { pObj->info.queInfo[0].chInfo[chId].memType = VPS_VPDMA_MT_TILEDMEM; } pObj->chNextFid[chId] = 0; } for (frameId = 0; frameId < pPrm->inputInfo.numCh * SYSTEM_LINK_FRAMES_PER_CH; frameId++) { pFrame = &pObj->outFrames[frameId]; memcpy(pFrame, &pObj->outFrames[0], sizeof(*pFrame)); pFrame->appData = &pObj->frameInfo[frameId]; memset(&pObj->frameInfo[frameId], 0, sizeof(pObj->frameInfo[frameId])); status = Utils_bufPutEmptyFrame(&pObj->bufOutQue, pFrame); UTILS_assert(status == FVID2_SOK); } #ifdef SYSTEM_DEBUG_SWMS Vps_printf(" %d: NULL_SRC: Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return FVID2_SOK; }
Int32 DupLink_drvCreate(DupLink_Obj * pObj, DupLink_CreateParams * pPrm) { UInt32 outId, frameId; Int32 status; FVID2_Frame *pFrame; System_FrameInfo *pFrameInfo; Semaphore_Params semParams; memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); UTILS_assert(pObj->createArgs.numOutQue <= DUP_LINK_MAX_OUT_QUE); pObj->putFrameCount = 0; pObj->getFrameCount = 0; memset(pObj->frames, 0, sizeof(pObj->frames)); memset(pObj->frameInfo, 0, sizeof(pObj->frameInfo)); status = System_linkGetInfo(pPrm->inQueParams.prevLinkId, &pObj->inTskInfo); UTILS_assert(status == FVID2_SOK); UTILS_assert(pPrm->inQueParams.prevLinkQueId < pObj->inTskInfo.numQue); pObj->info.numQue = pObj->createArgs.numOutQue; memcpy(&pObj->info.queInfo[0], &pObj->inTskInfo.queInfo[pPrm->inQueParams.prevLinkQueId], sizeof(pObj->inTskInfo.queInfo[0])); for (outId = 1; outId < pObj->info.numQue; outId++) { memcpy(&pObj->info.queInfo[outId], &pObj->info.queInfo[0], sizeof(pObj->info.queInfo[0])); } Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_BINARY; pObj->lock = Semaphore_create(1u, &semParams, NULL); for (outId = 0; outId < DUP_LINK_MAX_OUT_QUE; outId++) { status = Utils_bufCreate(&pObj->outFrameQue[outId], FALSE, FALSE); UTILS_assert(status == FVID2_SOK); for (frameId = 0; frameId < DUP_LINK_MAX_FRAMES_PER_OUT_QUE; frameId++) { pFrame = &pObj->frames[DUP_LINK_MAX_FRAMES_PER_OUT_QUE * outId + frameId]; pFrameInfo = &pObj->frameInfo[DUP_LINK_MAX_FRAMES_PER_OUT_QUE * outId + frameId]; pFrame->appData = pFrameInfo; status = Utils_bufPutEmptyFrame(&pObj->outFrameQue[outId], pFrame); UTILS_assert(status == FVID2_SOK); } } #ifdef SYSTEM_DEBUG_DUP Vps_printf(" %d: DUP : Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return FVID2_SOK; }