+2015-05-25 Carl Hetherington <cth@carlh.net>
+
+ * Try to set up useful default colour conversions
+ depending on the type and resolution of content (#565).
+
2015-05-23 Carl Hetherington <cth@carlh.net>
* Fix failure to import some video MXFs (#566).
-823dc6064795fd128bcb2f0229202d507e289324
994df155c9d1f6256cdcf51c355a74ebad24288b
ccb883a479cb341c686fc4237763f483d15e1ec5
8e5f3e2d989a119f41ba4c69434545c0929e92e0
}
-PresetColourConversion::PresetColourConversion (string n, dcp::ColourConversion conversion_)
+PresetColourConversion::PresetColourConversion (string n, string i, dcp::ColourConversion conversion_)
: conversion (conversion_)
, name (n)
+ , id (i)
{
}
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);
+}
+
{
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:
{
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;
+ }
+}
+
+
DCPTime full_length () const;
std::string identifier () const;
+
+ /* VideoContent */
+ void set_default_colour_conversion ();
/* AudioContent */
int audio_channels () const;
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;
+ }
+}
DCPTime full_length () const;
std::string identifier () const;
+
+ /* VideoContent */
+ void set_default_colour_conversion ();
void set_video_length (ContentTime);
bool still () 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
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);
return d.str ();
}
-
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;
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);
ContentTime _video_length;
float _video_frame_rate;
+ boost::optional<ColourConversion> _colour_conversion;
private:
friend struct ffmpeg_pts_offset_test;
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.
*/