Fix checking of frame channels vs stream channels.
authorCarl Hetherington <cth@carlh.net>
Sat, 1 Oct 2022 10:04:12 +0000 (12:04 +0200)
committerCarl Hetherington <cth@carlh.net>
Sat, 1 Oct 2022 10:04:12 +0000 (12:04 +0200)
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
src/lib/ffmpeg_decoder.h

index ba96d71ff5da78a9fe084d1bd56bbb2d82be56d4..a5b36d04f442ee71f8ca76adbc718f7c08f4ab3e 100644 (file)
@@ -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<AudioBuffers>
-FFmpegDecoder::deinterleave_audio (AVFrame* frame)
+deinterleave_audio(shared_ptr<FFmpegAudioStream> stream, AVFrame* frame)
 {
        auto format = static_cast<AVSampleFormat>(frame->format);
 
@@ -326,12 +327,12 @@ FFmpegDecoder::deinterleave_audio (AVFrame* frame)
        case AV_SAMPLE_FMT_FLTP:
        {
                auto p = reinterpret_cast<float**> (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<FFmpegAudioStream> 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;
 
index ce2476fb03b5bf6e1903ffe0de43c6cc33394b8e..e1a023453a5d21eccd2a479907c674a77a367264 100644 (file)
@@ -59,8 +59,6 @@ private:
 
        bool flush ();
 
-       static std::shared_ptr<AudioBuffers> deinterleave_audio (AVFrame* frame);
-
        AVSampleFormat audio_sample_format (std::shared_ptr<FFmpegAudioStream> stream) const;
        int bytes_per_audio_sample (std::shared_ptr<FFmpegAudioStream> stream) const;