X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplaylist.h;h=e6acff6944472db7e45827237914f1279c1c1a93;hb=92cafb6fc686a041354da2eabde6bcb2f6846e1d;hp=1d189cb070be9077f0ac241fcbefcf190366ac03;hpb=e94cd129dcd66a76210880bfdf19d27f7992651b;p=dcpomatic.git diff --git a/src/lib/playlist.h b/src/lib/playlist.h index 1d189cb07..e6acff694 100644 --- a/src/lib/playlist.h +++ b/src/lib/playlist.h @@ -37,17 +37,33 @@ class SndfileDecoder; class Job; class Film; +/** @class Playlist + * @brief A set of content files (video and audio), with knowledge of how they should be arranged into + * a DCP. + * + * This class holds Content objects, and it knows how they should be arranged. At the moment + * the ordering is implicit; video content is placed sequentially, and audio content is taken + * from the video unless any sound-only files are present. If sound-only files exist, they + * are played simultaneously (i.e. they can be split up into multiple files for different channels) + */ + class Playlist { public: Playlist (); + Playlist (boost::shared_ptr); - void setup (ContentList); + void as_xml (xmlpp::Node *); + void set_from_xml (boost::shared_ptr); + + void add (boost::shared_ptr); + void remove (boost::shared_ptr); + void move_earlier (boost::shared_ptr); + void move_later (boost::shared_ptr); ContentAudioFrame audio_length () const; int audio_channels () const; int audio_frame_rate () const; - int64_t audio_channel_layout () const; bool has_audio () const; float video_frame_rate () const; @@ -55,51 +71,62 @@ public: ContentVideoFrame video_length () const; AudioMapping default_audio_mapping () const; - - enum VideoFrom { - VIDEO_NONE, - VIDEO_FFMPEG, - VIDEO_IMAGEMAGICK - }; + ContentVideoFrame content_length () const; enum AudioFrom { - AUDIO_NONE, AUDIO_FFMPEG, AUDIO_SNDFILE }; - VideoFrom video_from () const { - return _video_from; - } - AudioFrom audio_from () const { return _audio_from; } - boost::shared_ptr ffmpeg () const { - return _ffmpeg; + bool has_subtitles () const; + + ContentList content () const { + return _content; + } + + boost::shared_ptr ffmpeg () const; + + std::list > video () const { + return _video; } - std::list > imagemagick () const { - return _imagemagick; + std::list > audio () const { + return _audio; } - std::list > sndfile () const { - return _sndfile; + std::string audio_digest () const; + std::string video_digest () const; + + int loop () const { + return _loop; } + + void set_loop (int l); mutable boost::signals2::signal Changed; mutable boost::signals2::signal, int)> ContentChanged; private: + void setup (); void content_changed (boost::weak_ptr, int); - - VideoFrom _video_from; + + /** where we should get our audio from */ AudioFrom _audio_from; - boost::shared_ptr _ffmpeg; - std::list > _imagemagick; - std::list > _sndfile; + /** all our content */ + ContentList _content; + /** all our content which contains video */ + std::list > _video; + /** all our content which contains audio. This may contain the same objects + * as _video for FFmpegContent. + */ + std::list > _audio; + + int _loop; std::list _content_connections; };