aboutsummaryrefslogtreecommitdiffhomepage
path: root/libvo
diff options
context:
space:
mode:
authorGravatar albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-29 23:40:07 +0000
committerGravatar albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-29 23:40:07 +0000
commit35c29d0946e46c3befc8a83978018caafbfe4db9 (patch)
tree431095d71806d6fc37f06e4a6f77736101be0719 /libvo
parent4758d5f97277026b63e54fbf4ab21bb338815c85 (diff)
Fixed the overlay, some opts to adjust the overlay
Experimental osd support for the overlay git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7971 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_dxr2.c108
1 files changed, 87 insertions, 21 deletions
diff --git a/libvo/vo_dxr2.c b/libvo/vo_dxr2.c
index 933e6fcfe4..eea0777569 100644
--- a/libvo/vo_dxr2.c
+++ b/libvo/vo_dxr2.c
@@ -17,6 +17,7 @@
#include "video_out_internal.h"
#include "mp_msg.h"
#include "cfgparser.h"
+#include "sub.h"
#ifdef X11_FULLSCREEN
#include "x11_common.h"
@@ -45,6 +46,7 @@ static int sub_x,sub_y,sub_w,sub_h;
static int sub_x_off,sub_y_off;
static int sub_config_count;
static int aspect;
+static int sub_vo_win = 0;
static int use_ol = 1;
static int ol_ratio = 1000;
@@ -60,6 +62,9 @@ static int iec958_mode = DXR2_IEC958_DECODED;
static int mute_mode = DXR2_AUDIO_MUTE_OFF;
static int ignore_cache = 0;
static int update_cache = 0;
+static int olw_cor = 0, olh_cor = 0,olx_cor = 0, oly_cor = 0;
+static int ol_osd = 0;
+
config_t dxr2_opts[] = {
{ "overlay", &use_ol, CONF_TYPE_FLAG, 0, 0, 1, NULL},
@@ -93,6 +98,14 @@ config_t dxr2_opts[] = {
{ "ignore-cache",&ignore_cache,CONF_TYPE_FLAG, 0, 0, 1, NULL},
{ "update-cache",&update_cache,CONF_TYPE_FLAG, 0, 0, 1, NULL},
+
+ { "olh-cor", &olh_cor, CONF_TYPE_INT, CONF_RANGE, -20, 20, NULL},
+ { "olw-cor", &olw_cor, CONF_TYPE_INT, CONF_RANGE, -20, 20, NULL},
+ { "olx-cor", &olx_cor, CONF_TYPE_INT, CONF_RANGE, -20, 20, NULL},
+ { "oly-cor", &oly_cor, CONF_TYPE_INT, CONF_RANGE, -20, 20, NULL},
+
+ { "ol-osd", &ol_osd, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ { "nool-osd", &ol_osd, CONF_TYPE_FLAG, 0, 1, 0, NULL},
{ NULL,NULL, 0, 0, 0, 0, NULL}
};
@@ -413,6 +426,7 @@ static int dxr2_set_vga_params(dxr2_vgaParams_t* vga,int detect) {
// First we need a white screen
uint8_t* img = malloc(vo_screenwidth*vo_screenheight*3);
uint8_t* src[] = { img, NULL, NULL };
+ int stride[] = { vo_screenwidth * 3 , 0, 0 };
int cc = vo_config_count;
memset(img,255,vo_screenwidth*vo_screenheight*3);
@@ -426,7 +440,7 @@ static int dxr2_set_vga_params(dxr2_vgaParams_t* vga,int detect) {
vo_config_count = cc;
return 0;
}
- sub_vo->draw_frame(src);
+ sub_vo->draw_slice(src,stride,vo_screenwidth,vo_screenheight,0,0);
sub_vo->flip_page();
free(img);
sub_config_count++;
@@ -475,7 +489,7 @@ static int dxr2_save_vga_params(dxr2_vgaParams_t* vga,char* name) {
return 0;
}
- ret = fprintf(fd,"%d %d %d %d %d %d %d %d %d %d %d\n",
+ ret = fprintf(fd,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
vga->hOffWinKey,
vga->vOffWinKey,
vga->xScreen,
@@ -486,10 +500,14 @@ static int dxr2_save_vga_params(dxr2_vgaParams_t* vga,char* name) {
vga->blankWidth,
vga->hOffset,
vga->vOffset,
- vga->ratio);
+ vga->ratio,
+ olx_cor,
+ oly_cor,
+ olw_cor,
+ olh_cor);
fclose(fd);
- return ret == 11 ? 1 : 0;
+ return ret >= 11 ? 1 : 0;
}
static int dxr2_load_vga_params(dxr2_vgaParams_t* vga,char* name) {
@@ -507,7 +525,7 @@ static int dxr2_load_vga_params(dxr2_vgaParams_t* vga,char* name) {
mp_msg(MSGT_VO,MSGL_ERR,"VO: [dxr2] Unable to open cache file %s for reading (%s)\n",cache_path,strerror(errno));
return 0;
}
- ret = fscanf(fd, "%d %d %d %d %d %d %d %d %d %d %d\n",
+ ret = fscanf(fd, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
&vga->hOffWinKey,
&vga->vOffWinKey,
&vga->xScreen,
@@ -518,10 +536,14 @@ static int dxr2_load_vga_params(dxr2_vgaParams_t* vga,char* name) {
&vga->blankWidth,
&vga->hOffset,
&vga->vOffset,
- &vga->ratio);
+ &vga->ratio,
+ &olx_cor,
+ &oly_cor,
+ &olw_cor,
+ &olh_cor);
fclose(fd);
- return ret == 11 ? 1 : 0;
+ return ret >= 11 ? 1 : 0;
}
static int dxr2_setup_vga_params(void) {
@@ -538,14 +560,32 @@ static int dxr2_setup_vga_params(void) {
static void dxr2_set_overlay_window(void) {
uint8_t* src[] = { sub_img, NULL, NULL };
+ int stride[] = { movie_w * 3 , 0, 0 };
dxr2_twoArg_t win;
int redisp = 0;
int cc = vo_config_count;
vo_config_count = sub_config_count;
- sub_vo->draw_frame(src);
+ sub_vo->draw_slice(src,stride,movie_w,movie_h,0,0);
sub_vo->flip_page();
vo_config_count = cc;
+
+ mp_msg(MSGT_VO,MSGL_V,"VO: [dxr2] setting overlay with correction x=%d y=%d w=%d h=%d\n",olx_cor,oly_cor, olw_cor,olh_cor);
+
+ // Sub vo isn't a windowed one, fill in the needed stuff
+ if(!sub_vo_win) {
+ if(vo_fs) {
+ vo_dwidth = vo_screenwidth;
+ vo_dheight = vo_screenheight;
+ vo_dx = vo_dy = 0;
+ } else {
+ vo_dwidth = movie_w;
+ vo_dheight = movie_h;
+ vo_dx = (vo_screenwidth - vo_dwidth) / 2;
+ vo_dy = (vo_screenheight - vo_dheight) / 2;
+ }
+ }
+
if(sub_w != vo_dwidth || sub_h != vo_dheight) {
int new_aspect = ((1<<16)*vo_dwidth + vo_dheight/2)/vo_dheight;
sub_w = vo_dwidth;
@@ -554,6 +594,8 @@ static void dxr2_set_overlay_window(void) {
sub_w = (sub_h*aspect + (1<<15))>>16;
else
sub_h = ((sub_w<<16) + (aspect>>1)) /aspect;
+ sub_w += olw_cor;
+ sub_h += olh_cor;
sub_x_off = (vo_dwidth-sub_w) / 2;
sub_y_off = (vo_dheight-sub_h) / 2;
sub_x = -vo_dx; // Be sure to also replace the overlay
@@ -564,10 +606,10 @@ static void dxr2_set_overlay_window(void) {
}
if(vo_dx != sub_x || vo_dy != sub_y) {
- sub_x = vo_dx;
- sub_y = vo_dy;
- win.arg1 = (sub_x > 0 ? sub_x : 0) + sub_x_off;
- win.arg2 = (sub_y > 0 ? sub_y : 0) + sub_y_off;
+ sub_x = vo_dx + olx_cor + sub_x_off;
+ sub_y = vo_dy + oly_cor + sub_y_off;
+ win.arg1 = (sub_x > 0 ? sub_x : 0);
+ win.arg2 = (sub_y > 0 ? sub_y : 0);
mp_msg(MSGT_VO,MSGL_V,"VO: [dxr2] set pos x=%d y=%d \n",win.arg1,win.arg2);
ioctl(dxr2_fd, DXR2_IOC_SET_OVERLAY_POSITION,&win);
}
@@ -703,21 +745,32 @@ static uint32_t config(uint32_t s_width, uint32_t s_height, uint32_t width, uint
arg = mute_mode;
ioctl(dxr2_fd, DXR2_IOC_AUDIO_MUTE, &arg);
+ movie_w = width;
+ movie_h = height;
+ vo_fs = flags & VOFLAG_FULLSCREEN ? 1 : 0;
// Overlay
while(use_ol) {
dxr2_twoArg_t win;
dxr2_oneArg_t om;
int cc = vo_config_count;
vo_config_count = sub_config_count;
+ // Load or detect the overlay stuff
if(!dxr2_setup_vga_params()) {
sub_vo->uninit();
sub_vo = NULL;
vo_config_count = cc;
break;
}
- if(strcmp(sub_vo->get_info()->short_name,"x11") != 0) {
+ // Does the sub vo support the x11 stuff
+ // Fix me : test the other x11 vo's and enable them
+ if(strcmp(sub_vo->get_info()->short_name,"x11") == 0)
+ sub_vo_win = 1;
+ else
+ sub_vo_win = 0;
+
+ // No window and no osd => we don't need any subdriver
+ if(!sub_vo_win && !ol_osd) {
sub_vo->uninit();
- vo_config_count = cc;
sub_vo = NULL;
}
@@ -768,9 +821,6 @@ static uint32_t config(uint32_t s_width, uint32_t s_height, uint32_t width, uint
}
break;
}
- vo_fs = flags & VOFLAG_FULLSCREEN ? 1 : 0;
- movie_w = width;
- movie_h = height;
// start playing
if(ioctl(dxr2_fd, DXR2_IOC_PLAY, NULL) == 0) {
@@ -785,8 +835,19 @@ static const vo_info_t* get_info(void)
return &vo_info;
}
+static void clear_alpha(int x0,int y0, int w,int h) {
+ uint8_t* src[] = { sub_img , NULL, NULL };
+ int stride[] = { movie_w * 3, 0, 0 };
+
+ sub_vo->draw_slice(src,stride,w,h,x0,y0);
+}
+
static void draw_osd(void)
{
+ if(sub_vo && ol_osd) {
+ vo_remove_text(movie_w,movie_h,clear_alpha);
+ sub_vo->draw_osd();
+ }
}
static uint32_t draw_frame(uint8_t * src[])
@@ -801,6 +862,8 @@ static uint32_t draw_frame(uint8_t * src[])
static void flip_page (void)
{
+ if(sub_vo && ol_osd)
+ sub_vo->flip_page();
}
static uint32_t draw_slice( uint8_t *srcimg[], int stride[], int w, int h, int x0, int y0 )
@@ -849,7 +912,7 @@ static void check_events(void)
// I'd like to have this done in an x11 independent way
// It's because of this that we are limited to vo_x11 for windowed overlay :-(
#ifdef X11_FULLSCREEN
- if(sub_vo) {
+ if(sub_vo && sub_vo_win) {
int e=vo_x11_check_events(mDisplay);
if ( !(e&VO_EVENT_RESIZE) && !(e&VO_EVENT_EXPOSE) ) return;
XSetBackground(mDisplay, vo_gc, 0);
@@ -970,9 +1033,12 @@ static uint32_t control(uint32_t request, void *data, ...)
case VOCTRL_FULLSCREEN:
if(!use_ol)
return VO_NOTIMPL;
- else if(sub_vo)
- return sub_vo->control(VOCTRL_FULLSCREEN,0);
- else {
+ else if(sub_vo) {
+ int r = sub_vo->control(VOCTRL_FULLSCREEN,0);
+ if(r == VO_TRUE && !sub_vo_win)
+ dxr2_set_overlay_window();
+ return r;
+ } else {
dxr2_twoArg_t win;
vo_fs = !vo_fs;
win.arg1 = vo_fs ? vo_screenwidth : movie_w;