This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 41b9f6ca417133f0bd341328d207dbdd9408843e Author: James Almer <[email protected]> AuthorDate: Wed Nov 4 13:15:29 2026 -0300 Commit: James Almer <[email protected]> CommitDate: Sat Nov 7 14:09:45 2026 +0000 libavcodec/libopusdec: don't override sample rate if it's set Input parameters may be inherited from the source audio used during encoding, including sample rate, timestamps, and priming/trailing samples to discard. Choose a supported output sample rate closest to the input one while at it. Signed-off-by: James Almer <[email protected]> --- libavcodec/libopusdec.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c index fc2119baff..527ed5890a 100644 --- a/libavcodec/libopusdec.c +++ b/libavcodec/libopusdec.c @@ -39,6 +39,7 @@ struct libopus_context { AVClass *class; OpusMSDecoder *dec; int pre_skip; + int sample_rate; #ifndef OPUS_SET_GAIN union { int i; double d; } gain; #endif @@ -53,6 +54,7 @@ static av_cold int libopus_decode_init(AVCodecContext *avc) { struct libopus_context *opus = avc->priv_data; int ret, channel_map = 0, gain_db = 0, nb_streams, nb_coupled, channels; + const int sample_rates[5] = { 8000, 12000, 16000, 24000, 48000 }; uint8_t mapping_arr[8] = { 0, 1 }, *mapping; channels = avc->extradata_size >= 10 ? avc->extradata[9] : (avc->ch_layout.nb_channels == 1) ? 1 : 2; @@ -62,7 +64,18 @@ static av_cold int libopus_decode_init(AVCodecContext *avc) channels = 2; } - avc->sample_rate = 48000; + if (!avc->sample_rate) + avc->sample_rate = 48000; + for (int i = 0; i < FF_ARRAY_ELEMS(sample_rates); i++) + if (sample_rates[i] >= avc->sample_rate) { + opus->sample_rate = sample_rates[i]; + break; + } + if (!opus->sample_rate) { + av_log(avc, AV_LOG_WARNING, "Invalid sample rate %d\n", avc->sample_rate); + return AVERROR(EINVAL); + } + avc->sample_fmt = avc->request_sample_fmt == AV_SAMPLE_FMT_FLT ? AV_SAMPLE_FMT_FLT : AV_SAMPLE_FMT_S16; av_channel_layout_uninit(&avc->ch_layout); @@ -105,7 +118,7 @@ static av_cold int libopus_decode_init(AVCodecContext *avc) mapping = mapping_arr; } - opus->dec = opus_multistream_decoder_create(avc->sample_rate, channels, + opus->dec = opus_multistream_decoder_create(opus->sample_rate, channels, nb_streams, nb_coupled, mapping, &ret); if (!opus->dec) { @@ -163,6 +176,7 @@ static int libopus_decode(AVCodecContext *avc, AVFrame *frame, struct libopus_context *opus = avc->priv_data; int ret, nb_samples; + frame->sample_rate = opus->sample_rate; frame->nb_samples = MAX_FRAME_SIZE; if ((ret = ff_get_buffer(avc, frame, 0)) < 0) return ret; -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
