Do not convert RGB buffer at once when stride does not fit exact samples.
authorKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 29 Jul 2011 10:55:01 +0000 (12:55 +0200)
committerRonald S. Bultje <rsbultje@gmail.com>
Sat, 30 Jul 2011 16:51:23 +0000 (09:51 -0700)
When converting RGB format to RGB format with the same bits per sample,
unscaled path performs conversion on the whole buffer at once. For
non-multiple-of-16 BGR24 to RGB24 conversion it means that padding at the
end of line will be converted too. Since it may be of arbitrary length
(e.g. 8 bytes), operating on the whole buffer produces obviously wrong
results.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
libswscale/swscale_unscaled.c

index 59f31c6f6421703e0b1ea99a2cda473534fbbb6d..c0161c24e952d61bd2cd54fe20b455cad918b2c1 100644 (file)
@@ -382,7 +382,7 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
         if ((dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_BGR32_1) && !isRGBA32(srcFormat))
             dstPtr += ALT32_CORR;
 
-        if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0)
+        if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0 && !(srcStride[0] % srcBpp))
             conv(srcPtr, dstPtr + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
         else {
             int i;