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.

求助:有关DM368 DVSDK包的OSD疑问



大家好,

    我正在使用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;
}