- VideoDecoder (boost::shared_ptr<const Film>, boost::shared_ptr<const VideoContent>);
-
- /** Seek so that the next pass() will yield (approximately) the requested frame.
- * Pass accurate = true to try harder to get close to the request.
- */
- virtual void seek (VideoContent::Frame frame, bool accurate) = 0;
-
- /** Emitted when a video frame is ready.
- * First parameter is the video image.
- * Second parameter is the eye(s) which should see this image.
- * Third parameter is the part of this image that should be used.
- * Fourth parameter is true if the image is the same as the last one that was emitted for this Eyes value.
- * Fourth parameter is the frame within our source.
- */
- boost::signals2::signal<void (boost::shared_ptr<const ImageProxy>, Eyes, Part, bool, VideoContent::Frame)> Video;
-
-protected:
-
- void video (boost::shared_ptr<const ImageProxy>, bool, VideoContent::Frame);
- boost::shared_ptr<const VideoContent> _video_content;
- /** This is in frames without taking 3D into account (e.g. if we are doing 3D alternate,
- * this would equal 2 on the left-eye second frame (not 1)).
- */
- VideoContent::Frame _video_position;
+ VideoDecoder (Decoder* parent, std::shared_ptr<const Content> c);
+
+ friend struct video_decoder_fill_test1;
+ friend struct video_decoder_fill_test2;
+ friend struct ffmpeg_pts_offset_test;
+ friend void ffmpeg_decoder_sequential_test_one (boost::filesystem::path file, float fps, int gaps, int video_length);
+
+ boost::optional<dcpomatic::ContentTime> position (std::shared_ptr<const Film>) const override {
+ return _position;
+ }
+
+ void seek () override;
+ void emit (std::shared_ptr<const Film> film, std::shared_ptr<const ImageProxy>, Frame frame);
+
+ boost::signals2::signal<void (ContentVideo)> Data;
+
+private:
+ std::shared_ptr<const Content> _content;
+ /** Eyes of last thing to be emitted; only used for THREE_D_ALTERNATE */
+ boost::optional<Eyes> _last_emitted_eyes;
+ boost::optional<dcpomatic::ContentTime> _position;
+ boost::scoped_ptr<FrameIntervalChecker> _frame_interval_checker;