X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fplayer.h;h=11cc99e7793005630a5e9ce1014e5827bdf55ed4;hb=f54190a85a4723ab7fce4c845d3d30e7141624ae;hp=5a4ee97becdc561b72cad6e59a36f97e77f02a80;hpb=320a74efb8d9c8aacded2799459a92d5b7235d90;p=dcpomatic.git diff --git a/src/lib/player.h b/src/lib/player.h index 5a4ee97be..11cc99e77 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -24,10 +24,11 @@ #include #include #include "playlist.h" -#include "audio_buffers.h" #include "content.h" #include "film.h" #include "rect.h" +#include "audio_merger.h" +#include "audio_content.h" class Job; class Film; @@ -40,8 +41,41 @@ class Resampler; /** @class Player * @brief A class which can `play' a Playlist; emitting its audio and video. */ + +struct IncomingVideo +{ +public: + boost::weak_ptr weak_piece; + boost::shared_ptr 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, Crop, libdcp::Size, libdcp::Size, Scaler const *); + + void set_subtitle (boost::shared_ptr, Position); + + boost::shared_ptr image (); + +private: + boost::shared_ptr _in; + Crop _crop; + libdcp::Size _inter_size; + libdcp::Size _out_size; + Scaler const * _scaler; + boost::shared_ptr _subtitle_image; + Position _subtitle_position; +}; -class Player : public boost::enable_shared_from_this +class Player : public boost::enable_shared_from_this, public boost::noncopyable { public: Player (boost::shared_ptr, boost::shared_ptr); @@ -58,12 +92,16 @@ public: void set_video_container_size (libdcp::Size); + bool repeat_last_video (); + /** Emitted when a video frame is ready. * First parameter is the video image. - * Second parameter is true if the image is the same as the last one that was emitted. - * Third parameter is the time. + * Second parameter is the eye(s) that should see this image. + * Third parameter is the colour conversion that should be used for this image. + * 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, bool, Time)> Video; + boost::signals2::signal, Eyes, ColourConversion, bool, Time)> Video; /** Emitted when some audio data is ready */ boost::signals2::signal, Time)> Audio; @@ -71,22 +109,26 @@ public: /** Emitted when something has changed such that if we went back and emitted * the last frame again it would look different. This is not emitted after * a seek. + * + * The parameter is true if these signals are currently likely to be frequent. */ - boost::signals2::signal Changed; + boost::signals2::signal Changed; private: + friend class PlayerWrapper; + friend class Piece; - void process_video (boost::weak_ptr, boost::shared_ptr, bool, VideoContent::Frame); + void process_video (boost::weak_ptr, boost::shared_ptr, Eyes, bool, VideoContent::Frame, Time); void process_audio (boost::weak_ptr, boost::shared_ptr, AudioContent::Frame); void process_subtitle (boost::weak_ptr, boost::shared_ptr, dcpomatic::Rect, Time, Time); void setup_pieces (); void playlist_changed (); - void content_changed (boost::weak_ptr, int); + void content_changed (boost::weak_ptr, int, bool); void do_seek (Time, bool); void flush (); void emit_black (); void emit_silence (OutputAudioFrame); - boost::shared_ptr resampler (boost::shared_ptr); + boost::shared_ptr resampler (boost::shared_ptr, bool); void film_changed (Film::Property); void update_subtitle (); @@ -105,10 +147,10 @@ private: /** The time after the last audio that we emitted */ Time _audio_position; - AudioBuffers _audio_buffers; + AudioMerger _audio_merger; libdcp::Size _video_container_size; - boost::shared_ptr _black_frame; + boost::shared_ptr _black_frame; std::map, boost::shared_ptr > _resamplers; struct { @@ -125,6 +167,18 @@ private: Time from; Time to; } _out_subtitle; + +#ifdef DCPOMATIC_DEBUG + boost::shared_ptr _last_video; +#endif + + bool _last_emit_was_black; + + IncomingVideo _last_incoming_video; + + boost::signals2::scoped_connection _playlist_changed_connection; + boost::signals2::scoped_connection _playlist_content_changed_connection; + boost::signals2::scoped_connection _film_changed_connection; }; #endif