From: Carl Hetherington Date: Tue, 30 Jul 2019 23:07:06 +0000 (+0100) Subject: Avoid random black gaps between bits of content A and B when X-Git-Tag: v2.15.15 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=bd83f1b0e1d8e7aae0af51376dbbb88d5e3f69d0 Avoid random black gaps between bits of content A and B when content B has had its start trimmed. In this case when we seek inaccurately in A we previously also seeked inaccurately in B. This meant that at the transition the first frame we see of B may not be the first frame of B. After this we seek accurately in B so that we definitely get to the start of it. This is especially important if the start of B has been trimmed to within two keyframes so that an inaccurate seek is not sufficient. --- diff --git a/src/lib/player.cc b/src/lib/player.cc index acde910be..bdfa51528 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -1054,8 +1054,12 @@ Player::seek (DCPTime time, bool accurate) BOOST_FOREACH (shared_ptr i, _pieces) { if (time < i->content->position()) { - /* Before; seek to the start of the content */ - i->decoder->seek (dcp_to_content_time (i, i->content->position()), accurate); + /* Before; seek to the start of the content. Even if this request is for an inaccurate seek + we must seek this (following) content accurately, otherwise when we come to the end of the current + content we may not start right at the beginning of the next, causing a gap (if the next content has + been trimmed to a point between keyframes, or something). + */ + i->decoder->seek (dcp_to_content_time (i, i->content->position()), true); i->done = false; } else if (i->content->position() <= time && time < i->content->end(_film)) { /* During; seek to position */