X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=f7b75babcdc3d8f2750900a4925878b3e3f96fda;hb=0330b684fe616b465e65b67f7d995e659fa83fca;hp=2669b350fb694e7085bd468eb5904f21fb047bb8;hpb=6bf04a56980eca8688fc8b691ed4fc5bca4ae8d3;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 2669b350f..f7b75babc 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -565,6 +565,10 @@ Player::get_reel_assets () continue; } + if (!dcp->reference_video() && !dcp->reference_audio() && !dcp->reference_text(TextType::OPEN_SUBTITLE) && !dcp->reference_text(TextType::CLOSED_CAPTION)) { + continue; + } + scoped_ptr decoder; try { decoder.reset (new DCPDecoder(_film, dcp, false, false, shared_ptr())); @@ -572,11 +576,13 @@ Player::get_reel_assets () return reel_assets; } + auto const frame_rate = _film->video_frame_rate(); DCPOMATIC_ASSERT (dcp->video_frame_rate()); - double const cfr = dcp->video_frame_rate().get(); - Frame const trim_start = dcp->trim_start().frames_round(cfr); - Frame const trim_end = dcp->trim_end().frames_round(cfr); - int const ffr = _film->video_frame_rate (); + /* We should only be referencing if the DCP rate is the same as the film rate */ + DCPOMATIC_ASSERT (std::round(dcp->video_frame_rate().get()) == frame_rate); + + Frame const trim_start = dcp->trim_start().frames_round(frame_rate); + Frame const trim_end = dcp->trim_end().frames_round(frame_rate); /* position in the asset from the start */ int64_t offset_from_start = 0; @@ -596,22 +602,22 @@ Player::get_reel_assets () Frame const reel_trim_start = min(reel_duration, max(int64_t(0), trim_start - offset_from_start)); Frame const reel_trim_end = min(reel_duration, max(int64_t(0), reel_duration - (offset_from_end - trim_end))); - auto const from = max(DCPTime(), content->position() + DCPTime::from_frames(offset_from_start, ffr) - DCPTime::from_frames(trim_start, cfr)); + auto const from = max(DCPTime(), content->position() + DCPTime::from_frames(offset_from_start, frame_rate) - DCPTime::from_frames(trim_start, frame_rate)); if (dcp->reference_video()) { - maybe_add_asset (reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, ffr); + maybe_add_asset (reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_audio()) { - maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, ffr); + maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_text(TextType::OPEN_SUBTITLE)) { - maybe_add_asset (reel_assets, reel->main_subtitle(), reel_trim_start, reel_trim_end, from, ffr); + maybe_add_asset (reel_assets, reel->main_subtitle(), reel_trim_start, reel_trim_end, from, frame_rate); } if (dcp->reference_text(TextType::CLOSED_CAPTION)) { for (auto caption: reel->closed_captions()) { - maybe_add_asset (reel_assets, caption, reel_trim_start, reel_trim_end, from, ffr); + maybe_add_asset (reel_assets, caption, reel_trim_start, reel_trim_end, from, frame_rate); } } @@ -1400,12 +1406,22 @@ Player::playlist () const void -Player::atmos (weak_ptr, ContentAtmos data) +Player::atmos (weak_ptr weak_piece, ContentAtmos data) { if (_suspended) { return; } - Atmos (data.data, DCPTime::from_frames(data.frame, _film->video_frame_rate()), data.metadata); + auto piece = weak_piece.lock (); + DCPOMATIC_ASSERT (piece); + + auto const vfr = _film->video_frame_rate(); + + DCPTime const dcp_time = DCPTime::from_frames(data.frame, vfr) - DCPTime(piece->content->trim_start(), FrameRateChange(vfr, vfr)); + if (dcp_time < piece->content->position() || dcp_time >= (piece->content->end(_film))) { + return; + } + + Atmos (data.data, dcp_time, data.metadata); }