diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-12-29 01:11:22 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-12-29 01:11:22 +0000 |
| commit | 60d528017a3ac1afdc30a3a000b28dda96a2175e (patch) | |
| tree | df6cad7c5ccd7f0da0802eb7dcf258df2bf1f7f9 /src | |
| parent | f8755c678d5b4b3d6b31761ef0ec13265190ca0c (diff) | |
Previously the code did not account for referenced audio, so far
as I can see. It decided which reel to write new audio to based on
how many frames had been written to the current reel; this makes
no sense for referred reels for which the player will emit no audio.
This code looks at the audio timestamp instead.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/dcp_encoder.cc | 3 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 3 | ||||
| -rw-r--r-- | src/lib/reel_writer.h | 6 | ||||
| -rw-r--r-- | src/lib/writer.cc | 34 | ||||
| -rw-r--r-- | src/lib/writer.h | 2 |
5 files changed, 23 insertions, 25 deletions
diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index 81464c8dc..76bfba5a2 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -121,11 +121,10 @@ DCPEncoder::video (shared_ptr<PlayerVideo> data, DCPTime time) _j2k_encoder->encode (data, time); } -/** The audio data passed into this method must be contiguous and start from the last accurate seek time */ void DCPEncoder::audio (shared_ptr<AudioBuffers> data, DCPTime time) { - _writer->write (data); + _writer->write (data, time); shared_ptr<Job> job = _job.lock (); DCPOMATIC_ASSERT (job); diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 1e730259f..c560909a9 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -69,7 +69,6 @@ ReelWriter::ReelWriter ( , _period (period) , _last_written_video_frame (-1) , _last_written_eyes (EYES_RIGHT) - , _total_written_audio_frames (0) , _reel_index (reel_index) , _reel_count (reel_count) , _content_summary (content_summary) @@ -534,8 +533,6 @@ ReelWriter::write (shared_ptr<const AudioBuffers> audio) if (audio) { _sound_asset_writer->write (audio->data(), audio->frames()); } - - _total_written_audio_frames += audio->frames (); } void diff --git a/src/lib/reel_writer.h b/src/lib/reel_writer.h index edf6c081e..c0e98f6eb 100644 --- a/src/lib/reel_writer.h +++ b/src/lib/reel_writer.h @@ -72,10 +72,6 @@ public: return _period; } - int total_written_audio_frames () const { - return _total_written_audio_frames; - } - int last_written_video_frame () const { return _last_written_video_frame; } @@ -107,8 +103,6 @@ private: /** the index of the last written video frame within the reel */ int _last_written_video_frame; Eyes _last_written_eyes; - /** the number of audio frames that have been written to the reel */ - int _total_written_audio_frames; /** index of this reel within the DCP (starting from 0) */ int _reel_index; /** number of reels in the DCP */ diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 3f0c687c2..6295058b8 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -231,36 +231,44 @@ Writer::fake_write (Frame frame, Eyes eyes) } /** Write some audio frames to the DCP. - * @param audio Audio data or 0 if there is no audio to be written here (i.e. it is referenced). + * @param audio Audio data. + * @param time Time of this data within the DCP. * This method is not thread safe. */ void -Writer::write (shared_ptr<const AudioBuffers> audio) +Writer::write (shared_ptr<const AudioBuffers> audio, DCPTime const time) { + DCPOMATIC_ASSERT (audio); + + int const afr = _film->audio_frame_rate(); + + DCPTime const end = time + DCPTime::from_frames(audio->frames(), afr); + /* The audio we get might span a reel boundary, and if so we have to write it in bits */ - int32_t offset = 0; - while (offset < audio->frames ()) { + DCPTime t = time; + while (t < end) { if (_audio_reel == _reels.end ()) { /* This audio is off the end of the last reel; ignore it */ return; } - int32_t const remaining = audio->frames() - offset; - int32_t const reel_space = _audio_reel->period().duration().frames_floor(_film->audio_frame_rate()) - _audio_reel->total_written_audio_frames(); - - if (remaining <= reel_space) { + if (end <= _audio_reel->period().to) { /* Easy case: we can write all the audio to this reel */ _audio_reel->write (audio); - offset += remaining; + t = end; } else { /* Write the part we can */ - shared_ptr<AudioBuffers> part (new AudioBuffers (audio->channels(), reel_space)); - part->copy_from (audio.get(), reel_space, offset, 0); - _audio_reel->write (part); + DCPTime const this_reel = _audio_reel->period().to - t; + Frame const this_reel_frames = this_reel.frames_ceil(afr); + if (this_reel_frames) { + shared_ptr<AudioBuffers> part (new AudioBuffers (audio->channels(), this_reel_frames)); + part->copy_from (audio.get(), this_reel_frames, DCPTime(t - time).frames_ceil(afr), 0); + _audio_reel->write (part); + } ++_audio_reel; - offset += reel_space; + t += this_reel; } } } diff --git a/src/lib/writer.h b/src/lib/writer.h index cb1bdc5cc..ec7b98804 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -103,7 +103,7 @@ public: void fake_write (Frame, Eyes); bool can_repeat (Frame) const; void repeat (Frame, Eyes); - void write (boost::shared_ptr<const AudioBuffers>); + void write (boost::shared_ptr<const AudioBuffers>, DCPTime time); void write (PlayerSubtitles subs, DCPTimePeriod period); void write (std::list<boost::shared_ptr<Font> > fonts); void write (ReferencedReelAsset asset); |
