[vlc-devel] [PATCH] Gamma correction support for adjust video filter

Arwed von Merkatz v.merkatz at gmx.net
Sat Jan 10 17:55:04 CET 2004


Hi,

due to a very old monitor I need gamma correction for video output if I
want to be able to see anything. vlc was lacking support for this so I
added it to the adjust video filter. I also added it to the Extended Gui
"Image adjust" part of the wxGTK interface, though i'm not sure if it
needs to be there, that was mainly for testing purposes, normally you
only need to set gamma once as the monitor gamma doesn't change that
fast.

-- 
Arwed v. Merkatz
Grimoire Guru for video
Grimoire Guru for xfce
Sourcemage GNU/Linux
http://www.sourcemage.org
-------------- next part --------------
? modules/codec/faad/Makefile.am
? modules/codec/faad/Makefile.in
Index: modules/gui/wxwindows/interface.cpp
===================================================================
RCS file: /var/cvs/videolan/vlc/modules/gui/wxwindows/interface.cpp,v
retrieving revision 1.83
diff -u -r1.83 interface.cpp
--- modules/gui/wxwindows/interface.cpp	5 Jan 2004 13:00:39 -0000	1.83
+++ modules/gui/wxwindows/interface.cpp	10 Jan 2004 16:48:49 -0000
@@ -145,6 +145,7 @@
     Contrast_Event,
     Brightness_Event,
     Saturation_Event,
+    Gamma_Event,
 
     Ratio_Event,
     Visual_Event,
@@ -200,6 +201,7 @@
     EVT_COMMAND_SCROLL(Contrast_Event, Interface::OnContrastUpdate)
     EVT_COMMAND_SCROLL(Brightness_Event, Interface::OnBrightnessUpdate)
     EVT_COMMAND_SCROLL(Saturation_Event, Interface::OnSaturationUpdate)
+    EVT_COMMAND_SCROLL(Gamma_Event, Interface::OnGammaUpdate)
 
 END_EVENT_TABLE()
 
@@ -546,11 +548,21 @@
     saturation_sizer->Add(saturation_slider,1,0,0);
     saturation_sizer->Layout();
 
+    wxBoxSizer *gamma_sizer = new wxBoxSizer( wxHORIZONTAL );
+    wxStaticText *gamma_text = new wxStaticText( extra_frame, -1,
+                                          wxU(_("Gamma")) );
+    gamma_slider = new wxSlider ( extra_frame, Gamma_Event, 0, 0,
+                           100, wxDefaultPosition, wxDefaultSize );
+    gamma_sizer->Add(gamma_text,1,0,0);
+    gamma_sizer->Add(gamma_slider,1,0,0);
+    gamma_sizer->Layout();
+
     adjust_sizer->Add(adjust_check, 1, wxEXPAND, 0);
     adjust_sizer->Add(hue_sizer, 1, wxEXPAND, 0);
     adjust_sizer->Add(contrast_sizer, 1, wxEXPAND, 0);
     adjust_sizer->Add(brightness_sizer, 1, wxEXPAND, 0);
     adjust_sizer->Add(saturation_sizer, 1, wxEXPAND, 0);
+    adjust_sizer->Add(gamma_sizer, 1, wxEXPAND, 0);
 
     extra_sizer->Add(adjust_sizer,1,wxBOTTOM,5);
 
@@ -637,6 +649,7 @@
         contrast_slider->Enable();
         brightness_slider->Enable();
         hue_slider->Enable();
+        gamma_slider->Enable();
     }
     else
     {
@@ -645,6 +658,7 @@
         contrast_slider->Disable();
         brightness_slider->Disable();
         hue_slider->Disable();
+        gamma_slider->Disable();
     }
     if( psz_filters ) free( psz_filters );
 
@@ -662,6 +676,9 @@
     f_value = config_GetFloat( p_intf, "brightness" );
     if( f_value > 0 && f_value < 2 )
         brightness_slider->SetValue( (int)(100 * f_value) );
+    f_value = config_GetFloat( p_intf, "gamma" );
+    if (f_value > 0 && f_value < 10 )
+        gamma_slider->SetValue( (int)(10 * f_value) );
 
     extra_frame->Hide();
 }
@@ -983,6 +1000,7 @@
         saturation_slider->Enable();
         contrast_slider->Enable();
         hue_slider->Enable();
+        gamma_slider->Enable();
     }
     else
     {
@@ -1025,6 +1043,7 @@
         saturation_slider->Disable();
         contrast_slider->Disable();
         hue_slider->Disable();
+        gamma_slider->Disable();
     }
     if(psz_filters) free(psz_filters);
     if(psz_new) free(psz_new);
@@ -1051,6 +1070,11 @@
 
 }
 
+void Interface::OnGammaUpdate(wxScrollEvent& event)
+{
+    config_PutFloat( p_intf , "gamma" , (float)event.GetPosition()/10 );
+}
+
 void Interface::OnRatio( wxCommandEvent& event )
 {
    config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
Index: modules/gui/wxwindows/wxwindows.h
===================================================================
RCS file: /var/cvs/videolan/vlc/modules/gui/wxwindows/wxwindows.h,v
retrieving revision 1.83
diff -u -r1.83 wxwindows.h
--- modules/gui/wxwindows/wxwindows.h	5 Jan 2004 13:00:39 -0000	1.83
+++ modules/gui/wxwindows/wxwindows.h	10 Jan 2004 16:48:51 -0000
@@ -178,6 +178,7 @@
     wxSlider *contrast_slider;
     wxSlider *saturation_slider;
     wxSlider *hue_slider;
+    wxSlider *gamma_slider;
 
     wxStaticBox *other_box;
     wxComboBox *ratio_combo;
@@ -218,6 +219,7 @@
     void OnContrastUpdate( wxScrollEvent& event );
     void OnBrightnessUpdate( wxScrollEvent& event );
     void OnSaturationUpdate( wxScrollEvent& event );
+    void OnGammaUpdate( wxScrollEvent& event );
 
     void OnRatio( wxCommandEvent& event );
     void OnEnableVisual( wxCommandEvent& event );
Index: modules/video_filter/adjust.c
===================================================================
RCS file: /var/cvs/videolan/vlc/modules/video_filter/adjust.c,v
retrieving revision 1.14
diff -u -r1.14 adjust.c
--- modules/video_filter/adjust.c	15 Oct 2003 22:49:48 -0000	1.14
+++ modules/video_filter/adjust.c	10 Jan 2004 16:48:52 -0000
@@ -65,6 +65,8 @@
 #define SAT_LONGTEXT N_("Set the image saturation, between 0 and 3. Defaults to 1")
 #define LUM_TEXT N_("Set image brightness")
 #define LUM_LONGTEXT N_("Set the image brightness, between 0 and 2. Defaults to 1")
+#define GAMMA_TEXT N_("Set image gamma")
+#define GAMMA_LONGTEXT N_("Set the image gamma, between 0.01 and 10. Defaults to 1")
 
 
 vlc_module_begin();
@@ -73,7 +75,8 @@
     add_float_with_range( "brightness", 1.0, 0.0, 2.0, NULL, LUM_TEXT, LUM_LONGTEXT, VLC_FALSE );
     add_integer_with_range( "hue", 0, 0, 360, NULL, HUE_TEXT, HUE_LONGTEXT, VLC_FALSE );
     add_float_with_range( "saturation", 1.0, 0.0, 3.0, NULL, SAT_TEXT, SAT_LONGTEXT, VLC_FALSE );
-    set_description( _("contrast/hue/saturation/brightness filter") );
+    add_float_with_range( "gamma", 1.0, 0.01, 10.0, NULL, GAMMA_TEXT, GAMMA_LONGTEXT, VLC_FALSE );
+    set_description( _("contrast/hue/saturation/brightness/gamma filter") );
     set_capability( "video filter", 0 );
     add_shortcut( "adjust" );
     set_callbacks( Create, Destroy );
@@ -204,12 +207,14 @@
 static void Render( vout_thread_t *p_vout, picture_t *p_pic )
 {
     int pi_luma[256];
+    int pi_gamma[256];
 
     picture_t *p_outpic;
     uint8_t *p_in, *p_in_v, *p_in_end, *p_line_end;
     uint8_t *p_out, *p_out_v;
 
     double  f_hue;
+    double  f_gamma;
     int32_t i_cont, i_lum;
     int i_sat, i_sin, i_cos, i_x, i_y;
     int i;
@@ -233,15 +238,22 @@
     i_lum = (config_GetFloat( p_vout, "brightness" ) - 1.0) * 255;
     f_hue = config_GetInt( p_vout, "hue" ) * M_PI / 180;
     i_sat = config_GetFloat( p_vout, "saturation" ) * 256;
+    f_gamma = 1.0 / config_GetFloat( p_vout, "gamma" );
 
     /* Contrast is a fast but kludged function, so I put this gap to be
      * cleaner :) */
     i_lum += 128 - i_cont / 2;
 
+    /* Fill the gamma lookup table */
+    for( i = 0 ; i < 256 ; i++ )
+    {
+      pi_gamma[ i ] = clip( pow(i / 255.0, f_gamma) * 255.0);
+    }
+
     /* Fill the luma lookup table */
     for( i = 0 ; i < 256 ; i++ )
     {
-        pi_luma[ i ] = clip( i_lum + i_cont * i / 256 );
+        pi_luma[ i ] = pi_gamma[clip( i_lum + i_cont * i / 256)];
     }
 
     /*


More information about the vlc-devel mailing list