summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-05-25 02:48:32 +0100
committerCarl Hetherington <cth@carlh.net>2015-05-25 02:48:32 +0100
commit8167d04e4dde6297ad936dca5dc691818a4dae41 (patch)
tree37aac64d82949ac0086d40259ccd06e35e728597 /src/lib
parentd8b6ee12af54a37433e96238bdca29171d6e0eb6 (diff)
11b5bf6229b8713dffde89a777cd5181335136f6 from master; default colour conversions depending on type and resolution
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/colour_conversion.cc24
-rw-r--r--src/lib/colour_conversion.h8
-rw-r--r--src/lib/ffmpeg_content.cc16
-rw-r--r--src/lib/ffmpeg_content.h3
-rw-r--r--src/lib/image_content.cc13
-rw-r--r--src/lib/image_content.h3
-rw-r--r--src/lib/video_content.cc6
-rw-r--r--src/lib/video_content.h5
8 files changed, 67 insertions, 11 deletions
diff --git a/src/lib/colour_conversion.cc b/src/lib/colour_conversion.cc
index cb3a92c1a..bc11071ee 100644
--- a/src/lib/colour_conversion.cc
+++ b/src/lib/colour_conversion.cc
@@ -222,9 +222,10 @@ PresetColourConversion::PresetColourConversion ()
}
-PresetColourConversion::PresetColourConversion (string n, dcp::ColourConversion conversion_)
+PresetColourConversion::PresetColourConversion (string n, string i, dcp::ColourConversion conversion_)
: conversion (conversion_)
, name (n)
+ , id (i)
{
}
@@ -257,8 +258,21 @@ operator== (PresetColourConversion const & a, PresetColourConversion const & b)
void
PresetColourConversion::setup_colour_conversion_presets ()
{
- _presets.push_back (PresetColourConversion (_("sRGB"), dcp::ColourConversion::srgb_to_xyz ()));
- _presets.push_back (PresetColourConversion (_("Rec. 601"), dcp::ColourConversion::rec601_to_xyz ()));
- _presets.push_back (PresetColourConversion (_("Rec. 709"), dcp::ColourConversion::rec709_to_xyz ()));
- _presets.push_back (PresetColourConversion (_("P3"), dcp::ColourConversion::p3_to_xyz ()));
+ _presets.push_back (PresetColourConversion (_("sRGB"), "rgb", dcp::ColourConversion::srgb_to_xyz ()));
+ _presets.push_back (PresetColourConversion (_("Rec. 601"), "rec601", dcp::ColourConversion::rec601_to_xyz ()));
+ _presets.push_back (PresetColourConversion (_("Rec. 709"), "rec709", dcp::ColourConversion::rec709_to_xyz ()));
+ _presets.push_back (PresetColourConversion (_("P3"), "p3", dcp::ColourConversion::p3_to_xyz ()));
}
+
+PresetColourConversion
+PresetColourConversion::from_id (string s)
+{
+ BOOST_FOREACH (PresetColourConversion const& i, _presets) {
+ if (i.id == s) {
+ return i;
+ }
+ }
+
+ DCPOMATIC_ASSERT (false);
+}
+
diff --git a/src/lib/colour_conversion.h b/src/lib/colour_conversion.h
index 1b42dffb7..06a9cf6c3 100644
--- a/src/lib/colour_conversion.h
+++ b/src/lib/colour_conversion.h
@@ -52,16 +52,20 @@ class PresetColourConversion
{
public:
PresetColourConversion ();
- PresetColourConversion (std::string, dcp::ColourConversion);
+ PresetColourConversion (std::string n, std::string i, dcp::ColourConversion);
PresetColourConversion (cxml::NodePtr node, int version);
ColourConversion conversion;
std::string name;
-
+ /** an internal short (non-internationalised) name for this preset */
+ std::string id;
+
static std::vector<PresetColourConversion> all () {
return _presets;
}
+ static PresetColourConversion from_id (std::string id);
+
static void setup_colour_conversion_presets ();
private:
diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc
index a52b53b04..187d61953 100644
--- a/src/lib/ffmpeg_content.cc
+++ b/src/lib/ffmpeg_content.cc
@@ -388,3 +388,19 @@ FFmpegContent::has_subtitles () const
{
return !subtitle_streams().empty ();
}
+
+void
+FFmpegContent::set_default_colour_conversion ()
+{
+ dcp::Size const s = video_size ();
+
+ boost::mutex::scoped_lock lm (_mutex);
+
+ if (s.width < 1080) {
+ _colour_conversion = PresetColourConversion::from_id ("rec601").conversion;
+ } else {
+ _colour_conversion = PresetColourConversion::from_id ("rec709").conversion;
+ }
+}
+
+
diff --git a/src/lib/ffmpeg_content.h b/src/lib/ffmpeg_content.h
index d6edb2bdb..bc1872ac1 100644
--- a/src/lib/ffmpeg_content.h
+++ b/src/lib/ffmpeg_content.h
@@ -63,6 +63,9 @@ public:
DCPTime full_length () const;
std::string identifier () const;
+
+ /* VideoContent */
+ void set_default_colour_conversion ();
/* AudioContent */
int audio_channels () const;
diff --git a/src/lib/image_content.cc b/src/lib/image_content.cc
index f9a772e00..54ac56eae 100644
--- a/src/lib/image_content.cc
+++ b/src/lib/image_content.cc
@@ -174,3 +174,16 @@ ImageContent::set_video_frame_rate (float r)
signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
}
+void
+ImageContent::set_default_colour_conversion ()
+{
+ bool const s = still ();
+
+ boost::mutex::scoped_lock lm (_mutex);
+
+ if (s) {
+ _colour_conversion = PresetColourConversion::from_id ("srgb").conversion;
+ } else {
+ _colour_conversion = PresetColourConversion::from_id ("rec709").conversion;
+ }
+}
diff --git a/src/lib/image_content.h b/src/lib/image_content.h
index 38aa77bf5..83a02a166 100644
--- a/src/lib/image_content.h
+++ b/src/lib/image_content.h
@@ -44,6 +44,9 @@ public:
DCPTime full_length () const;
std::string identifier () const;
+
+ /* VideoContent */
+ void set_default_colour_conversion ();
void set_video_length (ContentTime);
bool still () const;
diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc
index 442ee703c..891ccecd8 100644
--- a/src/lib/video_content.cc
+++ b/src/lib/video_content.cc
@@ -205,8 +205,9 @@ VideoContent::as_xml (xmlpp::Node* node) const
void
VideoContent::set_default_colour_conversion ()
{
+ /* If there's no better offer we'll use Rec. 709 */
boost::mutex::scoped_lock lm (_mutex);
- _colour_conversion = ColourConversion (dcp::ColourConversion::srgb_to_xyz ());
+ _colour_conversion = PresetColourConversion::from_id ("rec709").conversion;
}
void
@@ -235,6 +236,8 @@ VideoContent::take_from_video_examiner (shared_ptr<VideoExaminer> d)
shared_ptr<const Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
LOG_GENERAL ("Video length obtained from header as %1 frames", _video_length.frames (_video_frame_rate));
+
+ set_default_colour_conversion ();
signal_changed (VideoContentProperty::VIDEO_SIZE);
signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
@@ -562,4 +565,3 @@ VideoContent::processing_description () const
return d.str ();
}
-
diff --git a/src/lib/video_content.h b/src/lib/video_content.h
index 0e9f20348..ccc61b1f9 100644
--- a/src/lib/video_content.h
+++ b/src/lib/video_content.h
@@ -53,6 +53,8 @@ public:
std::string technical_summary () const;
virtual std::string identifier () const;
+ virtual void set_default_colour_conversion ();
+
ContentTime video_length () const {
boost::mutex::scoped_lock lm (_mutex);
return _video_length;
@@ -88,7 +90,6 @@ public:
void set_scale (VideoContentScale);
void unset_colour_conversion (bool signal = true);
void set_colour_conversion (ColourConversion);
- void set_default_colour_conversion ();
void set_fade_in (ContentTime);
void set_fade_out (ContentTime);
@@ -166,6 +167,7 @@ protected:
ContentTime _video_length;
float _video_frame_rate;
+ boost::optional<ColourConversion> _colour_conversion;
private:
friend struct ffmpeg_pts_offset_test;
@@ -179,7 +181,6 @@ private:
VideoFrameType _video_frame_type;
Crop _crop;
VideoContentScale _scale;
- boost::optional<ColourConversion> _colour_conversion;
/** Sample aspect ratio obtained from the content file's header,
if there is one.
*/