From: Carl Hetherington Date: Thu, 9 Jan 2020 23:52:20 +0000 (+0000) Subject: Give DCPDecoder its own ::position which just returns its internal X-Git-Tag: v2.14.22 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=4285355ff2bec853924647f0523d121860fe64e3 Give DCPDecoder its own ::position which just returns its internal _next time. This is important because Decoder::position does the wrong thing with DCPs in the following case. 1. DCPDecoder emits a subtitle event (start/stop) at time t. 2. There follows a long time T with no subtitle events. During this time the DCPDecoder's position is reported as t (since TextDecoder notes its position as the time of the last thing it emitted --- which is all it reasonably can do, I think). 3. During this T the DCPDecoder may be incorrectly pass()ed because its position is reported as earlier than it really is; this results in video/audio being emitted by the DCPDecoder but other contemporary sources may not be pass()ed. The upshot of this can be that no audio is emitted, as a contemporary audio source is not pass()ed and hence the merger is waiting for audio that will take a long time to come. When the butler is running this can result in audio underruns as the video buffers overflow with no sign of any audio. It is also simpler this way; DCPDecoder was already maintaining the required information. --- diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 7bd7ddf68..7af89e84d 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -415,3 +415,9 @@ DCPDecoder::set_forced_reduction (optional reduction) { _forced_reduction = reduction; } + +ContentTime +DCPDecoder::position () const +{ + return ContentTime::from_frames(_offset, _dcp_content->active_video_frame_rate(film())) + _next; +} diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h index 4068696ea..7beb7f7b1 100644 --- a/src/lib/dcp_decoder.h +++ b/src/lib/dcp_decoder.h @@ -52,6 +52,8 @@ public: bool pass (); void seek (ContentTime t, bool accurate); + ContentTime position () const; + private: friend struct dcp_subtitle_within_dcp_test; diff --git a/src/lib/decoder.h b/src/lib/decoder.h index d610f8727..93c212b34 100644 --- a/src/lib/decoder.h +++ b/src/lib/decoder.h @@ -57,7 +57,7 @@ public: virtual bool pass () = 0; virtual void seek (ContentTime time, bool accurate); - ContentTime position () const; + virtual ContentTime position () const; protected: boost::shared_ptr film () const;