summaryrefslogtreecommitdiff
path: root/src/cpl.h
blob: 932e6b765b3752fa33b319483e67e361e0d46921 (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
135
/*
    Copyright (C) 2014 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.

*/

/** @file  src/cpl.h
 *  @brief CPL class.
 */

#ifndef LIBDCP_CPL_H
#define LIBDCP_CPL_H

#include "types.h"
#include "certificates.h"
#include "key.h"
#include "asset.h"
#include "metadata.h"
#include <libxml++/libxml++.h>
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/optional.hpp>
#include <boost/filesystem.hpp>
#include <list>

namespace dcp {

class ReelAsset;
class Reel;
class XMLMetadata;
class MXFMetadata;
class Signer;
class DecryptedKDM;

/** @class CPL
 *  @brief A Composition Playlist.
 */
class CPL : public Asset
{
public:
	CPL (std::string annotation_text, ContentKind content_kind);
	CPL (boost::filesystem::path file);

	bool equals (
		boost::shared_ptr<const Asset> other,
		EqualityOptions options,
		NoteHandler note
		) const;

	void add (boost::shared_ptr<Reel> reel);
	void add (DecryptedKDM const &);

	/** @return contents of the &lt;AnnotationText&gt; node */
	std::string annotation_text () const {
		return _annotation_text;
	}

	/** @return contents of the &lt;ContentTitleText&gt; node */
	std::string content_title_text () const {
		return _content_title_text;
	}

	/** @return contents of the &lt;Id&gt; node within &lt;ContentVersion&gt; */
	void set_content_version_id (std::string id) {
		_content_version_id = id;
	}

	/** @return contents of the &lt;LabelText&gt; node within &lt;ContentVersion&gt; */
	void set_content_version_label_text (std::string text) {
		_content_version_label_text = text;
	}

	/** @return the type of the content, used by media servers
	 *  to categorise things (e.g. feature, trailer, etc.)
	 */
	ContentKind content_kind () const {
		return _content_kind;
	}

	/** @return the reels in this CPL */
	std::list<boost::shared_ptr<Reel> > reels () const {
		return _reels;
	}

	/** @return the ReelAssets in this CPL in all reels.
	 */
	std::list<boost::shared_ptr<const ReelAsset> > reel_assets () const;

	bool encrypted () const;

	void set_metadata (XMLMetadata m) {
		_metadata = m;
	}

	void write_xml (
		boost::filesystem::path file,
		Standard standard,
		boost::shared_ptr<const Signer>
		) const;

	void resolve_refs (std::list<boost::shared_ptr<Object> >);

protected:
	/** @return type string for PKLs for this asset */
	std::string pkl_type (Standard standard) const;

private:
	std::string _annotation_text;               ///< &lt;AnnotationText&gt;
	/** &lt;Issuer&gt;, &lt;Creator&gt; and &lt;IssueDate&gt;.  These are grouped
	 *  because they occur together in a few places.
	 */
	XMLMetadata _metadata;
	std::string _content_title_text;            ///< &lt;ContentTitleText&gt;
	ContentKind _content_kind;                  ///< &lt;ContentKind&gt;
	std::string _content_version_id;            ///< &lt;Id&gt; in &lt;ContentVersion&gt;
	std::string _content_version_label_text;    ///< &lt;LabelText&gt; in &lt;ContentVersion&gt;
	std::list<boost::shared_ptr<Reel> > _reels;
};

}

#endif