Live555获得的帧数据是否可以通过IPC bits links,能否用这种方式来显示?
live555 frame -> ipcBitsOutLinks ->ipcBitsInLinks -> decLinks ->displayLinks
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Live555获得的帧数据是否可以通过IPC bits links,能否用这种方式来显示?
live555 frame -> ipcBitsOutLinks ->ipcBitsInLinks -> decLinks ->displayLinks
流程: ipc out -> ipc video in -> dec -> dis 把live555的帧数往ipc out里面填充就可以了吗?就可以对live555在线直播了吗?我的代码是这样子:
vooid* getFrame(handle,frame,userdata)
{
Bitstream_Buf *pEmptyBuf = NULL;
//Int32 status = TRUE;
int chns[16] = {0};
static UInt64 timestamp_base = 0;
Bitstream_BufList emptyBufList;
Bitstream_BufList fullBufList;
IpcBitsOutLinkHLOS_BitstreamBufReqInfo reqInfo;
UInt32 bitBufSize;
UInt32 frameStartTime = 0;
UInt32 frameEndTime = 0;
UInt32 frameInterTime = 8;
Int32 milliSecondsToSleep = 0;
//Chains_Ctrl *chCfg = (Chains_Ctrl *) user_data;
frameStartTime = OSA_getCurTimeInMsec();
bitBufSize =1360*768/2;
reqInfo.bufSize = bitBufSize;
reqInfo.chNum = chns[0];
IpcBitsOutLink_getEmptyVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&emptyBufList,
&reqInfo);
if(0 == emptyBufList.numBufs)
{
return 0;
}
fullBufList.numBufs = 0;
pEmptyBuf = fullBufList.bufs[fullBufList.numBufs++] = emptyBufList.bufs[0];
memcpy(pEmptyBuf->addr, frame->frameBuf,frame->frameSize);
pEmptyBuf->fillLength = frame->frameSize;
UInt64 curTimeStamp =timestamp_base++ * 16;
pEmptyBuf->lowerTimeStamp = (UInt32)(curTimeStamp & 0xFFFFFFFF);
pEmptyBuf->upperTimeStamp = (UInt32)((curTimeStamp >> 32)& 0xFFFFFFFF);
if (fullBufList.numBufs)
{
IpcBitsOutLink_putFullVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&fullBufList);
}
milliSecondsToSleep = 1;
frameEndTime = OSA_getCurTimeInMsec();
milliSecondsToSleep = frameInterTime + frameStartTime - frameEndTime;
if (milliSecondsToSleep > 0) {
OSA_waitMsecs(milliSecondsToSleep);
milliSecondsToSleep = 0;
}
return 0;
}
Chains_revDis()
{
IpcBitsOutLinkRTOS_CreateParams ipcBitsInVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsOutHostPrm;
//IpcLink_CreateParams ipcOutVpssPrm;
//IpcLink_CreateParams ipcInVideoPrm;
DecLink_CreateParams decPrm;
SwMsLink_CreateParams swMsPrm;
DisplayLink_CreateParams displayPrm;
UInt32 swMsId;
UInt32 displayId;
UInt32 ipcOutVpssId;
UInt32 ipcInVideoId;
UInt32 decId;
//
UInt32 ipcBitsInVideoId;
UInt32 ipcBitsOutHostId;
UInt8 i;
myChains_ctrl =chainsCfg;
//Chains_ipcBitsInit();
printf("\n[#lqhPrint] my demo ");
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcOutVpssPrm);
CHAINS_INIT_STRUCT(IpcLink_CreateParams,ipcInVideoPrm);
swMsId = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
//swMsId[1] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
displayId = SYSTEM_LINK_ID_DISPLAY_0;
//displayId[1] = SYSTEM_LINK_ID_DISPLAY_1;
decId = SYSTEM_LINK_ID_VDEC_0;
//ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
// ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
ipcBitsInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);
ipcBitsOutHostPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
ipcBitsOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0] = 1;
ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
ipcBitsOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutHostPrm,FALSE);
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 = FALSE;
ipcBitsInVideoPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsInRTOS(&ipcBitsInVideoPrm,FALSE);
/*
ipcOutVpssPrm.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.numChPerOutQue[0] = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.notifyPrevLink = FALSE;
ipcOutVpssPrm.noNotifyMode = FALSE;
ipcOutVpssPrm.numChPerOutQue[0] = 0;
ipcOutVpssPrm.equallyDivideChAcrossOutQues = FALSE;
ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.numChPerOutQue[0] = 1;
ipcInVideoPrm.outQueParams[0].nextLink = decId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = FALSE;
ipcInVideoPrm.noNotifyMode = FALSE;
ipcInVideoPrm.numChPerOutQue[0] = 0;
ipcInVideoPrm.equallyDivideChAcrossOutQues = FALSE;
*/
for (i=0; i<chainsCfg->chRecNum; i++)
{
decPrm.chCreateParams[i].format = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFormat;
decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
decPrm.chCreateParams[i].targetMaxWidth = chainsCfg->chCfg[i + chainsCfg->chCapNum].inWidth;
decPrm.chCreateParams[i].targetMaxHeight = chainsCfg->chCfg[i + chainsCfg->chCapNum].inHeight;
decPrm.chCreateParams[i].fieldMergeDecodeEnable = FALSE;
decPrm.chCreateParams[i].algCreateStatus = DEC_LINK_ALG_CREATE_STATUS_CREATE;
decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = chainsCfg->chCfg[i + chainsCfg->chCapNum].encFrameRate;
decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = chainsCfg->chCfg[i + chainsCfg->chCapNum].bitRate;
decPrm.chCreateParams[i].numBufPerCh = 0;
decPrm.chCreateParams[i].tilerEnable = TRUE;
}
decPrm.inQueParams.prevLinkId = ipcBitsInVideoId;
decPrm.inQueParams.prevLinkQueId = 0;
decPrm.outQueParams.nextLink = swMsId;
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_VIP1_SC;
swMsPrm.inQueParams.prevLinkId = decId;
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = displayId;
swMsPrm.lineSkipMode = FALSE;
swMsPrm.enableLayoutGridDraw = TRUE;
swMsPrm.layoutPrm.outputFPS = chainsCfg->chCfg[0+chainsCfg->chCapNum].encFrameRate;
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
swMsPrm.maxOutRes = chainsCfg->displayRes[0];
swMsPrm.numOutBuf = 0;
Chains_swMsGenerateLayoutParams(0, 2, &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;
if(chainsCfg->chRecNum > 0)
{
printf("\n[#lqhPrint] Create ing ");
//System_linkCreate(ipcOutVpssId,&ipcOutVpssPrm,sizeof(ipcOutVpssPrm));
//System_linkCreate(ipcInVideoId,&ipcInVideoPrm,sizeof(ipcInVideoPrm));
System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
System_linkCreate(decId,&decPrm,sizeof(decPrm));
System_linkCreate(swMsId,&swMsPrm,sizeof(swMsPrm));
System_linkCreate(displayId,&displayPrm,sizeof(displayPrm));
}
if(chainsCfg->chRecNum > 0)
{
Vdis_start();
System_linkStart(displayId);
System_linkStart(swMsId);
System_linkStart(decId);
//System_linkStart(ipcOutVpssId);
//System_linkStart(ipcInVideoId);
System_linkStart(ipcBitsInVideoId);
System_linkStart(ipcBitsOutHostId);
rtspClientStart(chainsCfg);
}
while(1)
{
char ch;
ch = Chains_menuRunTime();
if(ch=='0')
break;
}
if(chainsCfg->chRecNum > 0)
{
rtspClientstop();
System_linkStop(ipcBitsOutHostId);
System_linkStop(ipcBitsInVideoId);
System_linkStop(decId);
//System_linkStop(ipcOutVpssId);
//System_linkStop(ipcInVideoId);
System_linkStop(swMsId);
Vdis_stop();
System_linkStop(displayId);
}
if(chainsCfg->chRecNum > 0)
{
System_linkDelete(ipcBitsOutHostId);
System_linkDelete(ipcBitsInVideoId);
System_linkDelete(decId);
System_linkDelete(swMsId);
System_linkDelete(displayId);
Chains_displayCtrlDeInit();
}
}
是我写反了,因该是:
IpcBitsOutLinkRTOS_CreateParams ipcBitsInVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsOutHostPrm;
改为这个:
IpcBitsInLinkRTOS_CreateParams ipcBitsInVideoPrm;
IpcBitsOutLinkHLOS_CreateParams ipcBitsOutHostPrm;
又一个问题:
IpcBitsOutLink_getEmptyVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&emptyBufList,
&reqInfo);
if(0 == emptyBufList.numBufs)
{
return 0;
}
这上面的语句无法申请获得buffer?求指教!
恩恩,我现在是这样子:
SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0 =>
SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0 =>
SYSTEM_LINK_ID_VDEC_0 =>
SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0 =>
SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0 =>
SYSTEM_LINK_ID_SW_MS_MULTI_INST_0 =>
SYSTEM_LINK_ID_DISPLAY_0
这样子连这些link应该是没问题的吧?第一个link是这样子操作的:
ipcBitsOutHostId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
System_LinkQueInfo queInfo;
queInfo.numCh = 1;
queInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDBITSTREAM;
queInfo.chInfo[0].codingformat = chainsCfg->chCfg[0].encFormat;
queInfo.chInfo[0].height = chainsCfg->chCfg[0].outHeight;
queInfo.chInfo[0].width = chainsCfg->chCfg[0].outWidth;
queInfo.chInfo[0].memType = SYSTEM_MT_TILEDMEM;
queInfo.chInfo[0].dataFormat = SYSTEM_DF_YUV420P;
queInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE;
ipcBitsOutHostPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
ipcBitsOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutHostPrm.baseCreateParams.numChPerOutQue[0] = 1;
ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
ipcBitsOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcBitsOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
Chains_ipcBitsInitCreateParams_BitsOutHLOS(&ipcBitsOutHostPrm,&queInfo);
System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
System_linkStart(ipcBitsOutHostId);
emptyBufList.numBufs =0 ;
bitBufSize =1360*768/2;
reqInfo.bufSize = bitBufSize;
reqInfo.chNum = chns[0];
OSA_waitMsecs(8);
frameStartTime = OSA_getCurTimeInMsec();
IpcBitsOutLink_getEmptyVideoBitStreamBufs(SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0,
&emptyBufList,
&reqInfo);
if(0 == emptyBufList.numBufs)
{
return 0;
}
可我这样获取第一个link的缓冲区的时候,失败了,返回来 emptyBufList.numBufs =0的,不知道哪里出错了?能帮我看看吗?
是的!我的成功出来了!
A8(live555 client) ->IPC OUT(Bit Out) ->IPC IN (Video IN) -> DecLink (Video)->(Video Out )(IPC ) -> (Vpass In)(IPC) SwMs -> Display
原来是我忘记配置Ipc BitoutLink NotifyNextLink 以及NotifyMode!配置就可以了!IPC都需要配置 NotifyNextLink 以及NotifyMode!
有一个问题我停止stop chain,按0然后结束当前demo
[host] 97990: IPC_BITS_OUT : Delete Done !!!
[m3vpss ] 102738: DISPLAY: Stop Done !!!
[m3video] 102762: IPCBITSIN:Link[1000001a]:
[m3video] RECV:1221 FREE:1221,DROPPED:0,AVGLATENCY:7
[m3video] 102763: IPC_BITS_IN : Delete in progress !!!
[m3video] 102763: IPC_BITS_IN : Delete Done !!!
[m3video] 102763: DECODE: Stop in progress !!!
[m3video] 102763: DECODE: Stop Done !!!
[m3video] 102763: DECODE: Delete in progress !!!
[m3video] !!!XDC RUNTIME ASSERT FAILED
[m3video] xdc.runtime.Error @ ti.sdo.ipc.SharedRegion: line 302:
[m3video] assertion failure: A_regionInvalid: Region is invalid
出现了这样子错误是什么原因呢?视频已经播放出来了的。
谢谢!
你好;
你可以检查一下System_linkDelete 的link的注销的顺序,看是哪个link导致的;