[FFmpeg-devel] [PATCH 3/2] avcodec/sanm: codec37 buffers are private
Marton Balint
cus at passwd.hu
Mon Jan 13 22:45:13 EET 2025
On Mon, 13 Jan 2025, Manuel Lauss wrote:
> codec37 operates on 2 buffers, which must be considered private to
> the codec and must therefore not be changed by subsequent FOBJs.
>
> Let codec37 therefore operate on frm1/2 instead of frm0/2, but copy
> the decoded image to frm0 where other codecs operate on.
>
> Fixes artifacts encountered in Full Throttle "dazed.san" and also
> in a lot of Rebel Assault II gameplay videos: these videos consist of
> frames with an initial codec37 FOBJ image to set the stage, and
> optional codec1-23 FOBJs overlaid on top of that image.
>
> Signed-off-by: Manuel Lauss <manuel.lauss at gmail.com>
> ---
> Applies on top of my previous patch "avcodec/sanm: simplify codec37 subcodec 3/4 path"
>
> libavcodec/sanm.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c
> index 51b8a2f54c..5bbfd5de8c 100644
> --- a/libavcodec/sanm.c
> +++ b/libavcodec/sanm.c
> @@ -645,10 +645,13 @@ static int old_codec37(SANMVideoContext *ctx, int top,
>
> ctx->rotate_code = 0;
>
> - if (((seq & 1) || !(flags & 1)) && (compr && compr != 2))
> - rotate_bufs(ctx, 1);
> + if (((seq & 1) || !(flags & 1)) && (compr && compr != 2)) {
> + void *tmp = ctx->frm1;
> + ctx->frm1 = ctx->frm2;
> + ctx->frm2 = tmp;
FFSWAP?
Thanks,
Marton
> + }
>
> - dst = ((uint8_t*)ctx->frm0) + left + top * stride;
> + dst = ((uint8_t*)ctx->frm1) + left + top * stride;
> prev = ((uint8_t*)ctx->frm2) + left + top * stride;
>
> if (mvoff > 2) {
> @@ -662,7 +665,6 @@ static int old_codec37(SANMVideoContext *ctx, int top,
> bytestream2_get_buffer(&ctx->gb, dst, width);
> dst += stride;
> }
> - memset(ctx->frm1, 0, ctx->height * stride);
> memset(ctx->frm2, 0, ctx->height * stride);
> break;
> case 1:
> @@ -729,7 +731,6 @@ static int old_codec37(SANMVideoContext *ctx, int top,
> case 2:
> if (rle_decode(ctx, dst, decoded_size))
> return AVERROR_INVALIDDATA;
> - memset(ctx->frm1, 0, ctx->frm1_size);
> memset(ctx->frm2, 0, ctx->frm2_size);
> break;
> case 3:
> @@ -783,6 +784,7 @@ static int old_codec37(SANMVideoContext *ctx, int top,
> return AVERROR_PATCHWELCOME;
> }
>
> + memcpy(ctx->frm0, ctx->frm1, ctx->buf_size);
> return 0;
> }
>
> --
> 2.47.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
More information about the ffmpeg-devel
mailing list