changeset 6304:ee65527096c2

pan&scan support with -vo xv by ?? <mplayer@svennevid.net>
author arpi
date Tue, 04 Jun 2002 20:17:07 +0000
parents ad98962908ac
children bd8e39725cfd
files cfg-mplayer.h input/input.c input/input.h libvo/sub.h libvo/video_out.c libvo/video_out.h libvo/vo_xv.c mplayer.c
diffstat 8 files changed, 50 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/cfg-mplayer.h	Tue Jun 04 20:12:34 2002 +0000
+++ b/cfg-mplayer.h	Tue Jun 04 20:17:07 2002 +0000
@@ -57,6 +57,7 @@
 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 @@
 	// 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
--- a/input/input.c	Tue Jun 04 20:12:34 2002 +0000
+++ b/input/input.c	Tue Jun 04 20:17:07 2002 +0000
@@ -65,6 +65,7 @@
 #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 @@
 #endif
   { { 'f', 0 }, "vo_fullscreen" },
   { { 's', 0 }, "screenshot" },
+  { { 'w', 0 }, "panscan -0.1" },
+  { { 'e', 0 }, "panscan +0.1" },
   { { 0 }, NULL }
 };
 
--- a/input/input.h	Tue Jun 04 20:12:34 2002 +0000
+++ b/input/input.h	Tue Jun 04 20:17:07 2002 +0000
@@ -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
--- a/libvo/sub.h	Tue Jun 04 20:12:34 2002 +0000
+++ b/libvo/sub.h	Tue Jun 04 20:17:07 2002 +0000
@@ -74,6 +74,7 @@
 #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
--- a/libvo/video_out.c	Tue Jun 04 20:12:34 2002 +0000
+++ b/libvo/video_out.c	Tue Jun 04 20:17:07 2002 +0000
@@ -56,6 +56,7 @@
 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
--- a/libvo/video_out.h	Tue Jun 04 20:12:34 2002 +0000
+++ b/libvo/video_out.h	Tue Jun 04 20:17:07 2002 +0000
@@ -216,6 +216,7 @@
 extern int vo_vsync;
 extern int vo_fs;
 extern int vo_fsmode;
+extern float vo_panscan;
 
 extern int vo_mouse_timer_const;
 
--- a/libvo/vo_xv.c	Tue Jun 04 20:12:34 2002 +0000
+++ b/libvo/vo_xv.c	Tue Jun 04 20:17:07 2002 +0000
@@ -94,6 +94,10 @@
 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 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 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;
--- a/mplayer.c	Tue Jun 04 20:12:34 2002 +0000
+++ b/mplayer.c	Tue Jun 04 20:17:07 2002 +0000
@@ -2544,6 +2544,24 @@
 #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;