summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-18 09:11:11 +0000
committernick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-18 09:11:11 +0000
commit555c6766839e256aebd2ad27307c74947abe0823 (patch)
tree977d2153ce201a6a745d8bbf0dab6feee544bb3f
parent6a8715f9b95a30b213f34792521b9e5386316825 (diff)
downloadmpv-555c6766839e256aebd2ad27307c74947abe0823.tar.bz2
mpv-555c6766839e256aebd2ad27307c74947abe0823.tar.xz
gamma correction support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4230 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--cfg-mplayer.h15
-rw-r--r--libvo/video_out.c11
-rw-r--r--libvo/vosub_vidix.c36
-rw-r--r--vidix/drivers/radeon_vid.c27
4 files changed, 84 insertions, 5 deletions
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index 520c093e38..2cb9aa7baf 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -39,6 +39,14 @@ extern char *lirc_configfile;
extern int vo_doublebuffering;
extern int vo_fsmode;
extern int vo_dbpp;
+/* gamma correction */
+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_intense;
+extern int vo_gamma_green_intense;
+extern int vo_gamma_blue_intense;
#endif
#ifdef USE_SUB
@@ -237,6 +245,13 @@ static config_t mplayer_opts[]={
{"fsmode", &vo_fsmode, CONF_TYPE_INT, CONF_RANGE, 0, 15, NULL},
{"double", &vo_doublebuffering, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"nodouble", &vo_doublebuffering, CONF_TYPE_FLAG, 0, 1, 0, NULL},
+ {"brightness",&vo_gamma_brightness, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"saturation",&vo_gamma_saturation, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"constrast",&vo_gamma_contrast, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"hue",&vo_gamma_hue, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"red_instense",&vo_gamma_red_intense, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"green_intense",&vo_gamma_green_intense, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
+ {"blue_intense",&vo_gamma_blue_intense, CONF_TYPE_INT, CONF_RANGE, -1000, 1000, NULL},
#endif
#ifdef HAVE_AA
diff --git a/libvo/video_out.c b/libvo/video_out.c
index df4d773f9c..1e2eac5b13 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -47,7 +47,16 @@ int vo_pts=0; // for hw decoding
float vo_fps=0; // for mp1e rte
char *vo_subdevice = NULL;
-
+/****************************************
+* GAMMA CORRECTION *
+****************************************/
+int vo_gamma_brightness=0;
+int vo_gamma_saturation=0;
+int vo_gamma_contrast=0;
+int vo_gamma_hue=0;
+int vo_gamma_red_intense=0;
+int vo_gamma_green_intense=0;
+int vo_gamma_blue_intense=0;
//
// Externally visible list of all vo drivers
//
diff --git a/libvo/vosub_vidix.c b/libvo/vosub_vidix.c
index db937ae99c..8cde3748f3 100644
--- a/libvo/vosub_vidix.c
+++ b/libvo/vosub_vidix.c
@@ -154,15 +154,51 @@ int vidix_init(unsigned src_width,unsigned src_height,
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_intense;
+extern int vo_gamma_green_intense;
+extern int vo_gamma_blue_intense;
+
+vidix_video_eq_t vid_eq;
+
void vidix_start(void)
{
int err;
+ if(verbose > 1)
+ {
+ printf("vosub_vidix: vo_gamma_brightness=%i\n"
+ "vosub_vidix: vo_gamma_saturation=%i\n"
+ "vosub_vidix: vo_gamma_contrast=%i\n"
+ "vosub_vidix: vo_gamma_hue=%i\n"
+ "vosub_vidix: vo_gamma_red_intense=%i\n"
+ "vosub_vidix: vo_gamma_green_intense=%i\n"
+ "vosub_vidix: vo_gamma_blue_intense=%i\n"
+ ,vo_gamma_brightness
+ ,vo_gamma_saturation
+ ,vo_gamma_contrast
+ ,vo_gamma_hue
+ ,vo_gamma_red_intense
+ ,vo_gamma_green_intense
+ ,vo_gamma_blue_intense);
+ }
if((err=vdlPlaybackOn(vidix_handler))!=0)
{
printf("vosub_vidix: Can't start playback: %s\n",strerror(err));
return -1;
}
+ vid_eq.brightness = vo_gamma_brightness;
+ vid_eq.saturation = vo_gamma_saturation;
+ vid_eq.contrast = vo_gamma_contrast;
+ vid_eq.hue = vo_gamma_hue;
+ vid_eq.red_intense = vo_gamma_red_intense;
+ vid_eq.green_intense = vo_gamma_green_intense;
+ vid_eq.blue_intense = vo_gamma_blue_intense;
+ vid_eq.flags = VEQ_FLG_ITU_R_BT_601;
+ vdlPlaybackSetEq(vidix_handler,&vid_eq);
return 0;
}
diff --git a/vidix/drivers/radeon_vid.c b/vidix/drivers/radeon_vid.c
index c97219d1ef..1f0427ce37 100644
--- a/vidix/drivers/radeon_vid.c
+++ b/vidix/drivers/radeon_vid.c
@@ -1070,20 +1070,39 @@ int vixPlaybackGetEq( vidix_video_eq_t * eq)
return 0;
}
+#ifndef RAGE128
+#define RTFSaturation(a) (1.0 + ((a)*1.0)/1000.0)
+#define RTFBrightness(a) (((a)*1.0)/2000.0)
+#define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0)
+#define RTFHue(a) (((a)*3.1416)/1000.0)
+#define RTFCheckParam(a) {if((a)<-1000) (a)=-1000; if((a)>1000) (a)=1000;}
+#endif
+
int vixPlaybackSetEq( const vidix_video_eq_t * eq)
{
#ifdef RAGE128
int br,sat;
+#else
+ int itu_space;
#endif
memcpy(&equal,eq,sizeof(vidix_video_eq_t));
#ifdef RAGE128
br = equal.brightness * 64 / 1000;
- sat = equal.saturation * 32 / 1000;
- if(sat < 0) sat = 0;
+ if(br < -64) br = -64; if(br > 63) br = 63;
+ sat = (equal.saturation + 1000) * 32 / 1000;
+ if(sat < 0) sat = 0; if(sat > 31) sat = 31;
OUTREG(OV0_COLOUR_CNTL, (br & 0x7f) | (sat << 8) | (sat << 16));
#else
- radeon_set_transform(equal.brightness,equal.contrast,
- equal.saturation,equal.hue,0);
+ itu_space = equal.flags == VEQ_FLG_ITU_R_BT_709 ? 1 : 0;
+ RTFCheckParam(equal.brightness);
+ RTFCheckParam(equal.saturation);
+ RTFCheckParam(equal.contrast);
+ RTFCheckParam(equal.hue);
+ radeon_set_transform(RTFBrightness(equal.brightness),
+ RTFContrast(equal.contrast),
+ RTFSaturation(equal.saturation),
+ RTFHue(equal.hue),
+ itu_space);
#endif
return 0;
}