diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/audio_mapping_test.cc | 64 | ||||
| -rw-r--r-- | test/film_test.cc | 21 | ||||
| -rw-r--r-- | test/memory_util_test.cc | 72 | ||||
| -rw-r--r-- | test/vf_test.cc | 96 | ||||
| -rw-r--r-- | test/wscript | 1 |
5 files changed, 222 insertions, 32 deletions
diff --git a/test/audio_mapping_test.cc b/test/audio_mapping_test.cc index dfde022a0..9bc5bcf5f 100644 --- a/test/audio_mapping_test.cc +++ b/test/audio_mapping_test.cc @@ -36,71 +36,71 @@ using std::string; using boost::optional; -BOOST_AUTO_TEST_CASE (audio_mapping_test) +BOOST_AUTO_TEST_CASE(audio_mapping_test) { AudioMapping none; - BOOST_CHECK_EQUAL (none.input_channels(), 0); + BOOST_CHECK_EQUAL(none.input_channels(), 0); - AudioMapping four (4, MAX_DCP_AUDIO_CHANNELS); - BOOST_CHECK_EQUAL (four.input_channels(), 4); + AudioMapping four(4, MAX_DCP_AUDIO_CHANNELS); + BOOST_CHECK_EQUAL(four.input_channels(), 4); - four.set (0, 1, 1); + four.set(0, 1, 1); for (int i = 0; i < 4; ++i) { for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) { - BOOST_CHECK_EQUAL (four.get(i, j), (i == 0 && j == 1) ? 1 : 0); + BOOST_CHECK_EQUAL(four.get(i, j), (i == 0 && j == 1) ? 1 : 0); } } - auto mapped = four.mapped_output_channels (); - BOOST_CHECK_EQUAL (mapped.size(), 1U); - BOOST_CHECK_EQUAL (mapped.front(), 1); + auto mapped = four.mapped_output_channels(); + BOOST_CHECK_EQUAL(mapped.size(), 1U); + BOOST_CHECK_EQUAL(mapped.front(), 1); - four.make_zero (); + four.make_zero(); for (int i = 0; i < 4; ++i) { for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) { - BOOST_CHECK_EQUAL (four.get (i, j), 0); + BOOST_CHECK_EQUAL(four.get(i, j), 0); } } } static void -guess_check (boost::filesystem::path filename, int output_channel) +guess_check(boost::filesystem::path filename, dcp::Channel output_channel) { - AudioMapping m (1, 8); - m.make_default (0, filename); - for (int i = 0; i < 8; ++i) { + AudioMapping m(1, 12); + m.make_default(0, filename); + for (int i = 0; i < 12; ++i) { BOOST_TEST_INFO(fmt::format("{} channel {}", filename.string(), i)); - BOOST_CHECK_CLOSE (m.get(0, i), i == output_channel ? 1 : 0, 0.01); + BOOST_CHECK_CLOSE(m.get(0, i), i == static_cast<int>(output_channel) ? 1 : 0, 0.01); } } -BOOST_AUTO_TEST_CASE (audio_mapping_guess_test) +BOOST_AUTO_TEST_CASE(audio_mapping_guess_test) { - guess_check ("stuff_L_nonsense.wav", 0); - guess_check ("stuff_nonsense.wav", 2); - guess_check ("fred_R.wav", 1); - guess_check ("jim_C_sheila.aiff", 2); - guess_check ("things_Lfe_and.wav", 3); - guess_check ("weeee_Ls.aiff", 4); - guess_check ("try_Rs-it.wav", 5); + guess_check("stuff_L_nonsense.wav", dcp::Channel::LEFT); + guess_check("stuff_nonsense.wav", dcp::Channel::CENTRE); + guess_check("fred_R.wav", dcp::Channel::RIGHT); + guess_check("jim_C_sheila.aiff", dcp::Channel::CENTRE); + guess_check("things_Lfe_and.wav", dcp::Channel::LFE); + guess_check("weeee_Ls.aiff", dcp::Channel::LS); + guess_check("try_Rs-it.wav", dcp::Channel::RS); /* PT-style */ - guess_check ("things_LFE.wav", 3); - guess_check ("ptish_Lsr_abc.wav", 6); - guess_check ("ptish_Rsr_abc.wav", 7); - guess_check ("more_Lss_s.wav", 4); - guess_check ("other_Rss.aiff", 5); + guess_check("things_LFE.wav", dcp::Channel::LFE); + guess_check("ptish_Lsr_abc.wav", dcp::Channel::BSL); + guess_check("ptish_Rsr_abc.wav", dcp::Channel::BSR); + guess_check("more_Lss_s.wav", dcp::Channel::LS); + guess_check("other_Rss.aiff", dcp::Channel::RS); /* Only the filename should be taken into account */ - guess_check ("-Lfe-/foo_L.wav", 0); + guess_check("-Lfe-/foo_L.wav", dcp::Channel::LEFT); /* Dolby-style */ - guess_check ("jake-Lrs-good.wav", 6); - guess_check ("elwood-Rrs-good.wav", 7); + guess_check("jake-Lrs-good.wav", dcp::Channel::BSL); + guess_check("elwood-Rrs-good.wav", dcp::Channel::BSR); } diff --git a/test/film_test.cc b/test/film_test.cc index 5ce195637..9949fd7d6 100644 --- a/test/film_test.cc +++ b/test/film_test.cc @@ -86,3 +86,24 @@ BOOST_AUTO_TEST_CASE(film_possible_reel_types_test2) BOOST_CHECK_EQUAL(film->possible_reel_types().size(), 2U); } + +BOOST_AUTO_TEST_CASE(film_copy_remembered_assets_test) +{ + dcp::filesystem::remove_all("build/test/film_copy_remembered_assets_test2"); + + auto content = content_factory("test/data/flat_red.png")[0]; + auto film = new_test_film("film_copy_remembered_assets_test", { content }); + make_and_verify_dcp(film); + + auto copy = make_shared<Film>(boost::filesystem::path("build/test/film_copy_remembered_assets_test2")); + copy->copy_from(film, [](float) {}); + + auto remembered = copy->read_remembered_assets(); + BOOST_REQUIRE_EQUAL(remembered.size(), 1U); + auto path = find_asset(remembered, *copy->directory(), dcpomatic::DCPTimePeriod({}, dcpomatic::DCPTime::from_seconds(10)), film->video_identifier()); + BOOST_CHECK(path.has_value()); + + for (auto path: dcp::filesystem::directory_iterator(film->dir("info"))) { + check_file(path.path(), copy->dir("info") / path.path().filename()); + } +} diff --git a/test/memory_util_test.cc b/test/memory_util_test.cc new file mode 100644 index 000000000..43dedb5ce --- /dev/null +++ b/test/memory_util_test.cc @@ -0,0 +1,72 @@ +/* + Copyright (C) 2026 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/memory_util.h" +#include <boost/test/unit_test.hpp> + + +void check(void* p, int size, uint64_t value) +{ + uint8_t* up = reinterpret_cast<uint8_t*>(p); + for (int i = 0; i < size; ++i) { + BOOST_CHECK_EQUAL(*up++, (value >> (i * 8)) & 0xff); + } +} + + +/** Aligned, multiple of 64 size */ +BOOST_AUTO_TEST_CASE(fill_memory_test1) +{ + int constexpr size = 256; + auto memory = wrapped_av_malloc(size); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + + +/** Aligned, extra bytes at the end */ +BOOST_AUTO_TEST_CASE(fill_memory_test2) +{ + int constexpr size = 259; + + auto memory = wrapped_av_malloc(size); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + + +/** Non-aligned, extra bytes at start and end */ +BOOST_AUTO_TEST_CASE(fill_memory_test3) +{ + int constexpr size = 265; + + auto memory = wrapped_av_malloc(size + 512); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + memory = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(memory) + 3); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + diff --git a/test/vf_test.cc b/test/vf_test.cc index 9c7ff65be..29b9913fd 100644 --- a/test/vf_test.cc +++ b/test/vf_test.cc @@ -592,3 +592,99 @@ BOOST_AUTO_TEST_CASE(vf_subs_get_font_from_ov) auto vf_font = find_file(*font_dir, "font"); check_file("test/data/Inconsolata-VF.ttf", vf_font); } + + +/** CCAPs in OVs would not correctly be referred to as we'd incorrectly create an + * empty filler CCAP asset. + */ +BOOST_AUTO_TEST_CASE(vf_referring_to_ov_ccap_test) +{ + auto picture = content_factory("test/data/flat_red.png")[0]; + auto ccap = content_factory("test/data/short.srt")[0]; + auto ov = new_test_film("vf_referring_to_ov_ccap_test_ov", { picture, ccap }); + ccap->only_text()->set_use(true); + ccap->only_text()->set_type(TextType::CLOSED_CAPTION); + ccap->only_text()->set_dcp_track(DCPTextTrack("First track", dcp::LanguageTag("fr"))); + make_and_verify_dcp(ov, { dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); + + auto ov_dcp = make_shared<DCPContent>(ov->dir(ov->dcp_name())); + auto subs = content_factory("test/data/short.srt")[0]; + auto vf = new_test_film("vf_referring_to_ov_ccap_test_vf", { ov_dcp, subs }); + vf->set_reel_type(ReelType::BY_VIDEO_CONTENT); + ov_dcp->set_reference_video(true); + ov_dcp->set_reference_audio(true); + ov_dcp->set_reference_text(TextType::CLOSED_CAPTION, true); + subs->only_text()->set_use(true); + subs->only_text()->set_type(TextType::OPEN_SUBTITLE); + subs->set_position(vf, dcpomatic::DCPTime()); + vf->write_metadata(); + make_dcp(vf, TranscodeJob::ChangedBehaviour::IGNORE); + BOOST_REQUIRE(!wait_for_jobs()); + + dcp::DCP ov_check(ov->dir(ov->dcp_name())); + ov_check.read(); + dcp::DCP vf_check(vf->dir(vf->dcp_name())); + vf_check.read(); + + BOOST_REQUIRE_EQUAL(ov_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + + BOOST_CHECK_EQUAL( + ov_check.cpls()[0]->reels()[0]->closed_captions()[0]->id(), + vf_check.cpls()[0]->reels()[0]->closed_captions()[0]->id() + ); +} + + +/** Check that in a VF we can have a CCAP reel which refers to the OV and another + * which is an auto-created filler. + */ +BOOST_AUTO_TEST_CASE(ccaps_can_be_referred_and_filled_test) +{ + auto picture = content_factory("test/data/flat_red.png")[0]; + auto ccap = content_factory("test/data/short.srt")[0]; + auto ov = new_test_film("ccaps_can_be_referred_and_filled_test_ov", { picture, ccap }); + ccap->only_text()->set_use(true); + ccap->only_text()->set_type(TextType::CLOSED_CAPTION); + ccap->only_text()->set_dcp_track(DCPTextTrack("First track", dcp::LanguageTag("fr"))); + make_and_verify_dcp(ov, { dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); + + auto ov_dcp = make_shared<DCPContent>(ov->dir(ov->dcp_name())); + auto subs = content_factory("test/data/short.srt")[0]; + auto vf = new_test_film("ccaps_can_be_referred_and_filled_test_vf", { ov_dcp, subs, picture }); + vf->set_reel_type(ReelType::BY_VIDEO_CONTENT); + ov_dcp->set_reference_video(true); + ov_dcp->set_reference_audio(true); + ov_dcp->set_reference_text(TextType::CLOSED_CAPTION, true); + subs->only_text()->set_use(true); + subs->only_text()->set_type(TextType::OPEN_SUBTITLE); + subs->set_position(vf, dcpomatic::DCPTime()); + vf->write_metadata(); + make_dcp(vf, TranscodeJob::ChangedBehaviour::IGNORE); + BOOST_REQUIRE(!wait_for_jobs()); + + dcp::DCP ov_check(ov->dir(ov->dcp_name())); + ov_check.read(); + dcp::DCP vf_check(vf->dir(vf->dcp_name())); + vf_check.read(); + + BOOST_REQUIRE_EQUAL(ov_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels().size(), 2U); + + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + + BOOST_CHECK_EQUAL( + ov_check.cpls()[0]->reels()[0]->closed_captions()[0]->id(), + vf_check.cpls()[0]->reels()[0]->closed_captions()[0]->id() + ); + + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[1]->closed_captions().size(), 1U); +} + diff --git a/test/wscript b/test/wscript index 341c407e7..3c8e2229a 100644 --- a/test/wscript +++ b/test/wscript @@ -136,6 +136,7 @@ def build(bld): markers_test.cc map_cli_test.cc mca_subdescriptors_test.cc + memory_util_test.cc mpeg2_dcp_test.cc no_use_video_test.cc open_caption_test.cc |
