summaryrefslogtreecommitdiff
path: root/src/lib/j2k_wav_encoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-22 21:04:50 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-22 21:04:50 +0100
commit579dfce1bae018efd73c9f5f3f31770cb401d19a (patch)
treef7bb1b2ad0537515fe3478d9ffe46a081f3b3414 /src/lib/j2k_wav_encoder.cc
parent71b7808830e17423453502ed5112b70bf90fff1b (diff)
Try again to sort out the audio padding / alignment.
Diffstat (limited to 'src/lib/j2k_wav_encoder.cc')
-rw-r--r--src/lib/j2k_wav_encoder.cc21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/lib/j2k_wav_encoder.cc b/src/lib/j2k_wav_encoder.cc
index 8747bb7ad..c0c785d11 100644
--- a/src/lib/j2k_wav_encoder.cc
+++ b/src/lib/j2k_wav_encoder.cc
@@ -49,6 +49,7 @@ J2KWAVEncoder::J2KWAVEncoder (shared_ptr<const FilmState> s, shared_ptr<const Op
#ifdef HAVE_SWRESAMPLE
, _swr_context (0)
#endif
+ , _audio_frames_written (0)
, _process_end (false)
{
/* Create sound output files with .tmp suffixes; we will rename
@@ -218,11 +219,11 @@ J2KWAVEncoder::encoder_thread (ServerDescription* server)
void
J2KWAVEncoder::process_begin (int64_t audio_channel_layout)
{
- if (_fs->audio_sample_rate() != _fs->target_sample_rate()) {
+ if (_fs->audio_sample_rate() != _fs->target_audio_sample_rate()) {
#ifdef HAVE_SWRESAMPLE
stringstream s;
- s << "Will resample audio from " << _fs->audio_sample_rate() << " to " << _fs->target_sample_rate();
+ s << "Will resample audio from " << _fs->audio_sample_rate() << " to " << _fs->target_audio_sample_rate();
_log->log (s.str ());
/* We will be using planar float data when we call the resampler */
@@ -230,7 +231,7 @@ J2KWAVEncoder::process_begin (int64_t audio_channel_layout)
0,
audio_channel_layout,
AV_SAMPLE_FMT_FLTP,
- _fs->target_sample_rate(),
+ _fs->target_audio_sample_rate(),
audio_channel_layout,
AV_SAMPLE_FMT_FLTP,
_fs->audio_sample_rate(),
@@ -321,7 +322,13 @@ J2KWAVEncoder::process_end ()
swr_free (&_swr_context);
}
-#endif
+#endif
+
+ int const dcp_sr = dcp_audio_sample_rate (_fs->audio_sample_rate ());
+ int64_t const extra_audio_frames = dcp_sr - (_audio_frames_written % dcp_sr);
+ shared_ptr<AudioBuffers> silence (new AudioBuffers (_fs->audio_channels(), extra_audio_frames));
+ silence->make_silent ();
+ write_audio (silence);
close_sound_files ();
@@ -344,7 +351,7 @@ J2KWAVEncoder::process_audio (shared_ptr<const AudioBuffers> audio)
if (_swr_context) {
/* Compute the resampled frames count and add 32 for luck */
- int const max_resampled_frames = ceil (audio->frames() * _fs->target_sample_rate() / _fs->audio_sample_rate()) + 32;
+ int const max_resampled_frames = ceil (audio->frames() * _fs->target_audio_sample_rate() / _fs->audio_sample_rate()) + 32;
resampled.reset (new AudioBuffers (_fs->audio_channels(), max_resampled_frames));
@@ -368,10 +375,12 @@ J2KWAVEncoder::process_audio (shared_ptr<const AudioBuffers> audio)
}
void
-J2KWAVEncoder::write_audio (shared_ptr<const AudioBuffers> audio) const
+J2KWAVEncoder::write_audio (shared_ptr<const AudioBuffers> audio)
{
for (int i = 0; i < _fs->audio_channels(); ++i) {
sf_write_float (_sound_files[i], audio->data(i), audio->frames());
}
+
+ _audio_frames_written += audio->frames ();
}