大家好,
我正在使用dvsdk-demos_4_02_00_01学习视频显示,有一个地方有个疑问:
在文件:ui.c
函数:UI_create
理解:对函数的理解大体如下注释描述。
疑问:如果在attrs->osd为1,到底是否使能了设备的osd功能呢?从代码看,只是将系统一些统计信息UI_update()到了管道里面。管道的另一端在哪里呢?
/******************************************************************************
* UI_create
******************************************************************************/
UI_Handle UI_create(UI_Attrs *attrs)
{
Display_Attrs aAttrs = Display_Attrs_DM365_ATTR_DEFAULT;
UI_Handle hUI;
hUI = calloc(1, sizeof(UI_Object));//此处为对象分配空间
if (hUI == NULL) {
ERR("Failed to allocate space for UI Object\n");
return NULL;
}
hUI->osd = attrs->osd;
hUI->videoStd = attrs->videoStd;
if (!attrs->osd) {//如果osd不使能,则创建fb视频设备,并且将OSD清零。
aAttrs.videoStd = hUI->videoStd;
/* Create display device driver instance */
if ( (aAttrs.videoStd == VideoStd_CIF) ||
(aAttrs.videoStd == VideoStd_SIF_NTSC) ||
(aAttrs.videoStd == VideoStd_SIF_PAL) ||
(aAttrs.videoStd == VideoStd_VGA) ||
(aAttrs.videoStd == VideoStd_D1_NTSC) ||
(aAttrs.videoStd == VideoStd_D1_PAL) ) {
aAttrs.videoOutput = Display_Output_COMPOSITE;
}
else {
aAttrs.videoStd = VideoStd_576P;
aAttrs.videoOutput = Display_Output_COMPONENT;
}
hUI->hAttr = Display_create(NULL, &aAttrs);
if (hUI->hAttr == NULL) {
ERR("Failed to create attribute window device\n");
cleanupUI(hUI);
return NULL;
}
/* Clear the OSD if using keyboard interface */
setOsdTransparency(hUI, 0);
}
/* Create the FIFOs if it does not exist */
if (attrs->osd) {
umask(0);
mknod(CMD_FIFO_FILE, S_IFIFO|0666, 0);
mknod(CONFIG_FIFO_FILE, S_IFIFO|0666, 0);
mknod(KB_CMD_FIFO_FILE, S_IFIFO|0666, 0);
mknod(STATUS_FIFO_FILE, S_IFIFO|0666, 0);
hUI->fpCmd = fopen(CMD_FIFO_FILE, "r");//这个代码有疑问,使用这个程序执行此处会挂在这里。修改为open非阻塞打开,则可以继续往后走。
hUI->fpConfig = fopen(CONFIG_FIFO_FILE, "r");
hUI->fpKbCmd = fopen(KB_CMD_FIFO_FILE, "w");
hUI->fpStatus = fopen(STATUS_FIFO_FILE, "w");
if ((hUI->fpCmd == NULL) || (hUI->fpConfig == NULL) ||
(hUI->fpKbCmd == NULL) || (hUI->fpStatus == NULL)) {
ERR("Failed to open pipes\n");
cleanupUI(hUI);
return NULL;
}
setvbuf(hUI->fpCmd, NULL, _IONBF, 0);//清FIFO
setvbuf(hUI->fpConfig, NULL, _IONBF, 0);
setvbuf(hUI->fpKbCmd, NULL, _IONBF, 0);
setvbuf(hUI->fpStatus, NULL, _IONBF, 0);
}
return hUI;
}