aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Lauss <manuel.lauss@gmail.com>2025-01-09 09:03:12 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2025-01-17 23:33:25 +0100
commit9a794897c39c300fd5d9c71c6db4c5017fb9ea5d (patch)
tree637562599f0c691a3056a90ba4ef3024549bccf7
parentfff7737b3d4c06eba7c71329635fa2a351cc0351 (diff)
downloadffmpeg-9a794897c39c300fd5d9c71c6db4c5017fb9ea5d.tar.gz
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.lauss@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavcodec/sanm.c114
1 files 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: