X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.h;h=15fa4dbd6ce5c1d118683e26bc5278e96cf31eef;hb=c37d4e41da190144806463387fdbe64e65196730;hp=7a99d656190bd25c23faddcd08f61e218942c884;hpb=7fb622a18582f18fcc6cfe140a262fd6cc8cad88;p=dcpomatic.git diff --git a/src/lib/player.h b/src/lib/player.h index 7a99d6561..15fa4dbd6 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -17,62 +17,96 @@ */ -#ifndef DVDOMATIC_PLAYER_H -#define DVDOMATIC_PLAYER_H +#ifndef DCPOMATIC_PLAYER_H +#define DCPOMATIC_PLAYER_H #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" -class VideoDecoder; -class SndfileDecoder; class Job; class Film; class Playlist; class AudioContent; - -class Player : public VideoSource, public AudioSource, public VideoSink, public boost::enable_shared_from_this +class Piece; +class Image; +class Resampler; + +/** @class Player + * @brief A class which can `play' a Playlist; emitting its audio and video. + */ + +class Player : public boost::enable_shared_from_this { public: Player (boost::shared_ptr, boost::shared_ptr); void disable_video (); void disable_audio (); - void disable_subtitles (); - void disable_video_sync (); bool pass (); - void set_progress (boost::shared_ptr); - bool seek (double); + void seek (Time, bool); + + 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; - double last_video_time () const; + /** 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::shared_ptr i, bool same, boost::shared_ptr s); - void process_audio (boost::weak_ptr, boost::shared_ptr); - void setup_decoders (); + + void process_video (boost::weak_ptr, boost::shared_ptr, bool, VideoContent::Frame); + void process_audio (boost::weak_ptr, boost::shared_ptr, AudioContent::Frame); + void setup_pieces (); void playlist_changed (); void content_changed (boost::weak_ptr, int); + void do_seek (Time, bool); + void flush (); + void emit_black (); + void emit_silence (OutputAudioFrame); + boost::shared_ptr resampler (boost::shared_ptr); + void film_changed (Film::Property); boost::shared_ptr _film; boost::shared_ptr _playlist; bool _video; bool _audio; - bool _subtitles; - - bool _have_valid_decoders; - std::list > _video_decoders; - std::list >::iterator _video_decoder; - std::list > _sndfile_decoders; - boost::shared_ptr _audio_buffers; + /** 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; + + /** 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; - bool _video_sync; + libdcp::Size _video_container_size; + boost::shared_ptr _black_frame; + std::map, boost::shared_ptr > _resamplers; }; #endif