summaryrefslogtreecommitdiff
path: root/src/lib/audio_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-08-15 15:46:41 +0200
committerCarl Hetherington <cth@carlh.net>2023-08-15 18:27:09 +0200
commitdf7697962ef1049077643636918fba3cd3457e71 (patch)
treebad496a5b4ddefcb4f677411608172cb9753c2b9 /src/lib/audio_decoder.cc
parent89df429dc7df08143da7b96fc428cde8bfa88a8e (diff)
Cope with unexpected channel counts in data coming from audio decoders.
Diffstat (limited to 'src/lib/audio_decoder.cc')
-rw-r--r--src/lib/audio_decoder.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc
index ad3374762..61ff5d265 100644
--- a/src/lib/audio_decoder.cc
+++ b/src/lib/audio_decoder.cc
@@ -120,11 +120,23 @@ AudioDecoder::emit(shared_ptr<const Film> film, AudioStreamPtr stream, shared_pt
}
if (resampler && !flushing) {
- auto ro = resampler->run (data);
- if (ro->frames() == 0) {
+ /* It can be the the data here has a different number of channels than the stream
+ * it comes from (e.g. the files decoded by FFmpegDecoder sometimes have a random
+ * frame, often at the end, with more channels). Insert silence or discard channels
+ * here.
+ */
+ if (resampler->channels() != data->channels()) {
+ LOG_WARNING("Received audio data with an unexpected channel count of %1 instead of %2", data->channels(), resampler->channels());
+ auto data_copy = data->clone();
+ data_copy->set_channels(resampler->channels());
+ data = resampler->run(data_copy);
+ } else {
+ data = resampler->run(data);
+ }
+
+ if (data->frames() == 0) {
return;
}
- data = ro;
}
Data(stream, ContentAudio (data, _positions[stream]));