From 06b218772cf18041edb11b5ed35c8a305b8fe26a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 20 Jul 2018 22:11:09 +0100 Subject: Put caption details inside their own tag in the metadata. --- src/lib/caption_content.cc | 95 +++++++++++++++++++++++++++++++--------------- src/lib/film.cc | 5 ++- 2 files changed, 68 insertions(+), 32 deletions(-) (limited to 'src/lib') diff --git a/src/lib/caption_content.cc b/src/lib/caption_content.cc index e3f6551fd..801ccc0d0 100644 --- a/src/lib/caption_content.cc +++ b/src/lib/caption_content.cc @@ -86,11 +86,18 @@ CaptionContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version) /* Otherwise we can drop through to the newer logic */ } - if (!node->optional_number_child("SubtitleXOffset") && !node->optional_number_child("SubtitleOffset")) { + if (version < 37) { + if (!node->optional_number_child("SubtitleXOffset") && !node->optional_number_child("SubtitleOffset")) { + return shared_ptr (); + } + shared_ptr (new CaptionContent (parent, node, version)); + } + + if (!node->node_child("Caption")) { return shared_ptr (); } - return shared_ptr (new CaptionContent (parent, node, version)); + return shared_ptr (new CaptionContent (parent, node->node_child("Caption"), version)); } CaptionContent::CaptionContent (Content* parent, cxml::ConstNodePtr node, int version) @@ -105,12 +112,18 @@ CaptionContent::CaptionContent (Content* parent, cxml::ConstNodePtr node, int ve , _outline_width (node->optional_number_child("OutlineWidth").get_value_or (2)) , _type (CAPTION_OPEN) { - if (version >= 32) { + if (version >= 37) { + _use = node->bool_child ("Use"); + _burn = node->bool_child ("Burn"); + } else if (version >= 32) { _use = node->bool_child ("UseSubtitles"); _burn = node->bool_child ("BurnSubtitles"); } - if (version >= 7) { + if (version >= 37) { + _x_offset = node->number_child ("XOffset"); + _y_offset = node->number_child ("YOffset"); + } else if (version >= 7) { _x_offset = node->number_child ("SubtitleXOffset"); _y_offset = node->number_child ("SubtitleYOffset"); } else { @@ -136,7 +149,10 @@ CaptionContent::CaptionContent (Content* parent, cxml::ConstNodePtr node, int ve } } - if (version >= 10) { + if (version >= 37) { + _x_scale = node->number_child ("XScale"); + _y_scale = node->number_child ("YScale"); + } else if (version >= 10) { _x_scale = node->number_child ("SubtitleXScale"); _y_scale = node->number_child ("SubtitleYScale"); } else { @@ -165,16 +181,31 @@ CaptionContent::CaptionContent (Content* parent, cxml::ConstNodePtr node, int ve ); } - optional fi = node->optional_number_child("SubtitleFadeIn"); + optional fi; + if (version >= 37) { + fi = node->optional_number_child("FadeIn"); + } else { + fi = node->optional_number_child("SubtitleFadeIn"); + } if (fi) { _fade_in = ContentTime (*fi); } - optional fo = node->optional_number_child("SubtitleFadeOut"); + + optional fo; + if (version >= 37) { + fo = node->optional_number_child("FadeOut"); + } else { + fo = node->optional_number_child("SubtitleFadeOut"); + } if (fo) { _fade_out = ContentTime (*fo); } - _language = node->optional_string_child ("SubtitleLanguage").get_value_or (""); + if (version >= 37) { + _language = node->optional_string_child ("Language").get_value_or (""); + } else { + _language = node->optional_string_child ("SubtitleLanguage").get_value_or (""); + } list fonts = node->node_children ("Font"); for (list::const_iterator i = fonts.begin(); i != fonts.end(); ++i) { @@ -183,7 +214,7 @@ CaptionContent::CaptionContent (Content* parent, cxml::ConstNodePtr node, int ve connect_to_fonts (); - _type = string_to_caption_type (node->optional_string_child("CaptionType").get_value_or("open")); + _type = string_to_caption_type (node->optional_string_child("Type").get_value_or("open")); } @@ -193,50 +224,52 @@ CaptionContent::as_xml (xmlpp::Node* root) const { boost::mutex::scoped_lock lm (_mutex); - root->add_child("UseSubtitles")->add_child_text (_use ? "1" : "0"); - root->add_child("BurnSubtitles")->add_child_text (_burn ? "1" : "0"); - root->add_child("SubtitleXOffset")->add_child_text (raw_convert (_x_offset)); - root->add_child("SubtitleYOffset")->add_child_text (raw_convert (_y_offset)); - root->add_child("SubtitleXScale")->add_child_text (raw_convert (_x_scale)); - root->add_child("SubtitleYScale")->add_child_text (raw_convert (_y_scale)); - root->add_child("SubtitleLanguage")->add_child_text (_language); + xmlpp::Element* caption = root->add_child ("Caption"); + + caption->add_child("Use")->add_child_text (_use ? "1" : "0"); + caption->add_child("Burn")->add_child_text (_burn ? "1" : "0"); + caption->add_child("XOffset")->add_child_text (raw_convert (_x_offset)); + caption->add_child("YOffset")->add_child_text (raw_convert (_y_offset)); + caption->add_child("XScale")->add_child_text (raw_convert (_x_scale)); + caption->add_child("YScale")->add_child_text (raw_convert (_y_scale)); + caption->add_child("Language")->add_child_text (_language); if (_colour) { - root->add_child("Red")->add_child_text (raw_convert (_colour->r)); - root->add_child("Green")->add_child_text (raw_convert (_colour->g)); - root->add_child("Blue")->add_child_text (raw_convert (_colour->b)); + caption->add_child("Red")->add_child_text (raw_convert (_colour->r)); + caption->add_child("Green")->add_child_text (raw_convert (_colour->g)); + caption->add_child("Blue")->add_child_text (raw_convert (_colour->b)); } if (_effect) { switch (*_effect) { case dcp::NONE: - root->add_child("Effect")->add_child_text("none"); + caption->add_child("Effect")->add_child_text("none"); break; case dcp::BORDER: - root->add_child("Effect")->add_child_text("outline"); + caption->add_child("Effect")->add_child_text("outline"); break; case dcp::SHADOW: - root->add_child("Effect")->add_child_text("shadow"); + caption->add_child("Effect")->add_child_text("shadow"); break; } } if (_effect_colour) { - root->add_child("EffectRed")->add_child_text (raw_convert (_effect_colour->r)); - root->add_child("EffectGreen")->add_child_text (raw_convert (_effect_colour->g)); - root->add_child("EffectBlue")->add_child_text (raw_convert (_effect_colour->b)); + caption->add_child("EffectRed")->add_child_text (raw_convert (_effect_colour->r)); + caption->add_child("EffectGreen")->add_child_text (raw_convert (_effect_colour->g)); + caption->add_child("EffectBlue")->add_child_text (raw_convert (_effect_colour->b)); } - root->add_child("LineSpacing")->add_child_text (raw_convert (_line_spacing)); + caption->add_child("LineSpacing")->add_child_text (raw_convert (_line_spacing)); if (_fade_in) { - root->add_child("SubtitleFadeIn")->add_child_text (raw_convert (_fade_in->get())); + caption->add_child("FadeIn")->add_child_text (raw_convert (_fade_in->get())); } if (_fade_out) { - root->add_child("SubtitleFadeOut")->add_child_text (raw_convert (_fade_out->get())); + caption->add_child("FadeOut")->add_child_text (raw_convert (_fade_out->get())); } - root->add_child("OutlineWidth")->add_child_text (raw_convert (_outline_width)); + caption->add_child("OutlineWidth")->add_child_text (raw_convert (_outline_width)); for (list >::const_iterator i = _fonts.begin(); i != _fonts.end(); ++i) { - (*i)->as_xml (root->add_child("Font")); + (*i)->as_xml (caption->add_child("Font")); } - root->add_child("CaptionType")->add_child_text (caption_type_to_string(_type)); + caption->add_child("Type")->add_child_text (caption_type_to_string(_type)); } string diff --git a/src/lib/film.cc b/src/lib/film.cc index f6941c1c7..08dd8bdc2 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -124,8 +124,11 @@ string const Film::metadata_file = "metadata.xml"; * VideoFrameType in VideoContent is a string rather than an integer. * 35 -> 36 * EffectColour rather than OutlineColour in Subtitle. + * 36 -> 37 + * CaptionContent can be in a Caption tag, and some of the tag names + * have had Subtitle prefixes or suffixes removed. */ -int const Film::current_state_version = 36; +int const Film::current_state_version = 37; /** Construct a Film object in a given directory. * -- cgit v1.2.3