/* Copyright (C) 2014-2022 Carl Hetherington This file is part of DCP-o-matic. DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DCP-o-matic. If not, see . */ #ifndef DCPOMATIC_DCP_CONTENT_H #define DCPOMATIC_DCP_CONTENT_H /** @file src/lib/dcp_content.h * @brief DCPContent class. */ #include "content.h" #include "enum_indexed_vector.h" #include "font.h" #include "resolution.h" #include "video_encoding.h" #include #include #include #include #include class DCPContentProperty { public: static int constexpr NEEDS_KDM = 600; static int constexpr NEEDS_ASSETS = 601; static int constexpr REFERENCE_VIDEO = 602; static int constexpr REFERENCE_AUDIO = 603; static int constexpr REFERENCE_TEXT = 604; static int constexpr NAME = 605; static int constexpr TEXTS = 606; static int constexpr CPL = 607; }; /** @class DCPContent * @brief An existing DCP used as input. */ class DCPContent : public Content { public: DCPContent(boost::filesystem::path p); DCPContent(cxml::ConstNodePtr, boost::optional film_directory, int version); std::shared_ptr shared_from_this() { return std::dynamic_pointer_cast(Content::shared_from_this()); } std::shared_ptr shared_from_this() const { return std::dynamic_pointer_cast(Content::shared_from_this()); } dcpomatic::DCPTime full_length(std::shared_ptr film) const override; dcpomatic::DCPTime approximate_length() const override; void examine(std::shared_ptr film, std::shared_ptr, bool tolerant) override; std::string summary() const override; std::string technical_summary() const override; void as_xml( xmlpp::Element* element, bool with_paths, PathBehaviour path_behaviour, boost::optional film_directory ) const override; std::string identifier() const override; void take_settings_from(std::shared_ptr c) override; void set_default_colour_conversion(); std::list reel_split_points(std::shared_ptr film) const override; std::vector directories() const; boost::filesystem::path path_for_display() const override; bool encrypted() const { boost::mutex::scoped_lock lm(_mutex); return _picture_encrypted || _sound_encrypted || _text_encrypted; } /** @return true if any picture asset in this DCP is encrypted */ bool picture_encrypted() const { boost::mutex::scoped_lock lm(_mutex); return _picture_encrypted; } /** @return true if any sound asset in this DCP is encrypted */ bool sound_encrypted() const { boost::mutex::scoped_lock lm(_mutex); return _sound_encrypted; } /** @return true if any text asset in this DCP is encrypted */ bool text_encrypted() const { boost::mutex::scoped_lock lm(_mutex); return _text_encrypted; } void add_kdm(dcp::EncryptedKDM); void add_ov(boost::filesystem::path ov); boost::optional kdm() const { return _kdm; } bool can_be_played() const override; bool needs_kdm() const; bool needs_assets() const; bool can_reference_anything(std::shared_ptr film, std::string& why_not) const; void set_reference_video(bool r); bool reference_video() const { boost::mutex::scoped_lock lm(_mutex); return _reference_video; } bool can_reference_video(std::shared_ptr film, std::string &) const; void set_reference_audio(bool r); bool reference_audio() const { boost::mutex::scoped_lock lm(_mutex); return _reference_audio; } bool can_reference_audio(std::shared_ptr film, std::string &) const; void set_reference_text(TextType type, bool r); /** @param type Original type of texts in the DCP. * @return true if these texts are to be referenced. */ bool reference_text(TextType type) const { boost::mutex::scoped_lock lm(_mutex); return _reference_text[type]; } bool can_reference_text(std::shared_ptr film, TextType type, std::string &) const; bool reference_anything() const; void set_cpl(std::string id); boost::optional cpl() const { boost::mutex::scoped_lock lm(_mutex); return _cpl; } std::string name() const { boost::mutex::scoped_lock lm(_mutex); return _name; } bool three_d() const { boost::mutex::scoped_lock lm(_mutex); return _three_d; } boost::optional content_kind() const { boost::mutex::scoped_lock lm(_mutex); return _content_kind; } dcp::Standard standard() const { boost::mutex::scoped_lock lm(_mutex); DCPOMATIC_ASSERT(_standard); return _standard.get(); } boost::optional video_encoding() const { boost::mutex::scoped_lock lm(_mutex); return _video_encoding; } std::map markers() const { return _markers; } bool kdm_timing_window_valid() const; Resolution resolution() const; std::vector ratings() const { return _ratings; } std::vector content_versions() const { return _content_versions; } int active_audio_channels() const; /** @return a guess of the DCP's audio language; if there are multiple reels, * and they have different langauges, this could be wrong. */ boost::optional audio_language() const { return _audio_language; } void check_font_ids(); boost::optional chain() const { return _chain; } boost::optional distributor() const { return _distributor; } boost::optional facility() const { return _facility; } boost::optional luminance() const { return _luminance; } std::list reels(std::shared_ptr film) const; private: friend struct reels_test5; void add_properties(std::shared_ptr film, std::list& p) const override; void read_directory(boost::filesystem::path); void read_sub_directory(boost::filesystem::path); bool overlaps(std::shared_ptr film, std::function)> part) const; std::string _name; bool _picture_encrypted; bool _sound_encrypted; bool _text_encrypted; /** true if this DCP needs more assets before it can be played */ bool _needs_assets; boost::optional _kdm; /** true if _kdm successfully decrypts the first frame of our DCP */ bool _kdm_valid; /** true if the video in this DCP should be included in the output by reference * rather than by rewrapping. */ bool _reference_video; /** true if the audio in this DCP should be included in the output by reference * rather than by rewrapping. */ bool _reference_audio; /** true if the texts in this DCP should be included in the output by reference * rather than by rewrapping. The types here are the original text types, * not what they are being used for. */ EnumIndexedVector _reference_text; boost::optional _standard; boost::optional _video_encoding; boost::optional _content_kind; bool _three_d; /** ID of the CPL to use; older metadata might not specify this: in that case * just use the only CPL. */ boost::optional _cpl; /** List of the lengths of the reels in this DCP */ std::list _reel_lengths; std::map _markers; std::vector _ratings; std::vector _content_versions; EnumIndexedVector _has_non_zero_entry_point; boost::optional _active_audio_channels; boost::optional _audio_language; boost::optional _chain; boost::optional _distributor; boost::optional _facility; boost::optional _luminance; }; #endif