X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=ac62ac7f44870e6b979ced49e8bfa6f82e69cc16;hb=a332bd6be323f03dad5b180fb237afe54f1bf81e;hp=a3a1cfb0fd491da77b0b2ac23b6964fb75983309;hpb=5c91ae09c613348a6e2f576cb0eb5cc1ee467235;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index a3a1cfb0f..ac62ac7f4 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2016 Carl Hetherington + Copyright (C) 2013-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -30,6 +30,7 @@ #include "filter.h" #include "film.h" #include "log.h" +#include "config.h" #include "exceptions.h" #include "frame_rate_change.h" #include "text_content.h" @@ -56,14 +57,15 @@ using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; using dcp::raw_convert; +using namespace dcpomatic; int const FFmpegContentProperty::SUBTITLE_STREAMS = 100; int const FFmpegContentProperty::SUBTITLE_STREAM = 101; int const FFmpegContentProperty::FILTERS = 102; +int const FFmpegContentProperty::KDM = 103; FFmpegContent::FFmpegContent (boost::filesystem::path p) : Content (p) - , _encrypted (false) { } @@ -124,8 +126,6 @@ FFmpegContent::FFmpegContent (cxml::ConstNodePtr node, int version, list _color_trc = get_optional_enum(node, "ColorTransferCharacteristic"); _colorspace = get_optional_enum(node, "Colorspace"); _bits_per_pixel = node->optional_number_child ("BitsPerPixel"); - _decryption_key = node->optional_string_child ("DecryptionKey"); - _encrypted = node->optional_bool_child("Encrypted").get_value_or(false); } FFmpegContent::FFmpegContent (vector > c) @@ -187,7 +187,6 @@ FFmpegContent::FFmpegContent (vector > c) _color_trc = ref->_color_trc; _colorspace = ref->_colorspace; _bits_per_pixel = ref->_bits_per_pixel; - _encrypted = ref->_encrypted; } void @@ -247,12 +246,6 @@ FFmpegContent::as_xml (xmlpp::Node* node, bool with_paths) const if (_bits_per_pixel) { node->add_child("BitsPerPixel")->add_child_text (raw_convert (*_bits_per_pixel)); } - if (_decryption_key) { - node->add_child("DecryptionKey")->add_child_text (_decryption_key.get()); - } - if (_encrypted) { - node->add_child("Encypted")->add_child_text ("1"); - } } void @@ -261,7 +254,9 @@ FFmpegContent::examine (shared_ptr film, shared_ptr job) ChangeSignaller cc1 (this, FFmpegContentProperty::SUBTITLE_STREAMS); ChangeSignaller cc2 (this, FFmpegContentProperty::SUBTITLE_STREAM); - job->set_progress_unknown (); + if (job) { + job->set_progress_unknown (); + } Content::examine (film, job); @@ -317,13 +312,19 @@ FFmpegContent::examine (shared_ptr film, shared_ptr job) text.push_back (shared_ptr (new TextContent (this, TEXT_OPEN_SUBTITLE, TEXT_UNKNOWN))); _subtitle_stream = _subtitle_streams.front (); } - - _encrypted = first_path.extension() == ".ecinema"; } if (examiner->has_video ()) { set_default_colour_conversion (); } + + if (examiner->has_video() && examiner->pulldown() && video_frame_rate() && fabs(*video_frame_rate() - 29.97) < 0.001) { + /* FFmpeg has detected this file as 29.97 and the examiner thinks it is using "soft" 2:3 pulldown (telecine). + * This means we can treat it as a 23.976fps file. + */ + set_video_frame_rate (24000.0 / 1001); + video->set_length (video->length() * 24.0 / 30); + } } string @@ -516,8 +517,10 @@ FFmpegContent::add_properties (shared_ptr film, list& video->add_properties (p); if (_bits_per_pixel) { - int const sub = 219 * pow (2, _bits_per_pixel.get() - 8); - int const total = pow (2, _bits_per_pixel.get()); + /* Assuming there's three components, so bits per pixel component is _bits_per_pixel / 3 */ + int const lim_start = pow(2, _bits_per_pixel.get() / 3 - 4); + int const lim_end = 235 * pow(2, _bits_per_pixel.get() / 3 - 8); + int const total = pow(2, _bits_per_pixel.get() / 3); switch (_color_range.get_value_or(AVCOL_RANGE_UNSPECIFIED)) { case AVCOL_RANGE_UNSPECIFIED: @@ -530,7 +533,7 @@ FFmpegContent::add_properties (shared_ptr film, list& /// file is limited, so that not all possible values are valid. p.push_back ( UserProperty ( - UserProperty::VIDEO, _("Colour range"), String::compose (_("Limited (%1-%2)"), (total - sub) / 2, (total + sub) / 2) + UserProperty::VIDEO, _("Colour range"), String::compose(_("Limited (%1-%2)"), lim_start, lim_end) ) ); break; @@ -686,3 +689,4 @@ FFmpegContent::take_settings_from (shared_ptr c) Content::take_settings_from (c); _filters = fc->_filters; } +