diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-08-15 15:46:41 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-08-15 18:27:09 +0200 |
| commit | df7697962ef1049077643636918fba3cd3457e71 (patch) | |
| tree | bad496a5b4ddefcb4f677411608172cb9753c2b9 /src/lib/audio_decoder.cc | |
| parent | 89df429dc7df08143da7b96fc428cde8bfa88a8e (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.cc | 18 |
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])); |
