From d3e80837e72bab37a610edd0c1b0307a1db39c31 Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Fri, 21 Nov 2025 20:43:56 +0800 Subject: [PATCH] avformat/mov: fix incorrect sample rate by parse srat box --- libavformat/mov.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/libavformat/mov.c b/libavformat/mov.c index a3e1ba0a31..8aac4a7d7a 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1075,6 +1075,40 @@ fail: } #endif +static int mov_read_srat(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + int32_t sample_rate; + + if (atom.size < 8 || c->fc->nb_streams < 1) + return 0; + + st = c->fc->streams[c->fc->nb_streams-1]; + if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) { + av_log(c->fc, AV_LOG_WARNING, "'srat' within non-audio sample entry, skip\n"); + return 0; + } + + if (!c->isom) { + av_log(c->fc, AV_LOG_WARNING, "'srat' within non-isom, skip\n"); + return 0; + } + + avio_skip(pb, 4); // version+flags + sample_rate = avio_rb32(pb); + if (sample_rate > 0) { + av_log(c->fc, AV_LOG_DEBUG, + "overwrite sample rate from %d to %d by 'srat'\n", + st->codecpar->sample_rate, sample_rate); + st->codecpar->sample_rate = sample_rate; + } else { + av_log(c->fc, AV_LOG_WARNING, + "ignore invalid sample rate %d in 'srat'\n", sample_rate); + } + + return 0; +} + static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -9489,6 +9523,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { #if CONFIG_IAMFDEC { MKTAG('i','a','c','b'), mov_read_iacb }, #endif +{ MKTAG('s','r','a','t'), mov_read_srat }, { 0, NULL } };