diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-06-26 01:21:21 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-06-26 17:04:31 +0100 |
| commit | 09a9ac376db005a40a351736bcff4077f098825d (patch) | |
| tree | 64ea69741155d15d114ad96daf0f90e24b3abe28 /src/lib/audio_decoder.cc | |
| parent | 46cd0fe7b5b514f0d9456b25f670679cc584a218 (diff) | |
Another try at sorting out the thorny question of timing.
Diffstat (limited to 'src/lib/audio_decoder.cc')
| -rw-r--r-- | src/lib/audio_decoder.cc | 101 |
1 files changed, 5 insertions, 96 deletions
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index a9e01908c..dc49a1846 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -31,57 +31,12 @@ using std::cout; using boost::optional; using boost::shared_ptr; -AudioDecoder::AudioDecoder (shared_ptr<const Film> f, shared_ptr<const AudioContent> c) +AudioDecoder::AudioDecoder (shared_ptr<const Film> f) : Decoder (f) - , _next_audio (0) - , _audio_content (c) + , _audio_position (0) { - if (_audio_content->content_audio_frame_rate() != _audio_content->output_audio_frame_rate()) { - - shared_ptr<const Film> film = _film.lock (); - assert (film); - - stringstream s; - 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 - layout is not necessary for our purposes; it seems - only to be used get the number of channels and - decide if rematrixing is needed. It won't be, since - input and output layouts are the same. - */ - - _swr_context = swr_alloc_set_opts ( - 0, - av_get_default_channel_layout (_audio_content->audio_channels ()), - AV_SAMPLE_FMT_FLTP, - _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 - ); - - swr_init (_swr_context); - } else { - _swr_context = 0; - } } -AudioDecoder::~AudioDecoder () -{ - if (_swr_context) { - swr_free (&_swr_context); - } -} - - #if 0 void AudioDecoder::process_end () @@ -113,54 +68,8 @@ AudioDecoder::process_end () #endif void -AudioDecoder::audio (shared_ptr<const AudioBuffers> data, Time time) -{ - /* 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() * _audio_content->output_audio_frame_rate() / _audio_content->content_audio_frame_rate() - ) + 32; - - shared_ptr<AudioBuffers> resampled (new AudioBuffers (data->channels(), max_resampled_frames)); - - /* Resample audio */ - int const resampled_frames = swr_convert ( - _swr_context, (uint8_t **) resampled->data(), max_resampled_frames, (uint8_t const **) data->data(), data->frames() - ); - - if (resampled_frames < 0) { - throw EncodeError (_("could not run sample-rate converter")); - } - - resampled->set_frames (resampled_frames); - - /* And point our variables at the resampled audio */ - data = resampled; - } - - shared_ptr<const Film> film = _film.lock (); - assert (film); - - /* Remap channels */ - shared_ptr<AudioBuffers> dcp_mapped (new AudioBuffers (film->dcp_audio_channels(), data->frames())); - dcp_mapped->make_silent (); - list<pair<int, libdcp::Channel> > map = _audio_content->audio_mapping().content_to_dcp (); - for (list<pair<int, libdcp::Channel> >::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 +AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame) { - shared_ptr<const Film> film = _film.lock (); - assert (film); - - return (_audio_content->length() - _next_audio) < film->audio_frames_to_time (1); + Audio (data, frame); + _audio_position = frame + data->frames (); } - |
