X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Ffilm.h;h=e2e88e2c9fe294569c40b165e88f51e7e68a68dd;hb=21ebc2365dd7a66c05d130dc87861f7399ae834b;hp=babc14a295c2d75cba261cf56c1dd2120ccdb03a;hpb=cc279961a2a9ffea67ed21378fef44c2e1bcb202;p=dcpomatic.git diff --git a/src/lib/film.h b/src/lib/film.h index babc14a29..e2e88e2c9 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -32,18 +32,23 @@ #include "change_signaller.h" #include "dcp_text_track.h" #include "dcpomatic_time.h" +#include "enum_indexed_vector.h" +#include "film_property.h" #include "frame_rate_change.h" #include "named_channel.h" #include "resolution.h" #include "signaller.h" +#include "territory_type.h" #include "transcode_job.h" #include "types.h" #include "util.h" +#include "video_encoding.h" #include #include #include #include #include +#include #include #include #include @@ -61,19 +66,21 @@ namespace dcpomatic { class Screen; } +class AudioContent; +class AudioProcessor; +class Content; class DCPContentType; +class Film; +class Job; class Log; -class Content; class Playlist; -class AudioContent; -class AudioProcessor; class Ratio; -class Job; -class Film; +struct atmos_encrypted_passthrough_test; struct isdcf_name_test; struct isdcf_name_with_atmos; +struct isdcf_name_with_ccap; +struct ov_subs_in_vf_name; struct recover_test_2d_encrypted; -struct atmos_encrypted_passthrough_test; class InfoFileHandle @@ -167,16 +174,7 @@ public: FrameRateChange active_frame_rate_change (dcpomatic::DCPTime) const; std::pair speed_up_range (int dcp_frame_rate) const; - dcp::EncryptedKDM make_kdm ( - dcp::Certificate recipient, - std::vector trusted_devices, - boost::filesystem::path cpl_file, - dcp::LocalTime from, - dcp::LocalTime until, - dcp::Formulation formulation, - bool disable_forensic_marking_picture, - boost::optional disable_forensic_marking_audio - ) const; + dcp::DecryptedKDM make_kdm(boost::filesystem::path cpl_file, dcp::LocalTime from, dcp::LocalTime until) const; int state_version () const { return _state_version; @@ -190,15 +188,19 @@ public: return _playlist; } - std::list reels () const; + std::vector reels() const; std::list mapped_audio_channels () const; boost::optional audio_language () const { return _audio_language; } - /** @return pair containing the main subtitle language, and additional languages */ - std::pair, std::vector> subtitle_languages () const; + /** @param burnt_in If non-null, filled with true if all subtitles are burnt in, otherwise false. + * @return pair containing the main subtitle language, and additional languages + */ + std::pair, std::vector> subtitle_languages(bool* burnt_in = nullptr) const; + /** @return all closed caption languages in the film */ + std::vector closed_caption_languages() const; std::string content_summary (dcpomatic::DCPTimePeriod period) const; @@ -216,54 +218,6 @@ public: bool last_written_by_earlier_than(int major, int minor, int micro) const; - /** Identifiers for the parts of our state; - used for signalling changes. - */ - enum class Property { - NONE, - NAME, - USE_ISDCF_NAME, - /** The playlist's content list has changed (i.e. content has been added or removed) */ - CONTENT, - /** The order of content in the playlist has changed */ - CONTENT_ORDER, - DCP_CONTENT_TYPE, - CONTAINER, - RESOLUTION, - ENCRYPTED, - J2K_BANDWIDTH, - VIDEO_FRAME_RATE, - AUDIO_FRAME_RATE, - AUDIO_CHANNELS, - /** The setting of _three_d has changed */ - THREE_D, - SEQUENCE, - INTEROP, - AUDIO_PROCESSOR, - REEL_TYPE, - REEL_LENGTH, - REENCODE_J2K, - MARKERS, - RATINGS, - CONTENT_VERSIONS, - NAME_LANGUAGE, - AUDIO_LANGUAGE, - RELEASE_TERRITORY, - SIGN_LANGUAGE_VIDEO_LANGUAGE, - VERSION_NUMBER, - STATUS, - CHAIN, - DISTRIBUTOR, - FACILITY, - STUDIO, - TEMP_VERSION, - PRE_RELEASE, - RED_BAND, - TWO_D_VERSION_OF_THREE_D, - LUMINANCE, - }; - - /* GET */ boost::optional directory () const { @@ -298,8 +252,8 @@ public: return _key; } - int j2k_bandwidth () const { - return _j2k_bandwidth; + int video_bit_rate(VideoEncoding encoding) const { + return _video_bit_rate[encoding]; } /** @return The frame rate of the DCP */ @@ -323,6 +277,14 @@ public: return _interop; } + VideoEncoding video_encoding() const { + return _video_encoding; + } + + bool limit_to_smpte_bv20() const { + return _limit_to_smpte_bv20; + } + AudioProcessor const * audio_processor () const { return _audio_processor; } @@ -335,6 +297,10 @@ public: return _reel_length; } + std::vector custom_reel_boundaries() const { + return _custom_reel_boundaries; + } + std::string context_id () const { return _context_id; } @@ -362,6 +328,10 @@ public: return _name_language; } + TerritoryType territory_type() const { + return _territory_type; + } + boost::optional release_territory () const { return _release_territory; } @@ -437,16 +407,19 @@ public: void set_container (Ratio const *, bool user_explicit = true); void set_resolution (Resolution, bool user_explicit = true); void set_encrypted (bool); - void set_j2k_bandwidth (int); + void set_video_bit_rate(VideoEncoding encoding, int64_t); void set_video_frame_rate (int rate, bool user_explicit = false); void set_audio_channels (int); void set_three_d (bool); void set_isdcf_date_today (); void set_sequence (bool); void set_interop (bool); + void set_video_encoding(VideoEncoding encoding); + void set_limit_to_smpte_bv20(bool); void set_audio_processor (AudioProcessor const * processor); void set_reel_type (ReelType); void set_reel_length (int64_t); + void set_custom_reel_boundaries(std::vector boundaries); void set_reencode_j2k (bool); void set_marker (dcp::Marker type, dcpomatic::DCPTime time); void unset_marker (dcp::Marker type); @@ -454,6 +427,7 @@ public: void set_ratings (std::vector r); void set_content_versions (std::vector v); void set_name_language (dcp::LanguageTag lang); + void set_territory_type(TerritoryType type); void set_release_territory (boost::optional region = boost::none); void set_sign_language_video_language (boost::optional tag); void set_version_number (int v); @@ -472,8 +446,12 @@ public: void add_ffoc_lfoc (Markers& markers) const; + void set_ui_state(std::string key, std::string value); + boost::optional ui_state(std::string key) const; + void read_ui_state(); + /** Emitted when some property has of the Film is about to change or has changed */ - mutable boost::signals2::signal Change; + mutable boost::signals2::signal Change; /** Emitted when some property of our content has changed */ mutable boost::signals2::signal, int, bool)> ContentChange; @@ -495,13 +473,15 @@ private: friend struct ::isdcf_name_test; friend struct ::isdcf_name_with_atmos; + friend struct ::isdcf_name_with_ccap; friend struct ::recover_test_2d_encrypted; friend struct ::atmos_encrypted_passthrough_test; - template friend class ChangeSignaller; + friend struct ::ov_subs_in_vf_name; + template friend class ChangeSignalDespatcher; boost::filesystem::path info_file (dcpomatic::DCPTimePeriod p) const; - void signal_change (ChangeType, Property); + void signal_change (ChangeType, FilmProperty); void signal_change (ChangeType, int); std::string video_identifier () const; void playlist_change (ChangeType); @@ -513,6 +493,7 @@ private: void check_settings_consistency (); void maybe_set_container_and_resolution (); void set_dirty (bool dirty); + void write_ui_state() const; /** Log to write to */ std::shared_ptr _log; @@ -541,8 +522,8 @@ private: * re-start picture MXF encodes. */ std::string _context_id; - /** bandwidth for J2K files in bits per second */ - int _j2k_bandwidth; + /** bit rate for encoding video using in bits per second */ + EnumIndexedVector _video_bit_rate; /** Frames per second to run our DCP at */ int _video_frame_rate; /** The date that we should use in a ISDCF name */ @@ -555,10 +536,14 @@ private: bool _three_d; bool _sequence; bool _interop; + VideoEncoding _video_encoding; + bool _limit_to_smpte_bv20; AudioProcessor const * _audio_processor; ReelType _reel_type; - /** Desired reel length in bytes, if _reel_type == REELTYPE_BY_LENGTH */ + /** Desired reel length in bytes, if _reel_type == BY_LENGTH */ int64_t _reel_length; + /** Reel boundaries (excluding those at the start and end, sorted in ascending order) if _reel_type == CUSTOM */ + std::vector _custom_reel_boundaries; bool _reencode_j2k; /** true if the user has ever explicitly set the video frame rate of this film */ bool _user_explicit_video_frame_rate; @@ -568,6 +553,7 @@ private: std::vector _ratings; std::vector _content_versions; dcp::LanguageTag _name_language; + TerritoryType _territory_type = TerritoryType::SPECIFIC; boost::optional _release_territory; boost::optional _sign_language_video_language; int _version_number; @@ -596,6 +582,8 @@ private: */ bool _tolerant; + std::map _ui_state; + mutable boost::mutex _info_file_mutex; boost::signals2::scoped_connection _playlist_change_connection; @@ -610,7 +598,7 @@ private: }; -typedef ChangeSignaller FilmChangeSignaller; +typedef ChangeSignaller FilmChangeSignaller; #endif