a2202cd68f658172c4d9168deb8c14ce7673a000
[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          *  @param i true to use the Interop standard, false for SMPTE.
63          */
64         virtual void write_to_cpl (xmlpp::Node* p, bool i) const = 0;
65
66         /** Write details of the asset to a PKL AssetList node.
67          *  @param p Parent node.
68          */
69         void write_to_pkl (xmlpp::Node *) const;
70
71         /** Write details of the asset to a ASSETMAP stream.
72          *  @param s Stream.
73          */
74         void write_to_assetmap (xmlpp::Node *) const;
75
76         std::string uuid () const {
77                 return _uuid;
78         }
79
80         boost::filesystem::path path () const;
81
82         void set_directory (std::string d) {
83                 _directory = d;
84         }
85
86         void set_file_name (std::string f) {
87                 _file_name = f;
88         }
89
90         int entry_point () const {
91                 return _entry_point;
92         }
93
94         int duration () const {
95                 return _duration;
96         }
97         
98         int intrinsic_duration () const {
99                 return _intrinsic_duration;
100         }
101         
102         int edit_rate () const {
103                 return _edit_rate;
104         }
105
106         void set_entry_point (int e) {
107                 _entry_point = e;
108         }
109         
110         void set_duration (int d) {
111                 _duration = d;
112         }
113
114         void set_intrinsic_duration (int d) {
115                 _intrinsic_duration = d;
116         }
117
118         virtual bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)>) const;
119
120 protected:
121         
122         std::string digest () const;
123
124         /** Directory that our MXF or XML file is in */
125         std::string _directory;
126         /** Name of our MXF or XML file */
127         std::string _file_name;
128         /** Our UUID */
129         std::string _uuid;
130         /** The edit rate; this is normally equal to the number of video frames per second */
131         int _edit_rate;
132         /** Start point to present in frames */
133         int _entry_point;
134         /** Total length in frames */
135         int _intrinsic_duration;
136         /** Length to present in frames */
137         int _duration;
138
139 private:        
140         /** Digest of our MXF or XML file */
141         mutable std::string _digest;
142 };
143
144 }
145
146 #endif