Fix a bug in the conversion of rgba32->yuv420p. This resulted in garbage images
authorPhilip Gladstone <philipjsg@users.sourceforge.net>
Sat, 8 Feb 2003 15:34:25 +0000 (15:34 +0000)
committerPhilip Gladstone <philipjsg@users.sourceforge.net>
Sat, 8 Feb 2003 15:34:25 +0000 (15:34 +0000)
when this conversion was used. I suspect that the same bug may be lurking in
other conversions. [The assumption was that the linesize was equal to the width
for both the source and destination images. This turns out not to be true
in some cases.]

Originally committed as revision 1556 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/imgconvert.c

index 4019631..5a09486 100644 (file)
@@ -574,8 +574,8 @@ static void rgb_name ## _to_yuv420p(AVPicture *dst, AVPicture *src,     \
     cb = dst->data[1];                                                  \
     cr = dst->data[2];                                                  \
                                                                         \
-    wrap = width;                                                       \
-    wrap3 = width * BPP;                                                \
+    wrap = dst->linesize[0];                                            \
+    wrap3 = src->linesize[0];                                           \
     p = src->data[0];                                                   \
     for(y=0;y<height;y+=2) {                                            \
         for(x=0;x<width;x+=2) {                                         \
@@ -620,8 +620,10 @@ static void rgb_name ## _to_yuv420p(AVPicture *dst, AVPicture *src,     \
             p += -wrap3 + 2 * BPP;                                      \
             lum += -wrap + 2;                                           \
         }                                                               \
-        p += wrap3;                                                     \
-        lum += wrap;                                                    \
+        p += wrap3 + (wrap3 - width * BPP);                             \
+        lum += wrap + (wrap - width);                                   \
+        cb += dst->linesize[1] - width / 2;                             \
+        cr += dst->linesize[2] - width / 2;                             \
     }                                                                   \
 }                                                                       \
                                                                         \