[FFmpeg-devel] [PATCH v3 10/14] avcodec/sanm: codec37: reimplement comp4

Manuel Lauss manuel.lauss at gmail.com
Mon Mar 17 19:49:12 EET 2025


Compression 4 code 0 means copy from delta buffer without mv,
AND start of a skip run.  This gets rid of the extra case and column
index manipulation and implements this as it is implemented in the
original game exe, i.e. as a special case for after mv copy.

Signed-off-by: Manuel Lauss <manuel.lauss at gmail.com>
---
v3: check bytestream size before reading a byte
v2: no changes

 libavcodec/sanm.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c
index 5bb35df9e0..9486e298cf 100644
--- a/libavcodec/sanm.c
+++ b/libavcodec/sanm.c
@@ -1106,16 +1106,17 @@ static int old_codec37(SANMVideoContext *ctx, int width, int height)
                     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);
+
+                    if ((compr == 4) && (code == 0)) {
+                        if (bytestream2_get_bytes_left(&ctx->gb) < 1)
+                            return AVERROR_INVALIDDATA;
+                        skip_run = bytestream2_get_byteu(&ctx->gb);
+                    }
                 }
             }
             dst  += stride * 4;
-- 
2.49.0



More information about the ffmpeg-devel mailing list