Example #1
0
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);
}
Example #2
0
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);
}