/* 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 #include #include #include class DCPContentProperty { public: static int const NEEDS_KDM; static int const NEEDS_ASSETS; static int const REFERENCE_VIDEO; static int const REFERENCE_AUDIO; static int const REFERENCE_TEXT; static int const NAME; static int const TEXTS; static int const CPL; }; /** @class DCPContent * @brief An existing DCP used as input. */ class DCPContent : public Content { public: DCPContent (boost::filesystem::path p); DCPContent (cxml::ConstNodePtr, 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) override; std::string summary () const override; std::string technical_summary () const override; void as_xml (xmlpp::Node *, bool with_paths) 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; 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; 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; 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 (); } 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; void check_font_ids(); 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); std::list reels (std::shared_ptr film) const; bool can_reference ( std::shared_ptr film, std::function )>, std::string overlapping, std::string& why_not ) 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; 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; boost::optional _active_audio_channels; }; extern std::string id_for_font_in_reel(std::string id, int reel); extern void add_fonts_from_examiner(std::shared_ptr text, std::vector>> const& fonts); #endif