X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=64da0b1af0b71d2f8e8d6909655a8ed08a896e41;hb=249ae25148213a2ab5d76980133182e7f2521524;hp=60c777b3c3d9f6107386525fa211630c14906afc;hpb=422be0eece2bf6ee80db1d3c21553cd82efff789;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index 60c777b3c..64da0b1af 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -32,9 +32,8 @@ #include "log.h" #include "exceptions.h" #include "frame_rate_change.h" -#include "raw_convert.h" #include "subtitle_content.h" -#include +#include #include extern "C" { #include @@ -58,6 +57,7 @@ using std::max; using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; +using dcp::raw_convert; int const FFmpegContentProperty::SUBTITLE_STREAMS = 100; int const FFmpegContentProperty::SUBTITLE_STREAM = 101; @@ -181,10 +181,10 @@ FFmpegContent::FFmpegContent (shared_ptr film, vectoradd_child("Type")->add_child_text ("FFmpeg"); - Content::as_xml (node); + Content::as_xml (node, with_paths); if (video) { video->as_xml (node); @@ -222,10 +222,10 @@ FFmpegContent::as_xml (xmlpp::Node* node) const node->add_child("FirstVideo")->add_child_text (raw_convert (_first_video.get().get())); } - node->add_child("ColorRange")->add_child_text (raw_convert (_color_range)); - node->add_child("ColorPrimaries")->add_child_text (raw_convert (_color_primaries)); - node->add_child("ColorTransferCharacteristic")->add_child_text (raw_convert (_color_trc)); - node->add_child("Colorspace")->add_child_text (raw_convert (_colorspace)); + node->add_child("ColorRange")->add_child_text (raw_convert (static_cast (_color_range))); + node->add_child("ColorPrimaries")->add_child_text (raw_convert (static_cast (_color_primaries))); + node->add_child("ColorTransferCharacteristic")->add_child_text (raw_convert (static_cast (_color_trc))); + node->add_child("Colorspace")->add_child_text (raw_convert (static_cast (_colorspace))); if (_bits_per_pixel) { node->add_child("BitsPerPixel")->add_child_text (raw_convert (_bits_per_pixel.get ())); } @@ -243,7 +243,6 @@ FFmpegContent::examine (shared_ptr job) if (examiner->has_video ()) { video.reset (new VideoContent (this)); video->take_from_examiner (examiner); - set_default_colour_conversion (); } boost::filesystem::path first_path = path (0); @@ -281,6 +280,10 @@ FFmpegContent::examine (shared_ptr job) } + if (examiner->has_video ()) { + set_default_colour_conversion (); + } + signal_changed (FFmpegContentProperty::SUBTITLE_STREAMS); signal_changed (FFmpegContentProperty::SUBTITLE_STREAM); } @@ -388,51 +391,27 @@ FFmpegContent::set_filters (vector const & filters) string FFmpegContent::identifier () const { - locked_stringstream s; - - s << Content::identifier(); + string s = Content::identifier(); if (video) { - s << "_" << video->identifier(); + s += "_" + video->identifier(); } - if (subtitle) { - s << "_" << subtitle->identifier(); + if (subtitle && subtitle->use() && subtitle->burn()) { + s += "_" + subtitle->identifier(); } boost::mutex::scoped_lock lm (_mutex); if (_subtitle_stream) { - s << "_" << _subtitle_stream->identifier (); + s += "_" + _subtitle_stream->identifier (); } for (vector::const_iterator i = _filters.begin(); i != _filters.end(); ++i) { - s << "_" << (*i)->id (); - } - - return s.str (); -} - -list -FFmpegContent::image_subtitles_during (ContentTimePeriod period, bool starting) const -{ - shared_ptr stream = subtitle_stream (); - if (!stream) { - return list (); - } - - return stream->image_subtitles_during (period, starting); -} - -list -FFmpegContent::text_subtitles_during (ContentTimePeriod period, bool starting) const -{ - shared_ptr stream = subtitle_stream (); - if (!stream) { - return list (); + s += "_" + (*i)->id (); } - return stream->text_subtitles_during (period, starting); + return s; } void @@ -444,10 +423,29 @@ FFmpegContent::set_default_colour_conversion () boost::mutex::scoped_lock lm (_mutex); - if (s.width < 1080) { - video->set_colour_conversion (PresetColourConversion::from_id ("rec601").conversion); - } else { + switch (_colorspace) { + case AVCOL_SPC_RGB: + video->set_colour_conversion (PresetColourConversion::from_id ("srgb").conversion); + break; + case AVCOL_SPC_BT709: video->set_colour_conversion (PresetColourConversion::from_id ("rec709").conversion); + break; + case AVCOL_SPC_BT470BG: + case AVCOL_SPC_SMPTE170M: + case AVCOL_SPC_SMPTE240M: + video->set_colour_conversion (PresetColourConversion::from_id ("rec601").conversion); + break; + case AVCOL_SPC_BT2020_CL: + case AVCOL_SPC_BT2020_NCL: + video->set_colour_conversion (PresetColourConversion::from_id ("rec2020").conversion); + break; + default: + if (s.width < 1080) { + video->set_colour_conversion (PresetColourConversion::from_id ("rec601").conversion); + } else { + video->set_colour_conversion (PresetColourConversion::from_id ("rec709").conversion); + } + break; } } @@ -519,10 +517,12 @@ FFmpegContent::add_properties (list& p) const _("SMPTE 240M"), _("Film"), _("BT2020"), - _("SMPTE ST 428-1 (CIE 1931 XYZ)") + _("SMPTE ST 428-1 (CIE 1931 XYZ)"), + _("SMPTE ST 431-2 (2011)"), + _("SMPTE ST 432-1 D65 (2010)") }; - DCPOMATIC_ASSERT (AVCOL_PRI_NB <= 11); + DCPOMATIC_ASSERT (AVCOL_PRI_NB <= 13); p.push_back (UserProperty (UserProperty::VIDEO, _("Colour primaries"), primaries[_color_primaries])); char const * transfers[] = { @@ -562,13 +562,14 @@ FFmpegContent::add_properties (list& p) const _("YCOCG"), _("BT2020 non-constant luminance"), _("BT2020 constant luminance"), + _("SMPTE 2085, Y'D'zD'x"), }; - DCPOMATIC_ASSERT (AVCOL_SPC_NB == 11); + DCPOMATIC_ASSERT (AVCOL_SPC_NB == 12); p.push_back (UserProperty (UserProperty::VIDEO, _("Colourspace"), spaces[_colorspace])); if (_bits_per_pixel) { - p.push_back (UserProperty (UserProperty::VIDEO, _("Bits per pixel"), raw_convert (_bits_per_pixel.get ()))); + p.push_back (UserProperty (UserProperty::VIDEO, _("Bits per pixel"), _bits_per_pixel.get ())); } } @@ -601,3 +602,12 @@ FFmpegContent::ffmpeg_audio_streams () const return fa; } + +void +FFmpegContent::take_settings_from (shared_ptr c) +{ + Content::take_settings_from (c); + + shared_ptr fc = dynamic_pointer_cast (c); + _filters = fc->_filters; +}