Cope with offsets between video/audio/subtitle data in a muxed file.
[dcpomatic.git] / src / lib / decoder.h
index 2a3b56c637be9f5135d1aa933369e077f7ea30a6..d2302d7a20d3057bcfde04fd9df1b11934f45420 100644 (file)
@@ -52,6 +52,24 @@ public:
                PASS_REASON_SUBTITLE
        };
 
+       void maybe_seek_video (ContentTime time, bool accurate);
+       void maybe_seek_audio (ContentTime time, bool accurate);
+       void maybe_seek_subtitle (ContentTime time, bool accurate);
+
+       /** @return true if this decoder has already returned all its data and will give no more */
+       virtual bool pass (PassReason, bool accurate) = 0;
+
+       /** Ensure that any future get() calls return data that reflect
+        *  changes in our content's settings.
+        */
+       virtual void reset () {}
+
+protected:
+       boost::optional<ContentTime> _video_position;
+       boost::optional<ContentTime> _audio_position;
+       boost::optional<ContentTime> _subtitle_position;
+
+private:
        /** Seek so that the next pass() will yield the next thing
         *  (video/sound frame, subtitle etc.) at or after the requested
         *  time.  Pass accurate = true to try harder to ensure that, at worst,
@@ -61,9 +79,7 @@ public:
         *  it may seek to just the right spot.
         */
        virtual void seek (ContentTime time, bool accurate) = 0;
-
-       /** @return true if this decoder has already returned all its data and will give no more */
-       virtual bool pass (PassReason, bool accurate) = 0;
+       void maybe_seek (boost::optional<ContentTime>& position, ContentTime time, bool accurate);
 };
 
 #endif