]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/scpr.h
avformat/mux: factorize interleaved write_packet
[ffmpeg] / libavcodec / scpr.h
index bb9b4d6a9bbcc434a4a968bcb2ef6ebf75f56298..15cb87c464e687c9aeae08c7287da8e3aeed07a3 100644 (file)
@@ -89,12 +89,12 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
     uint32_t lx = *plx,
              ly = *ply;
 
+    if (y >= avctx->height)
+        return AVERROR_INVALIDDATA;
+
     switch (ptype) {
     case 0:
         while (run-- > 0) {
-            if (y >= avctx->height)
-                return AVERROR_INVALIDDATA;
-
             dst[y * linesize + x] = clr;
             lx = x;
             ly = y;
@@ -102,14 +102,13 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
             if (x >= avctx->width) {
                 x = 0;
                 (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
             }
         }
         break;
     case 1:
         while (run-- > 0) {
-            if (y >= avctx->height)
-                return AVERROR_INVALIDDATA;
-
             dst[y * linesize + x] = dst[ly * linesize + lx];
             lx = x;
             ly = y;
@@ -117,15 +116,17 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
             if (x >= avctx->width) {
                 x = 0;
                 (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
             }
         }
         clr = dst[ly * linesize + lx];
         break;
     case 2:
-        while (run-- > 0) {
-            if (y < 1 || y >= avctx->height)
-                return AVERROR_INVALIDDATA;
+        if (y < 1)
+            return AVERROR_INVALIDDATA;
 
+        while (run-- > 0) {
             clr = dst[y * linesize + x + off + 1];
             dst[y * linesize + x] = clr;
             lx = x;
@@ -134,32 +135,35 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
             if (x >= avctx->width) {
                 x = 0;
                 (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
             }
         }
         break;
     case 4:
+        if (y < 1 || (y == 1 && x == 0))
+            return AVERROR_INVALIDDATA;
+
         while (run-- > 0) {
             uint8_t *odst = (uint8_t *)dst;
-
-            if (y < 1 || y >= avctx->height ||
-                (y == 1 && x == 0))
-                return AVERROR_INVALIDDATA;
+            int off1 = (ly * linesize + lx) * 4;
+            int off2 = ((y * linesize + x) + off) * 4;
 
             if (x == 0) {
-                z = backstep;
+                z = backstep * 4;
             } else {
                 z = 0;
             }
 
-            r = odst[(ly * linesize + lx) * 4] +
-                odst[((y * linesize + x) + off) * 4 + 4] -
-                odst[((y * linesize + x) + off - z) * 4];
-            g = odst[(ly * linesize + lx) * 4 + 1] +
-                odst[((y * linesize + x) + off) * 4 + 5] -
-                odst[((y * linesize + x) + off - z) * 4 + 1];
-            b = odst[(ly * linesize + lx) * 4 + 2] +
-                odst[((y * linesize + x) + off) * 4 + 6] -
-                odst[((y * linesize + x) + off - z) * 4 + 2];
+            r = odst[off1] +
+                odst[off2 + 4] -
+                odst[off2 - z ];
+            g = odst[off1 + 1] +
+                odst[off2 + 5] -
+                odst[off2 - z  + 1];
+            b = odst[off1 + 2] +
+                odst[off2 + 6] -
+                odst[off2 - z  + 2];
             clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
             dst[y * linesize + x] = clr;
             lx = x;
@@ -168,15 +172,16 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
             if (x >= avctx->width) {
                 x = 0;
                 (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
             }
         }
         break;
     case 5:
-        while (run-- > 0) {
-            if (y < 1 || y >= avctx->height ||
-                (y == 1 && x == 0))
-                return AVERROR_INVALIDDATA;
+        if (y < 1 || (y == 1 && x == 0))
+            return AVERROR_INVALIDDATA;
 
+        while (run-- > 0) {
             if (x == 0) {
                 z = backstep;
             } else {
@@ -191,6 +196,8 @@ static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
             if (x >= avctx->width) {
                 x = 0;
                 (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
             }
         }
         break;