I use dm8168 with dvr_rdk3.0 ,and here is the diagram I use
file--ipcBitsOutHost--ipcBitsInVideo--dec--ipcOutVideo--ipcInVpss--swMs--Dis
the problem is decode link recv nothing
here is my code to push the video stream to decode link
static Void *Chains_ipcBitsTestFxn(Void * prm )
{
Chains_IpcBitsCtrl *ipcBitsCtrl = (Chains_IpcBitsCtrl *) prm;
Chains_IpcBitsCtrlThrObj *thrObj = &ipcBitsCtrl->thrObj;
Chains_IpcBitsCtrlFileObj *fObj = &ipcBitsCtrl->fObj;
Bitstream_BufList emptyBufList;
Bitstream_BufList fullBufList;
Bitstream_Buf *pBuf;
IpcBitsOutLinkHLOS_BitstreamBufReqInfo reqInfo;
Int i;
Int status;
static Int printStats;
UInt32 bitBufSize,readLen = 16;
void *videoTmp;
int fdHndl = openFile("/media/sda1/test.264");
bitBufSize = CHAINS_IPCBITS_GET_BITBUF_SIZE(CHAINS_IPCBITS_DEFAULT_WIDTH,
CHAINS_IPCBITS_DEFAULT_HEIGHT);
reqInfo.numBufs = VIDBITSTREAM_MAX_BITSTREAM_BUFS;
reqInfo.reqType = IPC_BITSOUTHLOS_BITBUFREQTYPE_BUFSIZE;
for (i = 0; i < VIDBITSTREAM_MAX_BITSTREAM_BUFS; i++)
{
reqInfo.u[i].minBufSize = bitBufSize;
}
sleep(2);
while (FALSE == thrObj->exitBitsOutThread)
{
OSA_waitMsecs(CHAINS_IPCBITS_SENDFXN_PERIOD_MS);
emptyBufList.numBufs = 0;
status = IpcBitsOutLink_getEmptyVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&emptyBufList,
&reqInfo);
OSA_assert(status == 0);
videoTmp = readFile(fdHndl,readLen);
//print the first 16 bytes of videoTmp
//printMsg((char*)videoTmp,64);
for (i = 0; i < emptyBufList.numBufs; i++)
{
pBuf = emptyBufList.bufs[i];
OSA_assert(pBuf->bufSize >= bitBufSize );
pBuf->fillLength = readLen;
memcpy(pBuf->addr,videoTmp,pBuf->fillLength);
emptyBufList.bufs[i] = pBuf;
//printf("(%d) bufSize %d\n",i,pBuf->bufSize);
//printf("(%d) fillLen %d\n",i,pBuf->fillLength);
}
status = IpcBitsOutLink_putFullVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&emptyBufList);
OSA_assert(status == 0);
if ((printStats % CHAINS_IPCBITS_INFO_PRINT_INTERVAL) == 0)
{
OSA_printf("CHAINS_IPCBITS:%s:INFO: periodic print..",__func__);
}
printStats++;
}
OSA_printf("CHAINS_IPCBITS:%s:Leaving...",__func__);
return NULL;
}
and below is my link
/*******************************************************************************
* *
* Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/ *
* ALL RIGHTS RESERVED *
* *
******************************************************************************/
#include <demos/link_api_demos/common/chains.h>
#include <mcfw/interfaces/ti_venc.h>
#include <mcfw/interfaces/ti_vdec.h>
static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
{
.isPopulated = 1,
.ivaMap[0] =
{
.EncNumCh = 1,
.EncChList = {0},
.DecNumCh = 0,
.DecChList = {0},
},
.ivaMap[1] =
{
.EncNumCh = 0,
.EncChList = {0},
.DecNumCh = 1,
.DecChList = {0},
},
.ivaMap[2] =
{
.EncNumCh = 1,
.EncChList = {1},
.DecNumCh = 1,
.DecChList = {1},
},
};
Void Chains_H264DecDis(Chains_Ctrl *chainsCfg)
{
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
DecLink_CreateParams decPrm;
IpcLink_CreateParams ipcOutVideoPrm;
IpcLink_CreateParams ipcInVpssPrm;
SwMsLink_CreateParams swMsPrm;
DisplayLink_CreateParams displayPrm;
UInt32 ipcBitsOutHostId;
UInt32 ipcBitsInVideoId;
UInt32 decId;
UInt32 ipcOutVideoId;
UInt32 ipcInVpssId;
UInt32 swMsId;
UInt32 displayId;
UInt32 i;
char ch;
static UInt32 CHAINS_IPCBITS_DEFAULT_WIDTH = 1920;
static UInt32 CHAINS_IPCBITS_DEFAULT_HEIGHT = 1080;
Chains_ipcBitsInit();
CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVideoPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVpssPrm);
CHAINS_INIT_STRUCT(SwMsLink_CreateParams, swMsPrm);
CHAINS_INIT_STRUCT(DisplayLink_CreateParams,displayPrm);
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
decId = SYSTEM_LINK_ID_VDEC_0;
ipcOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
ipcInVpssId = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
swMsId = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
displayId = SYSTEM_LINK_ID_DISPLAY_1;
System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);
Chains_displayCtrlInit(chainsCfg->displayRes);
System_LinkQueInfo queInfo;
queInfo.numCh = 1;
for(i = 0;i < 1; i++)
{
queInfo.chInfo[i].bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM;
queInfo.chInfo[i].codingformat = IVIDEO_H264HP;
queInfo.chInfo[i].height = CHAINS_IPCBITS_DEFAULT_HEIGHT;
queInfo.chInfo[i].width = CHAINS_IPCBITS_DEFAULT_WIDTH;
queInfo.chInfo[i].memType = SYSTEM_MT_TILEDMEM;
queInfo.chInfo[i].dataFormat = SYSTEM_DF_YUV420P;//SYSTEM_DF_YUV420SP_UV;
queInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;
}
ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
// ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0] = 1;
ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
// ipcBitsOutHostPrm.bufPoolPerCh = FALSE;
// ipcBitsOutHostPrm.numBufPerCh[0] = 0;
// ipcBitsOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
// ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
// ipcBitsOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm,
&queInfo);
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutHostId;
ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInVideoPrm.baseCreateParams.numOutQue = 1;
// ipcBitsInVideoPrm.baseCreateParams.numChPerOutQue[0] = 1;
ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink = decId;
// ipcBitsInVideoPrm.baseCreateParams.notifyNextLink = FALSE;
// ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
// ipcBitsInVideoPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm,
FALSE);
for (i=0; i<4; i++) {
decPrm.chCreateParams[i].format = IVIDEO_H264HP;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;//IH264_HIGH_PROFILE;//
decPrm.chCreateParams[i].targetMaxWidth = CHAINS_IPCBITS_DEFAULT_WIDTH;
decPrm.chCreateParams[i].targetMaxHeight = CHAINS_IPCBITS_DEFAULT_HEIGHT;
decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
//decPrm.chCreateParams[i].algCreateStatus = DEC_LINK_ALG_CREATE_STATUS_CREATE;
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 25;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = 4000 * 1000;
decPrm.chCreateParams[i].numBufPerCh = 6;
}
decPrm.inQueParams.prevLinkId = ipcBitsInVideoId;
decPrm.inQueParams.prevLinkQueId = 0;
decPrm.outQueParams.nextLink = ipcOutVideoId;
decPrm.tilerEnable = TRUE;
ipcOutVideoPrm.inQueParams.prevLinkId = decId;
ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
ipcOutVideoPrm.numOutQue = 1;
ipcOutVideoPrm.outQueParams[0].nextLink = ipcInVpssId;
ipcOutVideoPrm.notifyNextLink = TRUE;
ipcOutVideoPrm.notifyPrevLink = FALSE;
ipcOutVideoPrm.noNotifyMode = FALSE;
ipcInVpssPrm.inQueParams.prevLinkId = ipcOutVideoId;
ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
ipcInVpssPrm.numOutQue = 1;
ipcInVpssPrm.outQueParams[0].nextLink = swMsId;
ipcInVpssPrm.notifyNextLink = TRUE;
ipcInVpssPrm.notifyPrevLink = FALSE;
ipcInVpssPrm.noNotifyMode = FALSE;
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
swMsPrm.inQueParams.prevLinkId = ipcInVpssId;
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = displayId;
swMsPrm.lineSkipMode = FALSE;
swMsPrm.enableLayoutGridDraw = FALSE;
swMsPrm.layoutPrm.outputFPS = chainsCfg->channelConf[0].frameRate;
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
swMsPrm.maxOutRes = chainsCfg->displayRes[0];
swMsPrm.numOutBuf = 0;
Chains_swMsSetLayoutParams(0, &swMsPrm);
displayPrm.numInputQueues = 1;
displayPrm.activeQueue = 0;
displayPrm.inQueParams[0].prevLinkId = swMsId;
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.displayRes = chainsCfg->displayRes[0];
displayPrm.forceFieldSeparatedInputMode = FALSE;
// swMsPrm.numSwMsInst = 1;
// swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
// swMsPrm.inQueParams.prevLinkId = ipcInVpssId;
// swMsPrm.inQueParams.prevLinkQueId = 0;
// swMsPrm.outQueParams.nextLink = displayId;
// swMsPrm.lineSkipMode = FALSE;
// swMsPrm.enableLayoutGridDraw = FALSE;
// swMsPrm.layoutPrm.outputFPS = chainsCfg->channelConf[0].frameRate;
// swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
// swMsPrm.maxOutRes = chainsCfg->displayRes[0];
// swMsPrm.numOutBuf = 0;
//
// Chains_swMsGenerateLayoutParams(0, 2, &swMsPrm);
//
// displayPrm.inQueParams[0].prevLinkId = swMsId;
// displayPrm.inQueParams[0].prevLinkQueId = 0;
// displayPrm.displayRes = chainsCfg->displayRes[0];
System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
System_linkCreate(decId, &decPrm, sizeof(decPrm));
System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));
System_linkCreate(ipcInVpssId , &ipcInVpssPrm , sizeof(ipcInVpssPrm) );
System_linkCreate(swMsId, &swMsPrm, sizeof(swMsPrm));
System_linkCreate(displayId, &displayPrm, sizeof(displayPrm));
Chains_memPrintHeapStatus();
{
System_linkStart(displayId);
System_linkStart(swMsId);
System_linkStart(decId);
//System_linkStart(ipcBitsInVideoId);
//System_linkStart(ipcBitsOutHostId);
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);
}
Chains_ipcBitsStop();
System_linkStop(ipcBitsOutHostId);
System_linkStop(ipcBitsInVideoId);
System_linkStop(decId);
System_linkStop(swMsId);
System_linkStop(displayId);
}
System_linkDelete(ipcBitsOutHostId);
System_linkDelete(ipcBitsInVideoId);
System_linkDelete(decId);
System_linkDelete(ipcOutVideoId);
System_linkDelete(ipcInVpssId);
System_linkDelete(swMsId);
System_linkDelete(displayId);
Chains_displayCtrlDeInit();
Chains_ipcBitsExit();
}