X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.h;h=6e70ad707cf79052cd24a64cbc0c1344020a2e1c;hb=79a871ea740509ff2fa540ca715375e0ba1c4ad9;hp=b6fb41f6e9eae15f04e58720ec4e9b2a5ace6847;hpb=fd040c2bd27fde35424a384174ecb56c643764cd;p=dcpomatic.git diff --git a/src/lib/player.h b/src/lib/player.h index b6fb41f6e..6e70ad707 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,69 +23,117 @@ #include #include #include -#include "video_source.h" -#include "audio_source.h" -#include "video_sink.h" -#include "audio_sink.h" +#include "playlist.h" +#include "content.h" +#include "film.h" +#include "rect.h" +#include "audio_merger.h" +#include "audio_content.h" +#include "piece.h" +#include "subtitle.h" -class VideoDecoder; -class AudioDecoder; class Job; class Film; class Playlist; class AudioContent; - +class Piece; +class Image; +class Resampler; +class PlayerVideoFrame; +class ImageProxy; + /** @class Player * @brief A class which can `play' a Playlist; emitting its audio and video. */ - -class Player : public TimedVideoSource, public TimedAudioSource, public TimedVideoSink, 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); void disable_video (); void disable_audio (); - void disable_subtitles (); bool pass (); - bool seek (double); - void seek_back (); - void seek_forward (); + void seek (Time, bool); + + Time video_position () const { + return _video_position; + } + + void set_video_container_size (libdcp::Size); - double last_video_time () const; + bool repeat_last_video (); + + /** Emitted when a video frame is ready. + * First parameter is the video image. + * Second parameter is true if the frame 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. + * + * The parameter is true if these signals are currently likely to be frequent. + */ + boost::signals2::signal Changed; private: - void process_video (boost::shared_ptr i, bool same, boost::shared_ptr s, double); - void process_audio (boost::weak_ptr, boost::shared_ptr, double); - void setup_decoders (); + friend class PlayerWrapper; + friend class Piece; + + void process_video (boost::weak_ptr, boost::shared_ptr, Eyes, Part, bool, VideoContent::Frame, Time); + void process_audio (boost::weak_ptr, boost::shared_ptr, AudioContent::Frame, bool); + 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, bool); + void film_changed (Film::Property); + void update_subtitle (); boost::shared_ptr _film; boost::shared_ptr _playlist; bool _video; bool _audio; - bool _subtitles; - - /** Our decoders are ready to go; if this is false the decoders must be (re-)created before they are used */ - bool _have_valid_decoders; - /** Video decoders in order of presentation */ - std::vector > _video_decoders; - /** Start positions of each video decoder in seconds*/ - std::vector _video_start; - /** Index of current video decoder */ - size_t _video_decoder; - /** Audio decoders in order of presentation (if they are from FFmpeg) */ - std::vector > _audio_decoders; - /** Start positions of each audio decoder (if they are from FFmpeg) in seconds */ - std::vector _audio_start; - /** Current audio decoder index if we are running them sequentially; otherwise undefined */ - size_t _sequential_audio_decoder; - - boost::shared_ptr _audio_buffers; - boost::optional _audio_time; + + /** 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; + + AudioMerger _audio_merger; + + libdcp::Size _video_container_size; + boost::shared_ptr _black_frame; + std::map, boost::shared_ptr > _resamplers; + + std::list _subtitles; + +#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