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.

请教TI大神,关于DM8148 capture 8位视频码流的问题。谢谢!

使用8148自己做的板子,用的dvr_rdk的开发包。

硬件配置:

link创建部分代码如下:

void* videocap_create(int outwidth, int outheight, int videostd)
{
df_ctx *ctx = (df_ctx*)malloc(sizeof(df_ctx));

if(ctx == NULL) return NULL;


CaptureLink_CreateParams capturePrm;
NsfLink_CreateParams nsfPrm;
SwMsLink_CreateParams swMsPrm;
DisplayLink_CreateParams displayPrm;
// MergeLink_CreateParams mergePrm;
DupLink_CreateParams dupPrm;
SclrLink_CreateParams sclrPrm;

IpcFramesOutLinkRTOS_CreateParams ipcFramesOutVpssToHostPrm;
IpcFramesInLinkHLOS_CreateParams ipcFramesInHostPrm;
// IpcFramesOutLinkHLOS_CreateParams ipcFramesOutHostPrm;
// IpcFramesInLinkRTOS_CreateParams ipcFramesInVpssFromHostPrm;

CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;

UInt32 captureId, nsfId, swMsId, displayId, dupId, m3out, a8in, sclrId;
#ifdef A8_CONTROL_I2C
Device_Tw2964Handle tw2964handle;
#endif
System_init();

captureId = SYSTEM_LINK_ID_CAPTURE;
nsfId = SYSTEM_LINK_ID_NSF_0;
swMsId = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
displayId = SYSTEM_LINK_ID_DISPLAY_0;
dupId = SYSTEM_VPSS_LINK_ID_DUP_0;
m3out = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_1;
a8in = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
sclrId = SYSTEM_LINK_ID_SCLR_INST_0;


CaptureLink_CreateParams_Init(&capturePrm);
SwMsLink_CreateParams_Init(&swMsPrm);
DisplayLink_CreateParams_Init(&displayPrm);
NsfLink_CreateParams_Init(&nsfPrm);
IpcFramesOutLinkRTOS_CreateParams_Init(&ipcFramesOutVpssToHostPrm);
IpcFramesInLinkHLOS_CreateParams_Init(&ipcFramesInHostPrm);
SclrLink_CreateParams_Init(&sclrPrm);

capturePrm.numVipInst = 1;
capturePrm.outQueParams[0].nextLink = dupId;
capturePrm.tilerEnable = FALSE;
capturePrm.enableSdCrop = FALSE;

pCaptureInstPrm = &capturePrm.vipInst[0];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422I_UYVY;
pCaptureInstPrm->standard = videostd;
pCaptureInstPrm->numOutput = 1;

pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV420SP_UV;//old= SYSTEM_DF_YUV420SP_UV
pCaptureOutPrm->scEnable = TRUE;
pCaptureOutPrm->scOutWidth = outwidth;
pCaptureOutPrm->scOutHeight = outheight;
pCaptureOutPrm->outQueId = 0;

dupPrm.inQueParams.prevLinkId = captureId;
dupPrm.inQueParams.prevLinkQueId= 0;
dupPrm.outQueParams[0].nextLink = swMsId;
dupPrm.outQueParams[1].nextLink = m3out;
dupPrm.numOutQue = 2;
dupPrm.notifyNextLink = TRUE;

ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkId = dupId;
ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 1;
ipcFramesOutVpssToHostPrm.baseCreateParams.noNotifyMode = TRUE;
ipcFramesOutVpssToHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcFramesOutVpssToHostPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcFramesOutVpssToHostPrm.baseCreateParams.outQueParams[0].nextLink=a8in;

ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = m3out;
ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInHostPrm.baseCreateParams.noNotifyMode = TRUE;
ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
ipcFramesInHostPrm.exportOnlyPhyAddr = TRUE;

ipcFramesInHostPrm.cbCtx = ctx;
ipcFramesInHostPrm.cbFxn = frameincallback;


swMsPrm.inQueParams.prevLinkId = dupId;
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = displayId;
swMsPrm.numSwMsInst = 1;
// swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_DEI_SC;
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
swMsPrm.maxInputQueLen = 4;
swMsPrm.maxOutRes = VSYS_STD_1080P_60;
swMsPrm.numOutBuf = 8;
swMsPrm.lineSkipMode = TRUE;
swMsPrm.layoutPrm.outputFPS = 60;

Chains_swMsGenerateLayoutParams(0, 2, &swMsPrm);


displayPrm.inQueParams[0].prevLinkId = swMsId;
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.displayRes = swMsPrm.maxOutRes;

UInt32 displayRes[SYSTEM_DC_MAX_VENC] =
{VSYS_STD_1080P_60, //SYSTEM_DC_VENC_HDMI,
VSYS_STD_1080P_60, //SYSTEM_DC_VENC_HDCOMP,
VSYS_STD_1080P_60, //SYSTEM_DC_VENC_DVO2
VSYS_STD_NTSC //SYSTEM_DC_VENC_SD,
};

Chains_displayCtrlInit(displayRes);
#ifdef A8_CONTROL_I2C
{
Int32 status = 0;
Device_VideoDecoderChipIdParams vidDecChipIdArgs;
Device_VideoDecoderChipIdStatus vidDecChipIdStatus;
VCAP_VIDEO_SOURCE_STATUS_PARAMS_S videoStatusArgs;
VCAP_VIDEO_SOURCE_CH_STATUS_S videoStatus;

Device_VideoDecoderCreateParams createArgs;
Device_VideoDecoderCreateStatus createStatusArgs;

Device_VideoDecoderVideoModeParams vidDecVideoModeArgs;

/* Initialize and create video decoders */
Device_tw2964Init();

memset(&createArgs, 0, sizeof(Device_VideoDecoderCreateParams));

createArgs.deviceI2cInstId = 0;
createArgs.numDevicesAtPort = 1;
createArgs.deviceI2cAddr[0] = Device_getVidDecI2cAddr(
DEVICE_VID_DEC_TW2964_DRV,
0);
createArgs.deviceResetGpio[0] = DEVICE_VIDEO_DECODER_GPIO_NONE;

tw2964handle = Device_tw2964Create( DEVICE_VID_DEC_TW2964_DRV,
0, // instId - need to change
&(createArgs),
&(createStatusArgs));


vidDecChipIdArgs.deviceNum = 0;

/* Configure video decoder */

memset(&vidDecVideoModeArgs,0, sizeof(Device_VideoDecoderVideoModeParams));

vidDecVideoModeArgs.videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_16BIT;//old= DEVICE_CAPT_VIDEO_IF_MODE_16BIT;
vidDecVideoModeArgs.videoDataFormat =SYSTEM_DF_YUV422P;//old= SYSTEM_DF_YUV422P;
vidDecVideoModeArgs.standard =SYSTEM_STD_1080P_60;//old= SYSTEM_STD_1080P_60;
vidDecVideoModeArgs.videoCaptureMode =DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC; //old= DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs.videoSystem =DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_NONE;//old= DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_NONE;
vidDecVideoModeArgs.videoCropEnable = FALSE;
vidDecVideoModeArgs.videoAutoDetectTimeout = -1;

status = Device_tw2964Control(tw2964handle,IOCTL_DEVICE_VIDEO_DECODER_SET_VIDEO_MODE,&vidDecVideoModeArgs,NULL);

}
ctx->tw2964handle=tw2964handle;

#endif
System_linkCreate (captureId, &capturePrm, sizeof(capturePrm));
printf(" capture link created! \r\n");

//System_linkControl(captureId, CAPTURE_LINK_CMD_CONFIGURE_VIP_DECODERS, NULL, 0, TRUE);
//System_linkCreate(sclrId, &sclrPrm, sizeof(sclrPrm));
//System_linkCreate(nsfId , &nsfPrm, sizeof(nsfPrm));
System_linkCreate(dupId, &dupPrm, sizeof(dupPrm));
System_linkCreate(m3out, &ipcFramesOutVpssToHostPrm, sizeof(ipcFramesOutVpssToHostPrm));
System_linkCreate(a8in, &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));
System_linkCreate(swMsId , &swMsPrm, sizeof(swMsPrm));
System_linkCreate(displayId, &displayPrm, sizeof(displayPrm));

ctx->captureId = captureId;
ctx->swMsId = swMsId;
ctx->sclrId = sclrId;
ctx->nsfId = nsfId;
ctx->displayId = displayId;
ctx->dupId = dupId;
ctx->m3out = m3out;
ctx->a8in = a8in;

dframe_createFrameThread(ctx);
return ctx;
}

目前纠结在pCaptureInstPrm->inDataFormat的配置问题。根据TW2964的手册,输出的码流如下:

感觉inDataFormat应该配成SYSTEM_DF_YUV422I_UYVY,但是这样配,在System_linkCreate (captureId, &capturePrm, sizeof(capturePrm));的时候,会提示[m3vpss ]  17125: Assertion @ Line: 742 in links_m3vpss/capture/captureLink_drv.c: pInst->captureVipHandle != NULL : failed !!!

我尝试了各种格式,只有inDataFormat= SYSTEM_DF_YUV422P时可以建立capturelink并能运行。但是这种情况又有2个问题:

1)SYSTEM_DF_YUV422P定义是YUV 422 Planar - Y, U and V separate,我理解应该是24bit,YUV各占8bit,与我用的8bit 656格式不相符。我理解的是不是错了?到底应该配成哪一种?

2)这样配置虽然可以运行,但会不停地报输入口overflow,而且输出的HDMI断也是偶尔才能看见图像,并且图像是静止的。