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".