1
mirror of https://github.com/mpv-player/mpv synced 2024-07-31 16:29:58 +02:00

pan&scan support with -vo xv by ?? <mplayer@svennevid.net>

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6305 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2002-06-04 20:17:07 +00:00
parent d20d9e132a
commit e598b63ddc
8 changed files with 50 additions and 2 deletions

View File

@ -57,6 +57,7 @@ extern int vo_gamma_green_intensity;
extern int vo_gamma_blue_intensity;
extern int vo_directrendering;
extern int vd_use_slices;
extern float vo_panscan;
#ifdef USE_OSD
extern int osd_level;
@ -238,6 +239,7 @@ static config_t mplayer_opts[]={
// wait for v-sync (vesa)
{"vsync", &vo_vsync, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"novsync", &vo_vsync, CONF_TYPE_FLAG, 0, 1, 0, NULL},
{"panscan", &vo_panscan, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL},
#ifdef HAVE_X11
// x11,xv,xmga,xvidix

View File

@ -65,6 +65,7 @@ static mp_cmd_t mp_cmds[] = {
#endif
{ MP_CMD_VO_FULLSCREEN, "vo_fullscreen", 0, { {-1,{0}} } },
{ MP_CMD_SCREENSHOT, "screenshot", 0, { {-1,{0}} } },
{ MP_CMD_PANSCAN, "panscan",1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
#ifdef HAVE_NEW_GUI
{ MP_CMD_GUI_LOADFILE, "gui_loadfile", 0, { {-1,{0}} } },
@ -243,6 +244,8 @@ static mp_cmd_bind_t def_cmd_binds[] = {
#endif
{ { 'f', 0 }, "vo_fullscreen" },
{ { 's', 0 }, "screenshot" },
{ { 'w', 0 }, "panscan -0.1" },
{ { 'e', 0 }, "panscan +0.1" },
{ { 0 }, NULL }
};

View File

@ -26,6 +26,7 @@
#define MP_CMD_SUB_POS 21
#define MP_CMD_DVDNAV 22
#define MP_CMD_SCREENSHOT 23
#define MP_CMD_PANSCAN 24
#define MP_CMD_GUI_EVENTS 5000
#define MP_CMD_GUI_LOADFILE 5001

View File

@ -74,6 +74,7 @@ extern void* vo_vobsub;
#define OSD_VOLUME 0x09
#define OSD_BRIGHTNESS 0x0A
#define OSD_HUE 0x0B
#define OSD_PANSCAN 0x50
#define OSD_PB_START 0x10
#define OSD_PB_0 0x11

View File

@ -56,6 +56,7 @@ int vo_doublebuffering = 0;
int vo_vsync = 0;
int vo_fs = 0;
int vo_fsmode = 0;
float vo_panscan = 0.0f;
int vo_pts=0; // for hw decoding
float vo_fps=0; // for mp1e rte

View File

@ -216,6 +216,7 @@ extern int vo_directrendering;
extern int vo_vsync;
extern int vo_fs;
extern int vo_fsmode;
extern float vo_panscan;
extern int vo_mouse_timer_const;

View File

@ -94,6 +94,10 @@ static uint32_t image_height;
static uint32_t image_format;
static int flip_flag;
static int panscan_x;
static int panscan_y;
static float panscan_amount;
static Window mRoot;
static uint32_t drwX,drwY,drwBorderWidth,drwDepth;
static uint32_t dwidth,dheight;
@ -334,6 +338,10 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
static uint32_t vm_height;
#endif
panscan_x = 0;
panscan_y = 0;
panscan_amount = 0.0f;
aspect_save_orig(width,height);
aspect_save_prescale(d_width,d_height);
@ -596,18 +604,31 @@ static void draw_osd(void)
static void flip_page(void)
{
if((vo_fs && (vo_panscan != panscan_amount)) || (!vo_fs && panscan_amount))
{
int panscan_area = (vo_screenheight-vo_dheight);
panscan_amount = vo_fs ? vo_panscan : 0;
panscan_x = panscan_area * panscan_amount * (image_width / (float)image_height);
panscan_y = panscan_area * panscan_amount;
XClearWindow(mDisplay, vo_window);
XFlush(mDisplay);
}
if ( Shmem_Flag )
{
XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf],
0, 0, image_width, image_height,
drwX,drwY,vo_dwidth,(vo_fs?vo_dheight - 1:vo_dheight),
drwX-(panscan_x>>1),drwY-(panscan_y>>1),vo_dwidth+panscan_x,(vo_fs?vo_dheight - 1:vo_dheight)+panscan_y,
False);
}
else
{
XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf],
0, 0, image_width, image_height,
drwX,drwY,vo_dwidth,(vo_fs?vo_dheight - 1:vo_dheight));
drwX-(panscan_x>>1),drwY-(panscan_y>>1),vo_dwidth+panscan_x,(vo_fs?vo_dheight - 1:vo_dheight)+panscan_y);
}
if (num_buffers>1){
current_buf=(current_buf+1)%num_buffers;

View File

@ -2544,6 +2544,24 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still)
#endif
if(video_out && vo_config_count) video_out->control(VOCTRL_FULLSCREEN, 0);
} break;
case MP_CMD_PANSCAN : {
int abs= cmd->args[1].v.i;
float v = cmd->args[0].v.f;
float res;
if(abs)
res = v;
else
res = vo_panscan+v;
vo_panscan = res > 1 ? 1 : res < 0 ? 0 : res;
#ifdef USE_OSD
if(osd_level){
osd_visible=sh_video->fps; // 1 sec
vo_osd_progbar_type=OSD_PANSCAN;
vo_osd_progbar_value=vo_panscan*256;
vo_osd_changed(OSDTYPE_PROGBAR);
}
#endif
} break;
case MP_CMD_SUB_POS:
{
int v;