X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.h;h=fa87c6c35f99e62bbe0619ba7d5b40f0f3c069b6;hb=ea51ac3483161343b7aefabe54420c6cb431c0fe;hp=66bcce80628830db9d977a1c4dcd3b42ecb7da7e;hpb=4f4a86fb43b00d251e44a7f4463fcb390c605212;p=dcpomatic.git diff --git a/src/lib/film.h b/src/lib/film.h index 66bcce806..fa87c6c35 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2020 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -26,23 +26,23 @@ #ifndef DCPOMATIC_FILM_H #define DCPOMATIC_FILM_H -#include "util.h" -#include "types.h" -#include "isdcf_metadata.h" +#include "change_signaller.h" +#include "dcp_text_track.h" #include "frame_rate_change.h" +#include "isdcf_metadata.h" #include "signaller.h" -#include "dcp_text_track.h" -#include -#include +#include "types.h" +#include "util.h" #include +#include +#include +#include #include -#include #include -#include #include +#include #include #include -#include namespace xmlpp { class Document; @@ -68,6 +68,7 @@ struct atmos_encrypted_passthrough_test; class InfoFileHandle { public: + InfoFileHandle (boost::mutex& mutex, boost::filesystem::path file, bool read); ~InfoFileHandle (); FILE* get () const { @@ -81,8 +82,6 @@ public: private: friend class Film; - InfoFileHandle (boost::mutex& mutex, boost::filesystem::path file, bool read); - boost::mutex::scoped_lock _lock; FILE* _handle; boost::filesystem::path _file; @@ -95,19 +94,19 @@ private: * * The content of a Film is held in a Playlist (created and managed by the Film). */ -class Film : public boost::enable_shared_from_this, public Signaller, public boost::noncopyable +class Film : public std::enable_shared_from_this, public Signaller, public boost::noncopyable { public: explicit Film (boost::optional dir); ~Film (); - boost::shared_ptr info_file_handle (dcpomatic::DCPTimePeriod period, bool read) const; + 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; boost::filesystem::path internal_video_asset_filename (dcpomatic::DCPTimePeriod p) const; - boost::filesystem::path audio_analysis_path (boost::shared_ptr) const; - boost::filesystem::path subtitle_analysis_path (boost::shared_ptr) const; + boost::filesystem::path audio_analysis_path (std::shared_ptr) const; + boost::filesystem::path subtitle_analysis_path (std::shared_ptr) const; void send_dcp_to_tms (); void make_dcp (bool gui = false, bool check = true); @@ -115,7 +114,7 @@ public: /** @return Logger. * It is safe to call this from any thread. */ - boost::shared_ptr log () const { + std::shared_ptr log () const { return _log; } @@ -127,9 +126,9 @@ public: void write_metadata () const; void write_metadata (boost::filesystem::path path) const; void write_template (boost::filesystem::path path) const; - boost::shared_ptr metadata (bool with_content_paths = true) const; + std::shared_ptr metadata (bool with_content_paths = true) const; - void copy_from (boost::shared_ptr film); + void copy_from (std::shared_ptr film); std::string isdcf_name (bool if_created_now) const; std::string dcp_name (bool if_created_now = false) const; @@ -175,18 +174,18 @@ public: return _state_version; } - std::string subtitle_language () const; - - std::vector audio_output_names () const; + std::vector audio_output_names () const; void repeat_content (ContentList, int); - boost::shared_ptr playlist () const { + std::shared_ptr playlist () const { return _playlist; } std::list reels () const; std::list mapped_audio_channels () const; + std::vector audio_languages () const; + std::pair, std::vector> subtitle_languages () const; std::string content_summary (dcpomatic::DCPTimePeriod period) const; @@ -205,7 +204,7 @@ public: /** Identifiers for the parts of our state; used for signalling changes. */ - enum Property { + enum class Property { NONE, NAME, USE_ISDCF_NAME, @@ -240,7 +239,8 @@ public: CHAIN, DISTRIBUTOR, FACILITY, - LUMINANCE + STUDIO, + LUMINANCE, }; @@ -327,8 +327,10 @@ public: return _reencode_j2k; } + typedef std::map Markers; + boost::optional marker (dcp::Marker type) const; - std::map markers () const { + Markers markers () const { return _markers; } @@ -348,7 +350,7 @@ public: return _audio_language; } - dcp::LanguageTag::RegionSubtag release_territory () const { + boost::optional release_territory () const { return _release_territory; } @@ -360,19 +362,23 @@ public: return _status; } - std::string chain () const { + boost::optional chain () const { return _chain; } - std::string distributor () const { + boost::optional distributor () const { return _distributor; } - std::string facility () const { + boost::optional facility () const { return _facility; } - dcp::Luminance luminance () const { + boost::optional studio () const { + return _studio; + } + + boost::optional luminance () const { return _luminance; } @@ -381,12 +387,12 @@ public: void set_directory (boost::filesystem::path); void set_name (std::string); void set_use_isdcf_name (bool); - void examine_and_add_content (boost::shared_ptr content, bool disable_audio_analysis = false); - void add_content (boost::shared_ptr); - void remove_content (boost::shared_ptr); + void examine_and_add_content (std::shared_ptr content, bool disable_audio_analysis = false); + void add_content (std::shared_ptr); + void remove_content (std::shared_ptr); void remove_content (ContentList); - void move_content_earlier (boost::shared_ptr); - void move_content_later (boost::shared_ptr); + void move_content_earlier (std::shared_ptr); + void move_content_later (std::shared_ptr); void set_dcp_content_type (DCPContentType const *); void set_container (Ratio const *, bool user_explicit = true); void set_resolution (Resolution, bool user_explicit = true); @@ -410,19 +416,22 @@ public: 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 (dcp::LanguageTag::RegionSubtag region); + void set_release_territory (boost::optional region = boost::none); void set_version_number (int v); void set_status (dcp::Status s); - void set_chain (std::string c); - void set_facility (std::string f); - void set_distributor (std::string d); - void set_luminance (dcp::Luminance l); + 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_distributor (boost::optional d = boost::none); + void set_luminance (boost::optional l = boost::none); + + 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; /** Emitted when some property of our content has changed */ - mutable boost::signals2::signal, int, bool)> ContentChange; + mutable boost::signals2::signal, int, bool)> ContentChange; /** Emitted when the film's length might have changed; this is not like a normal property as its value is derived from the playlist, so it has its own signal. @@ -440,7 +449,7 @@ private: friend struct ::isdcf_name_test; friend struct ::recover_test_2d_encrypted; friend struct ::atmos_encrypted_passthrough_test; - template friend class ChangeSignaller; + template friend class ChangeSignaller; boost::filesystem::path info_file (dcpomatic::DCPTimePeriod p) const; @@ -449,9 +458,9 @@ private: std::string video_identifier () const; void playlist_change (ChangeType); void playlist_order_changed (); - void playlist_content_change (ChangeType type, boost::weak_ptr, int, bool frequent); + void playlist_content_change (ChangeType type, std::weak_ptr, int, bool frequent); void playlist_length_change (); - void maybe_add_content (boost::weak_ptr, boost::weak_ptr, bool disable_audio_analysis); + void maybe_add_content (std::weak_ptr, std::weak_ptr, bool disable_audio_analysis); void audio_analysis_finished (); void check_settings_consistency (); void maybe_set_container_and_resolution (); @@ -459,8 +468,8 @@ private: static std::string const metadata_file; /** Log to write to */ - boost::shared_ptr _log; - boost::shared_ptr _playlist; + std::shared_ptr _log; + std::shared_ptr _playlist; /** Complete path to directory containing the film metadata; * must not be relative. @@ -513,20 +522,21 @@ private: std::vector _content_versions; dcp::LanguageTag _name_language; dcp::LanguageTag _audio_language; - dcp::LanguageTag::RegionSubtag _release_territory; + boost::optional _release_territory; int _version_number; dcp::Status _status; - std::string _chain; - std::string _distributor; - std::string _facility; - dcp::Luminance _luminance; + boost::optional _chain; + boost::optional _distributor; + boost::optional _facility; + boost::optional _studio; + boost::optional _luminance; int _state_version; /** true if our state has changed since we last saved it */ mutable bool _dirty; /** film being used as a template, or 0 */ - boost::shared_ptr _template_film; + std::shared_ptr _template_film; /** Be tolerant of errors in content (currently applies to DCP only). Not saved as state. @@ -546,4 +556,8 @@ private: friend struct film_metadata_test; }; + +typedef ChangeSignaller FilmChangeSignaller; + + #endif