From 34b2b0fe412332505e3d543358c9741bd068602d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 1 Mar 2023 01:26:49 +0100 Subject: Add option to limit DCP output to the "Bv2.0 profile" (#2470). I'm far from convinced about the point/sense of all these "profiles" (rather than just implementing or at least tolerating the standard) but lots of people are having problems with "QC" processes failing their DCPs with complaints related to MCASubDescriptors. It seems to make sense to have an option to turn them off - at least for now, until either the "QC" situation settles down or any bugs in DCP-o-matic are found and fixed. --- test/bv20_test.cc | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/data | 2 +- test/recover_test.cc | 6 ++-- test/wscript | 1 + 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 test/bv20_test.cc (limited to 'test') diff --git a/test/bv20_test.cc b/test/bv20_test.cc new file mode 100644 index 000000000..5530a05d0 --- /dev/null +++ b/test/bv20_test.cc @@ -0,0 +1,95 @@ +/* + Copyright (C) 2023 Carl Hetherington + + 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 . + +*/ + + +#include "lib/content_factory.h" +#include "lib/film.h" +#include "test.h" +#include +LIBDCP_DISABLE_WARNINGS +#include +LIBDCP_ENABLE_WARNINGS +#include +#include +#include + + +using std::shared_ptr; + + +bool +has_cpl_mca_subdescriptors(shared_ptr film) +{ + auto cpl = dcp::file_to_string(find_file(film->dir(film->dcp_name()), "cpl_")); + return cpl.find("MCASubDescriptors") != std::string::npos; +} + + +bool +has_mxf_mca_subdescriptors(shared_ptr film) +{ + /* One day hopefully libdcp will read these descriptors and we can find out from the SoundAsset + * whether they exist. + */ + + ASDCP::PCM::MXFReader reader; + auto r = reader.OpenRead(find_file(film->dir(film->dcp_name()), "pcm_").string()); + BOOST_REQUIRE(!ASDCP_FAILURE(r)); + + ASDCP::MXF::WaveAudioDescriptor* essence_descriptor = nullptr; + auto const rr = reader.OP1aHeader().GetMDObjectByType( + dcp::asdcp_smpte_dict->ul(ASDCP::MDD_WaveAudioDescriptor), + reinterpret_cast(&essence_descriptor) + ); + + if (!KM_SUCCESS(rr)) { + return false; + } + + return essence_descriptor->SubDescriptors.size() > 0; +} + + +BOOST_AUTO_TEST_CASE(bv21_extensions_used_when_not_limited) +{ + auto picture = content_factory("test/data/flat_red.png"); + auto sound = content_factory("test/data/sine_440.wav"); + auto film = new_test_film2("bv21_extensions_used_when_not_limited", { picture.front(), sound.front() }); + + make_and_verify_dcp(film); + + BOOST_CHECK(has_cpl_mca_subdescriptors(film)); + BOOST_CHECK(has_mxf_mca_subdescriptors(film)); +} + + +BOOST_AUTO_TEST_CASE(bv21_extensions_not_used_when_limited) +{ + auto picture = content_factory("test/data/flat_red.png"); + auto sound = content_factory("test/data/sine_440.wav"); + auto film = new_test_film2("bv21_extensions_not_used_when_limited", { picture.front(), sound.front () }); + film->set_limit_to_smpte_bv20(true); + + make_and_verify_dcp(film); + + BOOST_CHECK(!has_cpl_mca_subdescriptors(film)); + BOOST_CHECK(!has_mxf_mca_subdescriptors(film)); +} + diff --git a/test/data b/test/data index aede894d8..1bda4d6e0 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit aede894d8bf60f18915bf6f7046af05d9bfe585e +Subproject commit 1bda4d6e0a3fd9c455166aa9a6b70ac348bc83d0 diff --git a/test/recover_test.cc b/test/recover_test.cc index 0288da188..9508adca7 100644 --- a/test/recover_test.cc +++ b/test/recover_test.cc @@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE (recover_test_2d) dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE }); - boost::filesystem::path const video = "build/test/recover_test_2d/video/185_2K_02543352c540f4b083bff3f1e309d4a9_24_100000000_P_S_0_1200000.mxf"; + boost::filesystem::path const video = "build/test/recover_test_2d/video/185_2K_02543352c540f4b083bff3f1e309d4a9_24_100000000_P_S_L21_0_1200000.mxf"; boost::filesystem::copy_file ( video, "build/test/recover_test_2d/original.mxf" @@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE (recover_test_3d, * boost::unit_test::depends_on("recover_t make_and_verify_dcp (film, { dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE }); - boost::filesystem::path const video = "build/test/recover_test_3d/video/185_2K_70e6661af92ae94458784c16a21a9748_24_100000000_P_S_3D_0_96000.mxf"; + boost::filesystem::path const video = "build/test/recover_test_3d/video/185_2K_70e6661af92ae94458784c16a21a9748_24_100000000_P_S_L21_3D_0_96000.mxf"; boost::filesystem::copy_file ( video, @@ -144,7 +144,7 @@ BOOST_AUTO_TEST_CASE (recover_test_2d_encrypted, * boost::unit_test::depends_on( make_and_verify_dcp (film, { dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE }); boost::filesystem::path const video = - "build/test/recover_test_2d_encrypted/video/185_2K_02543352c540f4b083bff3f1e309d4a9_24_100000000_Eeafcb91c9f5472edf01f3a2404c57258_S_0_1200000.mxf"; + "build/test/recover_test_2d_encrypted/video/185_2K_02543352c540f4b083bff3f1e309d4a9_24_100000000_Eeafcb91c9f5472edf01f3a2404c57258_S_L21_0_1200000.mxf"; boost::filesystem::copy_file ( video, diff --git a/test/wscript b/test/wscript index 949f69019..6c85def54 100644 --- a/test/wscript +++ b/test/wscript @@ -57,6 +57,7 @@ def build(bld): audio_processor_delay_test.cc audio_ring_buffers_test.cc butler_test.cc + bv20_test.cc cinema_sound_processor_test.cc client_server_test.cc closed_caption_test.cc -- cgit v1.2.3