* modules/video_chroma/i420_rgb16.c: take care of width != pitch as well.
authorGildas Bazin <gbazin@videolan.org>
Mon, 30 Aug 2004 01:24:08 +0000 (01:24 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 30 Aug 2004 01:24:08 +0000 (01:24 +0000)
modules/video_chroma/i420_rgb16.c

index 8cc3eba..f15054f 100644 (file)
@@ -2,7 +2,7 @@
  * i420_rgb16.c : YUV to bitmap RGB conversion module for vlc
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: i420_rgb16.c,v 1.5 2003/08/29 18:58:05 fenrir Exp $
+ * $Id$
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -82,6 +82,11 @@ void E_(I420_RGB16_dithering)( vout_thread_t *p_vout, picture_t *p_src,
     int *       p_offset_start = p_vout->chroma.p_sys->p_offset;
     int *       p_offset;
 
+    const int i_source_margin = p_src->p[0].i_pitch
+                                 - p_src->p[0].i_visible_pitch;
+    const int i_source_margin_c = p_src->p[1].i_pitch
+                                 - p_src->p[1].i_visible_pitch;
+
     /* The dithering matrices */
     int dither10[4] = {  0x0,  0x8,  0x2,  0xa };
     int dither11[4] = {  0xc,  0x4,  0xe,  0x6 };
@@ -172,6 +177,13 @@ void E_(I420_RGB16_dithering)( vout_thread_t *p_vout, picture_t *p_src,
         }
         SCALE_WIDTH;
         SCALE_HEIGHT( 420, 2 );
+
+        p_y += i_source_margin;
+        if( i_y % 2 )
+        {
+            p_u += i_source_margin_c;
+            p_v += i_source_margin_c;
+        }
     }
 }
 #endif
@@ -219,6 +231,11 @@ void E_(I420_RGB16)( vout_thread_t *p_vout, picture_t *p_src,
     int *       p_offset_start = p_vout->chroma.p_sys->p_offset;
     int *       p_offset;
 
+    const int i_source_margin = p_src->p[0].i_pitch
+                                 - p_src->p[0].i_visible_pitch;
+    const int i_source_margin_c = p_src->p[1].i_pitch
+                                 - p_src->p[1].i_visible_pitch;
+
     i_right_margin = p_dest->p->i_pitch - p_dest->p->i_visible_pitch;
 
     if( p_vout->render.i_width & 7 )
@@ -342,6 +359,13 @@ void E_(I420_RGB16)( vout_thread_t *p_vout, picture_t *p_src,
         }
         SCALE_WIDTH;
         SCALE_HEIGHT( 420, 2 );
+
+        p_y += i_source_margin;
+        if( i_y % 2 )
+        {
+            p_u += i_source_margin_c;
+            p_v += i_source_margin_c;
+        }
     }
 }
 
@@ -388,6 +412,11 @@ void E_(I420_RGB32)( vout_thread_t *p_vout, picture_t *p_src,
     int *       p_offset_start = p_vout->chroma.p_sys->p_offset;
     int *       p_offset;
 
+    const int i_source_margin = p_src->p[0].i_pitch
+                                 - p_src->p[0].i_visible_pitch;
+    const int i_source_margin_c = p_src->p[1].i_pitch
+                                 - p_src->p[1].i_visible_pitch;
+
     i_right_margin = p_dest->p->i_pitch - p_dest->p->i_visible_pitch;
 
     if( p_vout->render.i_width & 7 )
@@ -471,6 +500,13 @@ void E_(I420_RGB32)( vout_thread_t *p_vout, picture_t *p_src,
         }
         SCALE_WIDTH;
         SCALE_HEIGHT( 420, 4 );
+
+        p_y += i_source_margin;
+        if( i_y % 2 )
+        {
+            p_u += i_source_margin_c;
+            p_v += i_source_margin_c;
+        }
     }
 }