mirror of https://github.com/mpv-player/mpv
Support for HW equalizing through VAA
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4397 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
92c5c27464
commit
e7e02f2dc3
174
libvo/vo_xv.c
174
libvo/vo_xv.c
|
@ -114,15 +114,7 @@ static void draw_alpha_uyvy(int x0,int y0, int w,int h, unsigned char* src, unsi
|
||||||
static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
|
static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int vo_gamma_brightness;
|
static int __xv_set_video_eq( const vidix_video_eq_t *info,int use_reset)
|
||||||
extern int vo_gamma_saturation;
|
|
||||||
extern int vo_gamma_contrast;
|
|
||||||
extern int vo_gamma_hue;
|
|
||||||
extern int vo_gamma_red_intensity;
|
|
||||||
extern int vo_gamma_green_intensity;
|
|
||||||
extern int vo_gamma_blue_intensity;
|
|
||||||
|
|
||||||
static void set_gamma_correction( unsigned int xv_port )
|
|
||||||
{
|
{
|
||||||
XvAttribute *attributes;
|
XvAttribute *attributes;
|
||||||
int howmany, xv_min,xv_max,xv_atomka;
|
int howmany, xv_min,xv_max,xv_atomka;
|
||||||
|
@ -130,9 +122,10 @@ static void set_gamma_correction( unsigned int xv_port )
|
||||||
/* get available attributes */
|
/* get available attributes */
|
||||||
attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
|
attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
|
||||||
/* first pass try reset */
|
/* first pass try reset */
|
||||||
if(!was_reset)
|
if(use_reset)
|
||||||
for (i = 0; i < howmany && attributes; i++)
|
|
||||||
{
|
{
|
||||||
|
for (i = 0; i < howmany && attributes; i++)
|
||||||
|
{
|
||||||
if (attributes[i].flags & XvSettable && !strcmp(attributes[i].name,"XV_SET_DEFAULTS"
|
if (attributes[i].flags & XvSettable && !strcmp(attributes[i].name,"XV_SET_DEFAULTS"
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
|
@ -141,9 +134,10 @@ static void set_gamma_correction( unsigned int xv_port )
|
||||||
xv_atomka = XInternAtom(mDisplay, attributes[i].name, True);
|
xv_atomka = XInternAtom(mDisplay, attributes[i].name, True);
|
||||||
XvSetPortAttribute(mDisplay, xv_port, xv_atomka, attributes[i].max_value);
|
XvSetPortAttribute(mDisplay, xv_port, xv_atomka, attributes[i].max_value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
/* for safety purposes */
|
||||||
|
if(!was_reset) return ENOSYS;
|
||||||
}
|
}
|
||||||
/* for safety purposes */
|
|
||||||
if(!was_reset) return;
|
|
||||||
for (i = 0; i < howmany && attributes; i++)
|
for (i = 0; i < howmany && attributes; i++)
|
||||||
{
|
{
|
||||||
if (attributes[i].flags & XvSettable)
|
if (attributes[i].flags & XvSettable)
|
||||||
|
@ -156,27 +150,34 @@ static void set_gamma_correction( unsigned int xv_port )
|
||||||
if (xv_atomka != None)
|
if (xv_atomka != None)
|
||||||
{
|
{
|
||||||
int port_value,port_min,port_max,port_mid;
|
int port_value,port_min,port_max,port_mid;
|
||||||
if(strcmp(attributes[i].name,"XV_BRIGHTNESS") == 0)
|
if(strcmp(attributes[i].name,"XV_BRIGHTNESS") == 0
|
||||||
port_value = vo_gamma_brightness;
|
&& (info->cap & VEQ_CAP_BRIGHTNESS))
|
||||||
|
port_value = info->brightness;
|
||||||
else
|
else
|
||||||
if(strcmp(attributes[i].name,"XV_SATURATION") == 0)
|
if(strcmp(attributes[i].name,"XV_SATURATION") == 0
|
||||||
port_value = vo_gamma_saturation;
|
&& (info->cap & VEQ_CAP_SATURATION))
|
||||||
|
port_value = info->saturation;
|
||||||
else
|
else
|
||||||
if(strcmp(attributes[i].name,"XV_CONTRAST") == 0)
|
if(strcmp(attributes[i].name,"XV_CONTRAST") == 0
|
||||||
port_value = vo_gamma_contrast;
|
&& (info->cap & VEQ_CAP_CONTRAST))
|
||||||
|
port_value = info->contrast;
|
||||||
else
|
else
|
||||||
if(strcmp(attributes[i].name,"XV_HUE") == 0)
|
if(strcmp(attributes[i].name,"XV_HUE") == 0
|
||||||
port_value = vo_gamma_hue;
|
&& (info->cap & VEQ_CAP_HUE))
|
||||||
|
port_value = info->hue;
|
||||||
else
|
else
|
||||||
/* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */
|
/* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */
|
||||||
if(strcmp(attributes[i].name,"XV_RED_INTENSITY") == 0)
|
if(strcmp(attributes[i].name,"XV_RED_INTENSITY") == 0
|
||||||
port_value = vo_gamma_red_intensity;
|
&& (info->cap & VEQ_CAP_RGB_INTENSITY))
|
||||||
|
port_value = info->red_intensity;
|
||||||
else
|
else
|
||||||
if(strcmp(attributes[i].name,"XV_GREEN_INTENSITY") == 0)
|
if(strcmp(attributes[i].name,"XV_GREEN_INTENSITY") == 0
|
||||||
port_value = vo_gamma_green_intensity;
|
&& (info->cap & VEQ_CAP_RGB_INTENSITY))
|
||||||
|
port_value = info->green_intensity;
|
||||||
else
|
else
|
||||||
if(strcmp(attributes[i].name,"XV_BLUE_INTENSITY") == 0)
|
if(strcmp(attributes[i].name,"XV_BLUE_INTENSITY") == 0
|
||||||
port_value = vo_gamma_blue_intensity;
|
&& (info->cap & VEQ_CAP_RGB_INTENSITY))
|
||||||
|
port_value = info->blue_intensity;
|
||||||
else continue;
|
else continue;
|
||||||
/* means that user has untouched this parameter since
|
/* means that user has untouched this parameter since
|
||||||
NVidia driver has default == min for XV_HUE but not mid */
|
NVidia driver has default == min for XV_HUE but not mid */
|
||||||
|
@ -191,6 +192,117 @@ static void set_gamma_correction( unsigned int xv_port )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int xv_set_video_eq( const vidix_video_eq_t *info)
|
||||||
|
{
|
||||||
|
return __xv_set_video_eq(info,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int xv_get_video_eq( vidix_video_eq_t *info)
|
||||||
|
{
|
||||||
|
XvAttribute *attributes;
|
||||||
|
int howmany, xv_min,xv_max,xv_atomka;
|
||||||
|
/* get available attributes */
|
||||||
|
memset(info,0,sizeof(vidix_video_eq_t));
|
||||||
|
attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
|
||||||
|
for (i = 0; i < howmany && attributes; i++)
|
||||||
|
{
|
||||||
|
if (attributes[i].flags & XvGettable)
|
||||||
|
{
|
||||||
|
xv_min = attributes[i].min_value;
|
||||||
|
xv_max = attributes[i].max_value;
|
||||||
|
xv_atomka = XInternAtom(mDisplay, attributes[i].name, True);
|
||||||
|
/* since we have SET_DEFAULTS first in our list, we can check if it's available
|
||||||
|
then trigger it if it's ok so that the other values are at default upon query */
|
||||||
|
if (xv_atomka != None)
|
||||||
|
{
|
||||||
|
int port_value,port_min,port_max,port_mid;
|
||||||
|
XvGetPortAttribute(mDisplay, xv_port, xv_atomka, &port_value);
|
||||||
|
if(verbose>1) printf("vo_xv: get: %s = %i\n",attributes[i].name,port_value);
|
||||||
|
|
||||||
|
port_min = xv_min;
|
||||||
|
port_max = xv_max;
|
||||||
|
port_mid = (port_min + port_max) / 2;
|
||||||
|
port_value = ((port_value - port_mid)*2000)/(port_max-port_min);
|
||||||
|
|
||||||
|
if(verbose>1) printf("vo_xv: assume: %s = %i\n",attributes[i].name,port_value);
|
||||||
|
|
||||||
|
if(strcmp(attributes[i].name,"XV_BRIGHTNESS") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_BRIGHTNESS;
|
||||||
|
info->brightness = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(strcmp(attributes[i].name,"XV_SATURATION") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_SATURATION;
|
||||||
|
info->saturation = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(strcmp(attributes[i].name,"XV_CONTRAST") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_CONTRAST;
|
||||||
|
info->contrast = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(strcmp(attributes[i].name,"XV_HUE") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_HUE;
|
||||||
|
info->hue = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */
|
||||||
|
if(strcmp(attributes[i].name,"XV_RED_INTENSITY") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_RGB_INTENSITY;
|
||||||
|
info->red_intensity = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(strcmp(attributes[i].name,"XV_GREEN_INTENSITY") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_RGB_INTENSITY;
|
||||||
|
info->green_intensity = port_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(strcmp(attributes[i].name,"XV_BLUE_INTENSITY") == 0)
|
||||||
|
{
|
||||||
|
info->cap |= VEQ_CAP_RGB_INTENSITY;
|
||||||
|
info->blue_intensity = port_value;
|
||||||
|
}
|
||||||
|
else continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int vo_gamma_brightness;
|
||||||
|
extern int vo_gamma_saturation;
|
||||||
|
extern int vo_gamma_contrast;
|
||||||
|
extern int vo_gamma_hue;
|
||||||
|
extern int vo_gamma_red_intensity;
|
||||||
|
extern int vo_gamma_green_intensity;
|
||||||
|
extern int vo_gamma_blue_intensity;
|
||||||
|
|
||||||
|
static void set_gamma_correction( void )
|
||||||
|
{
|
||||||
|
vidix_video_eq_t info;
|
||||||
|
/* try all */
|
||||||
|
info.cap = VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST | VEQ_CAP_SATURATION |
|
||||||
|
VEQ_CAP_HUE | VEQ_CAP_RGB_INTENSITY;
|
||||||
|
info.flags = 0; /* doesn't matter for xv */
|
||||||
|
info.brightness = vo_gamma_brightness;
|
||||||
|
info.contrast = vo_gamma_contrast;
|
||||||
|
info.saturation = vo_gamma_saturation;
|
||||||
|
info.hue = vo_gamma_hue;
|
||||||
|
info.red_intensity = vo_gamma_red_intensity;
|
||||||
|
info.green_intensity = vo_gamma_green_intensity;
|
||||||
|
info.blue_intensity = vo_gamma_blue_intensity;
|
||||||
|
/* reset with XV_SET_DEFAULTS only once */
|
||||||
|
__xv_set_video_eq(&info,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -356,7 +468,7 @@ static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t
|
||||||
|
|
||||||
current_buf=0;
|
current_buf=0;
|
||||||
|
|
||||||
#ifdef HAVE_NEW_GUI
|
#ifdef HAVE_NEW_GUI
|
||||||
if ( vo_window != None )
|
if ( vo_window != None )
|
||||||
{
|
{
|
||||||
mFullscreen=0;
|
mFullscreen=0;
|
||||||
|
@ -368,8 +480,8 @@ static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t
|
||||||
dheight=vo_screenwidth * mdheight / mdwidth;
|
dheight=vo_screenwidth * mdheight / mdwidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
set_gamma_correction(xv_port);
|
set_gamma_correction();
|
||||||
|
|
||||||
XGetGeometry( mDisplay,mywindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth );
|
XGetGeometry( mDisplay,mywindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth );
|
||||||
drwX=0; drwY=0;
|
drwX=0; drwY=0;
|
||||||
|
@ -619,4 +731,6 @@ static uint32_t preinit(const char *arg)
|
||||||
static void query_vaa(vo_vaa_t *vaa)
|
static void query_vaa(vo_vaa_t *vaa)
|
||||||
{
|
{
|
||||||
memset(vaa,0,sizeof(vo_vaa_t));
|
memset(vaa,0,sizeof(vo_vaa_t));
|
||||||
|
vaa->get_video_eq = xv_get_video_eq;
|
||||||
|
vaa->set_video_eq = xv_set_video_eq;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue