[FFmpeg-devel] [PATCH] libavformat/smush: read ANIMv2 a/v parameters

Marton Balint cus at passwd.hu
Mon Dec 9 03:03:33 EET 2024



On Tue, 26 Nov 2024, Manuel Lauss wrote:

> SMUSH ANIM files with subversion 2 provide additional fields for
> framerate and samplerate, use them if available, otherwise
> default to 12 fps which is the default for almost all ANIMv2
> since 1995.
>
> Fixes the too-fast playback of test files from LucasArts games
> released 1995-1997.  It was not noticed since Audio for
> those isn't decoded by ffmpeg.
>
> Signed-off-by: Manuel Lauss <manuel.lauss at gmail.com>
> ---
> libavformat/smush.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)

Thanks, applied a slightly modified version.

Regards,
Marton

>
> diff --git a/libavformat/smush.c b/libavformat/smush.c
> index 0877f7faff..25730e5816 100644
> --- a/libavformat/smush.c
> +++ b/libavformat/smush.c
> @@ -51,7 +51,7 @@ static int smush_read_header(AVFormatContext *ctx)
>     AVStream *vst, *ast;
>     uint32_t magic, nframes, size, subversion, i;
>     uint32_t width = 0, height = 0, got_audio = 0, read = 0;
> -    uint32_t sample_rate, channels, palette[256];
> +    uint32_t sample_rate, channels, palette[256], frame_rate = 15;
>     int ret;
>
>     magic = avio_rb32(pb);
> @@ -76,7 +76,16 @@ static int smush_read_header(AVFormatContext *ctx)
>         for (i = 0; i < 256; i++)
>             palette[i] = avio_rb24(pb);
>
> -        avio_skip(pb, size - (3 * 256 + 6));
> +        if (subversion > 1) {
> +            frame_rate = avio_rl32(pb);
> +            avio_skip(pb, 4);            // max size of FRME chunk in file
> +            sample_rate = avio_rl32(pb);
> +            avio_skip(pb, size - (3 * 256 + 6 + 3 * 4));
> +            if (frame_rate < 1 || frame_rate > 70)
> +                frame_rate = 12;
> +        } else {
> +            avio_skip(pb, size - (3 * 256 + 6));
> +        }
>     } else if (magic == MKBETAG('S', 'A', 'N', 'M')) {
>         if (avio_rb32(pb) != MKBETAG('S', 'H', 'D', 'R'))
>             return AVERROR_INVALIDDATA;
> @@ -146,7 +155,7 @@ static int smush_read_header(AVFormatContext *ctx)
>
>     smush->video_stream_index = vst->index;
>
> -    avpriv_set_pts_info(vst, 64, 1, 15);
> +    avpriv_set_pts_info(vst, 64, 1, frame_rate);
>
>     vst->start_time        = 0;
>     vst->duration          =
> -- 
> 2.47.0
>
> _______________________________________________
> 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