summaryrefslogtreecommitdiff
path: root/src/lib/playlist.h
blob: cea41ab3281729c84c185ed0e188d492f546218a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>

    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
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#include <list>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include "video_source.h"
#include "audio_source.h"
#include "video_sink.h"
#include "audio_sink.h"
#include "ffmpeg_content.h"
#include "audio_mapping.h"

class Content;
class FFmpegContent;
class FFmpegDecoder;
class ImageMagickContent;
class ImageMagickDecoder;
class SndfileContent;
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<const Playlist>);

	void as_xml (xmlpp::Node *);
	void set_from_xml (boost::shared_ptr<const cxml::Node>);

	void add (boost::shared_ptr<Content>);
	void remove (boost::shared_ptr<Content>);
	void move_earlier (boost::shared_ptr<Content>);
	void move_later (boost::shared_ptr<Content>);

	ContentAudioFrame audio_length () const;
	int audio_channels () const;
	int audio_frame_rate () const;
	bool has_audio () const;
	
	float video_frame_rate () const;
	libdcp::Size video_size () const;
	ContentVideoFrame video_length () const;

	AudioMapping default_audio_mapping () const;
	ContentVideoFrame content_length () const;

	enum AudioFrom {
		AUDIO_FFMPEG,
		AUDIO_SNDFILE
	};

	AudioFrom audio_from () const {
		return _audio_from;
	}

	bool has_subtitles () const;
	
	ContentList content () const {
		return _content;
	}

	std::string description () const;

	boost::shared_ptr<FFmpegContent> ffmpeg () const;

	std::list<boost::shared_ptr<const VideoContent> > video () const {
		return _video;
	}

	std::list<boost::shared_ptr<const AudioContent> > audio () const {
		return _audio;
	}

	std::string audio_digest () const;
	std::string video_digest () const;

	int loop () const {
		return _loop;
	}
	
	void set_loop (int l);

	mutable boost::signals2::signal<void ()> Changed;
	mutable boost::signals2::signal<void (boost::weak_ptr<Content>, int)> ContentChanged;
	
private:
	void setup ();
	void content_changed (boost::weak_ptr<Content>, int);

	/** where we should get our audio from */
	AudioFrom _audio_from;

	/** all our content */
	ContentList _content;
	/** all our content which contains video */
	std::list<boost::shared_ptr<const VideoContent> > _video;
	/** all our content which contains audio.  This may contain the same objects
	 *  as _video for FFmpegContent.
	 */
	std::list<boost::shared_ptr<const AudioContent> > _audio;

	int _loop;

	std::list<boost::signals2::connection> _content_connections;
};