/* 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 _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 (); } VideoEncoding 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(); 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; /** true if our DCP is encrypted */ bool _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; VideoEncoding _video_encoding = VideoEncoding::JPEG2000; 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; }; #endif