+/* -*- c-basic-offset: 8; default-tab-width: 8; -*- */
+
/*
Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
#include "audio_source.h"
#include "video_sink.h"
#include "audio_sink.h"
+#include "playlist.h"
+#include "audio_buffers.h"
-class VideoDecoder;
-class AudioDecoder;
class Job;
class Film;
class Playlist;
class AudioContent;
+class Piece;
/** @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<Player>
+class Player : public VideoSource, public AudioSource, public boost::enable_shared_from_this<Player>
{
public:
Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>);
void disable_subtitles ();
bool pass ();
- bool seek (double);
+ void seek (Time);
void seek_back ();
void seek_forward ();
- double last_video_time () const;
+ Time position () const {
+ return _position;
+ }
private:
- void process_video (boost::shared_ptr<const Image> i, bool same, boost::shared_ptr<Subtitle> s, double);
- void process_audio (boost::weak_ptr<const AudioContent>, boost::shared_ptr<const AudioBuffers>, double);
- void setup_decoders ();
+
+ void process_video (boost::weak_ptr<Content>, boost::shared_ptr<const Image>, bool, boost::shared_ptr<Subtitle>, Time);
+ void process_audio (boost::weak_ptr<Content>, boost::shared_ptr<const AudioBuffers>, Time);
+ void setup_pieces ();
void playlist_changed ();
void content_changed (boost::weak_ptr<Content>, int);
+ void do_seek (Time, bool);
boost::shared_ptr<const Film> _film;
boost::shared_ptr<const Playlist> _playlist;
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<boost::shared_ptr<VideoDecoder> > _video_decoders;
- /** Start positions of each video decoder in seconds*/
- std::vector<double> _video_start;
- /** Index of current video decoder */
- size_t _video_decoder;
- /** Audio decoders in order of presentation (if they are from FFmpeg) */
- std::vector<boost::shared_ptr<AudioDecoder> > _audio_decoders;
- /** Start positions of each audio decoder (if they are from FFmpeg) in seconds */
- std::vector<double> _audio_start;
- /** Current audio decoder index if we are running them sequentially; otherwise undefined */
- size_t _sequential_audio_decoder;
-
- boost::shared_ptr<AudioBuffers> _audio_buffers;
- boost::optional<double> _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<boost::shared_ptr<Piece> > _pieces;
+
+ /** Time of the earliest thing not yet to have been emitted */
+ Time _position;
+ AudioBuffers _audio_buffers;
+ Time _next_audio;
};
#endif