summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-10-14 21:48:25 +0200
committerCarl Hetherington <cth@carlh.net>2023-10-15 09:10:18 +0200
commit3c802dd6d1451c2c8a7e188f8379738d72e907eb (patch)
tree454396cf5451535b8708a0c4961c7d5c2b30ea1f /test
parent1bfe44b1503fb0f5cffda135076709014337de52 (diff)
Fix DCP content font ID allocation to cope with DCPs that have multiple fonts
with the same name in the same reel (#2600). Previously we had this id_for_font_in_reel() which would give an ID of N_font-ID. This means we got duplicate font IDs. Here we replace that method with FontAllocator, which gives an ID of N_font-ID for the first font and M_font-ID, where M is a number higher than the highest reel index. The idea is to support the required new IDs without breaking exisiting projects. There is some documentation of how it works in doc/design/fonts
Diffstat (limited to 'test')
m---------test/data0
-rw-r--r--test/font_id_allocator_test.cc72
-rw-r--r--test/hints_test.cc5
-rw-r--r--test/vf_test.cc47
-rw-r--r--test/writer_test.cc60
-rw-r--r--test/wscript1
6 files changed, 123 insertions, 62 deletions
diff --git a/test/data b/test/data
-Subproject c0f7e2c3f702b469db8e146eb9e650f9998d18a
+Subproject c40dcfabfccce346822a662012fa86814206d6a
diff --git a/test/font_id_allocator_test.cc b/test/font_id_allocator_test.cc
new file mode 100644
index 000000000..7c93c6b78
--- /dev/null
+++ b/test/font_id_allocator_test.cc
@@ -0,0 +1,72 @@
+/*
+ Copyright (C) 2023 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "lib/font_id_allocator.h"
+#include <boost/test/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE(font_id_allocator_test_without_disambiguation)
+{
+ FontIDAllocator allocator;
+
+ /* Reel 0 has just one asset with two fonts */
+ allocator.add_font(0, "asset1", "font");
+ allocator.add_font(0, "asset1", "font2");
+
+ /* Reel 1 has two assets each with two more fonts */
+ allocator.add_font(1, "asset2", "font");
+ allocator.add_font(1, "asset2", "font2");
+ allocator.add_font(1, "asset3", "font3");
+ allocator.add_font(1, "asset3", "font4");
+
+ allocator.allocate();
+
+ BOOST_CHECK(allocator.font_id(0, "asset1", "font") == "0_font");
+ BOOST_CHECK(allocator.font_id(0, "asset1", "font2") == "0_font2");
+ BOOST_CHECK(allocator.font_id(1, "asset2", "font") == "1_font");
+ BOOST_CHECK(allocator.font_id(1, "asset2", "font2") == "1_font2");
+ BOOST_CHECK(allocator.font_id(1, "asset3", "font3") == "1_font3");
+ BOOST_CHECK(allocator.font_id(1, "asset3", "font4") == "1_font4");
+}
+
+
+BOOST_AUTO_TEST_CASE(font_id_allocator_test_with_disambiguation)
+{
+ FontIDAllocator allocator;
+
+ /* Reel 0 has two assets each with a font with the same ID (perhaps a subtitle and a ccap).
+ * This would have crashed DCP-o-matic before the FontIDAllocator change (bug #2600)
+ * so it's OK if the second font gets a new index that we didn't see before.
+ */
+ allocator.add_font(0, "asset1", "font");
+ allocator.add_font(0, "asset2", "font");
+
+ /* Reel 1 has one asset with another font */
+ allocator.add_font(1, "asset3", "font1");
+
+ allocator.allocate();
+
+ BOOST_CHECK(allocator.font_id(0, "asset1", "font") == "0_font");
+ /* This should get a prefix that is higher than any reel index */
+ BOOST_CHECK(allocator.font_id(0, "asset2", "font") == "2_font");
+ BOOST_CHECK(allocator.font_id(1, "asset3", "font1") == "1_font1");
+}
+
diff --git a/test/hints_test.cc b/test/hints_test.cc
index 0e856c4f9..a989d3aeb 100644
--- a/test/hints_test.cc
+++ b/test/hints_test.cc
@@ -193,12 +193,13 @@ BOOST_AUTO_TEST_CASE (hint_subtitle_mxf_too_big)
}
fake_font.close();
- auto content = content_factory("test/data/" + name + ".srt")[0];
+ auto content = content_factory(String::compose("test/data/%1%2.xml", name, i))[0];
content->text[0]->set_type(TextType::OPEN_SUBTITLE);
content->text[0]->set_language(dcp::LanguageTag("en-US"));
film->examine_and_add_content(content);
BOOST_REQUIRE (!wait_for_jobs());
- content->text[0]->get_font("")->set_file("build/test/hint_subtitle_mxf_too_big.ttf");
+ auto const font = content->text[0]->get_font(String::compose("font_%1", i));
+ font->set_file("build/test/hint_subtitle_mxf_too_big.ttf");
}
auto hints = get_hints (film);
diff --git a/test/vf_test.cc b/test/vf_test.cc
index ecd615d98..249f9c5b0 100644
--- a/test/vf_test.cc
+++ b/test/vf_test.cc
@@ -28,8 +28,11 @@
#include "lib/content_factory.h"
#include "lib/dcp_content.h"
#include "lib/dcp_content_type.h"
+#include "lib/examine_content_job.h"
#include "lib/ffmpeg_content.h"
#include "lib/film.h"
+#include "lib/job_manager.h"
+#include "lib/make_dcp.h"
#include "lib/player.h"
#include "lib/text_content.h"
#include "lib/referenced_reel_asset.h"
@@ -423,3 +426,47 @@ BOOST_AUTO_TEST_CASE(test_referencing_ov_with_subs_when_adding_ccaps)
std::cout << why_not << "\n";
}
+
+BOOST_AUTO_TEST_CASE(test_duplicate_font_id_in_vf)
+{
+ string const name("test_duplicate_font_id_in_vf");
+ auto subs = content_factory("test/data/15s.srt");
+ auto ov = new_test_film2(name + "_ov", subs);
+ make_and_verify_dcp(
+ ov,
+ {
+ dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE,
+ dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME,
+ dcp::VerificationNote::Code::MISSING_CPL_METADATA
+ });
+
+ auto ccaps = content_factory("test/data/15s.srt")[0];
+ auto ov_dcp = make_shared<DCPContent>(ov->dir(ov->dcp_name(false)));
+ auto vf = new_test_film2(name + "_vf", { ov_dcp, ccaps });
+ ov_dcp->set_reference_audio(true);
+ ov_dcp->set_reference_video(true);
+ ov_dcp->text[0]->set_use(true);
+ ccaps->text[0]->set_type(TextType::CLOSED_CAPTION);
+ string why_not;
+ BOOST_CHECK_MESSAGE(ov_dcp->can_reference_text(vf, TextType::OPEN_SUBTITLE, why_not), why_not);
+ ov_dcp->set_reference_text(TextType::OPEN_SUBTITLE, true);
+ vf->write_metadata();
+ make_dcp(vf, TranscodeJob::ChangedBehaviour::IGNORE);
+ BOOST_REQUIRE(!wait_for_jobs());
+
+ auto vf_dcp = make_shared<DCPContent>(vf->dir(vf->dcp_name(false)));
+
+ auto test = new_test_film2(name + "_test", { vf_dcp });
+ vf_dcp->add_ov(ov->dir(ov->dcp_name(false)));
+ JobManager::instance()->add(make_shared<ExamineContentJob>(test, vf_dcp));
+ BOOST_CHECK(!wait_for_jobs());
+
+ make_and_verify_dcp(
+ test,
+ {
+ dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE,
+ dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME,
+ dcp::VerificationNote::Code::MISSING_CPL_METADATA,
+ });
+}
+
diff --git a/test/writer_test.cc b/test/writer_test.cc
index d5cafe1fb..7b2a2db00 100644
--- a/test/writer_test.cc
+++ b/test/writer_test.cc
@@ -101,63 +101,3 @@ BOOST_AUTO_TEST_CASE (interrupt_writer)
dcpomatic_sleep_seconds (1);
cl.run ();
}
-
-
-BOOST_AUTO_TEST_CASE (writer_disambiguate_font_ids1)
-{
- auto film = new_test_film2("writer_disambiguate_font_ids1", {});
- Writer writer(film, {});
-
- auto fonts = vector<shared_ptr<dcpomatic::Font>> {
- make_shared<dcpomatic::Font>("a"),
- make_shared<dcpomatic::Font>("b"),
- make_shared<dcpomatic::Font>("c")
- };
-
- writer.write(fonts);
-
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[0]), "a");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[1]), "b");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[2]), "c");
-}
-
-
-BOOST_AUTO_TEST_CASE (writer_disambiguate_font_ids2)
-{
- auto film = new_test_film2("writer_disambiguate_font_ids2", {});
- Writer writer(film, {});
-
- auto fonts = vector<shared_ptr<dcpomatic::Font>> {
- make_shared<dcpomatic::Font>("a"),
- make_shared<dcpomatic::Font>("a"),
- make_shared<dcpomatic::Font>("a")
- };
-
- writer.write(fonts);
-
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[0]), "a");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[1]), "a_0");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[2]), "a_1");
-}
-
-
-BOOST_AUTO_TEST_CASE (writer_disambiguate_font_ids3)
-{
- auto film = new_test_film2("writer_disambiguate_font_ids3", {});
- Writer writer(film, {});
-
- auto fonts = vector<shared_ptr<dcpomatic::Font>> {
- make_shared<dcpomatic::Font>("a_2"),
- make_shared<dcpomatic::Font>("a_1"),
- make_shared<dcpomatic::Font>("a_1"),
- make_shared<dcpomatic::Font>("b")
- };
-
- writer.write(fonts);
-
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[1]), "a_1");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[0]), "a_2");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[2]), "a_3");
- BOOST_CHECK_EQUAL(writer._fonts.get(fonts[3]), "b");
-}
-
diff --git a/test/wscript b/test/wscript
index f40568e3c..0c9db3889 100644
--- a/test/wscript
+++ b/test/wscript
@@ -99,6 +99,7 @@ def build(bld):
film_metadata_test.cc
find_missing_test.cc
font_comparator_test.cc
+ font_id_allocator_test.cc
frame_interval_checker_test.cc
frame_rate_test.cc
guess_crop_test.cc