diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-05-25 02:48:32 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-05-25 02:48:32 +0100 |
| commit | 8167d04e4dde6297ad936dca5dc691818a4dae41 (patch) | |
| tree | 37aac64d82949ac0086d40259ccd06e35e728597 /src/lib | |
| parent | d8b6ee12af54a37433e96238bdca29171d6e0eb6 (diff) | |
11b5bf6229b8713dffde89a777cd5181335136f6 from master; default colour conversions depending on type and resolution
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/colour_conversion.cc | 24 | ||||
| -rw-r--r-- | src/lib/colour_conversion.h | 8 | ||||
| -rw-r--r-- | src/lib/ffmpeg_content.cc | 16 | ||||
| -rw-r--r-- | src/lib/ffmpeg_content.h | 3 | ||||
| -rw-r--r-- | src/lib/image_content.cc | 13 | ||||
| -rw-r--r-- | src/lib/image_content.h | 3 | ||||
| -rw-r--r-- | src/lib/video_content.cc | 6 | ||||
| -rw-r--r-- | src/lib/video_content.h | 5 |
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. */ |
