X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder.cc;h=a9e01908c4782a6095821d080800b0568ce71214;hb=50cb31af16240b248700dab1484d7f07656c66df;hp=ddda816a571d374897ee499f8bfdee155b1b8ee2;hpb=8c6fe8e1e8c8f6d5932606f2a5b6e1b87681ae38;p=dcpomatic.git diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index ddda816a5..a9e01908c 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -25,6 +25,9 @@ #include "i18n.h" using std::stringstream; +using std::list; +using std::pair; +using std::cout; using boost::optional; using boost::shared_ptr; @@ -32,15 +35,18 @@ AudioDecoder::AudioDecoder (shared_ptr f, shared_ptroutput_audio_frame_rate (f)) { - if (_audio_content->content_audio_frame_rate() != _output_audio_frame_rate) { + if (_audio_content->content_audio_frame_rate() != _audio_content->output_audio_frame_rate()) { shared_ptr film = _film.lock (); assert (film); stringstream s; - s << String::compose ("Will resample audio from %1 to %2", _audio_content->content_audio_frame_rate(), _output_audio_frame_rate); + s << String::compose ( + "Will resample audio from %1 to %2", + _audio_content->content_audio_frame_rate(), _audio_content->output_audio_frame_rate() + ); + film->log()->log (s.str ()); /* We will be using planar float data when we call the @@ -53,10 +59,10 @@ AudioDecoder::AudioDecoder (shared_ptr f, shared_ptraudio_channels ()), AV_SAMPLE_FMT_FLTP, - _output_audio_frame_rate, - av_get_default_channel_layout (MAX_AUDIO_CHANNELS), + _audio_content->output_audio_frame_rate(), + av_get_default_channel_layout (_audio_content->audio_channels ()), AV_SAMPLE_FMT_FLTP, _audio_content->content_audio_frame_rate(), 0, 0 @@ -109,15 +115,15 @@ AudioDecoder::process_end () void AudioDecoder::audio (shared_ptr data, Time time) { - /* XXX: map audio to 5.1 */ - /* Maybe resample */ if (_swr_context) { /* Compute the resampled frames count and add 32 for luck */ - int const max_resampled_frames = ceil ((int64_t) data->frames() * _output_audio_frame_rate / _audio_content->content_audio_frame_rate()) + 32; + int const max_resampled_frames = ceil ( + (int64_t) data->frames() * _audio_content->output_audio_frame_rate() / _audio_content->content_audio_frame_rate() + ) + 32; - shared_ptr resampled (new AudioBuffers (MAX_AUDIO_CHANNELS, max_resampled_frames)); + shared_ptr resampled (new AudioBuffers (data->channels(), max_resampled_frames)); /* Resample audio */ int const resampled_frames = swr_convert ( @@ -134,11 +140,27 @@ AudioDecoder::audio (shared_ptr data, Time time) data = resampled; } - Audio (data, time); - shared_ptr film = _film.lock (); assert (film); + + /* Remap channels */ + shared_ptr dcp_mapped (new AudioBuffers (film->dcp_audio_channels(), data->frames())); + dcp_mapped->make_silent (); + list > map = _audio_content->audio_mapping().content_to_dcp (); + for (list >::iterator i = map.begin(); i != map.end(); ++i) { + dcp_mapped->accumulate_channel (data.get(), i->first, i->second); + } + + Audio (dcp_mapped, time); _next_audio = time + film->audio_frames_to_time (data->frames()); } - +bool +AudioDecoder::audio_done () const +{ + shared_ptr film = _film.lock (); + assert (film); + + return (_audio_content->length() - _next_audio) < film->audio_frames_to_time (1); +} +