DM648的VP1作为视频采集口,VP2作为视频显示口,框图如下:
时钟芯片供给TVP5154时钟为14.3M,供给SAA7105时钟为27M,TVP5154输出PORT_CLK给DM648的VP1采集口时钟为27M,时钟芯片供给VP2显示口时钟为27M。
代码基本仿照C:\dvsdk_1_11_00_00_DM648\examples\video_preview\evmDM648下面的video_preview.c来写,大致如下:
VOID DM648_VideoCapAndDisplay(VOID)
{
capChan = FVID_create("/VP1CAPTURE/A/2", IOM_INPUT, &status, (Ptr)&vCapParamsChan, NULL);
disChan = FVID_create("/VP2DISPLAY/SAA7105", IOM_OUTPUT, &status, (Ptr)&vDisParamsChan, NULL);
Cap和dis分别循环三次分配buffer并填入相应队列
status = FVID_allocBuffer(capChan, &frameBuffPtr);
status = FVID_queue(capChan, &frameBuffPtr);
status = FVID_allocBuffer(disChan, &frameBuffPtr);
status = FVID_queue(disChan, &frameBuffPtr);
/* Configure external video encoders (SAA7105) & decoders (TVP5154) */
/* Configure SAA7105 */
status |= FVID_control(disChan,
VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&vDisParamsEncoder);
/* Configure TVP5154 */
status |= FVID_control(capChan,
VPORT_CMD_EDC_BASE + EDC_CONFIG,
(Ptr)&vCapParamsDecoder);
/* start capture & display operation */
status |= FVID_control(disChan, VPORT_CMD_START, NULL);
status |= FVID_control(capChan, VPORT_CMD_START, NULL);
/* grab first buffer from input queue */
status = FVID_dequeue(disChan, &frameBuffPtr);
/* loop forever performing video capture and display */
while (status == 0) {
/* grab a fresh video input frame */
FVID_exchange(capChan, &frameBuffPtr);
/* display the video frame */
FVID_exchange(disChan, &frameBuffPtr);
}
}
视频口参数配置也是按照TI例程video_preview.c,如下:
static VPORTCAP_Params vCapParamsChan = CAP_PARAMS_CHAN_BT656_DEFAULT(PAL);
/* TVP5154 EDC driver configuration.Using embedded sync and Composite Analog Channel A for all 8 decoders */
static TVP5154_ConfParams vCapParamsDecoder[MAX_CAP_CHAN] = {
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A),
CAP_PARAMS_TVP5154_EMBEDDED_DEFAULT(PAL, COMPOSITE_A)
};
/* Vport Display driver configuration.Using embedded sync */
static VPORTDIS_Params vDisParamsChan = DIS_PARAMS_CHAN_BT656_DEFAULT(PAL);
/* SAA7105 EDC driver configuration.Using Svideo Analog output */
static SAA7105_ConfParams vDisParamsEncoder = DIS_PARAMS_SAA7105_SDTV_EMBEDDED_DEFAULT(PAL720, SVIDEO);
现在问题是代码走到红色处FVID_dequeue(disChan, &frameBuffPtr)时就出问题,display的chan->qOut链为空,导致_cmdDequeue函数中的if ((viop = (FVID_Frame *)QUE_dequeue(&chan->qOut)) != (FVID_Frame *)& chan->qOut)表达式不满足进而返回retVal = packet->status = IOM_PENDING; 求指导啊~~~~~