Merge master; at least partially.
[libdcp.git] / src / asset.h
1 /*
2     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 /** @file  src/asset.h
21  *  @brief Parent class for assets of DCPs.
22  */
23
24 #ifndef LIBDCP_ASSET_H
25 #define LIBDCP_ASSET_H
26
27 #include <string>
28 #include <list>
29 #include <boost/filesystem.hpp>
30 #include <boost/function.hpp>
31 #include <libxml++/libxml++.h>
32 #include "types.h"
33
34 namespace ASDCP {
35         class WriterInfo;
36 }
37
38 namespace xmlpp {
39         class Element;
40 }
41
42 namespace libdcp
43 {
44
45 /** @brief Parent class for assets of DCPs
46  *
47  *  These are collections of pictures or sound.
48  */
49 class Asset
50 {
51 public:
52         /** Construct an Asset.
53          *  @param directory Directory where our XML or MXF file is.
54          *  @param file_name Name of our file within directory, or empty to make one up based on UUID.
55          */
56         Asset (std::string directory, std::string file_name = "", int edit_rate = 0, int intrinsic_duration = 0);
57
58         virtual ~Asset() {}
59
60         /** Write details of the asset to a CPL AssetList node.
61          *  @param p Parent node.
62          */
63         virtual void write_to_cpl (xmlpp::Node *) const = 0;
64
65         /** Write details of the asset to a PKL AssetList node.
66          *  @param p Parent node.
67          */
68         void write_to_pkl (xmlpp::Node *) const;
69
70         /** Write details of the asset to a ASSETMAP stream.
71          *  @param s Stream.
72          */
73         void write_to_assetmap (xmlpp::Node *) const;
74
75         std::string uuid () const {
76                 return _uuid;
77         }
78
79         boost::filesystem::path path () const;
80
81         void set_directory (std::string d) {
82                 _directory = d;
83         }
84
85         void set_file_name (std::string f) {
86                 _file_name = f;
87         }
88
89         int entry_point () const {
90                 return _entry_point;
91         }
92
93         int duration () const {
94                 return _duration;
95         }
96         
97         int intrinsic_duration () const {
98                 return _intrinsic_duration;
99         }
100         
101         int edit_rate () const {
102                 return _edit_rate;
103         }
104
105         void set_entry_point (int e) {
106                 _entry_point = e;
107         }
108         
109         void set_duration (int d) {
110                 _duration = d;
111         }
112
113         void set_intrinsic_duration (int d) {
114                 _intrinsic_duration = d;
115         }
116
117         virtual bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)>) const;
118
119 protected:
120         
121         std::string digest () const;
122
123         /** Directory that our MXF or XML file is in */
124         std::string _directory;
125         /** Name of our MXF or XML file */
126         std::string _file_name;
127         /** Our UUID */
128         std::string _uuid;
129         /** The edit rate; this is normally equal to the number of video frames per second */
130         int _edit_rate;
131         /** Start point to present in frames */
132         int _entry_point;
133         /** Total length in frames */
134         int _intrinsic_duration;
135         /** Length to present in frames */
136         int _duration;
137
138 private:        
139         /** Digest of our MXF or XML file */
140         mutable std::string _digest;
141 };
142
143 }
144
145 #endif