X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_content.cc;h=f3c0d01cbafc792eb9356ae6b484a6e4e420a1ea;hb=e6f2a4b0085b35be378f2cdd687146857d61df80;hp=2b494dc9233259afdf2f73e30c1c015777b311ed;hpb=254b3044d72de6b033d7c584f5abd2b9aa70aad5;p=dcpomatic.git diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index 2b494dc92..f3c0d01cb 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,9 +30,11 @@ #include "filter.h" #include "film.h" #include "log.h" +#include "config.h" #include "exceptions.h" #include "frame_rate_change.h" #include "text_content.h" +#include "decrypted_ecinema_kdm.h" #include #include extern "C" { @@ -45,8 +47,6 @@ extern "C" { #include "i18n.h" -#define LOG_GENERAL(...) dcpomatic_log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); - using std::string; using std::vector; using std::list; @@ -58,14 +58,18 @@ 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) +#ifdef DCPOMATIC_VARIANT_SWAROOP , _encrypted (false) +#endif { } @@ -126,8 +130,9 @@ 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"); +#ifdef DCPOMATIC_VARIANT_SWAROOP _encrypted = node->optional_bool_child("Encrypted").get_value_or(false); +#endif } FFmpegContent::FFmpegContent (vector > c) @@ -189,7 +194,9 @@ FFmpegContent::FFmpegContent (vector > c) _color_trc = ref->_color_trc; _colorspace = ref->_colorspace; _bits_per_pixel = ref->_bits_per_pixel; +#ifdef DCPOMATIC_VARIANT_SWAROOP _encrypted = ref->_encrypted; +#endif } void @@ -249,12 +256,11 @@ 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()); - } +#ifdef DCPOMATIC_VARIANT_SWAROOP if (_encrypted) { node->add_child("Encypted")->add_child_text ("1"); } +#endif } void @@ -263,7 +269,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); @@ -309,7 +317,7 @@ FFmpegContent::examine (shared_ptr film, shared_ptr job) AudioStreamPtr as = audio->streams().front(); AudioMapping m = as->mapping (); - film->make_audio_mapping_default (m, first_path); + m.make_default (film ? film->audio_processor() : 0, first_path); as->set_mapping (m); } @@ -320,12 +328,18 @@ FFmpegContent::examine (shared_ptr film, shared_ptr job) _subtitle_stream = _subtitle_streams.front (); } +#ifdef DCPOMATIC_VARIANT_SWAROOP _encrypted = first_path.extension() == ".ecinema"; +#endif } if (examiner->has_video ()) { set_default_colour_conversion (); } + +#ifdef DCPOMATIC_VARIANT_SWAROOP + _id = examiner->id (); +#endif } string @@ -402,19 +416,39 @@ operator!= (FFmpegStream const & a, FFmpegStream const & b) DCPTime FFmpegContent::full_length (shared_ptr film) const { - FrameRateChange const frc (active_video_frame_rate(film), film->video_frame_rate()); + FrameRateChange const frc (film, shared_from_this()); if (video) { return DCPTime::from_frames (llrint (video->length_after_3d_combine() * frc.factor()), film->video_frame_rate()); } + if (audio) { + DCPTime longest; + BOOST_FOREACH (AudioStreamPtr i, audio->streams()) { + longest = max (longest, DCPTime::from_frames(llrint(i->length() / frc.speed_up), i->frame_rate())); + } + return longest; + } + + /* XXX: subtitle content? */ + + return DCPTime(); +} + +DCPTime +FFmpegContent::approximate_length () const +{ + if (video) { + return DCPTime::from_frames (video->length_after_3d_combine(), 24); + } + DCPOMATIC_ASSERT (audio); - DCPTime longest; + Frame longest = 0; BOOST_FOREACH (AudioStreamPtr i, audio->streams ()) { - longest = max (longest, DCPTime::from_frames (llrint (i->length() / frc.speed_up), i->frame_rate())); + longest = max (longest, Frame(llrint(i->length()))); } - return longest; + return DCPTime::from_frames (longest, 24); } void @@ -492,7 +526,7 @@ FFmpegContent::set_default_colour_conversion () void FFmpegContent::add_properties (shared_ptr film, list& p) const { - Content::add_properties (p); + Content::add_properties (film, p); if (video) { video->add_properties (p); @@ -668,3 +702,31 @@ FFmpegContent::take_settings_from (shared_ptr c) Content::take_settings_from (c); _filters = fc->_filters; } + +#ifdef DCPOMATIC_VARIANT_SWAROOP +void +FFmpegContent::add_kdm (EncryptedECinemaKDM kdm) +{ + ChangeSignaller cc (this, FFmpegContentProperty::KDM); + boost::mutex::scoped_lock lm (_mutex); + _kdm = kdm; + +} + +bool +FFmpegContent::kdm_timing_window_valid () const +{ + if (!_kdm) { + return true; + } + + DCPOMATIC_ASSERT (Config::instance()->decryption_chain()->key()); + + DecryptedECinemaKDM decrypted (*_kdm, *Config::instance()->decryption_chain()->key()); + + dcp::LocalTime now; + return (!decrypted.not_valid_before() || *decrypted.not_valid_before() < now) && + (!decrypted.not_valid_after() || now < *decrypted.not_valid_after()); +} + +#endif