Cope with unexpected channel counts in data coming from audio decoders.
authorCarl Hetherington <cth@carlh.net>
Tue, 15 Aug 2023 13:46:41 +0000 (15:46 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 15 Aug 2023 16:27:09 +0000 (18:27 +0200)
src/lib/audio_decoder.cc

index ad337476239246f73dc96238b8ed1653ccf49795..61ff5d265c526e6de31e44d5bfb7eb6972883fba 100644 (file)
@@ -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]));