Commit 0834db5163 for ffmpeg
commit 0834db516348d253b2c51f969188501d324c698d
Author: Romain Beauxis <romain.beauxis@gmail.com>
Date: Thu Nov 12 21:39:25 2026 -0600
avcodec/mpegaudiodec: set the sample rate before allocating the frame
decode_frame() sets the sample rate from the parsed header along with
the channel layout, before mp_decode_frame() allocates the output frame,
as decode_frame_adu() does.
The first frame after a mid-stream sample rate change carries its own
rate, as the updated mpegaudiodec-sample-rate-change reference shows.
diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c
index b146307dd9..cb86ea170d 100644
--- a/libavcodec/mpegaudiodec_template.c
+++ b/libavcodec/mpegaudiodec_template.c
@@ -1592,6 +1592,8 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
return AVERROR_INVALIDDATA;
}
/* update codec info */
+ if (avctx->codec_id != AV_CODEC_ID_AHX)
+ avctx->sample_rate = s->hdr.sample_rate;
av_channel_layout_uninit(&avctx->ch_layout);
avctx->ch_layout = s->hdr.nb_channels == 1 ? (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO :
(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
@@ -1612,9 +1614,6 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (ret >= 0) {
s->frame->nb_samples = avctx->frame_size;
*got_frame_ptr = 1;
- if (avctx->codec_id != AV_CODEC_ID_AHX)
- avctx->sample_rate = s->hdr.sample_rate;
- //FIXME maybe move the other codec info stuff from above here too
} else {
av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n");
/* Only return an error if the bad frame makes up the whole packet or
diff --git a/tests/ref/fate/mpegaudiodec-sample-rate-change b/tests/ref/fate/mpegaudiodec-sample-rate-change
index b7d84f4651..08e2caafbc 100644
--- a/tests/ref/fate/mpegaudiodec-sample-rate-change
+++ b/tests/ref/fate/mpegaudiodec-sample-rate-change
@@ -1,6 +1,6 @@
44100
44100
44100
-44100
+48000
48000
48000