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

📄 vpp.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"
#include "regmap.h"
#include "global.h"
#include "avd.h"

#include "vpp.h"
#include "set.h"
#include "fs9660.h"



#if 0
typedef struct
{
    UINT16  vint;
    UINT8   hexp;
}
t_hv_factor;

// for soure res(0:4), Aspect, TV, Zoom(0:6)
static const t_hv_factor hv_factors[5][2][2][7] = {
    {
     // b
     {
        {                                                       // res:720x480, 4:3, NTSC
//            {VINT_0_750, HEXP_1_000}, // lb test
         {VINT_1_000, HEXP_1_000},
         {VINT_1_000, HEXP_1_000},
         {VINT_1_200, HEXP_1_200},
         {VINT_1_600, HEXP_1_600},
         {VINT_2_000, CIF_ENABLE},
         {VINT_3_000, CIF_ENABLE + HEXP_1_500},
         {VINT_4_000, CIF_ENABLE + HEXP_2_000}
         },
        {                                                       // res:720x480, 4:3, PAL
         {VINT_1_200, HEXP_1_000},
         {VINT_1_200, HEXP_1_000},
         {VINT_1_440, HEXP_1_200},
         {VINT_1_920, HEXP_1_600},
         {VINT_2_400, CIF_ENABLE},
         {VINT_3_600, CIF_ENABLE + HEXP_1_500},
         {VINT_4_800, CIF_ENABLE + HEXP_2_000}
         }
        },
     // a
     {
        {                                                       // res:720x480, 16:9, NTSC
         {VINT_0_750, HEXP_1_000},
         {VINT_1_000, HEXP_1_333},
         {VINT_1_200, HEXP_1_600},
         {VINT_1_600, CIF_ENABLE + HEXP_1_067},
         {VINT_2_000, CIF_ENABLE + HEXP_1_333},
         {0, 0},
         {0, 0}
         },
        {                                                       // res:720x480, 16:9, PAL
         {VINT_0_900, HEXP_1_000},
         {VINT_1_200, HEXP_1_333},
         {VINT_1_440, HEXP_1_600},
         {VINT_1_920, CIF_ENABLE + HEXP_1_067},
         {VINT_2_400, CIF_ENABLE + HEXP_1_333},
         {0, 0},
         {0, 0}
         }
        }
     }
};

#define SOURCE_X(res)   ((res == 0) ? 720 :  \
                        ((res == 1) ? 704 : \
                        ((res == 2) ? 352 : \
                        ((res == 3) ? 352 : 480))))
#define SOURCE_Y(res, tv)  \
   ((res == 3) ? (tv == 0 ? 240 : 288) : (tv == 0 ? 480 : 576))

typedef struct
{
    UINT8   req_dis:1;
    UINT8   single_mode:1;
    UINT8   single_field:1;
    UINT8   cintmode:1;
    UINT8   framedisp:1;
    UINT8   fexc:1;

    UINT16  vfactor:10;
    UINT16  init_accu:9;
    UINT8   offset_value:6;
    UINT8   repeat_first:1;

    UINT16  dis_x_start:11;
    UINT16  dis_y_start:10;
    UINT16  dis_x_size:11;
    UINT16  dis_y_size:10;

    UINT8   cif_enable:1;
    UINT8   hexp_enable:1;
    UINT8   hfactor:8;

    UINT8   line_offset:8;
    UINT8   pix_offset:8;

    INT16   y_offset:9;
    INT8    cb_offset:8;
    INT8    cr_offset:8;
}
t_vpp_reg;

t_vpp_reg vpp_reg;



void setVPP_DoIt(void)
{
    UINT32  u;

    // 1. decide param

    // 2. write to the register
    regs0->dis_x_start = vpp_reg.dis_x_start;
    regs0->dis_y_start = vpp_reg.dis_y_start;
    regs0->dis_x_size = vpp_reg.dis_x_size;
    regs0->dis_y_size = vpp_reg.dis_y_size;
    regs0->v_filter_mode = u =
        VINT_ENCODE(vpp_reg.vfactor, vpp_reg.offset_value);
    psprintf(linebuf, "setv %x\n", u);
    epp_write(linebuf);
    regs0->field_exchange =
        (vpp_reg.single_field << 15) |
        (vpp_reg.init_accu << 6) |
        (vpp_reg.repeat_first << 5) |
        (vpp_reg.req_dis << 4) |
        (vpp_reg.single_mode << 3) |
        (vpp_reg.fexc << 2) | (vpp_reg.cintmode << 1) | (vpp_reg.framedisp << 0);
    regs0->h_exp_mode =
        (vpp_reg.cif_enable << 9) |
        (vpp_reg.hexp_enable << 8) | (vpp_reg.hfactor << 0);
    regs0->dis_offset = (vpp_reg.line_offset << 8) | (vpp_reg.pix_offset << 0);
    regs0->luma_offset = vpp_reg.y_offset;
    regs0->chroma_offset = (vpp_reg.cb_offset << 8) | (vpp_reg.cr_offset << 0);

#if 0
    printf(" vf %04x\n", (vpp_reg.offset_value << 10) | vpp_reg.vfactor);
    printf(" hf %04x\n",
                 (vpp_reg.cif_enable << 9) |
                 (vpp_reg.hexp_enable << 8) | (vpp_reg.hfactor << 0));
    printf(" dis_x_size %04x\n", vpp_reg.dis_x_size);
    printf(" dis_y_size %04x\n", vpp_reg.dis_y_size);
#endif
}

void setVPP_VideoOn(void)
{
    vpp_reg.req_dis = 0;
}

void setVPP_VideoOff(void)
{
    vpp_reg.req_dis = 1;
}

void setVPP_LineRepeat(void)
{
    vpp_reg.cintmode = 0;
}

void setVPP_FieldRepeat(void)
{
    vpp_reg.cintmode = 1;
}

void setVPP_FieldDisplay(void)
{
    vpp_reg.framedisp = 0;
}

void setVPP_FrameDisplay(void)
{
    vpp_reg.framedisp = 1;
}

static UINT8 source_res;
static UINT8 aspect_ratio;
static UINT8 tv_system;
static UINT8 display_mode;

static void setVPP_HV(t_hv_factor f)
{
    vpp_reg.vfactor = f.vint & 0x03FF;
    vpp_reg.offset_value = f.vint >> 10;

    if((f.hexp & CIF_ENABLE) != 0)
        vpp_reg.cif_enable = 1;
    else
        vpp_reg.cif_enable = 0;

    vpp_reg.hfactor = f.hexp & 0x7F;
    if(vpp_reg.hfactor != 0)
        vpp_reg.hexp_enable = 1;
    else
        vpp_reg.hexp_enable = 0;

}

void setVPP_ParamInit(UINT8 res, UINT8 aspect, UINT8 tv)
{
    source_res = res;
    aspect_ratio = aspect;
    tv_system = tv;
    vpp_reg.dis_x_start = 0;
    vpp_reg.dis_y_start = 0;
    vpp_reg.fexc = 1;
    setVPP_Display(DISPLAY_NORMAL);
}

void setVPP_Display(int mode)
{
    regs0->field_exchange = 0;

    display_mode = mode;
    setVPP_HV(hv_factors[source_res][aspect_ratio][tv_system][mode]);

    vpp_reg.line_offset = 0;
    switch (mode)
    {
        case 0:
            vpp_reg.dis_x_size = SOURCE_X(source_res);
            vpp_reg.dis_y_size = SOURCE_Y(source_res, tv_system) - 3;
            //if (aspect_ratio != 0) // lb test
            //   vpp_reg.line_offset = tv_system ? 36 : 30;
            break;
        case 1:
            vpp_reg.dis_x_size = SOURCE_X(source_res);
            vpp_reg.dis_y_size = SOURCE_Y(source_res, tv_system);
            break;
        case 2:
            vpp_reg.dis_x_size = (SOURCE_X(source_res) - 32) / 1.2;
            vpp_reg.dis_y_size = SOURCE_Y(source_res, tv_system) / 1.2;
            break;
        case 3:
            vpp_reg.dis_x_size = (SOURCE_X(source_res) - 32) / 1.6;
            vpp_reg.dis_y_size = SOURCE_Y(source_res, tv_system) / 1.6;
            break;
        case 4:
            vpp_reg.dis_x_size = (SOURCE_X(source_res) - 32) / 2;
            vpp_reg.dis_y_size = SOURCE_Y(source_res, tv_system) / 2;
            break;
    }

    if(vpp_reg.dis_x_size + vpp_reg.dis_x_start > SOURCE_X(source_res))
        vpp_reg.dis_x_size = SOURCE_X(source_res) - vpp_reg.dis_x_start;

    if(vpp_reg.dis_y_size + vpp_reg.dis_y_start >
         SOURCE_Y(source_res, tv_system))
        vpp_reg.dis_y_size =
            SOURCE_Y(source_res, tv_system) - vpp_reg.dis_y_start;
}

/* jj need to save the default mode(LB or PS) */
void setVPP_ZoomIn(void)
{
    if(display_mode != DISPLAY_ZOOM_MAX)
        display_mode++;
    setVPP_Display(display_mode);
}

void setVPP_ZoomOut(void)
{
    if(display_mode != DISPLAY_NORMAL)
        display_mode--;
    setVPP_Display(display_mode);
    if(display_mode == DISPLAY_NORMAL)
    {
        vpp_reg.dis_x_start = 0;
        vpp_reg.dis_y_start = 0;
    }
}

void setVPP_Pan(UINT8 dir, UINT16 size)
{
    switch (dir)
    {
        case PAN_UP:
            if(vpp_reg.dis_y_start > size)
            {
                vpp_reg.dis_y_start -= size;
            }
            else
                vpp_reg.dis_y_start = 0;
            break;
        case PAN_DOWN:
            vpp_reg.dis_y_start += size;
            break;
        case PAN_RIGHT:
            vpp_reg.dis_x_start += size;
            break;
        case PAN_LEFT:
            if(vpp_reg.dis_x_start > size)
            {
                vpp_reg.dis_x_start -= size;
            }
            else
                vpp_reg.dis_x_start = 0;
            break;
    }
    setVPP_Display(display_mode);
}


void vpp_start()
{
}
#endif

/*
** FUNCTION
** vpp_set_pic(int w, int h)
**
** DESCRIPTION
** setup picture display parameter according to following information
**
**  width of picture
**  height of picture
**  vpp_zoom
**  vpp_zoom_x
**  vpp_zoom_y
**
** REFERENCE
**  vpp_zoom    : 1:x1 2:x2 3:x4 4:x8
**  vpp_zoom_x  : starting display X
**  vpp_zoom_y  : starting display Y
**
*/

#define TV_WIDTH    704
#define TV_HEIGHT   ((IsAVDDisplayNTSC())? 480:576)


/*
** VPP controls
*/
#define FILTER_HEXP8            (RF_H_EXP_8_1)
#define FILTER_HEXP4            (RF_H_EXP_4_1)
#define FILTER_HEXP2            (RF_H_EXP_2_1)
#define FILTER_HEXP3_2          (RF_H_EXP_3_2)
#define FILTER_HEXP1            (RF_H_EXP_1_1)


enum
{
    ZOOM_X_x3_2 = -1,
    ZOOM_X_x1 = 1,
    ZOOM_X_x2 = 2,
    ZOOM_X_x4 = 4,
    ZOOM_X_x8 = 8,
};

enum
{
    ZOOM_Y_x1 = 1,
    ZOOM_Y_x2 = 2,
    ZOOM_Y_x4 = 4,
    ZOOM_Y_x8 = 8,
};

void vpp_set_pic(int width, int height)
{
	
#ifdef SAMSUNG_SERVO
////#ifdef MUTESERVO_HARDWARE    
#ifdef NEW_HARDWARE          //2003.04.21 rbhung for Samsung new harware

⌨️ 快捷键说明

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