diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-10-14 21:48:25 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-10-15 09:10:18 +0200 |
| commit | 3c802dd6d1451c2c8a7e188f8379738d72e907eb (patch) | |
| tree | 454396cf5451535b8708a0c4961c7d5c2b30ea1f /test | |
| parent | 1bfe44b1503fb0f5cffda135076709014337de52 (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/data | 0 | ||||
| -rw-r--r-- | test/font_id_allocator_test.cc | 72 | ||||
| -rw-r--r-- | test/hints_test.cc | 5 | ||||
| -rw-r--r-- | test/vf_test.cc | 47 | ||||
| -rw-r--r-- | test/writer_test.cc | 60 | ||||
| -rw-r--r-- | test/wscript | 1 |
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 |
