From f7642b4e1384156e3ce4f689474331ea7b958cbb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 4 Jan 2015 23:10:39 +0000 Subject: [PATCH] Fix loading of 1.x metadata. --- src/lib/colour_conversion.cc | 53 +++++++++++++++++++++++------------- src/lib/colour_conversion.h | 6 ++-- src/lib/config.cc | 5 +++- src/lib/player_video.cc | 7 +++-- src/lib/player_video.h | 2 +- src/lib/video_content.cc | 2 +- 6 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/lib/colour_conversion.cc b/src/lib/colour_conversion.cc index ef36087e7..ad09458f9 100644 --- a/src/lib/colour_conversion.cc +++ b/src/lib/colour_conversion.cc @@ -51,22 +51,37 @@ ColourConversion::ColourConversion (dcp::ColourConversion conversion_) } -ColourConversion::ColourConversion (cxml::NodePtr node) +ColourConversion::ColourConversion (cxml::NodePtr node, int version) { shared_ptr in; - - cxml::ConstNodePtr in_node = node->node_child ("InputTransferFunction"); - string in_type = in_node->string_child ("Type"); - if (in_type == "Gamma") { - _in.reset (new dcp::GammaTransferFunction (false, in_node->number_child ("Gamma"))); - } else if (in_type == "ModifiedGamma") { - _in.reset (new dcp::ModifiedGammaTransferFunction ( - false, - in_node->number_child ("Power"), - in_node->number_child ("Threshold"), - in_node->number_child ("A"), - in_node->number_child ("B") - )); + + if (version >= 32) { + + /* Version 2.x */ + + cxml::ConstNodePtr in_node = node->node_child ("InputTransferFunction"); + string in_type = in_node->string_child ("Type"); + if (in_type == "Gamma") { + _in.reset (new dcp::GammaTransferFunction (false, in_node->number_child ("Gamma"))); + } else if (in_type == "ModifiedGamma") { + _in.reset (new dcp::ModifiedGammaTransferFunction ( + false, + in_node->number_child ("Power"), + in_node->number_child ("Threshold"), + in_node->number_child ("A"), + in_node->number_child ("B") + )); + } + + } else { + + /* Version 1.x */ + + if (node->bool_child ("InputGammaLinearised")) { + _in.reset (new dcp::ModifiedGammaTransferFunction (false, node->number_child ("InputGamma"), 0.04045, 0.055, 12.92)); + } else { + _in.reset (new dcp::GammaTransferFunction (false, node->number_child ("InputGamma"))); + } } list m = node->node_children ("Matrix"); @@ -75,18 +90,18 @@ ColourConversion::ColourConversion (cxml::NodePtr node) int const tj = (*i)->number_attribute ("j"); _matrix(ti, tj) = raw_convert ((*i)->content ()); } - + _out.reset (new dcp::GammaTransferFunction (true, node->number_child ("OutputGamma"))); } boost::optional -ColourConversion::from_xml (cxml::NodePtr node) +ColourConversion::from_xml (cxml::NodePtr node, int version) { if (!node->optional_node_child ("InputTransferFunction")) { return boost::optional (); } - return ColourConversion (node); + return ColourConversion (node, version); } void @@ -176,8 +191,8 @@ PresetColourConversion::PresetColourConversion (string n, dcp::ColourConversion } -PresetColourConversion::PresetColourConversion (cxml::NodePtr node) - : conversion (node) +PresetColourConversion::PresetColourConversion (cxml::NodePtr node, int version) + : conversion (node, version) { name = node->string_child ("Name"); } diff --git a/src/lib/colour_conversion.h b/src/lib/colour_conversion.h index bf883a07c..ae207b46a 100644 --- a/src/lib/colour_conversion.h +++ b/src/lib/colour_conversion.h @@ -38,14 +38,14 @@ class ColourConversion : public dcp::ColourConversion public: ColourConversion (); ColourConversion (dcp::ColourConversion); - ColourConversion (cxml::NodePtr); + ColourConversion (cxml::NodePtr, int version); virtual void as_xml (xmlpp::Node *) const; std::string identifier () const; boost::optional preset () const; - static boost::optional from_xml (cxml::NodePtr); + static boost::optional from_xml (cxml::NodePtr, int version); }; class PresetColourConversion @@ -53,7 +53,7 @@ class PresetColourConversion public: PresetColourConversion (); PresetColourConversion (std::string, dcp::ColourConversion); - PresetColourConversion (cxml::NodePtr); + PresetColourConversion (cxml::NodePtr node, int version); void as_xml (xmlpp::Node *) const; diff --git a/src/lib/config.cc b/src/lib/config.cc index d43024128..306b48a9f 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -179,7 +179,10 @@ Config::read () try { for (list::iterator i = cc.begin(); i != cc.end(); ++i) { - _colour_conversions.push_back (PresetColourConversion (*i)); + /* This is a bit of a hack; use 32 (the first Film state file version for the 2.x branch) + for version 2 and 10 (the current Film state version for the 1.x branch) for version 1. + */ + _colour_conversions.push_back (PresetColourConversion (*i, version == 2 ? 32 : 10)); } } catch (cxml::Error) { /* Probably failed to load an old-style ColourConversion tag; just give up */ diff --git a/src/lib/player_video.cc b/src/lib/player_video.cc index fae66bf62..94e6f3f2a 100644 --- a/src/lib/player_video.cc +++ b/src/lib/player_video.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "image_proxy.h" #include "j2k_image_proxy.h" #include "scaler.h" +#include "film.h" using std::string; using std::cout; @@ -68,7 +69,9 @@ PlayerVideo::PlayerVideo (shared_ptr node, shared_ptr socket _scaler = Scaler::from_id (node->string_child ("Scaler")); _eyes = (Eyes) node->number_child ("Eyes"); _part = (Part) node->number_child ("Part"); - _colour_conversion = ColourConversion::from_xml (node); + + /* Assume that the ColourConversion uses the current state version */ + _colour_conversion = ColourConversion::from_xml (node, Film::current_state_version); _in = image_proxy_factory (node->node_child ("In"), socket); diff --git a/src/lib/player_video.h b/src/lib/player_video.h index 935690a08..1468b7863 100644 --- a/src/lib/player_video.h +++ b/src/lib/player_video.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index 8973fba7e..a76ddcd39 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -123,7 +123,7 @@ VideoContent::VideoContent (shared_ptr f, cxml::ConstNodePtr node, i if (node->optional_node_child ("ColourConversion")) { - _colour_conversion = ColourConversion (node->node_child ("ColourConversion")); + _colour_conversion = ColourConversion (node->node_child ("ColourConversion"), version); } if (version >= 32) { _fade_in = ContentTime (node->number_child ("FadeIn")); -- 2.30.2