📄 vpp.c
字号:
#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 + -