summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-06-04 20:17:07 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-06-04 20:17:07 +0000
commite598b63ddc1afd3d9b698d6fbd081b6762d77457 (patch)
treeac8ca76046683697955c30445effabc425beb7a6
parentd20d9e132a09b2b0f647a04be867b04eed1ad62a (diff)
downloadmpv-e598b63ddc1afd3d9b698d6fbd081b6762d77457.tar.bz2
mpv-e598b63ddc1afd3d9b698d6fbd081b6762d77457.tar.xz
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
-rw-r--r--cfg-mplayer.h2
-rw-r--r--input/input.c3
-rw-r--r--input/input.h1
-rw-r--r--libvo/sub.h1
-rw-r--r--libvo/video_out.c1
-rw-r--r--libvo/video_out.h1
-rw-r--r--libvo/vo_xv.c25
-rw-r--r--mplayer.c18
8 files changed, 50 insertions, 2 deletions
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;