diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 4f78f7de0a..0f84cec7b8 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -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 diff --git a/input/input.c b/input/input.c index 88e3ae0206..16899f62fd 100644 --- a/input/input.c +++ b/input/input.c @@ -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 } }; diff --git a/input/input.h b/input/input.h index 221c729859..462c142b62 100644 --- a/input/input.h +++ b/input/input.h @@ -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 diff --git a/libvo/sub.h b/libvo/sub.h index c15a2a99d0..6305531176 100644 --- a/libvo/sub.h +++ b/libvo/sub.h @@ -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 diff --git a/libvo/video_out.c b/libvo/video_out.c index 3a15467771..d1d0ae0c92 100644 --- a/libvo/video_out.c +++ b/libvo/video_out.c @@ -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 diff --git a/libvo/video_out.h b/libvo/video_out.h index 1490048c72..d3777d0088 100644 --- a/libvo/video_out.h +++ b/libvo/video_out.h @@ -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; diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c index 34ce3115a6..39b087cf42 100644 --- a/libvo/vo_xv.c +++ b/libvo/vo_xv.c @@ -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; diff --git a/mplayer.c b/mplayer.c index 414f0e36ed..226c42beac 100644 --- a/mplayer.c +++ b/mplayer.c @@ -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;