]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/pngenc.c
libx265: Properly handled dynamic linking with MSVC
[ffmpeg] / libavcodec / pngenc.c
index bf61be1609e229444990ce490af93ad5c2d7c7af..35a95921ad44a3f89450d01cb725d80b29470b4c 100644 (file)
@@ -113,6 +113,22 @@ static void sub_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, i
     }
 }
 
+static void sub_left_prediction(DSPContext *dsp, uint8_t *dst, const uint8_t *src, int bpp, int size)
+{
+    const uint8_t *src1 = src + bpp;
+    const uint8_t *src2 = src;
+    int x, unaligned_w;
+
+    memcpy(dst, src, bpp);
+    dst += bpp;
+    size -= bpp;
+    unaligned_w = FFMIN(32 - bpp, size);
+    for (x = 0; x < unaligned_w; x++)
+        *dst++ = *src1++ - *src2++;
+    size -= unaligned_w;
+    dsp->diff_bytes(dst, src1, src2, size);
+}
+
 static void png_filter_row(DSPContext *dsp, uint8_t *dst, int filter_type,
                            uint8_t *src, uint8_t *top, int size, int bpp)
 {
@@ -123,8 +139,7 @@ static void png_filter_row(DSPContext *dsp, uint8_t *dst, int filter_type,
         memcpy(dst, src, size);
         break;
     case PNG_FILTER_VALUE_SUB:
-        dsp->diff_bytes(dst, src, src-bpp, size);
-        memcpy(dst, src, bpp);
+        sub_left_prediction(dsp, dst, src, bpp, size);
         break;
     case PNG_FILTER_VALUE_UP:
         dsp->diff_bytes(dst, src, top, size);