X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_content.cc;h=cdf104f0377ba3b2aee4d714effb0b2f2f1b7e24;hb=f3617efde1751ac9e55f692369dc4ba3c6350ca8;hp=f8639cef9cc187f7ed2b35bc2821d955329be0e9;hpb=eeaca1992aa117fe3a2a4a079d8a20a01d88e933;p=dcpomatic.git diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index f8639cef9..cdf104f03 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -86,10 +86,6 @@ DCPContent::DCPContent (boost::filesystem::path p) read_directory (p); set_default_colour_conversion (); - - for (int i = 0; i < static_cast(TextType::COUNT); ++i) { - _reference_text[i] = false; - } } DCPContent::DCPContent (cxml::ConstNodePtr node, int version) @@ -101,10 +97,6 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version) text = TextContent::from_xml (this, node, version, notes); atmos = AtmosContent::from_xml (this, node); - for (int i = 0; i < static_cast(TextType::COUNT); ++i) { - _reference_text[i] = false; - } - if (video && audio) { audio->set_stream ( make_shared ( @@ -113,7 +105,8 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version) node->optional_number_child("AudioLength").get_value_or ( video->length() * node->number_child("AudioFrameRate") / video_frame_rate().get() ), - AudioMapping (node->node_child ("AudioMapping"), version) + AudioMapping(node->node_child("AudioMapping"), version), + 24 ) ); } @@ -128,11 +121,11 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version) _reference_video = node->optional_bool_child ("ReferenceVideo").get_value_or (false); _reference_audio = node->optional_bool_child ("ReferenceAudio").get_value_or (false); if (version >= 37) { - _reference_text[static_cast(TextType::OPEN_SUBTITLE)] = node->optional_bool_child("ReferenceOpenSubtitle").get_value_or(false); - _reference_text[static_cast(TextType::CLOSED_CAPTION)] = node->optional_bool_child("ReferenceClosedCaption").get_value_or(false); + _reference_text[TextType::OPEN_SUBTITLE] = node->optional_bool_child("ReferenceOpenSubtitle").get_value_or(false); + _reference_text[TextType::CLOSED_CAPTION] = node->optional_bool_child("ReferenceClosedCaption").get_value_or(false); } else { - _reference_text[static_cast(TextType::OPEN_SUBTITLE)] = node->optional_bool_child("ReferenceSubtitle").get_value_or(false); - _reference_text[static_cast(TextType::CLOSED_CAPTION)] = false; + _reference_text[TextType::OPEN_SUBTITLE] = node->optional_bool_child("ReferenceSubtitle").get_value_or(false); + _reference_text[TextType::CLOSED_CAPTION] = false; } if (node->optional_string_child("Standard")) { auto const s = node->optional_string_child("Standard").get(); @@ -148,7 +141,7 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version) auto ck = node->optional_string_child("ContentKind"); if (ck) { - _content_kind = dcp::content_kind_from_string (*ck); + _content_kind = dcp::ContentKind::from_name(*ck); } _cpl = node->optional_string_child("CPL"); for (auto i: node->node_children("ReelLength")) { @@ -206,6 +199,8 @@ DCPContent::read_sub_directory (boost::filesystem::path p) } else if (boost::filesystem::is_directory(i.path()) && i.path().filename() != ".AppleDouble") { LOG_GENERAL ("Inside there's directory %1", i.path().string()); read_sub_directory (i.path()); + } else { + LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast(boost::filesystem::status(i.path()).type())); } } } @@ -235,7 +230,7 @@ DCPContent::examine (shared_ptr film, shared_ptr job) boost::mutex::scoped_lock lm (_mutex); video = make_shared(this); } - video->take_from_examiner (examiner); + video->take_from_examiner(film, examiner); set_default_colour_conversion (); } @@ -244,7 +239,7 @@ DCPContent::examine (shared_ptr film, shared_ptr job) boost::mutex::scoped_lock lm (_mutex); audio = make_shared(this); } - auto as = make_shared(examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels()); + auto as = make_shared(examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels(), 24); audio->set_stream (as); auto m = as->mapping (); m.make_default (film ? film->audio_processor() : 0); @@ -268,6 +263,7 @@ DCPContent::examine (shared_ptr film, shared_ptr job) for (int i = 0; i < examiner->text_count(TextType::OPEN_SUBTITLE); ++i) { auto c = make_shared(this, TextType::OPEN_SUBTITLE, TextType::OPEN_SUBTITLE); c->set_language (examiner->open_subtitle_language()); + add_fonts_from_examiner(c, examiner->fonts()); new_text.push_back (c); } @@ -369,8 +365,8 @@ DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const node->add_child("KDMValid")->add_child_text (_kdm_valid ? "1" : "0"); node->add_child("ReferenceVideo")->add_child_text (_reference_video ? "1" : "0"); node->add_child("ReferenceAudio")->add_child_text (_reference_audio ? "1" : "0"); - node->add_child("ReferenceOpenSubtitle")->add_child_text(_reference_text[static_cast(TextType::OPEN_SUBTITLE)] ? "1" : "0"); - node->add_child("ReferenceClosedCaption")->add_child_text(_reference_text[static_cast(TextType::CLOSED_CAPTION)] ? "1" : "0"); + node->add_child("ReferenceOpenSubtitle")->add_child_text(_reference_text[TextType::OPEN_SUBTITLE] ? "1" : "0"); + node->add_child("ReferenceClosedCaption")->add_child_text(_reference_text[TextType::CLOSED_CAPTION] ? "1" : "0"); if (_standard) { switch (_standard.get ()) { case dcp::Standard::INTEROP: @@ -385,7 +381,7 @@ DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const } node->add_child("ThreeD")->add_child_text (_three_d ? "1" : "0"); if (_content_kind) { - node->add_child("ContentKind")->add_child_text(dcp::content_kind_to_string(*_content_kind)); + node->add_child("ContentKind")->add_child_text(_content_kind->name()); } if (_cpl) { node->add_child("CPL")->add_child_text (_cpl.get ()); @@ -443,8 +439,8 @@ DCPContent::identifier () const } s += string (_reference_video ? "1" : "0"); - for (int i = 0; i < static_cast(TextType::COUNT); ++i) { - s += string (_reference_text[i] ? "1" : "0"); + for (auto text: _reference_text) { + s += string(text ? "1" : "0"); } return s; } @@ -537,7 +533,7 @@ DCPContent::set_reference_text (TextType type, bool r) { boost::mutex::scoped_lock lm (_mutex); - _reference_text[static_cast(type)] = r; + _reference_text[type] = r; } } @@ -782,9 +778,7 @@ DCPContent::take_settings_from (shared_ptr c) _reference_video = dc->_reference_video; _reference_audio = dc->_reference_audio; - for (int i = 0; i < static_cast(TextType::COUNT); ++i) { - _reference_text[i] = dc->_reference_text[i]; - } + _reference_text = dc->_reference_text; } void @@ -820,3 +814,41 @@ DCPContent::resolution () const return Resolution::TWO_K; } + +void +add_fonts_from_examiner(shared_ptr text, vector>> const & all_fonts) +{ + int reel_number = 0; + for (auto reel_fonts: all_fonts) { + for (auto font: reel_fonts) { + /* Each reel could have its own font with the same ID, so we disambiguate them here + * by prepending the reel number. We do the same disambiguation when emitting the + * subtitles in the DCP decoder. + */ + font->set_id(id_for_font_in_reel(font->id(), reel_number)); + text->add_font(font); + } + ++reel_number; + } + +} + + +string +id_for_font_in_reel(string id, int reel) +{ + return String::compose("%1_%2", reel, id); +} + + +void +DCPContent::check_font_ids() +{ + if (text.empty()) { + return; + } + + DCPExaminer examiner(shared_from_this(), true); + add_fonts_from_examiner(text.front(), examiner.fonts()); +} +