Hi,
I am working to get multichannel decoder use case in DVR RDK using Link API's. And I have few issues.
Here is the use case code.
#include <demos/link_api_demos/common/chains.h>
#include <demos/link_api_demos/video_chains/system_chain.h>
/**
FILE (H264)
|
|
IPC_BITS_OUT_A8 (BitStream)
|
IPC_BITS_IN_M3 (BitStream)
|
DEC
|
IPC_FRAMES_OUT_M3 (Frames)
|
IPC_FRAMES_IN_A8 (Frames)
|
|
FILE (YUV)
*/
#define SRC_NUM_CH 16
#define NUM_BUF_PER_CH 8
static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
{
.isPopulated = 1,
.ivaMap[0] =
{
.EncNumCh = 0,
.EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.DecNumCh = 16,
.DecChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14, 15},
},
.ivaMap[1] =
{
.EncNumCh = 0,
.EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.DecNumCh = 0,
.DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
},
.ivaMap[2] =
{
.EncNumCh = 0,
.EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.DecNumCh = 0,
.DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
},
};
Void Chains_multiChEncDecLoopBack(Chains_Ctrl *chainsCfg)
{
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
DecLink_CreateParams decPrm;
IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVideoPrm;
IpcFramesInLinkHLOS_CreateParams ipcFramesInHostPrm;
Int i;
Bool isProgressive;
System_LinkInfo bitsProducerLinkInfo;
UInt32 decId;
UInt32 ipcFramesOutVideoId, ipcFramesInHostId;
UInt32 ipcBitsInVideoId, ipcBitsOutHostId;
char ch;
iChains_ipcBitsInit();
CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm);
CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVideoPrm);
CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams,ipcFramesInHostPrm);
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
decId = SYSTEM_LINK_ID_VDEC_0;
ipcFramesOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_OUT_0;
ipcFramesInHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
decPrm.tilerEnable = FALSE;
isProgressive = TRUE;
System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);
ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
ipcBitsOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutHostPrm.inQueInfo.numCh = SRC_NUM_CH;
ipcBitsOutHostPrm.bufPoolPerCh = TRUE;
for (i=0; i<SRC_NUM_CH; i++)
{
ipcBitsOutHostPrm.inQueInfo.chInfo[i].width = 720;
ipcBitsOutHostPrm.inQueInfo.chInfo[i].height = 576;
ipcBitsOutHostPrm.inQueInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;
ipcBitsOutHostPrm.inQueInfo.chInfo[i].bufType = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].codingformat = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].dataFormat = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].memType = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].startX = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].startY = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[0] = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[1] = 0; // NOT USED
ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[2] = 0; // NOT USED
ipcBitsOutHostPrm.numBufPerCh[i] = NUM_BUF_PER_CH;
}
/* IPC Host to IPC Video*/
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutHostId;
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = decId;
ipcBitsInVideoPrm.baseCreateParams.noNotifyMode = TRUE;
ipcBitsInVideoPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1;
/* IPC Video to DEC*/
for (i=0; i<SRC_NUM_CH; i++) {
decPrm.chCreateParams[i].format = IVIDEO_H264HP;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
decPrm.chCreateParams[i].targetMaxWidth = 720;
decPrm.chCreateParams[i].targetMaxHeight = 576;
if (isProgressive)
decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
else
decPrm.chCreateParams[i].fieldMergeDecodeEnable = TRUE;
decPrm.chCreateParams[i].numBufPerCh = NUM_BUF_PER_CH;
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 25;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
}
decPrm.inQueParams.prevLinkId = ipcBitsInVideoId;
decPrm.inQueParams.prevLinkQueId = 0;
decPrm.outQueParams.nextLink = ipcFramesOutVideoId;
/*DEC to IPC Video Frame out*/
ipcFramesOutVideoPrm.baseCreateParams.noNotifyMode = TRUE;
ipcFramesOutVideoPrm.baseCreateParams.notifyNextLink = FALSE;
ipcFramesOutVideoPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = decId;
ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcFramesOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcFramesInHostId;
/*IPC Frame video out to Host IN*/
ipcFramesInHostPrm.baseCreateParams.noNotifyMode = TRUE;
ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutVideoId;
ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
System_linkCreate(decId, &decPrm, sizeof(decPrm));
sleep(2);
System_linkCreate(ipcFramesOutVideoId, &ipcFramesOutVideoPrm, sizeof(ipcFramesOutVideoPrm));
System_linkCreate(ipcFramesInHostId, &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));
printf("SYSTEM INFO >>> FILE - DEC - FILE Links Created\n");
Chains_memPrintHeapStatus();
{
System_linkStart(ipcFramesInHostId);
System_linkStart(ipcFramesOutVideoId);
System_linkStart(decId);
System_linkStart(ipcBitsInVideoId);
System_linkStart(ipcBitsOutHostId);
/* Start taking CPU load just before starting of links */
Chains_prfLoadCalcEnable(TRUE, FALSE, FALSE);
while(1)
{
ch = Chains_menuRunTime();
if(ch=='0')
break;
if(ch=='i')
System_linkControl(decId, DEC_LINK_CMD_PRINT_IVAHD_STATISTICS, NULL, 0, TRUE);
if(ch=='d')
System_linkControl(decId, DEC_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);
if(ch=='D')
System_linkControl(decId, DEC_LINK_CMD_PRINT_BUFFER_STATISTICS, NULL, 0, TRUE);
if(ch=='b')
System_linkControl(ipcBitsOutHostId, IPCBITSOUT_LINK_CMD_PRINT_BUFFER_STATISTICS, NULL, 0, TRUE);
}
iChains_ipcBitsStop();
System_linkStop(ipcBitsOutHostId);
System_linkStop(ipcBitsInVideoId);
System_linkStop(decId);
}
System_linkDelete(ipcBitsOutHostId);
System_linkDelete(ipcBitsInVideoId);
System_linkDelete(decId);
System_linkDelete(ipcFramesOutVideoId);
System_linkDelete(ipcFramesInHostId);
/* Print the HWI, SWI and all tasks load */
/* Reset the accumulated timer ticks */
Chains_prfLoadCalcEnable(FALSE, TRUE, FALSE);
//Utils_encdecHdvicpPrfPrint();
iChains_ipcBitsExit();
}
I used the following technique to copy the data from file to IPC
----------------------------------------------
reqInfo.numBufs = 16;
reqInfo.reqType = IPC_BITSOUTHLOS_BITBUFREQTYPE_CHID;
for (i = 0; i< 16; i++) /*request 16 empty buffer*/
reqInfo.u[i].chNum = i;
IpcBitsOutLink_getEmptyVideoBitStreamBufs(ipcBitsInLinkId, &emptyBufList, &reqInfo);
iChains_ipcBitsReadBitsFromFile(&emptyBufList, maxDataSize);
IpcBitsOutLink_putFullVideoBitStreamBufs(ipcBitsInLinkId, &emptyBufList);
sleep(1)
-----------------------------------------------
Since I declared only 8 buff per channel, Only 8 times I am able to transfer data from file to IPC_BITS_IN. The buffers are not consumed by decoder component.
Stat Prints:-
Enter Choice: [m3video]
[m3video] *** Decode Statistics ***
[m3video] 36754: DEC: Rcvd from prev = 0, Returned to prev = 0
[m3video] DEC Out BufExt Q Status
[m3video] Empty Q 0 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 1 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 2 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 3 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 4 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 5 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 6 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 7 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 8 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 9 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 10 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 11 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 12 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 13 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 14 -> count 8, wrPtr 8, rdPtr 0
[m3video] Empty Q 15 -> count 8, wrPtr 8, rdPtr 0
[m3video] Full Q -> count 0, wrPtr 0, rdPtr 0
---------------
Enter Choice: [m3video]
[m3video] *** DECODE Statistics ***
[m3video]
[m3video] Elasped Time : 17 secs
[m3video]
[m3video]
[m3video] CH | In Recv In User Out
[m3video] Num | FPS Skip FPS FPS
[m3video] -----------------------------------
[m3video] 0 | 0 0 0
[m3video] 1 | 0 0 0
[m3video] 2 | 0 0 0
[m3video] 3 | 0 0 0
[m3video] 4 | 0 0 0
[m3video] 5 | 0 0 0
[m3video] 6 | 0 0 0
[m3video] 7 | 0 0 0
[m3video] 8 | 0 0 0
[m3video] 9 | 0 0 0
[m3video] 10 | 0 0 0
[m3video] 11 | 0 0 0
[m3video] 12 | 0 0 0
[m3video] 13 | 0 0 0
[m3video] 14 | 0 0 0
[m3video] 15 | 0 0 0
[m3video]
[m3video] Multi Channel Decode Average Submit Batch Size
[m3video] Max Submit Batch Size : 24
[m3video] IVAHD_0 Average Batch Size : 0
[m3video] IVAHD_0 Max achieved Batch Size : 0
[m3video] IVAHD_1 Average Batch Size : 0
[m3video] IVAHD_1 Max achieved Batch Size : 0
[m3video] IVAHD_2 Average Batch Size : 0
[m3video] IVAHD_2 Max achieved Batch Size : 0
[m3video]
[m3video] Multi Channel Decode Batch break Stats
[m3video] Total Number of Batches created: 0
[m3video] All numbers are based off total number of Batches created
[m3video] Batch breaks due to batch sizeexceeding limit: 0 %
[m3video] Batch breaks due to ReqObj Que being empty: 0 %
[m3video] Batch breaks due to changed resolution class: 0 %
[m3video] Batch breaks due to interlace and progressivecontent mix: 0 %
[m3video] Batch breaks due to channel repeat: 0 %
[m3video] Batch breaks due to different codec: 0 %
[m3video] Total Number of Batches created: 0
[m3video] All numbers are based off total number of Batches created
[m3video] Batch breaks due to batch sizeexceeding limit: 0 %
[m3video] Batch breaks due to ReqObj Que being empty: 0 %
[m3video] Batch breaks due to changed resolution class: 0 %
[m3video] Batch breaks due to interlace and progressivecontent mix: 0 %
[m3video] Batch breaks due to channel repeat: 0 %
[m3video] Batch breaks due to different codec: 0 %
[m3video] Total Number of Batches created: 0
[m3video] All numbers are based off total number of Batches created
[m3video] Batch breaks due to batch sizeexceeding limit: 0 %
[m3video] Batch breaks due to ReqObj Que being empty: 0 %
[m3video] Batch breaks due to changed resolution class: 0 %
[m3video] Batch breaks due to interlace and progressivecontent mix: 0 %
[m3video] Batch breaks due to channel repeat: 0 %
[m3video] Batch breaks due to different codec: 0 %
[m3video]
-------------------------
Enter Choice: [m3video] 30547: HDVICP-ID:0
[m3video] All percentage figures are based off totalElapsedTime
[m3video] totalAcquire2wait :0 %
[m3video] totalWait2Isr :0 %
[m3video] totalIsr2Done :0 %
[m3video] totalWait2Done :0 %
[m3video] totalDone2Release :0 %
[m3video] totalAcquire2Release :0 %
[m3video] totalAcq2acqDelay :0 %
[m3video] totalElapsedTime in msec : 0
[m3video] numAccessCnt: 0
[m3video] IVA-FPS : 0
[m3video] Average time spent per frame in microsec: 0
[m3video] 30548: HDVICP-ID:1
[m3video] All percentage figures are based off totalElapsedTime
[m3video] totalAcquire2wait :0 %
[m3video] totalWait2Isr :0 %
[m3video] totalIsr2Done :0 %
[m3video] totalWait2Done :0 %
[m3video] totalDone2Release :0 %
[m3video] totalAcquire2Release :0 %
[m3video] totalAcq2acqDelay :0 %
[m3video] totalElapsedTime in msec : 0
[m3video] numAccessCnt: 0
[m3video] IVA-FPS : 0
[m3video] Average time spent per frame in microsec: 0
[m3video] 30548: HDVICP-ID:2
[m3video] All percentage figures are based off totalElapsedTime
[m3video] totalAcquire2wait :0 %
[m3video] totalWait2Isr :0 %
[m3video] totalIsr2Done :0 %
[m3video] totalWait2Done :0 %
[m3video] totalDone2Release :0 %
[m3video] totalAcquire2Release :0 %
[m3video] totalAcq2acqDelay :0 %
[m3video] totalElapsedTime in msec : 0
[m3video] numAccessCnt: 0
[m3video] IVA-FPS : 0
[m3video] Average time spent per frame in microsec: 0
-----------------------
Why the decoder is not emptying the data? any Idea?
Thanks
Subash