summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-01-04 23:10:39 +0000
committerCarl Hetherington <cth@carlh.net>2015-01-04 23:10:39 +0000
commitf7642b4e1384156e3ce4f689474331ea7b958cbb (patch)
tree49f5c5b9e830bddd32ef203d98ea004943210078 /src/lib
parentbee98cdc1ddc5f87749de3bbf2ae5e4b2ef498c3 (diff)
Fix loading of 1.x metadata.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/colour_conversion.cc53
-rw-r--r--src/lib/colour_conversion.h6
-rw-r--r--src/lib/config.cc5
-rw-r--r--src/lib/player_video.cc7
-rw-r--r--src/lib/player_video.h2
-rw-r--r--src/lib/video_content.cc2
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<dcp::TransferFunction> 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<double> ("Gamma")));
- } else if (in_type == "ModifiedGamma") {
- _in.reset (new dcp::ModifiedGammaTransferFunction (
- false,
- in_node->number_child<double> ("Power"),
- in_node->number_child<double> ("Threshold"),
- in_node->number_child<double> ("A"),
- in_node->number_child<double> ("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<double> ("Gamma")));
+ } else if (in_type == "ModifiedGamma") {
+ _in.reset (new dcp::ModifiedGammaTransferFunction (
+ false,
+ in_node->number_child<double> ("Power"),
+ in_node->number_child<double> ("Threshold"),
+ in_node->number_child<double> ("A"),
+ in_node->number_child<double> ("B")
+ ));
+ }
+
+ } else {
+
+ /* Version 1.x */
+
+ if (node->bool_child ("InputGammaLinearised")) {
+ _in.reset (new dcp::ModifiedGammaTransferFunction (false, node->number_child<float> ("InputGamma"), 0.04045, 0.055, 12.92));
+ } else {
+ _in.reset (new dcp::GammaTransferFunction (false, node->number_child<float> ("InputGamma")));
+ }
}
list<cxml::NodePtr> m = node->node_children ("Matrix");
@@ -75,18 +90,18 @@ ColourConversion::ColourConversion (cxml::NodePtr node)
int const tj = (*i)->number_attribute<int> ("j");
_matrix(ti, tj) = raw_convert<double> ((*i)->content ());
}
-
+
_out.reset (new dcp::GammaTransferFunction (true, node->number_child<double> ("OutputGamma")));
}
boost::optional<ColourConversion>
-ColourConversion::from_xml (cxml::NodePtr node)
+ColourConversion::from_xml (cxml::NodePtr node, int version)
{
if (!node->optional_node_child ("InputTransferFunction")) {
return boost::optional<ColourConversion> ();
}
- 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<size_t> preset () const;
- static boost::optional<ColourConversion> from_xml (cxml::NodePtr);
+ static boost::optional<ColourConversion> 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<cxml::NodePtr>::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 <cth@carlh.net>
+ Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
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<cxml::Node> node, shared_ptr<Socket> socket
_scaler = Scaler::from_id (node->string_child ("Scaler"));
_eyes = (Eyes) node->number_child<int> ("Eyes");
_part = (Part) node->number_child<int> ("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 <cth@carlh.net>
+ Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
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<const Film> 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<int64_t> ("FadeIn"));