⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osd.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 C
📖 第 1 页 / 共 5 页
字号:
    regs0->tlink_addr = region[0].osd_header[0];
    regs0->blink_addr = region[0].osd_header[1];
    regs0->osd_en = 1;

#if CONFIG==CONFIG_COMBO_SVCD
    if(tv_wait_sync)
        WAIT_VSYNC;                                 //this action become effective when vsync only
#endif
}

//function: create region for interlace mode
//
//Note: the osd create region is addition the color mode for create
void osd_create_region(t_osd_region * p, int X, int Y, t_osd_region * prev,
                                             BYTE bColorMode, BYTE bScanMode)
{
    BYTE   *ofrom = get_osdbuf_baseptr();
    BYTE   *obase;
    UINT16 *pa;
    UINT32  linkaddr;
    int     W, H, pn;
    int     j, i;

    W = p->osd_w / 4;                           //width must times of 4         

    if(bScanMode == OSD_NONINTERLACED)  //jhuang non-interlaced
        H = p->osd_h;                               //bottom same to Top  
    else
        H = p->osd_h / 2;                       //Top + bottom  

    for(i = 0; i < 2; i++)
    {
        obase = ofrom + (osd_free << 5);

        //buffer must in 32 aligment
        p->osd_header[i] = osd_free;

        // get prev link address (for header generation)
        linkaddr = (prev == NULL) ? LINK_NULL : prev->osd_header[i];
        p->osd_format = bColorMode;

        //setup header
        switch (bColorMode)
        {
            case OSD_FORMAT_4COLOR:
#if 0
                //if(IsKYSetup())
                //{
                // wbe32 (obase + 0,osd_header_hi (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 4,linkaddr));
                // wbe32 (obase + 4,osd_header_lo (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 4,linkaddr)); 
                // pn=4;
                //     pa = (UINT16 *) palette_4color_setup;                                  
                // }
                //else
                // {
                // wbe32 (obase + 0,osd_header_hi (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 15,linkaddr));
                // wbe32 (obase + 4,osd_header_lo (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 15,linkaddr)); 
                // pn=4;
                //     pa = (UINT16 *) palette_4color;
                // }
#endif

                /* blending*VIDEO+(15-blending)*OSD */
                #ifdef OSD_SHADE
                
                wbe32(obase + 0, osd_header_hi(1, W, H, Y, X, 0, OSD_CLUT_4, 
                    (IsNM9frame()||IsNMPreview())? 0 : 2,//8//jhuang 2002/12/2獺紈
                                                        (IsKYSetup()? 4 : 14), linkaddr));
                wbe32(obase + 4, osd_header_lo(1, W, H, Y, X, 0, OSD_CLUT_4, 
                    (IsNM9frame()||IsNMPreview())? 0 : 2,//8//jhuang 2002/12/2獺紈
                                                        (IsKYSetup()? 4 : 14), linkaddr));
                #else
                
                wbe32(obase + 0, osd_header_hi(1, W, H, Y, X, 0, OSD_CLUT_4, 12,
                                                        (IsKYSetup()? 4 : 15), linkaddr));
                wbe32(obase + 4, osd_header_lo(1, W, H, Y, X, 0, OSD_CLUT_4, 12,
                                                        (IsKYSetup()? 4 : 15), linkaddr));
                #endif          
                                            
                pn = 4;

                if(IsKYSetup())
                    pa = (UINT16 *) palette_4color_setup;
                else
                    pa = (UINT16 *) palette_4color;

                break;
            default:                                    // 16color ,width X 2
                wbe32(obase + 0,
                            osd_header_hi(1, W, H, Y, X, 1, OSD_CLUT_16, 12, 4, linkaddr));
                wbe32(obase + 4,
                            osd_header_lo(1, W, H, Y, X, 1, OSD_CLUT_16, 12, 4, linkaddr));
                pn = 16;
                pa = (UINT16 *) palette_16color;
                break;
        }
        obase += 8;                                 // skip header region

        //put color
        do
        {
            wbe16(obase, *pa);
            obase += 2;
            pa++;
        }
        while(--pn > 0);

        // clear OSD bitmap content
        for(pn = H; pn > 0; pn--)
        {
            for(j = 0; j < W; j++)
                ((UINT32 *) obase)[j] = 0;

            //next line     
            obase += (W << 2);
        }

        //aligment buffer on 32 byte start
        osd_free = ((obase - ofrom) + 31) / 32;

        //if on non-interface mode , display become top line= bottom line
        if(bScanMode == OSD_NONINTERLACED)
        {
            p->osd_header[1] = p->osd_header[0];
            break;
        }
    }
}

/*
**
*/
void InitSW_region(void)
{
    UINT8   i, j;

    //clear old message
    for(i = 0; i < MAX_REGION; i++)
        for(j = 0; j < MAX_SW_REGION; j++)
            RegionStr[i][j][0] = 0;
}


/*
** FUNCTION
** osd_init
** 
** DESCRIPTION
** initialize osd-printing function
*/

/*
** DVD version
**  
*/

#ifndef SUPPORT_OSD_AUTO_INIT
void osd_init(void)
{
    osd_disable();

    // setup first free address   
    osd_free = addr_vxvy(0, 0);

    // setup region 2 //56:interlaced;80:non-interlaced            
    region[2].osd_w = 35 * 4;           //min 16*4 for vol control bar
    region[2].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[2], 32, 80, NULL /*&region[3] */ ,
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 1 //40:interlaced;52:non-interlaced            
    region[1].osd_w = 35 * 4;           //min 10*4 for vol control char
    region[1].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[1], 32, 52, &region[2], OSD_FORMAT_4COLOR,
                                        OSD_NONINTERLACED);

    // setup region 0   //24:interlaced/non-interlaced           
    region[0].osd_w = 13 * 4;           //min 8*4 for time display//BYTE PER PIXEL
    region[0].osd_h = OSD_FONT_HEIGHT;  //PIXEL
    osd_create_region(&region[0], 32, 24, &region[1], OSD_FORMAT_4COLOR,
                                        OSD_NONINTERLACED);


#ifdef  MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
    if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
    {
        psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init).... %x(%x)\n",
                         addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
        epp_write_slow(linebuf);
    }
#else
    if((int)addr_vy(osd_free) >= (int)OBV_H)
    {
        psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init).... %x(%x)\n",
                         addr_vy(osd_free), OBV_H);
        epp_write_slow(linebuf);
    }
#endif
#endif


    ClearOsdMsg(0);
    osd_enable();
}

/*
**
*/
void osd_init_preview(void)
{
#include "avd.h"                                //jhuang 2002/3/10

    osd_disable();

    // setup first free address   
    osd_free = addr_vxvy(0, 0);

#if CONFIG==CONFIG_COMBO_SVCD
    // setup region 2 //56:interlaced;80:non-interlaced            
    region[4].osd_w = 25 * 4 + 4;   //30 * 4;//min 16*4 for vol control bar
    region[4].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[4], 35 /*78 */ , (IsAVDDisplayPAL()? 254 : 204),
                                        NULL, OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 2 //56:interlaced;80:non-interlaced            
    region[3].osd_w = 25 * 4 + 4;   //30 * 4;//min 16*4 for vol control bar
    region[3].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[3], 35 /*78 */ , (IsAVDDisplayPAL()? 175 : 138),
                                        &region[4], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 3 //56:interlaced;80:non-interlaced            
    region[2].osd_w = 25 * 4 + 4;   //30 * 4;//min 16*4 for vol control bar
    region[2].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[2], 35 /*78 */ , (IsAVDDisplayPAL()? 96 : 72),
                                        &region[3], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 1 //40:interlaced;52:non-interlaced            
    region[1].osd_w = 14 * 4;           //min 10*4 for vol control char
    region[1].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[1], 32, (IsAVDDisplayPAL()? 52 : 40), &region[2],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 0   //24:interlaced/non-interlaced           
    region[0].osd_w = 8 * 4;            //min 8*4 for time display//BYTE PER PIXEL
    region[0].osd_h = OSD_FONT_HEIGHT;  //PIXEL
    osd_create_region(&region[0], 32, (IsAVDDisplayPAL()? 24 : 12), &region[1],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
#else
    // setup region 2 //56:interlaced;80:non-interlaced            
    region[4].osd_w = 25 * 4;           //30 * 4;//min 16*4 for vol control bar
    region[4].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[4], 78, (IsAVDDisplayPAL()? 270 : 219), NULL,
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 2 //56:interlaced;80:non-interlaced            
    region[3].osd_w = 25 * 4;           //30 * 4;//min 16*4 for vol control bar
    region[3].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[3], 78, (IsAVDDisplayPAL()? (180 + 3) : 147),
                                        &region[4], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);


    // setup region 3 //56:interlaced;80:non-interlaced            
    region[2].osd_w = 25 * 4;           //30 * 4;//min 16*4 for vol control bar
    region[2].osd_h = 8;                    //OSD_FONT_HEIGHT;
    osd_create_region(&region[2], 78, (IsAVDDisplayPAL()? (100 - 2) : 75),
                                        &region[3], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 1 //40:interlaced;52:non-interlaced            
    region[1].osd_w = 14 * 4;           //min 10*4 for vol control char
    region[1].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[1], 32, (IsAVDDisplayPAL()? 52 : 48), &region[2],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
    // setup region 0   //24:interlaced/non-interlaced           
    region[0].osd_w = 8 * 4;            //min 8*4 for time display//BYTE PER PIXEL
    region[0].osd_h = OSD_FONT_HEIGHT;  //PIXEL
    osd_create_region(&region[0], 32, (IsAVDDisplayPAL()? 24 : 20), &region[1],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
#endif

#ifdef    MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
    if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
    {
        psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_preview).... %x(%x)\n",
                         addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
        epp_write_slow(linebuf);
    }
#else
    if((int)addr_vy(osd_free) >= (int)OBV_H)
    {
        psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_preview).... %x(%x)\n",
                         addr_vy(osd_free), OBV_H);
        epp_write_slow(linebuf);
    }
#endif
#endif

    ClearOsdMsg(0);
    osd_enable();
}

//
// FUNCTION
// osd_init_prog
// 
// DESCRIPTION
// initialize osd program menu
//
void osd_init_prog(void)
{
    osd_disable();

    // setup first free address
    osd_free = addr_vxvy(0, 0);

    //MAX creation
    //region[0].osd_w = 14 * 4;
    //region[0].osd_h = 6 * OSD_FONT_HEIGHT;

    // setup region 7   
    region[7].osd_w = 10 * 4;
    region[7].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[7], 110, 80 + (OSD_FONT_HEIGHT * 5), NULL,
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);


    // setup region 6   
    region[6].osd_w = 10 * 4;
    region[6].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[6], 110, 80 + (OSD_FONT_HEIGHT * 4), &region[7],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);


// setup region 5   
    region[5].osd_w = 10 * 4;
    region[5].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[5], 110, 80 + (OSD_FONT_HEIGHT * 3), &region[6],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

// setup region 4   
    region[4].osd_w = 10 * 4;
    region[4].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[4], 110, 80 + (OSD_FONT_HEIGHT * 2), &region[5],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

// setup region 3   
    region[3].osd_w = 10 * 4;
    region[3].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[3], 110, 80 + (OSD_FONT_HEIGHT * 1), &region[4],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 2   
    region[2].osd_w = 10 * 4;
    region[2].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[2], 110, 80 + (OSD_FONT_HEIGHT * 0), &region[3],
                                        OSD_FORMAT_4COLOR, OSD_NONINTERLACED);

    // setup region 1 //40:interlaced;52:non-interlaced            
    region[1].osd_w = 14 * 4;           //min 10*4 for vol control char
    region[1].osd_h = OSD_FONT_HEIGHT;
    osd_create_region(&region[1], 32, 52, &region[2], OSD_FORMAT_4COLOR,
                                        OSD_NONINTERLACED);
    // setup region 0   //24:interlaced/non-interlaced           
    region[0].osd_w = 8 * 4;            //min 8*4 for time display//BYTE PER PIXEL
    region[0].osd_h = OSD_FONT_HEIGHT;  //PIXEL
    osd_create_region(&region[0], 32, 24, &region[1], OSD_FORMAT_4COLOR,
                                        OSD_NONINTERLACED);


#ifdef    MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
    if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
    {
        psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_prog).... %x(%x)\n",
                         addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
        epp_write_slow(linebuf);
    }
#else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -