Creator is optional.
[libdcp.git] / src / cpl_file.cc
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/cpl_file.cc
21  *  @brief Classes used to parse a CPL.
22  */
23
24 #include <iostream>
25 #include "cpl_file.h"
26
27 using namespace std;
28 using namespace libdcp;
29
30 CPLFile::CPLFile (string file)
31         : XMLFile (file, "CompositionPlaylist")
32 {
33         id = string_node ("Id");
34         annotation_text = optional_string_node ("AnnotationText");
35         issue_date = string_node ("IssueDate");
36         creator = optional_string_node ("Creator");
37         content_title_text = string_node ("ContentTitleText");
38         content_kind = kind_node ("ContentKind");
39         content_version = optional_sub_node<ContentVersion> ("ContentVersion");
40         ignore_node ("RatingList");
41         reels = sub_nodes<CPLReel> ("ReelList", "Reel");
42
43         ignore_node ("Issuer");
44         ignore_node ("Signer");
45         ignore_node ("Signature");
46
47         done ();
48 }
49
50 ContentVersion::ContentVersion (xmlpp::Node const * node)
51         : XMLNode (node)
52 {
53         id = optional_string_node ("Id");
54         label_text = string_node ("LabelText");
55         done ();
56 }
57
58 CPLReel::CPLReel (xmlpp::Node const * node)
59         : XMLNode (node)
60 {
61         id = string_node ("Id");
62         asset_list = sub_node<CPLAssetList> ("AssetList");
63
64         ignore_node ("AnnotationText");
65         done ();
66 }
67
68 CPLAssetList::CPLAssetList (xmlpp::Node const * node)
69         : XMLNode (node)
70 {
71         main_picture = optional_sub_node<MainPicture> ("MainPicture");
72         main_stereoscopic_picture = optional_sub_node<MainStereoscopicPicture> ("MainStereoscopicPicture");
73         main_sound = optional_sub_node<MainSound> ("MainSound");
74         main_subtitle = optional_sub_node<MainSubtitle> ("MainSubtitle");
75
76         done ();
77 }
78
79 MainPicture::MainPicture (xmlpp::Node const * node)
80         : Picture (node)
81 {
82
83 }
84
85 MainStereoscopicPicture::MainStereoscopicPicture (xmlpp::Node const * node)
86         : Picture (node)
87 {
88
89 }
90
91 Picture::Picture (xmlpp::Node const * node)
92         : XMLNode (node)
93 {
94         id = string_node ("Id");
95         annotation_text = optional_string_node ("AnnotationText");
96         edit_rate = fraction_node ("EditRate");
97         intrinsic_duration = int64_node ("IntrinsicDuration");
98         entry_point = int64_node ("EntryPoint");
99         duration = int64_node ("Duration");
100         frame_rate = fraction_node ("FrameRate");
101         try {
102                 screen_aspect_ratio = fraction_node ("ScreenAspectRatio");
103         } catch (XMLError& e) {
104                 /* Maybe it's not a fraction */
105         }
106         try {
107                 float f = float_node ("ScreenAspectRatio");
108                 screen_aspect_ratio = Fraction (f * 1000, 1000);
109         } catch (bad_cast& e) {
110
111         }
112
113         ignore_node ("Hash");
114
115         done ();
116 }
117
118 MainSound::MainSound (xmlpp::Node const * node)
119         : XMLNode (node)
120 {
121         id = string_node ("Id");
122         annotation_text = optional_string_node ("AnnotationText");
123         edit_rate = fraction_node ("EditRate");
124         intrinsic_duration = int64_node ("IntrinsicDuration");
125         entry_point = int64_node ("EntryPoint");
126         duration = int64_node ("Duration");
127
128         ignore_node ("Hash");
129         ignore_node ("Language");
130         
131         done ();
132 }
133
134 MainSubtitle::MainSubtitle (xmlpp::Node const * node)
135         : XMLNode (node)
136 {
137         id = string_node ("Id");
138         annotation_text = optional_string_node ("AnnotationText");
139         edit_rate = fraction_node ("EditRate");
140         intrinsic_duration = int64_node ("IntrinsicDuration");
141         entry_point = int64_node ("EntryPoint");
142         duration = int64_node ("Duration");
143
144         ignore_node ("Hash");
145         ignore_node ("Language");
146         
147         done ();
148 }