X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_examiner.cc;h=8866ba7219aa4ee00b2783f7466f1f66f13d45b5;hb=f06c5136e7d3cd0a8e1814763c7774859998efe4;hp=b2034890b04eab8e58cc52824fd359143bce09e6;hpb=df28b0e939bd0f12ae31e6f7ba94fa954496b3b8;p=dcpomatic.git diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc index b2034890b..8866ba721 100644 --- a/src/lib/dcp_examiner.cc +++ b/src/lib/dcp_examiner.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -35,7 +35,11 @@ #include #include #include +#include +#include +#include #include +#include #include #include #include @@ -48,11 +52,12 @@ using std::runtime_error; using boost::shared_ptr; using boost::dynamic_pointer_cast; -DCPExaminer::DCPExaminer (shared_ptr content) - : DCP (content) +DCPExaminer::DCPExaminer (shared_ptr content, bool tolerant) + : DCP (content, tolerant) , _video_length (0) , _audio_length (0) - , _has_subtitles (false) + , _has_video (false) + , _has_audio (false) , _encrypted (false) , _needs_assets (false) , _kdm_valid (false) @@ -60,6 +65,10 @@ DCPExaminer::DCPExaminer (shared_ptr content) { shared_ptr cpl; + for (int i = 0; i < TEXT_COUNT; ++i) { + _text_count[i] = 0; + } + if (content->cpl ()) { /* Use the CPL that the content was using before */ BOOST_FOREACH (shared_ptr i, cpls()) { @@ -99,6 +108,7 @@ DCPExaminer::DCPExaminer (shared_ptr content) _cpl = cpl->id (); _name = cpl->content_title_text (); + _content_kind = cpl->content_kind (); BOOST_FOREACH (shared_ptr i, cpl->reels()) { @@ -117,6 +127,7 @@ DCPExaminer::DCPExaminer (shared_ptr content) throw DCPError (_("Mismatched frame rates in DCP")); } + _has_video = true; shared_ptr asset = i->main_picture()->asset (); if (!_video_size) { _video_size = asset->size (); @@ -124,7 +135,7 @@ DCPExaminer::DCPExaminer (shared_ptr content) throw DCPError (_("Mismatched video sizes in DCP")); } - _video_length += i->main_picture()->duration(); + _video_length += i->main_picture()->actual_duration(); } if (i->main_sound ()) { @@ -134,6 +145,7 @@ DCPExaminer::DCPExaminer (shared_ptr content) return; } + _has_audio = true; shared_ptr asset = i->main_sound()->asset (); if (!_audio_channels) { @@ -148,7 +160,7 @@ DCPExaminer::DCPExaminer (shared_ptr content) throw DCPError (_("Mismatched audio sample rates in DCP")); } - _audio_length += i->main_sound()->duration(); + _audio_length += i->main_sound()->actual_duration(); } if (i->main_subtitle ()) { @@ -158,19 +170,39 @@ DCPExaminer::DCPExaminer (shared_ptr content) return; } - _has_subtitles = true; + _text_count[TEXT_OPEN_SUBTITLE] = 1; + } + + BOOST_FOREACH (shared_ptr j, i->closed_captions()) { + if (!j->asset_ref().resolved()) { + /* We are missing this asset so we can't continue; examination will be repeated later */ + _needs_assets = true; + return; + } + + _text_count[TEXT_CLOSED_CAPTION]++; + } + + if (i->main_picture()) { + _reel_lengths.push_back (i->main_picture()->actual_duration()); + } else if (i->main_sound()) { + _reel_lengths.push_back (i->main_sound()->actual_duration()); + } else if (i->main_subtitle()) { + _reel_lengths.push_back (i->main_subtitle()->actual_duration()); + } else if (!i->closed_captions().empty()) { + _reel_lengths.push_back (i->closed_captions().front()->actual_duration()); } } _encrypted = cpl->encrypted (); _kdm_valid = true; - /* Check that we can read the first picture frame */ + /* Check that we can read the first picture, sound and subtitle frames of each reel */ try { - if (!cpl->reels().empty ()) { - shared_ptr asset = cpl->reels().front()->main_picture()->asset (); - shared_ptr mono = dynamic_pointer_cast (asset); - shared_ptr stereo = dynamic_pointer_cast (asset); + BOOST_FOREACH (shared_ptr i, cpl->reels()) { + shared_ptr pic = i->main_picture()->asset (); + shared_ptr mono = dynamic_pointer_cast (pic); + shared_ptr stereo = dynamic_pointer_cast (pic); if (mono) { mono->start_read()->get_frame(0)->xyz_image (); @@ -178,13 +210,19 @@ DCPExaminer::DCPExaminer (shared_ptr content) stereo->start_read()->get_frame(0)->xyz_image (dcp::EYE_LEFT); } + if (i->main_sound()) { + shared_ptr sound = i->main_sound()->asset (); + i->main_sound()->asset()->start_read()->get_frame(0); + } + + if (i->main_subtitle()) { + i->main_subtitle()->asset()->subtitles (); + } } } catch (dcp::DCPReadError& e) { _kdm_valid = false; - if (_encrypted && content->kdm ()) { - /* XXX: maybe don't use an exception for this */ - throw runtime_error (_("The KDM does not decrypt the DCP. Perhaps it is targeted at the wrong CPL.")); - } + } catch (dcp::MiscError& e) { + _kdm_valid = false; } DCPOMATIC_ASSERT (cpl->standard ());