X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=bc13d6ab2ad72e8dd19f5fb4cdebccd2e3490755;hb=a788f3c1e29a6b8329d54e1518f3b84d68d347d5;hp=ed4519acafa7ddbffdfd85c9b4f6c8a1570ff640;hpb=8843d281ba06613fc92711d2ea824c35502be78e;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index ed4519aca..bc13d6ab2 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -464,7 +464,7 @@ Player::get_audio (DCPTime time, DCPTime length, bool accurate) request = DCPTime (); } - Frame const content_frame = dcp_to_content_audio (*i, request); + Frame const content_frame = dcp_to_resampled_audio (*i, request); BOOST_FOREACH (AudioStreamPtr j, content->audio_streams ()) { @@ -521,47 +521,34 @@ Player::get_audio (DCPTime time, DCPTime length, bool accurate) Frame Player::dcp_to_content_video (shared_ptr piece, DCPTime t) const { - /* s is the offset of t from the start position of this content */ + shared_ptr vc = dynamic_pointer_cast (piece->content); DCPTime s = t - piece->content->position (); - s = DCPTime (max (DCPTime::Type (0), s.get ())); - s = DCPTime (min (piece->content->length_after_trim().get(), s.get())); - - /* Convert this to the content frame */ - return DCPTime (s + piece->content->trim_start()).frames (_film->video_frame_rate()) / piece->frc.factor (); + s = min (piece->content->length_after_trim(), s); + return max (ContentTime (), ContentTime (s, piece->frc) + piece->content->trim_start ()).frames (vc->video_frame_rate ()); } DCPTime Player::content_video_to_dcp (shared_ptr piece, Frame f) const { - DCPTime t = DCPTime::from_frames (f * piece->frc.factor (), _film->video_frame_rate()) - piece->content->trim_start () + piece->content->position (); - if (t < DCPTime ()) { - t = DCPTime (); - } - - return t; + shared_ptr vc = dynamic_pointer_cast (piece->content); + ContentTime const c = ContentTime::from_frames (f, vc->video_frame_rate ()) - piece->content->trim_start (); + return max (DCPTime (), DCPTime (c, piece->frc) + piece->content->position ()); } Frame -Player::dcp_to_content_audio (shared_ptr piece, DCPTime t) const +Player::dcp_to_resampled_audio (shared_ptr piece, DCPTime t) const { - /* s is the offset of t from the start position of this content */ - DCPTime s = t - piece->content->position (); - s = DCPTime (max (DCPTime::Type (0), s.get ())); - s = DCPTime (min (piece->content->length_after_trim().get(), s.get())); - - /* Convert this to the content frame */ - return DCPTime (s + piece->content->trim_start()).frames (_film->audio_frame_rate()); + DCPTime s = t - piece->content->position () + DCPTime (piece->content->trim_start (), piece->frc); + s = max (DCPTime (), min (piece->content->length_after_trim(), s)); + return s.frames (_film->audio_frame_rate ()); } ContentTime Player::dcp_to_content_subtitle (shared_ptr piece, DCPTime t) const { - /* s is the offset of t from the start position of this content */ DCPTime s = t - piece->content->position (); - s = DCPTime (max (DCPTime::Type (0), s.get ())); - s = DCPTime (min (piece->content->length_after_trim().get(), s.get())); - - return ContentTime (s + piece->content->trim_start(), piece->frc); + s = min (piece->content->length_after_trim(), s); + return max (ContentTime (), ContentTime (s, piece->frc) + piece->content->trim_start()); } void