summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-03-20 23:43:34 +0100
committerCarl Hetherington <cth@carlh.net>2025-03-24 16:59:24 +0100
commit816a7b7a9d9c3cae7565cec139bf28068853f94d (patch)
tree718644b178b68fd03e2b1ea18c7bec96da5de4e4
parente93b66f4236ec25dbd0603bbe74c904b53180e91 (diff)
Basic support for variable-Z 3D subtitles.
-rw-r--r--cscript2
-rw-r--r--src/lib/config.cc4
-rw-r--r--src/lib/dcp_text_track.cc4
-rw-r--r--src/lib/film.cc8
-rw-r--r--src/lib/reel_writer.cc11
-rw-r--r--src/lib/subtitle_film_encoder.cc2
-rw-r--r--src/lib/text_content.cc2
-rw-r--r--src/lib/text_decoder.cc1
-rw-r--r--src/lib/util.cc4
-rw-r--r--src/lib/video_content.cc2
-rw-r--r--src/wx/closed_captions_dialog.cc2
-rw-r--r--src/wx/dcp_panel.cc2
-rw-r--r--src/wx/language_tag_dialog.cc2
-rw-r--r--src/wx/language_tag_widget.cc2
-rw-r--r--test/cpl_metadata_test.cc4
-rw-r--r--test/render_subtitles_test.cc6
-rw-r--r--test/subtitle_metadata_test.cc2
-rw-r--r--test/vf_test.cc3
18 files changed, 36 insertions, 27 deletions
diff --git a/cscript b/cscript
index 0413849fd..08d63cbbf 100644
--- a/cscript
+++ b/cscript
@@ -436,7 +436,7 @@ def build_with_cpp17(target):
def dependencies(target, options):
- deps = [('libdcp', 'v1.10.15', {'c++17': build_with_cpp17(target)})]
+ deps = [('libdcp', 'v1.10.16', {'c++17': build_with_cpp17(target)})]
deps.append(('libsub', 'v1.6.53'))
deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23'))
deps.append(('rtaudio', 'f619b76'))
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 49c64e5b6..86bc343da 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -807,7 +807,7 @@ Config::write_config() const
cxml::add_text_child(root, "DefaultAudioDelay", fmt::to_string(_default_audio_delay));
if (_default_audio_language) {
/* [XML] DefaultAudioLanguage Default audio language to use for new films */
- cxml::add_text_child(root, "DefaultAudioLanguage", _default_audio_language->to_string());
+ cxml::add_text_child(root, "DefaultAudioLanguage", _default_audio_language->as_string());
}
if (_default_kdm_directory) {
/* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */
@@ -1111,7 +1111,7 @@ Config::write_config() const
_audio_mapping->as_xml(cxml::add_child(root, "AudioMapping"));
}
for (auto const& i: _custom_languages) {
- cxml::add_text_child(root, "CustomLanguage", i.to_string());
+ cxml::add_text_child(root, "CustomLanguage", i.as_string());
}
for (auto const& initial: _initial_paths) {
if (initial.second) {
diff --git a/src/lib/dcp_text_track.cc b/src/lib/dcp_text_track.cc
index 292932396..ec1d6828b 100644
--- a/src/lib/dcp_text_track.cc
+++ b/src/lib/dcp_text_track.cc
@@ -50,7 +50,7 @@ DCPTextTrack::DCPTextTrack (string name_, optional<dcp::LanguageTag> language_)
string
DCPTextTrack::summary () const
{
- return String::compose("%1 (%2)", name, language ? language->to_string() : _("Unknown"));
+ return String::compose("%1 (%2)", name, language ? language->as_string() : _("Unknown"));
}
void
@@ -58,7 +58,7 @@ DCPTextTrack::as_xml (xmlpp::Element* parent) const
{
cxml::add_text_child(parent, "Name", name);
if (language) {
- cxml::add_text_child(parent, "Language", language->to_string());
+ cxml::add_text_child(parent, "Language", language->as_string());
}
}
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 6adc7dff4..5c3b6cee9 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -442,13 +442,13 @@ Film::metadata(bool with_content_paths) const
for (auto i: _content_versions) {
cxml::add_text_child(root, "ContentVersion", i);
}
- cxml::add_text_child(root, "NameLanguage", _name_language.to_string());
+ cxml::add_text_child(root, "NameLanguage", _name_language.as_string());
cxml::add_text_child(root, "TerritoryType", territory_type_to_string(_territory_type));
if (_release_territory) {
cxml::add_text_child(root, "ReleaseTerritory", _release_territory->subtag());
}
if (_sign_language_video_language) {
- cxml::add_text_child(root, "SignLanguageVideoLanguage", _sign_language_video_language->to_string());
+ cxml::add_text_child(root, "SignLanguageVideoLanguage", _sign_language_video_language->as_string());
}
cxml::add_text_child(root, "VersionNumber", fmt::to_string(_version_number));
cxml::add_text_child(root, "Status", dcp::status_to_string(_status));
@@ -475,7 +475,7 @@ Film::metadata(bool with_content_paths) const
cxml::add_text_child(root, "UserExplicitContainer", _user_explicit_container ? "1" : "0");
cxml::add_text_child(root, "UserExplicitResolution", _user_explicit_resolution ? "1" : "0");
if (_audio_language) {
- cxml::add_text_child(root, "AudioLanguage", _audio_language->to_string());
+ cxml::add_text_child(root, "AudioLanguage", _audio_language->as_string());
}
_playlist->as_xml(
cxml::add_child(root, "Playlist"),
@@ -1004,7 +1004,7 @@ Film::isdcf_name(bool if_created_now) const
auto entry_for_language = [](dcp::LanguageTag const& tag) {
/* Look up what we should be using for this tag in the DCNC name */
for (auto const& dcnc: dcp::dcnc_tags()) {
- if (tag.to_string() == dcnc.first) {
+ if (tag.as_string() == dcnc.first) {
return dcnc.second;
}
}
diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc
index 9037c9ef9..90cd9f26b 100644
--- a/src/lib/reel_writer.cc
+++ b/src/lib/reel_writer.cc
@@ -801,9 +801,9 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool
auto s = make_shared<dcp::InteropTextAsset>();
s->set_movie_title (film()->name());
if (is_open(type)) {
- s->set_language (lang.first ? lang.first->to_string() : "Unknown");
+ s->set_language(lang.first ? lang.first->as_string() : "Unknown");
} else if (track->language) {
- s->set_language (track->language->to_string());
+ s->set_language(track->language->as_string());
}
s->set_reel_number(fmt::to_string(_reel_index + 1));
asset = s;
@@ -814,7 +814,7 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool
if (is_open(type) && lang.first) {
s->set_language (*lang.first);
} else if (track && track->language) {
- s->set_language (dcp::LanguageTag(track->language->to_string()));
+ s->set_language(dcp::LanguageTag(track->language->as_string()));
}
s->set_edit_rate (dcp::Fraction (film()->video_frame_rate(), 1));
s->set_reel_number (_reel_index + 1);
@@ -843,6 +843,7 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool
0.5,
dcp::VAlign::CENTER,
0,
+ vector<dcp::Text::VariableZPosition>(),
dcp::Direction::LTR,
" ",
dcp::Effect::NONE,
@@ -958,11 +959,11 @@ ReelWriter::write(PlayerText subs, TextType type, optional<DCPTextTrack> track,
for (auto i: subs.bitmap) {
asset->add (
- make_shared<dcp::TextImage>(
+ std::make_shared<dcp::TextImage>(
image_as_png(i.image),
dcp::Time(period.from.seconds() - _period.from.seconds(), tcr),
dcp::Time(period.to.seconds() - _period.from.seconds(), tcr),
- i.rectangle.x, dcp::HAlign::LEFT, i.rectangle.y, dcp::VAlign::TOP, 0,
+ i.rectangle.x, dcp::HAlign::LEFT, i.rectangle.y, dcp::VAlign::TOP, 0, vector<dcp::Text::VariableZPosition>(),
dcp::Time(), dcp::Time()
)
);
diff --git a/src/lib/subtitle_film_encoder.cc b/src/lib/subtitle_film_encoder.cc
index a127ba73f..2de74bc67 100644
--- a/src/lib/subtitle_film_encoder.cc
+++ b/src/lib/subtitle_film_encoder.cc
@@ -145,7 +145,7 @@ SubtitleFilmEncoder::text(PlayerText subs, TextType type, optional<DCPTextTrack>
auto s = make_shared<dcp::InteropTextAsset>();
s->set_movie_title (_film->name());
if (lang.first) {
- s->set_language (lang.first->to_string());
+ s->set_language(lang.first->as_string());
}
s->set_reel_number(fmt::to_string(_reel_index + 1));
_assets[_reel_index].first = s;
diff --git a/src/lib/text_content.cc b/src/lib/text_content.cc
index 4a333bb76..93dad2639 100644
--- a/src/lib/text_content.cc
+++ b/src/lib/text_content.cc
@@ -411,7 +411,7 @@ TextContent::as_xml(xmlpp::Element* root) const
}
if (_language) {
auto lang = cxml::add_child(text, "Language");
- lang->add_child_text (_language->to_string());
+ lang->add_child_text(_language->as_string());
lang->set_attribute("additional", _language_is_additional ? "1" : "0");
}
}
diff --git a/src/lib/text_decoder.cc b/src/lib/text_decoder.cc
index ab82177f7..52d6c58d3 100644
--- a/src/lib/text_decoder.cc
+++ b/src/lib/text_decoder.cc
@@ -284,6 +284,7 @@ TextDecoder::emit_plain_start(ContentTime from, sub::Subtitle const & sub_subtit
v_position,
v_align,
0,
+ vector<dcp::Text::VariableZPosition>(),
dcp::Direction::LTR,
remove_invalid_characters_for_xml(block.text),
dcp::Effect::NONE,
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 1e2f7d61f..81ae4c494 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -479,8 +479,8 @@ LIBDCP_ENABLE_WARNINGS
/* Render something to fontconfig to create its cache */
vector<StringText> subs;
dcp::TextString ss(
- optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR,
- "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0, std::vector<dcp::Ruby>()
+ optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0,
+ vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0, std::vector<dcp::Ruby>()
);
subs.push_back(StringText(ss, 0, make_shared<dcpomatic::Font>("foo"), dcp::SubtitleStandard::SMPTE_2014));
render_text(subs, dcp::Size(640, 480), DCPTime(), 24);
diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc
index 56262cd14..ae13e1eca 100644
--- a/src/lib/video_content.cc
+++ b/src/lib/video_content.cc
@@ -304,7 +304,7 @@ VideoContent::as_xml(xmlpp::Element* element) const
cxml::add_text_child(element, "Range", _range == VideoRange::FULL ? "full" : "video");
_pixel_quanta.as_xml(cxml::add_child(element, "PixelQuanta"));
if (_burnt_subtitle_language) {
- cxml::add_text_child(element, "BurntSubtitleLanguage", _burnt_subtitle_language->to_string());
+ cxml::add_text_child(element, "BurntSubtitleLanguage", _burnt_subtitle_language->as_string());
}
}
diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc
index c8a04993c..b8618c0cd 100644
--- a/src/wx/closed_captions_dialog.cc
+++ b/src/wx/closed_captions_dialog.cc
@@ -254,7 +254,7 @@ ClosedCaptionsDialog::update_tracks (shared_ptr<const Film> film)
_track->Clear ();
for (auto const& i: _tracks) {
- _track->Append (std_to_wx(String::compose("%1 (%2)", i.name, i.language ? i.language->to_string() : wx_to_std(_("Unknown")))));
+ _track->Append(std_to_wx(String::compose("%1 (%2)", i.name, i.language ? i.language->as_string() : wx_to_std(_("Unknown")))));
}
if (_track->GetCount() > 0) {
diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc
index 0f0edc971..aeddb2a8d 100644
--- a/src/wx/dcp_panel.cc
+++ b/src/wx/dcp_panel.cc
@@ -484,7 +484,7 @@ DCPPanel::film_changed(FilmProperty p)
{
auto al = _film->audio_language();
checked_set (_enable_audio_language, static_cast<bool>(al));
- checked_set (_audio_language, al ? std_to_wx(al->to_string()) : wxString{});
+ checked_set(_audio_language, al ? std_to_wx(al->as_string()) : wxString{});
setup_dcp_name ();
setup_sensitivity ();
_audio_panel_sizer->Layout();
diff --git a/src/wx/language_tag_dialog.cc b/src/wx/language_tag_dialog.cc
index c898d3edb..f5a239c6c 100644
--- a/src/wx/language_tag_dialog.cc
+++ b/src/wx/language_tag_dialog.cc
@@ -96,7 +96,7 @@ LanguageTagDialog::populate_list ()
it.SetText (std_to_wx(i.description()));
_list->InsertItem (it);
it.SetColumn (1);
- it.SetText (std_to_wx(i.to_string()));
+ it.SetText(std_to_wx(i.as_string()));
_list->SetItem (it);
}
};
diff --git a/src/wx/language_tag_widget.cc b/src/wx/language_tag_widget.cc
index cefa4b90c..ff2883bc2 100644
--- a/src/wx/language_tag_widget.cc
+++ b/src/wx/language_tag_widget.cc
@@ -78,7 +78,7 @@ LanguageTagWidget::set (optional<dcp::LanguageTag> tag)
{
_tag = tag;
if (tag) {
- checked_set (_language, std_to_wx(tag->to_string()));
+ checked_set(_language, std_to_wx(tag->as_string()));
} else {
checked_set(_language, wxString{});
}
diff --git a/test/cpl_metadata_test.cc b/test/cpl_metadata_test.cc
index 59ceed064..c0a3c658d 100644
--- a/test/cpl_metadata_test.cc
+++ b/test/cpl_metadata_test.cc
@@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_51_vi)
BOOST_REQUIRE(msc);
/* We think this should say 51 not 71 at the start (#2580) */
- BOOST_CHECK_EQUAL(msc->to_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN");
+ BOOST_CHECK_EQUAL(msc->as_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN");
}
@@ -117,5 +117,5 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_71)
auto msc = cpl->main_sound_configuration();
BOOST_REQUIRE(msc);
- BOOST_CHECK_EQUAL(msc->to_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs");
+ BOOST_CHECK_EQUAL(msc->as_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs");
}
diff --git a/test/render_subtitles_test.cc b/test/render_subtitles_test.cc
index e89890542..1fe43c6d8 100644
--- a/test/render_subtitles_test.cc
+++ b/test/render_subtitles_test.cc
@@ -37,6 +37,9 @@
using std::make_shared;
using std::shared_ptr;
+using std::string;
+using std::vector;
+using boost::optional;
static void
@@ -59,6 +62,7 @@ add(std::vector<StringText>& s, std::string text, bool italic, bool bold, bool u
1,
dcp::VAlign::TOP,
0,
+ vector<dcp::Text::VariableZPosition>(),
dcp::Direction::LTR,
text,
dcp::Effect::NONE,
@@ -133,6 +137,7 @@ BOOST_AUTO_TEST_CASE(render_text_with_newline_test)
0.5, dcp::HAlign::CENTER,
0.5, dcp::VAlign::CENTER,
0.0,
+ vector<dcp::Text::VariableZPosition>(),
dcp::Direction::LTR,
"Hello world",
dcp::Effect::NONE, dcp::Colour(0, 0, 0),
@@ -146,6 +151,7 @@ BOOST_AUTO_TEST_CASE(render_text_with_newline_test)
0.5, dcp::HAlign::CENTER,
0.5, dcp::VAlign::CENTER,
0.0,
+ vector<dcp::Text::VariableZPosition>(),
dcp::Direction::LTR,
"\n",
dcp::Effect::NONE, dcp::Colour(0, 0, 0),
diff --git a/test/subtitle_metadata_test.cc b/test/subtitle_metadata_test.cc
index d8b887576..fcea278d7 100644
--- a/test/subtitle_metadata_test.cc
+++ b/test/subtitle_metadata_test.cc
@@ -50,6 +50,6 @@ BOOST_AUTO_TEST_CASE (subtitle_metadata_test1)
auto langs = film->open_text_languages();
BOOST_REQUIRE (langs.first);
- BOOST_CHECK_EQUAL (langs.first->to_string(), "de-DE");
+ BOOST_CHECK_EQUAL(langs.first->as_string(), "de-DE");
}
diff --git a/test/vf_test.cc b/test/vf_test.cc
index cb5116910..2b59b68ba 100644
--- a/test/vf_test.cc
+++ b/test/vf_test.cc
@@ -59,6 +59,7 @@ using std::make_shared;
using std::shared_ptr;
using std::string;
using std::vector;
+using boost::optional;
using namespace dcpomatic;
@@ -465,7 +466,7 @@ BOOST_AUTO_TEST_CASE(test_referencing_ov_with_missing_subtitle_in_some_reels)
42, 1, dcp::Time(0, 0, 5, 0, 24), dcp::Time(0, 0, 9, 0, 24),
0, dcp::HAlign::CENTER,
0, dcp::VAlign::CENTER,
- 0, dcp::Direction::LTR,
+ 0, vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR,
"Hello",
dcp::Effect::NONE, dcp::Colour(0, 0, 0),
dcp::Time{}, dcp::Time{},