summaryrefslogtreecommitdiff
path: root/src/asset.h
blob: 6db8e5c271761670e0ce20d7187ed34460466650 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
    Copyright (C) 2012 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/asset.h
 *  @brief Parent class for assets of DCPs.
 */

#ifndef LIBDCP_ASSET_H
#define LIBDCP_ASSET_H

#include <string>
#include <list>
#include <boost/filesystem.hpp>
#include <boost/function.hpp>
#include <libxml++/libxml++.h>
#include "types.h"

namespace ASDCP {
	struct WriterInfo;
}

namespace xmlpp {
	class Element;
}

namespace libdcp
{

/** @brief Parent class for assets of DCPs
 *
 *  These are collections of pictures or sound.
 */
class Asset
{
public:
	/** Construct an Asset.
	 *  @param directory Directory where our XML or MXF file is.
	 *  @param file_name Name of our file within directory, or empty to make one up based on UUID.
	 */
	Asset (boost::filesystem::path directory, boost::filesystem::path file_name = "");

	virtual ~Asset() {}

	/** Write details of the asset to a CPL AssetList node.
	 *  @param p Parent element.
	 */
	virtual void write_to_cpl (xmlpp::Element* p) const = 0;

	/** Write details of the asset to a PKL AssetList node.
	 *  @param p Parent node.
	 */
	void write_to_pkl (xmlpp::Node *, bool interop) const;

	/** Write details of the asset to a ASSETMAP stream.
	 *  @param s Stream.
	 */
	void write_to_assetmap (xmlpp::Node *) const;

	/** Compute the digest for this asset.  Calling this is optional: if
	 *  it is not called, the digest will be computed when required.  However,
	 *  calling this method allows the caller to see the progress of the
	 *  computation, which can be long for large assets.
	 *  @param Called with progress between 0 and 1.
	 */
	void compute_digest (boost::function<void (float)> progress);

	std::string uuid () const {
		return _uuid;
	}

	boost::filesystem::path path () const;

	void set_directory (boost::filesystem::path d) {
		_directory = d;
	}

	void set_file_name (boost::filesystem::path f) {
		_file_name = f;
	}

	int entry_point () const {
		return _entry_point;
	}

	int duration () const {
		return _duration;
	}
	
	int intrinsic_duration () const {
		return _intrinsic_duration;
	}
	
	int edit_rate () const {
		return _edit_rate;
	}

	void set_entry_point (int e) {
		_entry_point = e;
	}
	
	void set_duration (int d) {
		_duration = d;
	}

	void set_intrinsic_duration (int d) {
		_intrinsic_duration = d;
	}

	void set_edit_rate (int r) {
		_edit_rate = r;
	}

	virtual bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)>) const;

protected:

	/** @return Interop PKL asdcpKind for the &lt;Type&gt; tag e.g. Picture, Sound etc. */
	virtual std::string asdcp_kind () const = 0;
	
	std::string digest () const;

	/** Directory that our MXF or XML file is in */
	boost::filesystem::path _directory;
	/** Name of our MXF or XML file */
	boost::filesystem::path _file_name;
	/** Our UUID */
	std::string _uuid;
	/** The edit rate; this is normally equal to the number of video frames per second */
	int _edit_rate;
	/** Start point to present in frames */
	int _entry_point;
	/** Total length in frames */
	int _intrinsic_duration;
	/** Length to present in frames */
	int _duration;

private:	
	/** Digest of our MXF or XML file */
	mutable std::string _digest;
};

}

#endif