summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-10-01 12:04:12 +0200
committerCarl Hetherington <cth@carlh.net>2022-10-01 12:04:12 +0200
commitdba7e1137282b52a1bd6ad1d56fe6371a8c97e30 (patch)
tree3a640d849c45d583a853900fa0c1fc6392f919ec /src/lib
parent3d369d6ce80caf87520237f4e8009b7fd55aa91b (diff)
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.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ffmpeg_decoder.cc11
-rw-r--r--src/lib/ffmpeg_decoder.h2
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<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;
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<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;