diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-04-14 00:48:27 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-04-14 00:48:27 +0100 |
| commit | 7fb622a18582f18fcc6cfe140a262fd6cc8cad88 (patch) | |
| tree | 7d4a6d849cc276aada1df1d4bc16f97c7f25c0bb /src | |
| parent | 8c4b46f9fc316327e5e9e83e711dfa21bbde4935 (diff) | |
Fix mapping of audio in DCP.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/audio_mapping.cc | 2 | ||||
| -rw-r--r-- | src/lib/encoder.cc | 6 | ||||
| -rw-r--r-- | src/lib/player.cc | 31 | ||||
| -rw-r--r-- | src/lib/player.h | 2 |
4 files changed, 21 insertions, 20 deletions
diff --git a/src/lib/audio_mapping.cc b/src/lib/audio_mapping.cc index b85ea7314..2e8077565 100644 --- a/src/lib/audio_mapping.cc +++ b/src/lib/audio_mapping.cc @@ -41,7 +41,7 @@ int AudioMapping::dcp_channels () const { for (list<pair<Channel, libdcp::Channel> >::const_iterator i = _content_to_dcp.begin(); i != _content_to_dcp.end(); ++i) { - if (((int) i->second) > 2) { + if (((int) i->second) >= 2) { return 6; } } diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index b897c8a31..d6a57ae6b 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -135,9 +135,9 @@ void Encoder::process_end () { #if HAVE_SWRESAMPLE - if (_film->has_audio() && _film->audio_channels() && _swr_context) { + if (_film->has_audio() && _swr_context) { - shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_channels(), 256)); + shared_ptr<AudioBuffers> 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); @@ -312,7 +312,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data) /* Compute the resampled frames count and add 32 for luck */ int const max_resampled_frames = ceil ((int64_t) data->frames() * _film->target_audio_sample_rate() / _film->audio_frame_rate()) + 32; - shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_channels(), max_resampled_frames)); + shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_mapping().dcp_channels(), max_resampled_frames)); /* Resample audio */ int const resampled_frames = swr_convert ( diff --git a/src/lib/player.cc b/src/lib/player.cc index 92c2929ac..c77059b0a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -92,8 +92,8 @@ Player::pass () } } - Audio (_sndfile_buffers); - _sndfile_buffers.reset (); + Audio (_audio_buffers); + _audio_buffers.reset (); } return done; @@ -126,22 +126,23 @@ Player::process_video (shared_ptr<Image> i, bool same, shared_ptr<Subtitle> s) void Player::process_audio (weak_ptr<const AudioContent> c, shared_ptr<AudioBuffers> b) { - if (_playlist->audio_from() == Playlist::AUDIO_SNDFILE) { - AudioMapping mapping = _film->audio_mapping (); - if (!_sndfile_buffers) { - _sndfile_buffers.reset (new AudioBuffers (mapping.dcp_channels(), b->frames ())); - _sndfile_buffers->make_silent (); - } + AudioMapping mapping = _film->audio_mapping (); + if (!_audio_buffers) { + _audio_buffers.reset (new AudioBuffers (mapping.dcp_channels(), b->frames ())); + _audio_buffers->make_silent (); + } - for (int i = 0; i < b->channels(); ++i) { - list<libdcp::Channel> dcp = mapping.content_to_dcp (AudioMapping::Channel (c, i)); - for (list<libdcp::Channel>::iterator j = dcp.begin(); j != dcp.end(); ++j) { - _sndfile_buffers->accumulate (b, i, static_cast<int> (*j)); - } + for (int i = 0; i < b->channels(); ++i) { + list<libdcp::Channel> dcp = mapping.content_to_dcp (AudioMapping::Channel (c, i)); + for (list<libdcp::Channel>::iterator j = dcp.begin(); j != dcp.end(); ++j) { + _audio_buffers->accumulate (b, i, static_cast<int> (*j)); } + } - } else { - Audio (b); + if (_playlist->audio_from() == Playlist::AUDIO_FFMPEG) { + /* We can just emit this audio now as it will all be here */ + Audio (_audio_buffers); + _audio_buffers.reset (); } } diff --git a/src/lib/player.h b/src/lib/player.h index 8a82ab298..7a99d6561 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -70,7 +70,7 @@ private: std::list<boost::shared_ptr<VideoDecoder> >::iterator _video_decoder; std::list<boost::shared_ptr<SndfileDecoder> > _sndfile_decoders; - boost::shared_ptr<AudioBuffers> _sndfile_buffers; + boost::shared_ptr<AudioBuffers> _audio_buffers; bool _video_sync; }; |
