ced9da3b2be8e0fc725e711972714d40c9a84e0a
[libdcp.git] / src / mxf.h
1 /*
2     Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef LIBDCP_MXF_H
21 #define LIBDCP_MXF_H
22
23 #include "asset.h"
24 #include "key.h"
25 #include "metadata.h"
26
27 #include <boost/signals2.hpp>
28
29 namespace ASDCP {
30         class AESDecContext;
31         struct WriterInfo;
32 }
33
34 /* Undefine some stuff that the OS X 10.5 SDK defines */
35 #undef Key
36 #undef set_key
37
38 namespace dcp
39 {
40
41 class MXFMetadata;
42 class PictureAssetWriter;
43
44 /** @class MXF
45  *  @brief Parent for classes which represent MXF files.
46  */
47 class MXF
48 {
49 public:
50         virtual ~MXF () {}
51
52         /** @return true if the data is encrypted */
53         bool encrypted () const {
54                 return static_cast<bool>(_key_id);
55         }
56
57         /** Set the ID of the key that is used for encryption/decryption.
58          *  @param i key ID.
59          */
60         void set_key_id (std::string i) {
61                 _key_id = i;
62         }
63
64         /** @return the ID of the key used for encryption/decryption, if there is one */
65         boost::optional<std::string> key_id () const {
66                 return _key_id;
67         }
68
69         void set_key (Key);
70
71         /** @return encryption/decryption key, if one has been set */
72         boost::optional<Key> key () const {
73                 return _key;
74         }
75
76         /** Set the metadata that is written to the MXF file.
77          *  @param m Metadata.
78          */
79         void set_metadata (MXFMetadata m) {
80                 _metadata = m;
81         }
82
83         /** @return metadata from the MXF file */
84         MXFMetadata metadata () const {
85                 return _metadata;
86         }
87
88 protected:
89         template <class P, class Q>
90         friend void start (PictureAssetWriter* writer, boost::shared_ptr<P> state, Standard standard, Q* mxf, uint8_t* data, int size);
91
92         std::string read_writer_info (ASDCP::WriterInfo const &);
93         /** Fill in a ADSCP::WriteInfo struct.
94          *  @param w struct to fill in.
95          *  @param standard INTEROP or SMPTE.
96          */
97         void fill_writer_info (ASDCP::WriterInfo* w, std::string id, Standard standard) const;
98
99         /** ID of the key used for encryption/decryption, if there is one */
100         boost::optional<std::string> _key_id;
101         /** Key used for encryption/decryption, if there is one */
102         boost::optional<Key> _key;
103         MXFMetadata _metadata;
104 };
105
106 }
107
108 #endif