From 11cc2c64b148201fbf962c68c21af9f5f706c257 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 16 Dec 2022 00:19:00 +0100 Subject: [PATCH] Make sure main picture active area values are even (#2392). --- src/lib/writer.cc | 4 ++-- src/wx/verify_dcp_dialog.cc | 3 +++ test/dcp_metadata_test.cc | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 2dd46f0b2..2e732c280 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -676,8 +676,8 @@ Writer::finish (boost::filesystem::path output_dcp) auto active_area = film()->active_area(); if (active_area.width > 0 && active_area.height > 0) { - /* It's not allowed to have a zero active area width or height */ - cpl->set_main_picture_active_area (active_area); + /* It's not allowed to have a zero active area width or height, and the sizes must be multiples of 2 */ + cpl->set_main_picture_active_area({ active_area.width & ~1, active_area.height & ~1}); } auto sl = film()->subtitle_languages().second; diff --git a/src/wx/verify_dcp_dialog.cc b/src/wx/verify_dcp_dialog.cc index bb51baeac..bd36334cd 100644 --- a/src/wx/verify_dcp_dialog.cc +++ b/src/wx/verify_dcp_dialog.cc @@ -380,6 +380,9 @@ VerifyDCPDialog::VerifyDCPDialog (wxWindow* parent, shared_ptr job case dcp::VerificationNote::Code::INVALID_CONTENT_KIND: add(i, _("An invalid %n has been used.")); break; + case dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA: + add(i, _("The is either not a multiple of 2, or is bigger than an asset.")); + break; } } diff --git a/test/dcp_metadata_test.cc b/test/dcp_metadata_test.cc index 8d410e13d..dd81a4161 100644 --- a/test/dcp_metadata_test.cc +++ b/test/dcp_metadata_test.cc @@ -50,3 +50,22 @@ BOOST_AUTO_TEST_CASE (dcp_metadata_test) BOOST_CHECK_EQUAL (cpls[0]->issuer(), "this is the issuer"); } + +BOOST_AUTO_TEST_CASE(main_picture_active_area_test) +{ + auto content = content_factory(TestPaths::private_data() / "bbc405.png"); + auto film = new_test_film2("main_picture_active_area_test", content); + film->set_resolution(Resolution::FOUR_K); + film->set_interop(false); + + make_and_verify_dcp(film, { dcp::VerificationNote::Code::MISSING_CPL_METADATA }); + + dcp::DCP dcp(film->dir(film->dcp_name())); + dcp.read(); + auto cpls = dcp.cpls(); + BOOST_REQUIRE_EQUAL(cpls.size(), 1U); + + BOOST_REQUIRE(static_cast(cpls[0]->main_picture_active_area())); + BOOST_REQUIRE(cpls[0]->main_picture_active_area() == dcp::Size(2866, 2160)); +} + -- 2.30.2