X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.h;h=b3eadd7c07e25521506bf6fcc29bc251262e811f;hb=bb917533ad5beaded24ed56c7c4dc71d50e76263;hp=e4fb832209025117a3f5c02414a3d429bf62bc5a;hpb=8db8de91e2a5489da345fae7544753f4cb2f5ab4;p=dcpomatic.git diff --git a/src/lib/player.h b/src/lib/player.h index e4fb83220..b3eadd7c0 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -23,24 +23,25 @@ #include #include #include -#include "video_source.h" -#include "audio_source.h" -#include "video_sink.h" -#include "audio_sink.h" #include "playlist.h" #include "audio_buffers.h" +#include "content.h" +#include "film.h" +#include "rect.h" class Job; class Film; class Playlist; class AudioContent; class Piece; +class Image; +class Resampler; /** @class Player * @brief A class which can `play' a Playlist; emitting its audio and video. */ -class Player : public VideoSource, public AudioSource, public boost::enable_shared_from_this +class Player : public boost::enable_shared_from_this { public: Player (boost::shared_ptr, boost::shared_ptr); @@ -49,28 +50,45 @@ public: void disable_audio (); bool pass (); - void seek (Time); - void seek_back (); - void seek_forward (); + void seek (Time, bool); - /** @return position that we are at; ie the time of the next thing we will emit on pass() */ - Time position () const { - return _position; + Time video_position () const { + return _video_position; } void set_video_container_size (libdcp::Size); + /** 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. + */ + boost::signals2::signal, bool, Time)> Video; + + /** Emitted when some audio data is ready */ + boost::signals2::signal, Time)> Audio; + + /** 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. + */ + boost::signals2::signal Changed; + private: - void process_video (boost::weak_ptr, boost::shared_ptr, bool, Time); - void process_audio (boost::weak_ptr, boost::shared_ptr, Time); + void process_video (boost::weak_ptr, boost::shared_ptr, bool, VideoContent::Frame); + 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 do_seek (Time, bool); - void add_black_piece (Time, Time); - void add_silent_piece (Time, Time); void flush (); + void emit_black (); + void emit_silence (OutputAudioFrame); + boost::shared_ptr resampler (boost::shared_ptr); + void film_changed (Film::Property); + void update_subtitle (); boost::shared_ptr _film; boost::shared_ptr _playlist; @@ -81,10 +99,33 @@ private: /** Our pieces are ready to go; if this is false the pieces must be (re-)created before they are used */ bool _have_valid_pieces; std::list > _pieces; - Time _position; + + /** The time after the last video that we emitted */ + Time _video_position; + /** The time after the last audio that we emitted */ + Time _audio_position; + AudioBuffers _audio_buffers; - Time _next_audio; - boost::optional _video_container_size; + + libdcp::Size _video_container_size; + boost::shared_ptr _black_frame; + std::map, boost::shared_ptr > _resamplers; + boost::shared_ptr _last_resampler; + + struct { + boost::weak_ptr piece; + boost::shared_ptr image; + dcpomatic::Rect rect; + Time from; + Time to; + } _in_subtitle; + + struct { + boost::shared_ptr image; + Position position; + Time from; + Time to; + } _out_subtitle; }; #endif