From cc76b517f6a74f813ae38137bdc88ff3bafa6dd9 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 10 May 2016 13:22:35 +0100 Subject: [PATCH] Allow content parts to not be preset in XML. --- src/lib/audio_content.cc | 10 ++++++++++ src/lib/audio_content.h | 5 ++++- src/lib/dcp_content.cc | 10 +++------- src/lib/dcp_subtitle_content.cc | 2 +- src/lib/ffmpeg_content.cc | 6 +++--- src/lib/image_content.cc | 2 +- src/lib/sndfile_content.cc | 2 +- src/lib/subtitle_content.cc | 10 ++++++++++ src/lib/subtitle_content.h | 5 ++++- src/lib/text_subtitle_content.cc | 2 +- src/lib/video_content.cc | 10 ++++++++++ src/lib/video_content.h | 4 +++- 12 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/lib/audio_content.cc b/src/lib/audio_content.cc index a0c9950a6..540279a95 100644 --- a/src/lib/audio_content.cc +++ b/src/lib/audio_content.cc @@ -56,6 +56,16 @@ AudioContent::AudioContent (Content* parent, shared_ptr film) } +shared_ptr +AudioContent::from_xml (Content* parent, shared_ptr film, cxml::ConstNodePtr node) +{ + if (!node->optional_number_child ("AudioGain")) { + return shared_ptr (); + } + + return shared_ptr (new AudioContent (parent, film, node)); +} + AudioContent::AudioContent (Content* parent, shared_ptr film, cxml::ConstNodePtr node) : ContentPart (parent, film) { diff --git a/src/lib/audio_content.h b/src/lib/audio_content.h index 7de0742a5..e196e15c2 100644 --- a/src/lib/audio_content.h +++ b/src/lib/audio_content.h @@ -43,7 +43,6 @@ class AudioContent : public ContentPart { public: AudioContent (Content* parent, boost::shared_ptr); - AudioContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr); AudioContent (Content* parent, boost::shared_ptr, std::vector >); void as_xml (xmlpp::Node *) const; @@ -82,8 +81,12 @@ public: void add_properties (std::list &) const; + static boost::shared_ptr from_xml (Content* parent, boost::shared_ptr, cxml::ConstNodePtr); + private: + AudioContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr); + /** Gain to apply to audio in dB */ double _gain; /** Delay to apply to audio (positive moves audio later) in milliseconds */ diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 6a6f6efc5..2cd7e576f 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -72,9 +72,10 @@ DCPContent::DCPContent (shared_ptr film, boost::filesystem::path p) DCPContent::DCPContent (shared_ptr film, cxml::ConstNodePtr node, int version) : Content (film, node) { - video.reset (new VideoContent (this, film, node, version)); + video = VideoContent::from_xml (this, film, node, version); + audio = AudioContent::from_xml (this, film, node); + subtitle = SubtitleContent::from_xml (this, film, node, version); - audio.reset (new AudioContent (this, film, node)); audio->set_stream ( AudioStreamPtr ( new AudioStream (node->number_child ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version)) @@ -83,10 +84,6 @@ DCPContent::DCPContent (shared_ptr film, cxml::ConstNodePtr node, in _name = node->string_child ("Name"); - if (node->bool_child ("HasSubtitles")) { - subtitle.reset (new SubtitleContent (this, film, node, version)); - } - _encrypted = node->bool_child ("Encrypted"); if (node->optional_node_child ("KDM")) { _kdm = dcp::EncryptedKDM (node->string_child ("KDM")); @@ -179,7 +176,6 @@ DCPContent::as_xml (xmlpp::Node* node) const boost::mutex::scoped_lock lm (_mutex); node->add_child("Name")->add_child_text (_name); - node->add_child("HasSubtitles")->add_child_text (subtitle ? "1" : "0"); node->add_child("Encrypted")->add_child_text (_encrypted ? "1" : "0"); if (_kdm) { node->add_child("KDM")->add_child_text (_kdm->as_xml ()); diff --git a/src/lib/dcp_subtitle_content.cc b/src/lib/dcp_subtitle_content.cc index a6beacb0d..0702237f3 100644 --- a/src/lib/dcp_subtitle_content.cc +++ b/src/lib/dcp_subtitle_content.cc @@ -45,7 +45,7 @@ DCPSubtitleContent::DCPSubtitleContent (shared_ptr film, cxml::Const : Content (film, node) , _length (node->number_child ("Length")) { - subtitle.reset (new SubtitleContent (this, film, node, version)); + subtitle = SubtitleContent::from_xml (this, film, node, version); } void diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index f249a1c35..a8206b13e 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -74,9 +74,9 @@ FFmpegContent::FFmpegContent (shared_ptr film, boost::filesystem::pa FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr node, int version, list& notes) : Content (film, node) { - video.reset (new VideoContent (this, film, node, version)); - audio.reset (new AudioContent (this, film, node)); - subtitle.reset (new SubtitleContent (this, film, node, version)); + video = VideoContent::from_xml (this, film, node, version); + audio = AudioContent::from_xml (this, film, node); + subtitle = SubtitleContent::from_xml (this, film, node, version); list c = node->node_children ("SubtitleStream"); for (list::const_iterator i = c.begin(); i != c.end(); ++i) { diff --git a/src/lib/image_content.cc b/src/lib/image_content.cc index 57212c589..15c20d874 100644 --- a/src/lib/image_content.cc +++ b/src/lib/image_content.cc @@ -66,7 +66,7 @@ ImageContent::ImageContent (shared_ptr film, boost::filesystem::path ImageContent::ImageContent (shared_ptr film, cxml::ConstNodePtr node, int version) : Content (film, node) { - video.reset (new VideoContent (this, film, node, version)); + video = VideoContent::from_xml (this, film, node, version); } string diff --git a/src/lib/sndfile_content.cc b/src/lib/sndfile_content.cc index 2b28ba8b4..7c204e9eb 100644 --- a/src/lib/sndfile_content.cc +++ b/src/lib/sndfile_content.cc @@ -48,7 +48,7 @@ SndfileContent::SndfileContent (shared_ptr film, cxml::ConstNodePtr : Content (film, node) , _audio_length (node->number_child ("AudioLength")) { - audio.reset (new AudioContent (this, film, node)); + audio = AudioContent::from_xml (this, film, node); audio->set_stream ( AudioStreamPtr ( new AudioStream (node->number_child ("AudioFrameRate"), AudioMapping (node->node_child ("AudioMapping"), version))) diff --git a/src/lib/subtitle_content.cc b/src/lib/subtitle_content.cc index 228376c34..89953b0e5 100644 --- a/src/lib/subtitle_content.cc +++ b/src/lib/subtitle_content.cc @@ -66,6 +66,16 @@ SubtitleContent::SubtitleContent (Content* parent, shared_ptr film) } +shared_ptr +SubtitleContent::from_xml (Content* parent, shared_ptr film, cxml::ConstNodePtr node, int version) +{ + if (!node->optional_number_child("SubtitleXOffset") && !node->optional_number_child("SubtitleOffset")) { + return shared_ptr (); + } + + return shared_ptr (new SubtitleContent (parent, film, node, version)); +} + SubtitleContent::SubtitleContent (Content* parent, shared_ptr film, cxml::ConstNodePtr node, int version) : ContentPart (parent, film) , _use (false) diff --git a/src/lib/subtitle_content.h b/src/lib/subtitle_content.h index 09cc92709..db2286339 100644 --- a/src/lib/subtitle_content.h +++ b/src/lib/subtitle_content.h @@ -47,7 +47,6 @@ class SubtitleContent : public ContentPart { public: SubtitleContent (Content* parent, boost::shared_ptr); - SubtitleContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int version); SubtitleContent (Content* parent, boost::shared_ptr, std::vector >); void as_xml (xmlpp::Node *) const; @@ -129,12 +128,16 @@ public: return _outline_colour; } + static boost::shared_ptr from_xml (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int version); + protected: /** subtitle language (e.g. "German") or empty if it is not known */ std::string _language; private: friend struct ffmpeg_pts_offset_test; + + SubtitleContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int version); void font_changed (); void connect_to_fonts (); diff --git a/src/lib/text_subtitle_content.cc b/src/lib/text_subtitle_content.cc index c7be4c19b..74e785ff7 100644 --- a/src/lib/text_subtitle_content.cc +++ b/src/lib/text_subtitle_content.cc @@ -45,7 +45,7 @@ TextSubtitleContent::TextSubtitleContent (shared_ptr film, cxml::Con : Content (film, node) , _length (node->number_child ("Length")) { - subtitle.reset (new SubtitleContent (this, film, node, version)); + subtitle = SubtitleContent::from_xml (this, film, node, version); } void diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index ff5a4cb17..75d94510a 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -75,6 +75,16 @@ VideoContent::VideoContent (Content* parent, shared_ptr film) } +shared_ptr +VideoContent::from_xml (Content* parent, shared_ptr film, cxml::ConstNodePtr node, int version) +{ + if (!node->optional_number_child ("VideoWidth")) { + return shared_ptr (); + } + + return shared_ptr (new VideoContent (parent, film, node, version)); +} + VideoContent::VideoContent (Content* parent, shared_ptr film, cxml::ConstNodePtr node, int version) : ContentPart (parent, film) { diff --git a/src/lib/video_content.h b/src/lib/video_content.h index 03ffb0fa8..ef54a6be4 100644 --- a/src/lib/video_content.h +++ b/src/lib/video_content.h @@ -51,7 +51,6 @@ class VideoContent : public ContentPart, public boost::enable_shared_from_this); - VideoContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int); VideoContent (Content* parent, boost::shared_ptr, std::vector >); void as_xml (xmlpp::Node *) const; @@ -167,6 +166,8 @@ public: void take_from_examiner (boost::shared_ptr); void add_properties (std::list &) const; + static boost::shared_ptr from_xml (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int); + private: friend struct ffmpeg_pts_offset_test; @@ -174,6 +175,7 @@ private: friend struct best_dcp_frame_rate_test_double; friend struct audio_sampling_rate_test; + VideoContent (Content* parent, boost::shared_ptr, cxml::ConstNodePtr, int); void setup_default_colour_conversion (); Frame _length; -- 2.30.2