summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/audio_mapping_test.cc64
-rw-r--r--test/film_test.cc21
-rw-r--r--test/memory_util_test.cc72
-rw-r--r--test/vf_test.cc96
-rw-r--r--test/wscript1
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