diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-11-05 20:47:41 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-11-05 20:47:41 +0000 |
| commit | 3a5f168317a4fa7b8df54c10cedb68e95b972699 (patch) | |
| tree | 0369d3a2f35d068b776c5442fe6ed7de31246b93 | |
| parent | 667ca18efe8548d5d607aee714d68e46f95f88bf (diff) | |
Fix timestamps of things coming out of the DCP decoder for multi-reel.
| -rw-r--r-- | ChangeLog | 4 | ||||
| -rw-r--r-- | src/lib/dcp_decoder.cc | 22 |
2 files changed, 20 insertions, 6 deletions
@@ -1,3 +1,7 @@ +2015-11-05 Carl Hetherington <cth@carlh.net> + + * Correct time display when previewing multi-reel DCP content. + 2015-11-05 c.hetherington <cth@carlh.net> * Updated nl_NL translation from Rob van Nieuwkerk. diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index c968259b3..379ce5a89 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -65,7 +65,17 @@ DCPDecoder::pass (PassReason reason, bool) return true; } + /* Offset of the start of the current reel from the start of the content in frames */ + int offset = 0; + list<shared_ptr<dcp::Reel> >::const_iterator i = _reels.begin(); + while (i != _reel) { + offset += (*i)->main_picture()->duration (); + ++i; + } + double const vfr = _dcp_content->video_frame_rate (); + + /* Frame within the (played part of the) reel that is coming up next */ int64_t const frame = _next.frames_round (vfr); if ((*_reel)->main_picture () && reason != PASS_REASON_SUBTITLE) { @@ -74,16 +84,16 @@ DCPDecoder::pass (PassReason reason, bool) shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset); int64_t const entry_point = (*_reel)->main_picture()->entry_point (); if (mono) { - video (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame (entry_point + frame), asset->size())), frame); + video (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame (entry_point + frame), asset->size())), offset + frame); } else { video ( shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)), - frame + offset + frame ); video ( shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)), - frame + offset + frame ); } } @@ -103,7 +113,7 @@ DCPDecoder::pass (PassReason reason, bool) } } - audio (_dcp_content->audio_stream(), data, _next); + audio (_dcp_content->audio_stream(), data, ContentTime::from_frames (offset, vfr) + _next); } if ((*_reel)->main_subtitle ()) { @@ -118,8 +128,8 @@ DCPDecoder::pass (PassReason reason, bool) /* XXX: assuming that all `subs' are at the same time; maybe this is ok */ text_subtitle ( ContentTimePeriod ( - ContentTime::from_seconds (subs.front().in().as_seconds ()), - ContentTime::from_seconds (subs.front().out().as_seconds ()) + ContentTime::from_frames (offset - entry_point, vfr) + ContentTime::from_seconds (subs.front().in().as_seconds ()), + ContentTime::from_frames (offset - entry_point, vfr) + ContentTime::from_seconds (subs.front().out().as_seconds ()) ), subs ); |
