ffmpeg | branch: master | Manuel Lauss <manuel.la...@gmail.com> | Thu Jan  9 
09:03:12 2025 +0100| [9a794897c39c300fd5d9c71c6db4c5017fb9ea5d] | committer: 
Michael Niedermayer

avcodec/sanm: simplify codec37 subcodec 3/4 path

A flag in the codec header determines whether opcodes 0xfd/0xfe
are to be treated as special or not.  The current code has 2
implementations of the same decoding scheme, with one treating
the 2 opcodes as special, the other not.
Collapse them into a single implementation and treat these opcode
according to the flag.

Signed-off-by: Manuel Lauss <manuel.la...@gmail.com>
Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9a794897c39c300fd5d9c71c6db4c5017fb9ea5d
---

 libavcodec/sanm.c | 114 ++++++++++++++++++------------------------------------
 1 file changed, 37 insertions(+), 77 deletions(-)

diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c
index 0d04b09c8d..51b8a2f54c 100644
--- a/libavcodec/sanm.c
+++ b/libavcodec/sanm.c
@@ -734,87 +734,47 @@ static int old_codec37(SANMVideoContext *ctx, int top,
         break;
     case 3:
     case 4:
-        if (flags & 4) {
-            for (j = 0; j < height; j += 4) {
-                for (i = 0; i < width; i += 4) {
-                    int code;
-                    if (skip_run) {
-                        skip_run--;
-                        copy_block4(dst + i, prev + i, stride, stride, 4);
-                        continue;
-                    }
+        for (j = 0; j < height; j += 4) {
+            for (i = 0; i < width; i += 4) {
+                int code;
+                if (skip_run) {
+                    skip_run--;
+                    copy_block4(dst + i, prev + i, stride, stride, 4);
+                    continue;
+                }
+                if (bytestream2_get_bytes_left(&ctx->gb) < 1)
+                    return AVERROR_INVALIDDATA;
+                code = bytestream2_get_byteu(&ctx->gb);
+                if (code == 0xFF) {
+                    if (bytestream2_get_bytes_left(&ctx->gb) < 16)
+                        return AVERROR_INVALIDDATA;
+                    for (k = 0; k < 4; k++)
+                        bytestream2_get_bufferu(&ctx->gb, dst + i + k * 
stride, 4);
+                } else if ((flags & 4) && (code == 0xFE)) {
+                    if (bytestream2_get_bytes_left(&ctx->gb) < 4)
+                       return AVERROR_INVALIDDATA;
+                   for (k = 0; k < 4; k++)
+                       memset(dst + i + k * stride, 
bytestream2_get_byteu(&ctx->gb), 4);
+                } else if ((flags & 4) && (code == 0xFD)) {
                     if (bytestream2_get_bytes_left(&ctx->gb) < 1)
                         return AVERROR_INVALIDDATA;
-                    code = bytestream2_get_byteu(&ctx->gb);
-                    switch (code) {
-                    case 0xFF:
-                        if (bytestream2_get_bytes_left(&ctx->gb) < 16)
-                            return AVERROR_INVALIDDATA;
-                        for (k = 0; k < 4; k++)
-                            bytestream2_get_bufferu(&ctx->gb, dst + i + k * 
stride, 4);
-                        break;
-                    case 0xFE:
-                        if (bytestream2_get_bytes_left(&ctx->gb) < 4)
-                            return AVERROR_INVALIDDATA;
-                        for (k = 0; k < 4; k++)
-                            memset(dst + i + k * stride, 
bytestream2_get_byteu(&ctx->gb), 4);
-                        break;
-                    case 0xFD:
-                        if (bytestream2_get_bytes_left(&ctx->gb) < 1)
-                            return AVERROR_INVALIDDATA;
-                        t = bytestream2_get_byteu(&ctx->gb);
-                        for (k = 0; k < 4; k++)
-                            memset(dst + i + k * stride, t, 4);
-                        break;
-                    default:
-                        if (compr == 4 && !code) {
-                            if (bytestream2_get_bytes_left(&ctx->gb) < 1)
-                                return AVERROR_INVALIDDATA;
-                            skip_run = bytestream2_get_byteu(&ctx->gb) + 1;
-                            i -= 4;
-                        } else {
-                            mx = c37_mv[(mvoff * 255 + code) * 2];
-                            my = c37_mv[(mvoff * 255 + code) * 2 + 1];
-                            codec37_mv(dst + i, prev + i + mx + my * stride,
-                                       ctx->height, stride, i + mx, j + my);
-                        }
-                    }
-                }
-                dst  += stride * 4;
-                prev += stride * 4;
-            }
-        } else {
-            for (j = 0; j < height; j += 4) {
-                for (i = 0; i < width; i += 4) {
-                    int code;
-                    if (skip_run) {
-                        skip_run--;
-                        copy_block4(dst + i, prev + i, stride, stride, 4);
-                        continue;
-                    }
-                    code = bytestream2_get_byte(&ctx->gb);
-                    if (code == 0xFF) {
-                        if (bytestream2_get_bytes_left(&ctx->gb) < 16)
-                            return AVERROR_INVALIDDATA;
-                        for (k = 0; k < 4; k++)
-                            bytestream2_get_bufferu(&ctx->gb, dst + i + k * 
stride, 4);
-                    } else if (compr == 4 && !code) {
-                        if (bytestream2_get_bytes_left(&ctx->gb) < 1)
-                            return AVERROR_INVALIDDATA;
-                        skip_run = bytestream2_get_byteu(&ctx->gb) + 1;
-                        i -= 4;
-                    } else {
-                        int mx, my;
-
-                        mx = c37_mv[(mvoff * 255 + code) * 2];
-                        my = c37_mv[(mvoff * 255 + code) * 2 + 1];
-                        codec37_mv(dst + i, prev + i + mx + my * stride,
-                                   ctx->height, stride, i + mx, j + my);
-                    }
+                    t = bytestream2_get_byteu(&ctx->gb);
+                    for (k = 0; k < 4; k++)
+                        memset(dst + i + k * stride, t, 4);
+               } else if ((compr == 4) && (code == 0)) {
+                    if (bytestream2_get_bytes_left(&ctx->gb) < 1)
+                        return AVERROR_INVALIDDATA;
+                    skip_run = bytestream2_get_byteu(&ctx->gb) + 1;
+                    i -= 4;
+               } else {
+                    mx = c37_mv[(mvoff * 255 + code) * 2];
+                    my = c37_mv[(mvoff * 255 + code) * 2 + 1];
+                    codec37_mv(dst + i, prev + i + mx + my * stride,
+                               ctx->height, stride, i + mx, j + my);
                 }
-                dst  += stride * 4;
-                prev += stride * 4;
             }
+            dst  += stride * 4;
+            prev += stride * 4;
         }
         break;
     default:

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to