Ping?

Incidentally this also closes trac ticket #5753;  while commit
b22ce90d ("avcodec/sanm: SMUSH codec48 decoder") fixes #5746.

Thanks!
     Manuel

On Thu, Jan 9, 2025 at 9:03 AM Manuel Lauss <manuel.la...@gmail.com> wrote:
>
> RLE-compressed stream of motion vector indices and a special opcode
> to fill a block with data from the source stream.
>
> It is used in the LucasArts "Full Throttle" blink*.san animations.
>
> Signed-off-by: Manuel Lauss <manuel.la...@gmail.com>
> ---
> v2: move variable declarations to top of functions.
>
>  libavcodec/sanm.c | 65 ++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 62 insertions(+), 3 deletions(-)
>
> diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c
> index a278ef24b1..0d04b09c8d 100644
> --- a/libavcodec/sanm.c
> +++ b/libavcodec/sanm.c
> @@ -624,8 +624,8 @@ static inline void codec37_mv(uint8_t *dst, const uint8_t 
> *src,
>  static int old_codec37(SANMVideoContext *ctx, int top,
>                         int left, int width, int height)
>  {
> +    int i, j, k, l, t, run, len, code, skip, mx, my;
>      ptrdiff_t stride = ctx->pitch;
> -    int i, j, k, t;
>      uint8_t *dst, *prev;
>      int skip_run = 0;
>      int compr = bytestream2_get_byte(&ctx->gb);
> @@ -665,6 +665,67 @@ static int old_codec37(SANMVideoContext *ctx, int top,
>          memset(ctx->frm1, 0, ctx->height * stride);
>          memset(ctx->frm2, 0, ctx->height * stride);
>          break;
> +    case 1:
> +        run = 0;
> +        len = -1;
> +        code = 0;
> +
> +        for (j = 0; j < height; j += 4) {
> +            for (i = 0; i < width; i += 4) {
> +                if (len < 0) {
> +                    if (bytestream2_get_bytes_left(&ctx->gb) < 1)
> +                        return AVERROR_INVALIDDATA;
> +                    code = bytestream2_get_byte(&ctx->gb);
> +                    len = code >> 1;
> +                    run = code & 1;
> +                    skip = 0;
> +                } else {
> +                    skip = run;
> +                }
> +
> +                if (!skip) {
> +                    if (bytestream2_get_bytes_left(&ctx->gb) < 1)
> +                        return AVERROR_INVALIDDATA;
> +                    code = bytestream2_get_byte(&ctx->gb);
> +                    if (code == 0xff) {
> +                        len--;
> +                        for (k = 0; k < 4; k++) {
> +                            for (l = 0; l < 4; l++) {
> +                                if (len < 0) {
> +                                    if (bytestream2_get_bytes_left(&ctx->gb) 
> < 1)
> +                                        return AVERROR_INVALIDDATA;
> +                                    code = bytestream2_get_byte(&ctx->gb);
> +                                    len = code >> 1;
> +                                    run = code & 1;
> +                                    if (run) {
> +                                        if 
> (bytestream2_get_bytes_left(&ctx->gb) < 1)
> +                                            return AVERROR_INVALIDDATA;
> +                                        code = 
> bytestream2_get_byte(&ctx->gb);
> +                                    }
> +                                }
> +                                if (!run) {
> +                                    if (bytestream2_get_bytes_left(&ctx->gb) 
> < 1)
> +                                            return AVERROR_INVALIDDATA;
> +                                        code = 
> bytestream2_get_byte(&ctx->gb);
> +                                }
> +                                *(dst + i + (k * stride) + l) = code;
> +                                len--;
> +                            }
> +                        }
> +                        continue;
> +                    }
> +                }
> +                /* 4x4 block copy from prev with MV */
> +                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);
> +                len--;
> +            }
> +            dst += stride * 4;
> +            prev += stride * 4;
> +        }
> +        break;
>      case 2:
>          if (rle_decode(ctx, dst, decoded_size))
>              return AVERROR_INVALIDDATA;
> @@ -712,8 +773,6 @@ static int old_codec37(SANMVideoContext *ctx, int top,
>                              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,
> --
> 2.47.1
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

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

Reply via email to