[vlc-devel] commit: Fixed a bit panoramix. (Laurent Aimar )

git version control git at videolan.org
Wed Aug 20 23:10:23 CEST 2008


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Aug 20 23:06:13 2008 +0200| [aba84a741ac82b651e02392f72bbd6db08dacba3] | committer: Laurent Aimar 

Fixed a bit panoramix.

Fix var_CreateGetBool/Integer mix up.
Fix an in valid free.
Fix an out of bound read.
Fix uninitialized variables.
(It may help with #1879)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aba84a741ac82b651e02392f72bbd6db08dacba3
---

 modules/video_filter/panoramix.c |   88 ++++++++++++++++++++------------------
 1 files changed, 47 insertions(+), 41 deletions(-)

diff --git a/modules/video_filter/panoramix.c b/modules/video_filter/panoramix.c
index 1d4a8ba..919f3b9 100644
--- a/modules/video_filter/panoramix.c
+++ b/modules/video_filter/panoramix.c
@@ -384,11 +384,11 @@ case VLC_FOURCC('c','y','u','v'):    // packed by 2
 #endif
 
 #ifdef OVERLAP
-    p_vout->p_sys->i_offset_x = var_CreateGetInteger( p_vout, CFG_PREFIX "offset-x" );
+    p_vout->p_sys->i_offset_x = var_CreateGetBool( p_vout, CFG_PREFIX "offset-x" );
     if (p_vout->p_sys->i_col > 2) p_vout->p_sys->i_offset_x = 0; // offset-x is used in case of 2x1 wall & autocrop
     p_vout->p_sys->b_autocrop = !(var_CreateGetInteger( p_vout, "crop-ratio" ) == 0);
     if (!p_vout->p_sys->b_autocrop) p_vout->p_sys->b_autocrop = var_CreateGetInteger( p_vout, "autocrop" );
-    p_vout->p_sys->b_attenuate = var_CreateGetInteger( p_vout, CFG_PREFIX "attenuate");
+    p_vout->p_sys->b_attenuate = var_CreateGetBool( p_vout, CFG_PREFIX "attenuate");
     p_vout->p_sys->bz_length = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-length" );
     if (p_vout->p_sys->i_row > 1)
         p_vout->p_sys->bz_height = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-height" );
@@ -412,7 +412,7 @@ case VLC_FOURCC('c','y','u','v'):    // packed by 2
     p_vout->p_sys->f_gamma_blue = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-blue" );
 #endif
 #ifndef SYS_MINGW32
-    p_vout->p_sys->b_xinerama= var_CreateGetInteger( p_vout, CFG_PREFIX "xinerama" );
+    p_vout->p_sys->b_xinerama = var_CreateGetBool( p_vout, CFG_PREFIX "xinerama" );
 #endif
 #else
     p_vout->p_sys->i_col = __MAX( 1, __MIN( 15, p_vout->p_sys->i_col ) );
@@ -540,7 +540,7 @@ static uint8_t F(uint8_t i, float gamma)
  *****************************************************************************/
 static int AdjustHeight( vout_thread_t *p_vout )
 {
-    bool b_fullscreen = var_CreateGetInteger( p_vout, "fullscreen" );
+    bool b_fullscreen = p_vout->b_fullscreen;
     int i_window_width = p_vout->i_window_width;
     int i_window_height = p_vout->i_window_height;
     double d_halfLength = 0;
@@ -548,34 +548,33 @@ static int AdjustHeight( vout_thread_t *p_vout )
     double d_halfLength_calculated;
     int    i_offset = 0;
 
-// OS DEPENDENT CODE to get display dimensions
-        if (b_fullscreen)
-        {
+    // OS DEPENDENT CODE to get display dimensions
+    if (b_fullscreen )
+    {
 #ifdef SYS_MINGW32
-            i_window_width  = GetSystemMetrics(SM_CXSCREEN);
-            i_window_height = GetSystemMetrics(SM_CYSCREEN);
+        i_window_width  = GetSystemMetrics(SM_CXSCREEN);
+        i_window_height = GetSystemMetrics(SM_CYSCREEN);
 #else
-            Display *p_display = XOpenDisplay( "" );
-            if (p_vout->p_sys->b_xinerama)
-            {
-                i_window_width = DisplayWidth(p_display, 0) / p_vout->p_sys->i_col;
-                i_window_height = DisplayHeight(p_display, 0) / p_vout->p_sys->i_row;
-             }
-            else
-            {
-                i_window_width = DisplayWidth(p_display, 0);
-                i_window_height = DisplayHeight(p_display, 0);
-            }
-               XCloseDisplay( p_display );
-               free(p_display);
+        Display *p_display = XOpenDisplay( "" );
+        if (p_vout->p_sys->b_xinerama)
+        {
+            i_window_width = DisplayWidth(p_display, 0) / p_vout->p_sys->i_col;
+            i_window_height = DisplayHeight(p_display, 0) / p_vout->p_sys->i_row;
+        }
+        else
+        {
+            i_window_width = DisplayWidth(p_display, 0);
+            i_window_height = DisplayHeight(p_display, 0);
+        }
+        XCloseDisplay( p_display );
 #endif
         var_SetInteger( p_vout, "width", i_window_width);
         var_SetInteger( p_vout, "height", i_window_height);
         p_vout->i_window_width = i_window_width;
-           p_vout->i_window_height = i_window_height;
-        }
+        p_vout->i_window_height = i_window_height;
+    }
 
-        if (p_vout->p_sys->bz_length)
+    if( p_vout->p_sys->bz_length)
         if ((!p_vout->p_sys->b_autocrop) && (!p_vout->p_sys->i_ratio))
         {
             if ((p_vout->p_sys->i_row > 1) || (p_vout->p_sys->i_col > 1))
@@ -622,10 +621,10 @@ static int AdjustHeight( vout_thread_t *p_vout )
                         (p_vout->p_sys->i_halfLength * (double)i_window_height *
                         (double)p_vout->render.i_aspect  /     VOUT_ASPECT_FACTOR / (double)p_vout->output.i_width);
         }
-        else
-            d_halfLength = 0;
+    else
+        d_halfLength = 0;
 
-        return i_offset;
+    return i_offset;
 }
 #endif
 
@@ -633,6 +632,8 @@ static int AdjustHeight( vout_thread_t *p_vout )
 /*****************************************************************************
  * Init: initialize Wall video thread output method
  *****************************************************************************/
+#define VLC_XCHG( type, a, b ) do { type __tmp = (b); (b) = (a); (a) = __tmp; } while(0)
+
 static int Init( vout_thread_t *p_vout )
 {
     int i_index, i_row, i_col, i_width, i_height;
@@ -673,6 +674,16 @@ static int Init( vout_thread_t *p_vout )
         f_WhiteLevel[0] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitelevel-red" ) / 255.0;
         f_WhiteLevel[1] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitelevel-green" ) / 255.0;
         f_WhiteLevel[2] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitelevel-blue" ) / 255.0;
+        for( int i = 3; i < VOUT_MAX_PLANES; i++ )
+        {
+            /* Initialize unsupported planes */
+            f_BlackCrush[i] = 140.0/255.0;
+            f_WhiteCrush[i] = 200.0/255.0;
+            f_BlackLevel[i] = 150.0/255.0;
+            f_WhiteLevel[i] = 0.0/255.0;
+            p_vout->p_sys->f_gamma[i] = 1.0;
+        }
+
         switch (p_vout->render.i_chroma)
         {
         // planar YVU
@@ -683,16 +694,11 @@ static int Init( vout_thread_t *p_vout )
             case VLC_FOURCC('U','Y','N','V'):    // packed by 2
             case VLC_FOURCC('Y','4','2','2'):    // packed by 2
     //        case VLC_FOURCC('c','y','u','v'):    // packed by 2
-                p_vout->p_sys->f_gamma[2] = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-green" );
-                p_vout->p_sys->f_gamma[1] = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-blue" );
-                f_BlackCrush[2] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-blackcrush-green" ) / 255.0;
-                f_BlackCrush[1] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-blackcrush-blue" ) / 255.0;
-                f_WhiteCrush[2] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitecrush-green" ) / 255.0;
-                f_WhiteCrush[1] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitecrush-blue" ) / 255.0;
-                f_BlackLevel[2] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-blacklevel-green" ) / 255.0;
-                f_BlackLevel[1] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-blacklevel-blue" ) / 255.0;
-                f_WhiteLevel[2] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitelevel-green" ) / 255.0;
-                f_WhiteLevel[1] = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-whitelevel-blue" ) / 255.0;
+                VLC_XCHG( float, p_vout->p_sys->f_gamma[1], p_vout->p_sys->f_gamma[2] );
+                VLC_XCHG( float, f_BlackCrush[1], f_BlackCrush[2] );
+                VLC_XCHG( float, f_WhiteCrush[1], f_WhiteCrush[2] );
+                VLC_XCHG( float, f_BlackLevel[1], f_BlackLevel[2] );
+                VLC_XCHG( float, f_WhiteLevel[1], f_WhiteLevel[2] );
         // planar YUV
             case VLC_FOURCC('I','4','4','4'):
             case VLC_FOURCC('I','4','2','2'):
@@ -981,6 +987,7 @@ static void RenderPlanarYUV( vout_thread_t *p_vout, picture_t *p_pic )
                 int i_out_pitch = p_outpic->p[i_plane].i_pitch;
                 int i_copy_pitch = p_outpic->p[i_plane].i_visible_pitch;
                 int i_lines = p_outpic->p[i_plane].i_visible_lines;
+
 #ifdef OVERLAP
                 if (i_col) pi_left_skip[i_plane] -= (2 * p_vout->p_sys->i_halfLength ) / (p_vout->p_sys->pp_vout[i_vout].i_width / i_copy_pitch);
                 if ((i_row) && (!i_col)) pi_top_skip[i_plane] -= (2 * p_vout->p_sys->i_halfHeight * p_pic->p[i_plane].i_pitch) / (p_vout->p_sys->pp_vout[i_vout].i_width / i_copy_pitch);
@@ -989,13 +996,12 @@ static void RenderPlanarYUV( vout_thread_t *p_vout, picture_t *p_pic )
                     pi_top_skip[i_plane] -= (2 * p_vout->p_sys->i_halfHeight * i_row * p_pic->p[i_plane].i_pitch) / (p_vout->p_sys->pp_vout[i_vout].i_width / i_copy_pitch);
 // i_n : previous inactive pp_vout
                 int i_n=0;
-                while ((!p_vout->p_sys->pp_vout[i_row * p_vout->p_sys->i_col + i_col - 1 - i_n].b_active) && (i_col - i_n > 1)) i_n++;
+                while( (i_col - i_n > 1) && (!p_vout->p_sys->pp_vout[i_row * p_vout->p_sys->i_col + i_col - 1 - i_n].b_active) ) i_n++;
                 if ((i_col > 1) && i_n)
                     pi_left_skip[i_plane] -= i_n*(2 * p_vout->p_sys->i_halfLength ) / (p_vout->p_sys->pp_vout[i_vout].i_width / i_copy_pitch);
 
                 p_in = p_pic->p[i_plane].p_pixels
-                /* Wall proprities */
-                + pi_top_skip[i_plane] + pi_left_skip[i_plane];
+                        + pi_top_skip[i_plane] + pi_left_skip[i_plane]; /* Wall proprities */
 
                 if ((p_vout->p_sys->i_row > 2) &&
                     ((!i_row) || (i_row + 1 == p_vout->p_sys->i_row)))




More information about the vlc-devel mailing list