X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Ffilm.h;h=8aeae8e4ed37ed97b3022e188d518f1027ed3f4b;hb=3c5bd6d80f4f7b535cfe4630136f1f561d6427e4;hp=6b50bba5e9759a2ffd39e83dce4f988863bb3451;hpb=a6696b9a58c14d81f0ae30482051c2cd47a004db;p=dcpomatic.git diff --git a/src/lib/film.h b/src/lib/film.h index 6b50bba5e..8aeae8e4e 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -18,24 +18,34 @@ */ + /** @file src/film.h * @brief A representation of some audio and video content, and details of * how they should be presented in a DCP. */ + #ifndef DCPOMATIC_FILM_H #define DCPOMATIC_FILM_H + #include "change_signaller.h" #include "dcp_text_track.h" +#include "dcpomatic_time.h" +#include "film_property.h" #include "frame_rate_change.h" -#include "isdcf_metadata.h" +#include "named_channel.h" +#include "resolution.h" #include "signaller.h" +#include "transcode_job.h" #include "types.h" #include "util.h" #include +#include #include #include +#include +#include #include #include #include @@ -44,6 +54,7 @@ #include #include + namespace xmlpp { class Document; } @@ -62,20 +73,18 @@ class Ratio; class Job; class Film; struct isdcf_name_test; +struct isdcf_name_with_atmos; +struct isdcf_name_with_ccap; struct recover_test_2d_encrypted; struct atmos_encrypted_passthrough_test; + class InfoFileHandle { public: InfoFileHandle (boost::mutex& mutex, boost::filesystem::path file, bool read); - ~InfoFileHandle (); - FILE* get () const { - return _handle; - } - - boost::filesystem::path file () const { + dcp::File& get () { return _file; } @@ -83,10 +92,10 @@ private: friend class Film; boost::mutex::scoped_lock _lock; - FILE* _handle; - boost::filesystem::path _file; + dcp::File _file; }; + /** @class Film * * @brief A representation of some audio, video, subtitle and closed-caption content, @@ -94,12 +103,15 @@ private: * * The content of a Film is held in a Playlist (created and managed by the Film). */ -class Film : public std::enable_shared_from_this, public Signaller, public boost::noncopyable +class Film : public std::enable_shared_from_this, public Signaller { public: explicit Film (boost::optional dir); ~Film (); + Film (Film const&) = delete; + Film& operator= (Film const&) = delete; + std::shared_ptr info_file_handle (dcpomatic::DCPTimePeriod period, bool read) const; boost::filesystem::path j2c_path (int, Frame, Eyes, bool) const; boost::filesystem::path internal_video_asset_dir () const; @@ -109,7 +121,6 @@ public: boost::filesystem::path subtitle_analysis_path (std::shared_ptr) const; void send_dcp_to_tms (); - void make_dcp (bool gui = false, bool check = true); /** @return Logger. * It is safe to call this from any thread. @@ -123,7 +134,7 @@ public: void use_template (std::string name); std::list read_metadata (boost::optional path = boost::optional ()); - void write_metadata () const; + void write_metadata (); void write_metadata (boost::filesystem::path path) const; void write_template (boost::filesystem::path path) const; std::shared_ptr metadata (bool with_content_paths = true) const; @@ -144,13 +155,13 @@ public: std::vector cpls () const; - int audio_frame_rate () const; - std::list closed_caption_tracks () const; uint64_t required_disk_space () const; bool should_be_enough_disk_space (double& required, double& available, bool& can_hard_link) const; + bool has_sign_language_video_channel () const; + /* Proxies for some Playlist methods */ ContentList content () const; @@ -159,16 +170,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; @@ -184,8 +186,15 @@ public: std::list reels () const; std::list mapped_audio_channels () const; - std::vector audio_languages () 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; + /** @return all closed caption languages in the film */ + std::vector closed_caption_languages() const; std::string content_summary (dcpomatic::DCPTimePeriod period) const; @@ -201,47 +210,7 @@ public: return _tolerant; } - /** 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, - ISDCF_METADATA, - VIDEO_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, - VERSION_NUMBER, - STATUS, - CHAIN, - DISTRIBUTOR, - FACILITY, - LUMINANCE, - }; - + bool last_written_by_earlier_than(int major, int minor, int micro) const; /* GET */ @@ -281,10 +250,6 @@ public: return _j2k_bandwidth; } - ISDCFMetadata isdcf_metadata () const { - return _isdcf_metadata; - } - /** @return The frame rate of the DCP */ int video_frame_rate () const { return _video_frame_rate; @@ -306,6 +271,10 @@ public: return _interop; } + bool limit_to_smpte_bv20() const { + return _limit_to_smpte_bv20; + } + AudioProcessor const * audio_processor () const { return _audio_processor; } @@ -345,14 +314,14 @@ public: return _name_language; } - dcp::LanguageTag audio_language () const { - return _audio_language; - } - boost::optional release_territory () const { return _release_territory; } + boost::optional sign_language_video_language () const { + return _sign_language_video_language; + } + int version_number () const { return _version_number; } @@ -373,10 +342,38 @@ public: return _facility; } + boost::optional studio () const { + return _studio; + } + + bool temp_version () const { + return _temp_version; + } + + bool pre_release () const { + return _pre_release; + } + + bool red_band () const { + return _red_band; + } + + bool two_d_version_of_three_d () const { + return _two_d_version_of_three_d; + } + boost::optional luminance () const { return _luminance; } + boost::gregorian::date isdcf_date () const { + return _isdcf_date; + } + + int audio_frame_rate () const { + return _audio_frame_rate; + } + /* SET */ void set_directory (boost::filesystem::path); @@ -393,13 +390,13 @@ public: void set_resolution (Resolution, bool user_explicit = true); void set_encrypted (bool); void set_j2k_bandwidth (int); - void set_isdcf_metadata (ISDCFMetadata); 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_limit_to_smpte_bv20(bool); void set_audio_processor (AudioProcessor const * processor); void set_reel_type (ReelType); void set_reel_length (int64_t); @@ -410,19 +407,26 @@ public: void set_ratings (std::vector r); void set_content_versions (std::vector v); void set_name_language (dcp::LanguageTag lang); - void set_audio_language (dcp::LanguageTag lang); void set_release_territory (boost::optional region = boost::none); + void set_sign_language_video_language (boost::optional tag); void set_version_number (int v); void set_status (dcp::Status s); void set_chain (boost::optional c = boost::none); void set_facility (boost::optional f = boost::none); + void set_studio (boost::optional s = boost::none); + void set_temp_version (bool t); + void set_pre_release (bool p); + void set_red_band (bool r); + void set_two_d_version_of_three_d (bool t); void set_distributor (boost::optional d = boost::none); void set_luminance (boost::optional l = boost::none); + void set_audio_language (boost::optional language); + void set_audio_frame_rate (int rate); void add_ffoc_lfoc (Markers& markers) const; /** 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; @@ -432,6 +436,8 @@ public: */ mutable boost::signals2::signal LengthChange; + boost::signals2::signal DirtyChange; + /** Emitted when we have something important to tell the user */ boost::signals2::signal Message; @@ -441,13 +447,15 @@ public: 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; + 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); @@ -458,8 +466,7 @@ private: void audio_analysis_finished (); void check_settings_consistency (); void maybe_set_container_and_resolution (); - - static std::string const metadata_file; + void set_dirty (bool dirty); /** Log to write to */ std::shared_ptr _log; @@ -470,6 +477,8 @@ private: */ boost::optional _directory; + boost::optional _last_written_by; + /** Name for DCP-o-matic */ std::string _name; /** True if a auto-generated ISDCF-compliant name should be used for our DCP */ @@ -488,8 +497,6 @@ private: std::string _context_id; /** bandwidth for J2K files in bits per second */ int _j2k_bandwidth; - /** ISDCF naming stuff */ - ISDCFMetadata _isdcf_metadata; /** Frames per second to run our DCP at */ int _video_frame_rate; /** The date that we should use in a ISDCF name */ @@ -502,6 +509,7 @@ private: bool _three_d; bool _sequence; bool _interop; + bool _limit_to_smpte_bv20; AudioProcessor const * _audio_processor; ReelType _reel_type; /** Desired reel length in bytes, if _reel_type == REELTYPE_BY_LENGTH */ @@ -515,14 +523,21 @@ private: std::vector _ratings; std::vector _content_versions; dcp::LanguageTag _name_language; - dcp::LanguageTag _audio_language; boost::optional _release_territory; + boost::optional _sign_language_video_language; int _version_number; dcp::Status _status; boost::optional _chain; boost::optional _distributor; boost::optional _facility; + boost::optional _studio; + bool _temp_version = false; + bool _pre_release = false; + bool _red_band = false; + bool _two_d_version_of_three_d = false; boost::optional _luminance; + boost::optional _audio_language; + int _audio_frame_rate = 48000; int _state_version; @@ -550,7 +565,7 @@ private: }; -typedef ChangeSignaller FilmChangeSignaller; +typedef ChangeSignaller FilmChangeSignaller; #endif