X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=871ec76b8404b5a6f9d28a0b88b72281a7f791bb;hb=591c89275bfa26c3b2e1b0f1926909fc4bf5b219;hp=2840d0236b79029be4dc8ce0045ac43e0a010ef9;hpb=42e315363f3e03984e7f77d7b73b0a0edd5466be;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 2840d0236..871ec76b8 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -205,27 +206,7 @@ Film::Film (optional dir) _playlist_length_change_connection = _playlist->LengthChange.connect (bind(&Film::playlist_length_change, this)); if (dir) { - /* Make state.directory a complete path without ..s (where possible) - (Code swiped from Adam Bowen on stackoverflow) - XXX: couldn't/shouldn't this just be boost::filesystem::canonical? - */ - - boost::filesystem::path p (boost::filesystem::system_complete (dir.get())); - boost::filesystem::path result; - for (auto i: p) { - if (i == "..") { - boost::system::error_code ec; - if (boost::filesystem::is_symlink(result, ec) || result.filename() == "..") { - result /= i; - } else { - result = result.parent_path (); - } - } else if (i != ".") { - result /= i; - } - } - - set_directory (result.make_preferred ()); + set_directory(dcp::filesystem::weakly_canonical(*dir)); } if (_directory) { @@ -435,7 +416,7 @@ Film::metadata (bool with_content_paths) const root->add_child("UserExplicitVideoFrameRate")->add_child_text(_user_explicit_video_frame_rate ? "1" : "0"); for (auto const& marker: _markers) { auto m = root->add_child("Marker"); - m->set_attribute("Type", dcp::marker_to_string(marker.first)); + m->set_attribute("type", dcp::marker_to_string(marker.first)); m->add_child_text(raw_convert(marker.second.get())); } for (auto i: _ratings) { @@ -445,6 +426,7 @@ Film::metadata (bool with_content_paths) const root->add_child("ContentVersion")->add_child_text(i); } root->add_child("NameLanguage")->add_child_text(_name_language.to_string()); + root->add_child("TerritoryType")->add_child_text(territory_type_to_string(_territory_type)); if (_release_territory) { root->add_child("ReleaseTerritory")->add_child_text(_release_territory->subtag()); } @@ -494,7 +476,7 @@ void Film::write_metadata () { DCPOMATIC_ASSERT (directory()); - boost::filesystem::create_directories (directory().get()); + dcp::filesystem::create_directories(directory().get()); auto const filename = file(metadata_file); try { metadata()->write_to_file_formatted(filename.string()); @@ -508,7 +490,7 @@ Film::write_metadata () void Film::write_template (boost::filesystem::path path) const { - boost::filesystem::create_directories (path.parent_path()); + dcp::filesystem::create_directories(path.parent_path()); shared_ptr doc = metadata (false); metadata(false)->write_to_file_formatted(path.string()); } @@ -520,19 +502,19 @@ list Film::read_metadata (optional path) { if (!path) { - if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file (metadata_file))) { + if (dcp::filesystem::exists(file("metadata")) && !dcp::filesystem::exists(file(metadata_file))) { throw runtime_error (_("This film was created with an older version of DCP-o-matic, and unfortunately it cannot be loaded into this version. You will need to create a new Film, re-add your content and set it up again. Sorry!")); } path = file (metadata_file); } - if (!boost::filesystem::exists(*path)) { + if (!dcp::filesystem::exists(*path)) { throw FileNotFoundError(*path); } cxml::Document f ("Metadata"); - f.read_file (path.get ()); + f.read_file(dcp::filesystem::fix_long_path(path.get())); _state_version = f.number_child ("Version"); if (_state_version > current_state_version) { @@ -540,9 +522,9 @@ Film::read_metadata (optional path) } else if (_state_version < current_state_version) { /* This is an older version; save a copy (if we haven't already) */ auto const older = path->parent_path() / String::compose("metadata.%1.xml", _state_version); - if (!boost::filesystem::is_regular_file(older)) { + if (!dcp::filesystem::is_regular_file(older)) { try { - boost::filesystem::copy_file(*path, older); + dcp::filesystem::copy_file(*path, older); } catch (...) { /* Never mind; at least we tried */ } @@ -621,7 +603,11 @@ Film::read_metadata (optional path) _user_explicit_video_frame_rate = f.optional_bool_child("UserExplicitVideoFrameRate").get_value_or(false); for (auto i: f.node_children("Marker")) { - _markers[dcp::marker_from_string(i->string_attribute("Type"))] = DCPTime(dcp::raw_convert(i->content())); + auto type = i->optional_string_attribute("Type"); + if (!type) { + type = i->string_attribute("type"); + } + _markers[dcp::marker_from_string(*type)] = DCPTime(dcp::raw_convert(i->content())); } for (auto i: f.node_children("Rating")) { @@ -636,6 +622,10 @@ Film::read_metadata (optional path) if (name_language) { _name_language = dcp::LanguageTag (*name_language); } + auto territory_type = f.optional_string_child("TerritoryType"); + if (territory_type) { + _territory_type = string_to_territory_type(*territory_type); + } auto release_territory = f.optional_string_child("ReleaseTerritory"); if (release_territory) { _release_territory = dcp::LanguageTag::RegionSubtag (*release_territory); @@ -707,10 +697,10 @@ Film::read_metadata (optional path) } _studio = isdcf->optional_string_child("Studio"); _facility = isdcf->optional_string_child("Facility"); - _temp_version = isdcf->optional_bool_child("TempVersion").get_value_or("false"); - _pre_release = isdcf->optional_bool_child("PreRelease").get_value_or("false"); - _red_band = isdcf->optional_bool_child("RedBand").get_value_or("false"); - _two_d_version_of_three_d = isdcf->optional_bool_child("TwoDVersionOfThreeD").get_value_or("false"); + _temp_version = isdcf->optional_bool_child("TempVersion").get_value_or(false); + _pre_release = isdcf->optional_bool_child("PreRelease").get_value_or(false); + _red_band = isdcf->optional_bool_child("RedBand").get_value_or(false); + _two_d_version_of_three_d = isdcf->optional_bool_child("TwoDVersionOfThreeD").get_value_or(false); _chain = isdcf->optional_string_child("Chain"); } @@ -740,7 +730,7 @@ Film::dir (boost::filesystem::path d, bool create) const p /= d; if (create) { - boost::filesystem::create_directories (p); + dcp::filesystem::create_directories(p); } return p; @@ -758,7 +748,7 @@ Film::file (boost::filesystem::path f) const p /= _directory.get(); p /= f; - boost::filesystem::create_directories (p.parent_path ()); + dcp::filesystem::create_directories(p.parent_path()); return p; } @@ -790,16 +780,27 @@ Film::mapped_audio_channels () const pair, vector> -Film::subtitle_languages () const +Film::subtitle_languages(bool* burnt_in) const { + if (burnt_in) { + *burnt_in = true; + } + pair, vector> result; for (auto i: content()) { - for (auto text: i->text) { - if (text->use() && text->type() == TextType::OPEN_SUBTITLE && text->language()) { - if (text->language_is_additional()) { - result.second.push_back(text->language().get()); - } else { - result.first = text->language().get(); + auto dcp = dynamic_pointer_cast(i); + for (auto const& text: i->text) { + auto const use = text->use() || (dcp && dcp->reference_text(TextType::OPEN_SUBTITLE)); + if (use && text->type() == TextType::OPEN_SUBTITLE) { + if (!text->burn() && burnt_in) { + *burnt_in = false; + } + if (text->language()) { + if (text->language_is_additional()) { + result.second.push_back(text->language().get()); + } else { + result.first = text->language().get(); + } } } } @@ -815,6 +816,22 @@ Film::subtitle_languages () const } +vector +Film::closed_caption_languages() const +{ + vector result; + for (auto i: content()) { + for (auto text: i->text) { + if (text->use() && text->type() == TextType::CLOSED_CAPTION && text->dcp_track() && text->dcp_track()->language) { + result.push_back(*text->dcp_track()->language); + } + } + } + + return result; +} + + /** @return a ISDCF-compliant name for a DCP of this film */ string Film::isdcf_name (bool if_created_now) const @@ -953,23 +970,9 @@ Film::isdcf_name (bool if_created_now) const isdcf_name += "_" + to_upper (audio_language); - /* I'm not clear on the precise details of the convention for CCAP labelling; - for now I'm just appending -CCAP if we have any closed captions. - */ - - auto burnt_in = true; - auto ccap = false; - for (auto i: content_list) { - for (auto text: i->text) { - if (text->type() == TextType::OPEN_SUBTITLE && text->use() && !text->burn()) { - burnt_in = false; - } else if (text->type() == TextType::CLOSED_CAPTION && text->use()) { - ccap = true; - } - } - } - - auto sub_langs = subtitle_languages(); + bool burnt_in; + auto sub_langs = subtitle_languages(&burnt_in); + auto ccap_langs = closed_caption_languages(); if (sub_langs.first && sub_langs.first->language()) { auto lang = entry_for_language(*sub_langs.first); if (burnt_in) { @@ -979,15 +982,18 @@ Film::isdcf_name (bool if_created_now) const } isdcf_name += "-" + lang; - if (ccap) { - isdcf_name += "-CCAP"; - } + } else if (!ccap_langs.empty()) { + isdcf_name += "-" + to_upper(entry_for_language(ccap_langs[0])) + "-CCAP"; } else { /* No subtitles */ isdcf_name += "-XX"; } - if (_release_territory) { + if (_territory_type == TerritoryType::INTERNATIONAL_TEXTED) { + isdcf_name += "_INT-TD"; + } else if (_territory_type == TerritoryType::INTERNATIONAL_TEXTLESS) { + isdcf_name += "_INT-TL"; + } else if (_release_territory) { auto territory = _release_territory->subtag(); isdcf_name += "_" + to_upper (territory); if (!_ratings.empty()) { @@ -1095,21 +1101,21 @@ Film::set_directory (boost::filesystem::path d) void Film::set_name (string n) { - FilmChangeSignaller ch (this, Property::NAME); + FilmChangeSignaller ch(this, FilmProperty::NAME); _name = n; } void Film::set_use_isdcf_name (bool u) { - FilmChangeSignaller ch (this, Property::USE_ISDCF_NAME); + FilmChangeSignaller ch(this, FilmProperty::USE_ISDCF_NAME); _use_isdcf_name = u; } void Film::set_dcp_content_type (DCPContentType const * t) { - FilmChangeSignaller ch (this, Property::DCP_CONTENT_TYPE); + FilmChangeSignaller ch(this, FilmProperty::DCP_CONTENT_TYPE); _dcp_content_type = t; } @@ -1121,7 +1127,7 @@ Film::set_dcp_content_type (DCPContentType const * t) void Film::set_container (Ratio const * c, bool explicit_user) { - FilmChangeSignaller ch (this, Property::CONTAINER); + FilmChangeSignaller ch(this, FilmProperty::CONTAINER); _container = c; if (explicit_user) { @@ -1137,7 +1143,7 @@ Film::set_container (Ratio const * c, bool explicit_user) void Film::set_resolution (Resolution r, bool explicit_user) { - FilmChangeSignaller ch (this, Property::RESOLUTION); + FilmChangeSignaller ch(this, FilmProperty::RESOLUTION); _resolution = r; if (explicit_user) { @@ -1149,7 +1155,7 @@ Film::set_resolution (Resolution r, bool explicit_user) void Film::set_j2k_bandwidth (int b) { - FilmChangeSignaller ch (this, Property::J2K_BANDWIDTH); + FilmChangeSignaller ch(this, FilmProperty::J2K_BANDWIDTH); _j2k_bandwidth = b; } @@ -1160,7 +1166,7 @@ Film::set_j2k_bandwidth (int b) void Film::set_video_frame_rate (int f, bool user_explicit) { - FilmChangeSignaller ch (this, Property::VIDEO_FRAME_RATE); + FilmChangeSignaller ch(this, FilmProperty::VIDEO_FRAME_RATE); _video_frame_rate = f; if (user_explicit) { _user_explicit_video_frame_rate = true; @@ -1170,14 +1176,14 @@ Film::set_video_frame_rate (int f, bool user_explicit) void Film::set_audio_channels (int c) { - FilmChangeSignaller ch (this, Property::AUDIO_CHANNELS); + FilmChangeSignaller ch(this, FilmProperty::AUDIO_CHANNELS); _audio_channels = c; } void Film::set_three_d (bool t) { - FilmChangeSignaller ch (this, Property::THREE_D); + FilmChangeSignaller ch(this, FilmProperty::THREE_D); _three_d = t; if (_three_d && _two_d_version_of_three_d) { @@ -1188,7 +1194,7 @@ Film::set_three_d (bool t) void Film::set_interop (bool i) { - FilmChangeSignaller ch (this, Property::INTEROP); + FilmChangeSignaller ch(this, FilmProperty::INTEROP); _interop = i; } @@ -1196,7 +1202,7 @@ Film::set_interop (bool i) void Film::set_limit_to_smpte_bv20(bool limit) { - FilmChangeSignaller ch(this, Property::LIMIT_TO_SMPTE_BV20); + FilmChangeSignaller ch(this, FilmProperty::LIMIT_TO_SMPTE_BV20); _limit_to_smpte_bv20 = limit; } @@ -1204,15 +1210,15 @@ Film::set_limit_to_smpte_bv20(bool limit) void Film::set_audio_processor (AudioProcessor const * processor) { - FilmChangeSignaller ch1 (this, Property::AUDIO_PROCESSOR); - FilmChangeSignaller ch2 (this, Property::AUDIO_CHANNELS); + FilmChangeSignaller ch1(this, FilmProperty::AUDIO_PROCESSOR); + FilmChangeSignaller ch2(this, FilmProperty::AUDIO_CHANNELS); _audio_processor = processor; } void Film::set_reel_type (ReelType t) { - FilmChangeSignaller ch (this, Property::REEL_TYPE); + FilmChangeSignaller ch(this, FilmProperty::REEL_TYPE); _reel_type = t; } @@ -1220,30 +1226,30 @@ Film::set_reel_type (ReelType t) void Film::set_reel_length (int64_t r) { - FilmChangeSignaller ch (this, Property::REEL_LENGTH); + FilmChangeSignaller ch(this, FilmProperty::REEL_LENGTH); _reel_length = r; } void Film::set_reencode_j2k (bool r) { - FilmChangeSignaller ch (this, Property::REENCODE_J2K); + FilmChangeSignaller ch(this, FilmProperty::REENCODE_J2K); _reencode_j2k = r; } void Film::signal_change (ChangeType type, int p) { - signal_change (type, static_cast(p)); + signal_change(type, static_cast(p)); } void -Film::signal_change (ChangeType type, Property p) +Film::signal_change(ChangeType type, FilmProperty p) { if (type == ChangeType::DONE) { set_dirty (true); - if (p == Property::CONTENT) { + if (p == FilmProperty::CONTENT) { if (!_user_explicit_video_frame_rate) { set_video_frame_rate (best_video_frame_rate()); } @@ -1251,7 +1257,7 @@ Film::signal_change (ChangeType type, Property p) emit (boost::bind (boost::ref (Change), type, p)); - if (p == Property::VIDEO_FRAME_RATE || p == Property::SEQUENCE) { + if (p == FilmProperty::VIDEO_FRAME_RATE || p == FilmProperty::SEQUENCE) { /* We want to call Playlist::maybe_sequence but this must happen after the main signal emission (since the butler will see that emission and un-suspend itself). */ @@ -1310,10 +1316,10 @@ Film::cpls () const vector out; auto const dir = directory().get(); - for (auto const& item: boost::filesystem::directory_iterator(dir)) { + for (auto const& item: dcp::filesystem::directory_iterator(dir)) { if ( - boost::filesystem::is_directory(item) && - item.path().leaf() != "j2c" && item.path().leaf() != "video" && item.path().leaf() != "info" && item.path().leaf() != "analysis" + dcp::filesystem::is_directory(item) && + item.path().filename() != "j2c" && item.path().filename() != "video" && item.path().filename() != "info" && item.path().filename() != "analysis" ) { try { @@ -1334,7 +1340,7 @@ Film::cpls () const void Film::set_encrypted (bool e) { - FilmChangeSignaller ch (this, Property::ENCRYPTED); + FilmChangeSignaller ch(this, FilmProperty::ENCRYPTED); _encrypted = e; } @@ -1410,7 +1416,9 @@ Film::add_content (shared_ptr c) maybe_set_container_and_resolution (); if (c->atmos) { - set_audio_channels (14); + if (_audio_channels < 14) { + set_audio_channels(14); + } set_interop (false); } } @@ -1503,9 +1511,9 @@ void Film::playlist_content_change (ChangeType type, weak_ptr c, int p, bool frequent) { if (p == ContentProperty::VIDEO_FRAME_RATE) { - signal_change (type, Property::CONTENT); + signal_change(type, FilmProperty::CONTENT); } else if (p == AudioContentProperty::STREAMS) { - signal_change (type, Property::NAME); + signal_change(type, FilmProperty::NAME); } if (type == ChangeType::DONE) { @@ -1529,8 +1537,8 @@ Film::playlist_length_change () void Film::playlist_change (ChangeType type) { - signal_change (type, Property::CONTENT); - signal_change (type, Property::NAME); + signal_change(type, FilmProperty::CONTENT); + signal_change(type, FilmProperty::NAME); if (type == ChangeType::DONE) { check_settings_consistency (); @@ -1595,7 +1603,7 @@ void Film::playlist_order_changed () { /* XXX: missing PENDING */ - signal_change (ChangeType::DONE, Property::CONTENT_ORDER); + signal_change(ChangeType::DONE, FilmProperty::CONTENT_ORDER); } @@ -1606,7 +1614,7 @@ Film::set_sequence (bool s) return; } - FilmChangeSignaller cc (this, Property::SEQUENCE); + FilmChangeSignaller cc(this, FilmProperty::SEQUENCE); _sequence = s; _playlist->set_sequence (s); } @@ -1734,15 +1742,15 @@ Film::should_be_enough_disk_space (double& required, double& available, bool& ca if (f) { f.close(); boost::system::error_code ec; - boost::filesystem::create_hard_link (test, test2, ec); + dcp::filesystem::create_hard_link(test, test2, ec); if (ec) { can_hard_link = false; } - boost::filesystem::remove (test); - boost::filesystem::remove (test2); + dcp::filesystem::remove(test); + dcp::filesystem::remove(test2); } - auto s = boost::filesystem::space (internal_video_asset_dir ()); + auto s = dcp::filesystem::space(internal_video_asset_dir()); required = double (required_disk_space ()) / 1073741824.0f; if (!can_hard_link) { required *= 2; @@ -1956,7 +1964,7 @@ Film::closed_caption_tracks () const void Film::set_marker (dcp::Marker type, DCPTime time) { - FilmChangeSignaller ch (this, Property::MARKERS); + FilmChangeSignaller ch(this, FilmProperty::MARKERS); _markers[type] = time; } @@ -1964,7 +1972,7 @@ Film::set_marker (dcp::Marker type, DCPTime time) void Film::unset_marker (dcp::Marker type) { - FilmChangeSignaller ch (this, Property::MARKERS); + FilmChangeSignaller ch(this, FilmProperty::MARKERS); _markers.erase (type); } @@ -1972,7 +1980,7 @@ Film::unset_marker (dcp::Marker type) void Film::clear_markers () { - FilmChangeSignaller ch (this, Property::MARKERS); + FilmChangeSignaller ch(this, FilmProperty::MARKERS); _markers.clear (); } @@ -1980,14 +1988,14 @@ Film::clear_markers () void Film::set_ratings (vector r) { - FilmChangeSignaller ch (this, Property::RATINGS); + FilmChangeSignaller ch(this, FilmProperty::RATINGS); _ratings = r; } void Film::set_content_versions (vector v) { - FilmChangeSignaller ch (this, Property::CONTENT_VERSIONS); + FilmChangeSignaller ch(this, FilmProperty::CONTENT_VERSIONS); _content_versions = v; } @@ -1995,7 +2003,7 @@ Film::set_content_versions (vector v) void Film::set_name_language (dcp::LanguageTag lang) { - FilmChangeSignaller ch (this, Property::NAME_LANGUAGE); + FilmChangeSignaller ch(this, FilmProperty::NAME_LANGUAGE); _name_language = lang; } @@ -2003,7 +2011,7 @@ Film::set_name_language (dcp::LanguageTag lang) void Film::set_release_territory (optional region) { - FilmChangeSignaller ch (this, Property::RELEASE_TERRITORY); + FilmChangeSignaller ch(this, FilmProperty::RELEASE_TERRITORY); _release_territory = region; } @@ -2011,7 +2019,7 @@ Film::set_release_territory (optional region) void Film::set_status (dcp::Status s) { - FilmChangeSignaller ch (this, Property::STATUS); + FilmChangeSignaller ch(this, FilmProperty::STATUS); _status = s; } @@ -2019,7 +2027,7 @@ Film::set_status (dcp::Status s) void Film::set_version_number (int v) { - FilmChangeSignaller ch (this, Property::VERSION_NUMBER); + FilmChangeSignaller ch(this, FilmProperty::VERSION_NUMBER); _version_number = v; } @@ -2027,7 +2035,7 @@ Film::set_version_number (int v) void Film::set_chain (optional c) { - FilmChangeSignaller ch (this, Property::CHAIN); + FilmChangeSignaller ch(this, FilmProperty::CHAIN); _chain = c; } @@ -2035,7 +2043,7 @@ Film::set_chain (optional c) void Film::set_distributor (optional d) { - FilmChangeSignaller ch (this, Property::DISTRIBUTOR); + FilmChangeSignaller ch(this, FilmProperty::DISTRIBUTOR); _distributor = d; } @@ -2043,7 +2051,7 @@ Film::set_distributor (optional d) void Film::set_luminance (optional l) { - FilmChangeSignaller ch (this, Property::LUMINANCE); + FilmChangeSignaller ch(this, FilmProperty::LUMINANCE); _luminance = l; } @@ -2051,7 +2059,7 @@ Film::set_luminance (optional l) void Film::set_facility (optional f) { - FilmChangeSignaller ch (this, Property::FACILITY); + FilmChangeSignaller ch(this, FilmProperty::FACILITY); _facility = f; } @@ -2059,7 +2067,7 @@ Film::set_facility (optional f) void Film::set_studio (optional s) { - FilmChangeSignaller ch (this, Property::STUDIO); + FilmChangeSignaller ch(this, FilmProperty::STUDIO); _studio = s; } @@ -2082,10 +2090,10 @@ Film::info_file_handle (DCPTimePeriod period, bool read) const InfoFileHandle::InfoFileHandle (boost::mutex& mutex, boost::filesystem::path path, bool read) : _lock (mutex) - , _file (path, read ? "rb" : (boost::filesystem::exists(path) ? "r+b" : "wb")) + , _file(path, read ? "rb" : (dcp::filesystem::exists(path) ? "r+b" : "wb")) { if (!_file) { - throw OpenFileError (path, errno, read ? OpenFileError::READ : (boost::filesystem::exists(path) ? OpenFileError::READ_WRITE : OpenFileError::WRITE)); + throw OpenFileError(path, errno, read ? OpenFileError::READ : (dcp::filesystem::exists(path) ? OpenFileError::READ_WRITE : OpenFileError::WRITE)); } } @@ -2107,7 +2115,7 @@ Film::add_ffoc_lfoc (Markers& markers) const void Film::set_temp_version (bool t) { - FilmChangeSignaller ch (this, Property::TEMP_VERSION); + FilmChangeSignaller ch(this, FilmProperty::TEMP_VERSION); _temp_version = t; } @@ -2115,7 +2123,7 @@ Film::set_temp_version (bool t) void Film::set_pre_release (bool p) { - FilmChangeSignaller ch (this, Property::PRE_RELEASE); + FilmChangeSignaller ch(this, FilmProperty::PRE_RELEASE); _pre_release = p; } @@ -2123,7 +2131,7 @@ Film::set_pre_release (bool p) void Film::set_red_band (bool r) { - FilmChangeSignaller ch (this, Property::RED_BAND); + FilmChangeSignaller ch(this, FilmProperty::RED_BAND); _red_band = r; } @@ -2131,7 +2139,7 @@ Film::set_red_band (bool r) void Film::set_two_d_version_of_three_d (bool t) { - FilmChangeSignaller ch (this, Property::TWO_D_VERSION_OF_THREE_D); + FilmChangeSignaller ch(this, FilmProperty::TWO_D_VERSION_OF_THREE_D); _two_d_version_of_three_d = t; } @@ -2139,7 +2147,7 @@ Film::set_two_d_version_of_three_d (bool t) void Film::set_audio_language (optional language) { - FilmChangeSignaller ch (this, Property::AUDIO_LANGUAGE); + FilmChangeSignaller ch(this, FilmProperty::AUDIO_LANGUAGE); _audio_language = language; } @@ -2147,7 +2155,7 @@ Film::set_audio_language (optional language) void Film::set_audio_frame_rate (int rate) { - FilmChangeSignaller ch (this, Property::AUDIO_FRAME_RATE); + FilmChangeSignaller ch(this, FilmProperty::AUDIO_FRAME_RATE); _audio_frame_rate = rate; } @@ -2162,7 +2170,7 @@ Film::has_sign_language_video_channel () const void Film::set_sign_language_video_language (optional lang) { - FilmChangeSignaller ch (this, Property::SIGN_LANGUAGE_VIDEO_LANGUAGE); + FilmChangeSignaller ch(this, FilmProperty::SIGN_LANGUAGE_VIDEO_LANGUAGE); _sign_language_video_language = lang; } @@ -2215,3 +2223,11 @@ Film::last_written_by_earlier_than(int major, int minor, int micro) const return our_micro < micro; } + +void +Film::set_territory_type(TerritoryType type) +{ + FilmChangeSignaller ch(this, FilmProperty::TERRITORY_TYPE); + _territory_type = type; +} +