From da5e64883d7665353fcf838f6956f2dfb6e8b176 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 19 May 2020 13:17:10 +0200 Subject: [PATCH] Fix enabled/disable overlapping video/audio with DCP content (part of #1355) --- src/lib/dcp_content.cc | 4 +- src/lib/player.cc | 4 + test/no_use_video_test.cc | 159 ++++++++++++++++++++++++++++++++++++++ test/wscript | 1 + 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 test/no_use_video_test.cc diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 4280ad13a..ca210b558 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -610,7 +610,7 @@ DCPContent::can_reference (shared_ptr film, function c) { - return static_cast(c->video); + return static_cast(c->video) && c->video->use(); } bool @@ -643,7 +643,7 @@ DCPContent::can_reference_video (shared_ptr film, string& why_not) c static bool check_audio (shared_ptr c) { - return static_cast(c->audio); + return static_cast(c->audio) && !c->audio->mapping().mapped_output_channels().empty(); } bool diff --git a/src/lib/player.cc b/src/lib/player.cc index d2e5ed521..fc821d6c7 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -795,6 +795,10 @@ Player::video (weak_ptr wp, ContentVideo video) return; } + if (!piece->content->video->use()) { + return; + } + FrameRateChange frc (_film, piece->content); if (frc.skip && (video.frame % 2) == 1) { return; diff --git a/test/no_use_video_test.cc b/test/no_use_video_test.cc new file mode 100644 index 000000000..2577f935b --- /dev/null +++ b/test/no_use_video_test.cc @@ -0,0 +1,159 @@ +/* + Copyright (C) 2020 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 . + +*/ + + +/** @file test/test_no_use_video.cc + * @brief Test some cases where the video parts of inputs are ignored, to + * check that the right DCPs are made. + * @ingroup completedcp + */ + + +#include "lib/audio_content.h" +#include "lib/content.h" +#include "lib/content_factory.h" +#include "lib/film.h" +#include "lib/dcp_content.h" +#include "lib/video_content.h" +#include "test.h" +#include +#include +#include +#include +#include +#include + + +using boost::dynamic_pointer_cast; +using boost::shared_ptr; + + +/** Overlay two video-only bits of content, don't use the video on one and + * make sure the other one is in the DCP. + */ +BOOST_AUTO_TEST_CASE (no_use_video_test1) +{ + shared_ptr film = new_test_film2 ("no_use_video_test1"); + shared_ptr A = content_factory ("test/data/flat_red.png").front(); + shared_ptr B = content_factory ("test/data/flat_green.png").front(); + film->examine_and_add_content (A); + film->examine_and_add_content (B); + BOOST_REQUIRE (!wait_for_jobs()); + + A->set_position (film, dcpomatic::DCPTime()); + B->set_position (film, dcpomatic::DCPTime()); + A->video->set_use (false); + + film->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + check_dcp ("test/data/no_use_video_test1", film); +} + + +/** Overlay two muxed sources and disable the video on one */ +BOOST_AUTO_TEST_CASE (no_use_video_test2) +{ + shared_ptr film = new_test_film2 ("no_use_video_test2"); + shared_ptr A = content_factory (TestPaths::private_data / "dolby_aurora.vob").front(); + shared_ptr B = content_factory (TestPaths::private_data / "big_buck_bunny_trailer_480p.mov").front(); + film->examine_and_add_content (A); + film->examine_and_add_content (B); + BOOST_REQUIRE (!wait_for_jobs()); + + A->set_position (film, dcpomatic::DCPTime()); + B->set_position (film, dcpomatic::DCPTime()); + A->video->set_use (false); + + film->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + check_dcp ("test/data/no_use_video_test2", film); +} + + +/** Make two DCPs and make a VF with the audio from one and the video from another */ +BOOST_AUTO_TEST_CASE (no_use_video_test3) +{ + shared_ptr ov_a = new_test_film2 ("no_use_video_test3_ov_a"); + shared_ptr ov_a_pic = content_factory ("test/data/flat_red.png").front(); + BOOST_REQUIRE (ov_a_pic); + shared_ptr ov_a_snd = content_factory ("test/data/sine_16_48_220_10.wav").front(); + BOOST_REQUIRE (ov_a_snd); + ov_a->examine_and_add_content (ov_a_pic); + ov_a->examine_and_add_content (ov_a_snd); + BOOST_REQUIRE (!wait_for_jobs()); + ov_a->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + shared_ptr ov_b = new_test_film2 ("no_use_video_test3_ov_b"); + shared_ptr ov_b_pic = content_factory ("test/data/flat_green.png").front(); + BOOST_REQUIRE (ov_b_pic); + shared_ptr ov_b_snd = content_factory ("test/data/sine_16_48_880_10.wav").front(); + BOOST_REQUIRE (ov_b_snd); + ov_b->examine_and_add_content (ov_b_pic); + ov_b->examine_and_add_content (ov_b_snd); + BOOST_REQUIRE (!wait_for_jobs()); + ov_b->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + shared_ptr vf = new_test_film2 ("no_use_video_test3_vf"); + shared_ptr A (new DCPContent(ov_a->dir(ov_a->dcp_name()))); + shared_ptr B (new DCPContent(ov_b->dir(ov_b->dcp_name()))); + vf->examine_and_add_content (A); + vf->examine_and_add_content (B); + BOOST_REQUIRE (!wait_for_jobs()); + + A->set_position (vf, dcpomatic::DCPTime()); + A->video->set_use (false); + B->set_position (vf, dcpomatic::DCPTime()); + AudioMapping mapping (16, 16); + mapping.make_zero (); + B->audio->set_mapping(mapping); + + A->set_reference_audio (true); + B->set_reference_video (true); + + vf->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + dcp::DCP ov_a_check (ov_a->dir(ov_a->dcp_name())); + ov_a_check.read (); + BOOST_REQUIRE_EQUAL (ov_a_check.cpls().size(), 1); + BOOST_REQUIRE_EQUAL (ov_a_check.cpls().front()->reels().size(), 1); + shared_ptr ov_a_reel (ov_a_check.cpls().front()->reels().front()); + + dcp::DCP ov_b_check (ov_b->dir(ov_b->dcp_name())); + ov_b_check.read (); + BOOST_REQUIRE_EQUAL (ov_b_check.cpls().size(), 1); + BOOST_REQUIRE_EQUAL (ov_b_check.cpls().front()->reels().size(), 1); + shared_ptr ov_b_reel (ov_b_check.cpls().front()->reels().front()); + + dcp::DCP vf_check (vf->dir(vf->dcp_name())); + vf_check.read (); + BOOST_REQUIRE_EQUAL (vf_check.cpls().size(), 1); + BOOST_REQUIRE_EQUAL (vf_check.cpls().front()->reels().size(), 1); + shared_ptr vf_reel (vf_check.cpls().front()->reels().front()); + + BOOST_CHECK_EQUAL (vf_reel->main_picture()->asset_ref().id(), ov_b_reel->main_picture()->asset_ref().id()); + BOOST_CHECK_EQUAL (vf_reel->main_sound()->asset_ref().id(), ov_a_reel->main_sound()->asset_ref().id()); +} + + diff --git a/test/wscript b/test/wscript index 1c3d750c3..9c67eacc4 100644 --- a/test/wscript +++ b/test/wscript @@ -94,6 +94,7 @@ def build(bld): job_test.cc kdm_naming_test.cc make_black_test.cc + no_use_video_test.cc optimise_stills_test.cc pixel_formats_test.cc player_test.cc -- 2.30.2