X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder.cc;h=9b8d15bf163927c69cbe201e5c7427825013db76;hb=996b0c06e23bcb6b300d7b8799df94993692e07d;hp=e1c93ac77bcb23de9a5888cdc2babd36ffdef442;hpb=21ce34c2cd04a2e7e133ff693b84c054182f4f91;p=dcpomatic.git diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index e1c93ac77..9b8d15bf1 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -25,19 +25,28 @@ #include "i18n.h" using std::stringstream; +using std::list; +using std::pair; using boost::optional; using boost::shared_ptr; AudioDecoder::AudioDecoder (shared_ptr f, shared_ptr c) : Decoder (f) + , _next_audio (0) , _audio_content (c) - , _output_audio_frame_rate (_audio_content->output_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); - _film->log()->log (s.str ()); + 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 resampler. As far as I can see, the audio channel @@ -51,7 +60,7 @@ AudioDecoder::AudioDecoder (shared_ptr f, shared_ptroutput_audio_frame_rate(), av_get_default_channel_layout (MAX_AUDIO_CHANNELS), AV_SAMPLE_FMT_FLTP, _audio_content->content_audio_frame_rate(), @@ -78,7 +87,10 @@ AudioDecoder::process_end () { if (_swr_context) { - shared_ptr out (new AudioBuffers (_film->audio_mapping().dcp_channels(), 256)); + shared_ptr film = _film.lock (); + assert (film); + + shared_ptr out (new AudioBuffers (film->audio_mapping().dcp_channels(), 256)); while (1) { int const frames = swr_convert (_swr_context, (uint8_t **) out->data(), 256, 0, 0); @@ -100,17 +112,17 @@ AudioDecoder::process_end () #endif void -AudioDecoder::emit_audio (shared_ptr data, Time time) +AudioDecoder::audio (shared_ptr data, Time time) { - /* XXX: map audio to 5.1 */ - - /* Maybe sample-rate convert */ + /* 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 ( @@ -127,7 +139,19 @@ AudioDecoder::emit_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()); }