Suspend scale / crop / window / subtitle overlay until we decide that a frame is...
[dcpomatic.git] / src / lib / player.h
index 7cce7e7237fd204690c1d246263f06a36656bcd8..11cc99e7793005630a5e9ce1014e5827bdf55ed4 100644 (file)
@@ -41,6 +41,39 @@ class Resampler;
 /** @class Player
  *  @brief A class which can `play' a Playlist; emitting its audio and video.
  */
+
+struct IncomingVideo
+{
+public:
+       boost::weak_ptr<Piece> weak_piece;
+       boost::shared_ptr<const Image> image;
+       Eyes eyes;
+       bool same;
+       VideoContent::Frame frame;
+       Time extra;
+};
+
+/** A wrapper for an Image which contains some pending operations; these may
+ *  not be necessary if the receiver of the PlayerImage throws it away.
+ */
+class PlayerImage
+{
+public:
+       PlayerImage (boost::shared_ptr<const Image>, Crop, libdcp::Size, libdcp::Size, Scaler const *);
+
+       void set_subtitle (boost::shared_ptr<const Image>, Position<int>);
+       
+       boost::shared_ptr<Image> image ();
+
+private:
+       boost::shared_ptr<const Image> _in;
+       Crop _crop;
+       libdcp::Size _inter_size;
+       libdcp::Size _out_size;
+       Scaler const * _scaler;
+       boost::shared_ptr<const Image> _subtitle_image;
+       Position<int> _subtitle_position;
+};
  
 class Player : public boost::enable_shared_from_this<Player>, public boost::noncopyable
 {
@@ -68,7 +101,7 @@ public:
         *  Fourth parameter is true if the image is the same as the last one that was emitted.
         *  Fifth parameter is the time.
         */
-       boost::signals2::signal<void (boost::shared_ptr<const Image>, Eyes, ColourConversion, bool, Time)> Video;
+       boost::signals2::signal<void (boost::shared_ptr<PlayerImage>, Eyes, ColourConversion, bool, Time)> Video;
        
        /** Emitted when some audio data is ready */
        boost::signals2::signal<void (boost::shared_ptr<const AudioBuffers>, Time)> Audio;
@@ -83,8 +116,9 @@ public:
 
 private:
        friend class PlayerWrapper;
+       friend class Piece;
 
-       void process_video (boost::weak_ptr<Piece>, boost::shared_ptr<const Image>, Eyes, bool, VideoContent::Frame);
+       void process_video (boost::weak_ptr<Piece>, boost::shared_ptr<const Image>, Eyes, bool, VideoContent::Frame, Time);
        void process_audio (boost::weak_ptr<Piece>, boost::shared_ptr<const AudioBuffers>, AudioContent::Frame);
        void process_subtitle (boost::weak_ptr<Piece>, boost::shared_ptr<Image>, dcpomatic::Rect<double>, Time, Time);
        void setup_pieces ();
@@ -116,7 +150,7 @@ private:
        AudioMerger<Time, AudioContent::Frame> _audio_merger;
 
        libdcp::Size _video_container_size;
-       boost::shared_ptr<Image> _black_frame;
+       boost::shared_ptr<PlayerImage> _black_frame;
        std::map<boost::shared_ptr<AudioContent>, boost::shared_ptr<Resampler> > _resamplers;
 
        struct {
@@ -140,13 +174,7 @@ private:
 
        bool _last_emit_was_black;
 
-       struct {
-               boost::weak_ptr<Piece> weak_piece;
-               boost::shared_ptr<const Image> image;
-               Eyes eyes;
-               bool same;
-               VideoContent::Frame frame;
-       } _last_process_video;
+       IncomingVideo _last_incoming_video;
 
        boost::signals2::scoped_connection _playlist_changed_connection;
        boost::signals2::scoped_connection _playlist_content_changed_connection;