From dba7e1137282b52a1bd6ad1d56fe6371a8c97e30 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 1 Oct 2022 12:04:12 +0200 Subject: [PATCH] Fix checking of frame channels vs stream channels. The comment says that we're handling differences between channel counts in the frame and stream but the code wasn't doing that. --- src/lib/ffmpeg_decoder.cc | 11 ++++++----- src/lib/ffmpeg_decoder.h | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index ba96d71ff..a5b36d04f 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -219,8 +219,9 @@ FFmpegDecoder::pass () /** @param data pointer to array of pointers to buffers. * Only the first buffer will be used for non-planar data, otherwise there will be one per channel. */ +static shared_ptr -FFmpegDecoder::deinterleave_audio (AVFrame* frame) +deinterleave_audio(shared_ptr stream, AVFrame* frame) { auto format = static_cast(frame->format); @@ -326,12 +327,12 @@ FFmpegDecoder::deinterleave_audio (AVFrame* frame) case AV_SAMPLE_FMT_FLTP: { auto p = reinterpret_cast (frame->data); - DCPOMATIC_ASSERT (frame->channels <= channels); + DCPOMATIC_ASSERT(channels <= stream->channels()); /* Sometimes there aren't as many channels in the frame as in the stream */ - for (int i = 0; i < frame->channels; ++i) { + for (int i = 0; i < channels; ++i) { memcpy (data[i], p[i], frames * sizeof(float)); } - for (int i = frame->channels; i < channels; ++i) { + for (int i = channels; i < stream->channels(); ++i) { audio->make_silent (i); } } @@ -450,7 +451,7 @@ void FFmpegDecoder::process_audio_frame (shared_ptr stream) { auto frame = audio_frame (stream); - auto data = deinterleave_audio (frame); + auto data = deinterleave_audio(stream, frame); auto const time_base = stream->stream(_format_context)->time_base; diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index ce2476fb0..e1a023453 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -59,8 +59,6 @@ private: bool flush (); - static std::shared_ptr deinterleave_audio (AVFrame* frame); - AVSampleFormat audio_sample_format (std::shared_ptr stream) const; int bytes_per_audio_sample (std::shared_ptr stream) const; -- 2.30.2