Show audio bit depth in content properties (#559).
[dcpomatic.git] / src / lib / dcp_content.cc
index f8639cef9cc187f7ed2b35bc2821d955329be0e9..cdf104f0377ba3b2aee4d714effb0b2f2f1b7e24 100644 (file)
@@ -86,10 +86,6 @@ DCPContent::DCPContent (boost::filesystem::path p)
 
        read_directory (p);
        set_default_colour_conversion ();
-
-       for (int i = 0; i < static_cast<int>(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<int>(TextType::COUNT); ++i) {
-               _reference_text[i] = false;
-       }
-
        if (video && audio) {
                audio->set_stream (
                        make_shared<AudioStream> (
@@ -113,7 +105,8 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version)
                                node->optional_number_child<Frame>("AudioLength").get_value_or (
                                        video->length() * node->number_child<int>("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<int>(TextType::OPEN_SUBTITLE)] = node->optional_bool_child("ReferenceOpenSubtitle").get_value_or(false);
-               _reference_text[static_cast<int>(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<int>(TextType::OPEN_SUBTITLE)] = node->optional_bool_child("ReferenceSubtitle").get_value_or(false);
-               _reference_text[static_cast<int>(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<int>(boost::filesystem::status(i.path()).type()));
                }
        }
 }
@@ -235,7 +230,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        boost::mutex::scoped_lock lm (_mutex);
                        video = make_shared<VideoContent>(this);
                }
-               video->take_from_examiner (examiner);
+               video->take_from_examiner(film, examiner);
                set_default_colour_conversion ();
        }
 
@@ -244,7 +239,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        boost::mutex::scoped_lock lm (_mutex);
                        audio = make_shared<AudioContent>(this);
                }
-               auto as = make_shared<AudioStream>(examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels());
+               auto as = make_shared<AudioStream>(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<const Film> film, shared_ptr<Job> job)
        for (int i = 0; i < examiner->text_count(TextType::OPEN_SUBTITLE); ++i) {
                auto c = make_shared<TextContent>(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<int>(TextType::OPEN_SUBTITLE)] ? "1" : "0");
-       node->add_child("ReferenceClosedCaption")->add_child_text(_reference_text[static_cast<int>(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<int>(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<int>(type)] = r;
+               _reference_text[type] = r;
        }
 }
 
@@ -782,9 +778,7 @@ DCPContent::take_settings_from (shared_ptr<const Content> c)
 
        _reference_video = dc->_reference_video;
        _reference_audio = dc->_reference_audio;
-       for (int i = 0; i < static_cast<int>(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<TextContent> text, vector<vector<shared_ptr<Font>>> 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());
+}
+