static Int32 HelloWorldLink_createOutObj(HelloWorldLink_Obj * pObj) { HelloWorldLink_OutObj *pOutObj; System_LinkChInfo *pOutChInfo; Int32 status; UInt32 bufIdx; Int i,j,queueId,chId; UInt32 totalBufCnt; /*************************************************************************/ /* One link can have multiple output queues with different/same output */ /* data queued to it's output queue. Create here outobj for all output */ /* queue */ /*************************************************************************/ for(queueId = 0; queueId < HELLOWORLD_LINK_MAX_OUT_QUE; queueId++) { pOutObj = &pObj->outObj[queueId]; pObj->outObj[queueId].numAllocPools = 1; pOutObj->bufSize[0] = HELLOWORLD_LINK_OUT_BUF_SIZE; /*********************************************************************/ /* Set the buffer alignment as per need. Typically 128 suggested for */ /* better cache and DMA efficiency. */ /*********************************************************************/ pOutObj->bufSize[0] = VpsUtils_align(pOutObj->bufSize[0], HELLOWORLD_BUFFER_ALIGNMENT); /*********************************************************************/ /* Create output queue */ /*********************************************************************/ status = Utils_bitbufCreate(&pOutObj->bufOutQue, TRUE, FALSE, pObj->outObj[queueId].numAllocPools); UTILS_assert(status == FVID2_SOK); totalBufCnt = 0; /*********************************************************************/ /* Allocate output buffers */ /*********************************************************************/ for (i = 0; i < pOutObj->numAllocPools; i++) { /*****************************************************************/ /* Number of output buffers per channel. In this example hello */ /* world, outNumBufs set via user input. */ /*****************************************************************/ pOutObj->outNumBufs[i] = (pObj->createArgs.maxChannels * pObj->createArgs.numBufsPerCh); for (j = 0; j < pObj->createArgs.maxChannels; j++) { pOutObj->ch2poolMap[j] = i; } /*****************************************************************/ /* Allocate the buffer from shared memory pool for bitstream */ /* buffer. If you like to allocate memory for frame buffers, */ /* you can either call Utils_tilerFrameAlloc() to allocate */ /* memory from tiler memory or you can call Utils_memFrameAlloc */ /* to allocate memory from shared buffer pool */ /*****************************************************************/ status = Utils_memBitBufAlloc(&(pOutObj->outBufs[totalBufCnt]), pOutObj->bufSize[i], pOutObj->outNumBufs[i]); UTILS_assert(status == FVID2_SOK); /*****************************************************************/ /* Push the buffers to the output queue that's just been created */ /*****************************************************************/ for (bufIdx = 0; bufIdx < pOutObj->outNumBufs[i]; bufIdx++) { UTILS_assert((bufIdx + totalBufCnt) < HELLOWORLD_LINK_MAX_OUT_FRAMES); pOutObj->outBufs[bufIdx + totalBufCnt].allocPoolID = i; pOutObj->outBufs[bufIdx + totalBufCnt].doNotDisplay = FALSE; status = Utils_bitbufPutEmptyBuf(&pOutObj->bufOutQue, &pOutObj->outBufs[bufIdx + totalBufCnt]); UTILS_assert(status == FVID2_SOK); } totalBufCnt += pOutObj->outNumBufs[i]; } } pObj->info.numQue = HELLOWORLD_LINK_MAX_OUT_QUE; /*************************************************************************/ /* queInfo is used by next link to create it's instance. */ /* Set numCh - number of channel information */ /*************************************************************************/ for (queueId = 0u; queueId < HELLOWORLD_LINK_MAX_OUT_QUE; queueId++) { pObj->info.queInfo[queueId].numCh = pObj->inQueInfo.numCh; } /*************************************************************************/ /* Set the information for output buffer of each channel. Again, next */ /* link connected to hello world link will use this information to */ /* create it's own instance. */ /*************************************************************************/ for (chId = 0u; chId < pObj->inQueInfo.numCh; chId++) { for (queueId = 0u; queueId < HELLOWORLD_LINK_MAX_OUT_QUE; queueId++) { pOutChInfo = &pObj->info.queInfo[queueId].chInfo[chId]; pOutChInfo->bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM; pOutChInfo->codingformat = NULL; pOutChInfo->memType = NULL; pOutChInfo->scanFormat = pObj->inQueInfo.chInfo[chId].scanFormat; pOutChInfo->width = pObj->inQueInfo.chInfo[chId].width; pOutChInfo->height = pObj->inQueInfo.chInfo[chId].height; } } return (status); }
static Int32 AlgLink_createOutObj(AlgLink_Obj * pObj) { AlgLink_OutObj *pOutObj; System_LinkChInfo *pOutChInfo; Int32 status; UInt32 bufIdx; Int i,j,queueId,chId; UInt32 totalBufCnt; for(queueId = 0; queueId < ALG_LINK_MAX_OUT_QUE; queueId++) { pOutObj = &pObj->outObj[queueId]; pObj->outObj[queueId].numAllocPools = 1; pOutObj->buf_size[0] = UTILS_SCD_GET_OUTBUF_SIZE(); pOutObj->buf_size[0] = VpsUtils_align(pOutObj->buf_size[0], SharedRegion_getCacheLineSize(SYSTEM_IPC_SR_CACHED)); status = Utils_bitbufCreate(&pOutObj->bufOutQue, TRUE, FALSE, pObj->outObj[queueId].numAllocPools); UTILS_assert(status == FVID2_SOK); totalBufCnt = 0; for (i = 0; i < pOutObj->numAllocPools; i++) { pOutObj->outNumBufs[i] = (pObj->scdAlg.createArgs.numValidChForSCD * pObj->scdAlg.createArgs.numBufPerCh); for (j = 0; j < pObj->scdAlg.createArgs.numValidChForSCD; j++) { pOutObj->ch2poolMap[j] = i; } status = Utils_memBitBufAlloc(&(pOutObj->outBufs[totalBufCnt]), pOutObj->buf_size[i], pOutObj->outNumBufs[i]); UTILS_assert(status == FVID2_SOK); for (bufIdx = 0; bufIdx < pOutObj->outNumBufs[i]; bufIdx++) { UTILS_assert((bufIdx + totalBufCnt) < ALG_LINK_SCD_MAX_OUT_FRAMES); pOutObj->outBufs[bufIdx + totalBufCnt].allocPoolID = i; pOutObj->outBufs[bufIdx + totalBufCnt].doNotDisplay = FALSE; status = Utils_bitbufPutEmptyBuf(&pOutObj->bufOutQue, &pOutObj->outBufs[bufIdx + totalBufCnt]); UTILS_assert(status == FVID2_SOK); } /* align size to minimum required frame buffer alignment */ totalBufCnt += pOutObj->outNumBufs[i]; } } pObj->info.numQue = ALG_LINK_MAX_OUT_QUE; for (queueId = 0u; queueId < ALG_LINK_MAX_OUT_QUE; queueId++) { pObj->info.queInfo[queueId].numCh = pObj->inQueInfo.numCh; } for (chId = 0u; chId < pObj->inQueInfo.numCh; chId++) { for (queueId = 0u; queueId < ALG_LINK_MAX_OUT_QUE; queueId++) { pOutChInfo = &pObj->info.queInfo[queueId].chInfo[chId]; pOutChInfo->bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM; pOutChInfo->codingformat = NULL; pOutChInfo->memType = NULL; pOutChInfo->scanFormat = pObj->inQueInfo.chInfo[chId].scanFormat; pOutChInfo->width = pObj->inQueInfo.chInfo[chId].width; pOutChInfo->height = pObj->inQueInfo.chInfo[chId].height; } } return (status); }