From c5d12e5bc6f4201a9876bc21f08a1a3278fa7fc0 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 12 Sep 2026 19:50:46 +0000 Subject: [PATCH] 2026-09-12 19:50:46 Signed-off-by: lizzie --- src/audio_core/adsp/apps/opus/opus_decoder.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.cpp b/src/audio_core/adsp/apps/opus/opus_decoder.cpp index 0be0f774b1..35a9b3b828 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decoder.cpp @@ -88,7 +88,6 @@ public: avc->extradata_size = OPUS_HEAD_SIZE + 2 * channel_count; } - // FFmpeg hardcodes sample rate avc->sample_rate = sample_rate; avc->request_sample_fmt = AV_SAMPLE_FMT_S16; @@ -97,18 +96,17 @@ public: avpkt = av_packet_alloc(); frame = av_frame_alloc(); return ResultSuccess; - } else { - avcodec_free_context(&avc); } + avcodec_free_context(&avc); } } return Service::Audio::ResultLibOpusInternalError; } Result Shutdown() { - avcodec_free_context(&avc); av_frame_free(&frame); av_packet_free(&avpkt); + avcodec_free_context(&avc); return ResultSuccess; } @@ -128,14 +126,14 @@ public: int r = avcodec_receive_frame(avc, frame); if (r == AVERROR(EAGAIN)) { av_packet_unref(avpkt); - av_new_packet(avpkt, int(input_data_size)); + av_new_packet(avpkt, int(input_data_size) + AV_INPUT_BUFFER_PADDING_SIZE); std::memcpy(avpkt->data, reinterpret_cast(input_data), input_data_size); r = avcodec_send_packet(avc, avpkt); ASSERT(r >= 0); } else if (r == AVERROR_EOF) { break; } else if (r >= 0) { - auto const bsize = av_samples_get_buffer_size(nullptr, frame->ch_layout.nb_channels, frame->nb_samples, AV_SAMPLE_FMT_S16, 1); + auto const bsize = av_samples_get_buffer_size(frame->linesize, frame->ch_layout.nb_channels, frame->nb_samples, AV_SAMPLE_FMT_S16, 1); if (frame->format == AV_SAMPLE_FMT_S16) { std::memcpy(reinterpret_cast(output_data) + (int(output_data_size) - rem_output_bytes), frame->data[0], size_t(bsize)); } else {