diff options
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/sub.h | 1 | ||||
-rw-r--r-- | libvo/video_out.c | 1 | ||||
-rw-r--r-- | libvo/video_out.h | 1 | ||||
-rw-r--r-- | libvo/vo_xv.c | 25 |
4 files changed, 26 insertions, 2 deletions
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; |