X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Freels_test.cc;h=7fbf77f74c41423fae4f6ba6ffd5e040c5c60dc8;hb=ce73eaf7875a9a3326afcd839ad85eb95879c160;hp=a37e14067c8eff7612f37f7f6d62409198cb3f69;hpb=3b78e9223c9be784531475acacb88b59b2459f48;p=dcpomatic.git diff --git a/test/reels_test.cc b/test/reels_test.cc index a37e14067..7fbf77f74 100644 --- a/test/reels_test.cc +++ b/test/reels_test.cc @@ -25,27 +25,32 @@ */ -#include "lib/film.h" -#include "lib/ratio.h" +#include "lib/content_factory.h" +#include "lib/dcp_content.h" +#include "lib/dcp_content_type.h" #include "lib/ffmpeg_content.h" +#include "lib/film.h" #include "lib/image_content.h" -#include "lib/dcp_content_type.h" -#include "lib/dcp_content.h" -#include "lib/video_content.h" +#include "lib/make_dcp.h" +#include "lib/ratio.h" #include "lib/string_text_file_content.h" -#include "lib/content_factory.h" +#include "lib/video_content.h" #include "test.h" +#include +#include +#include +#include #include #include -using std::list; using std::cout; -using std::vector; -using std::string; -using std::shared_ptr; +using std::function; +using std::list; using std::make_shared; -using boost::function; +using std::shared_ptr; +using std::string; +using std::vector; using namespace dcpomatic; @@ -105,21 +110,21 @@ BOOST_AUTO_TEST_CASE (reels_test2) film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST")); { - shared_ptr c (new ImageContent("test/data/flat_red.png")); + auto c = make_shared("test/data/flat_red.png"); film->examine_and_add_content (c); BOOST_REQUIRE (!wait_for_jobs()); c->video->set_length (24); } { - shared_ptr c (new ImageContent("test/data/flat_green.png")); + auto c = make_shared("test/data/flat_green.png"); film->examine_and_add_content (c); BOOST_REQUIRE (!wait_for_jobs()); c->video->set_length (24); } { - shared_ptr c (new ImageContent("test/data/flat_blue.png")); + auto c = make_shared("test/data/flat_blue.png"); film->examine_and_add_content (c); BOOST_REQUIRE (!wait_for_jobs()); c->video->set_length (24); @@ -195,7 +200,7 @@ BOOST_AUTO_TEST_CASE (reels_test4) /* 4 piece of 1s-long content */ shared_ptr content[4]; for (int i = 0; i < 4; ++i) { - content[i].reset (new ImageContent("test/data/flat_green.png")); + content[i] = make_shared("test/data/flat_green.png"); film->examine_and_add_content (content[i]); BOOST_REQUIRE (!wait_for_jobs()); content[i]->video->set_length (24); @@ -235,6 +240,7 @@ BOOST_AUTO_TEST_CASE (reels_test4) BOOST_AUTO_TEST_CASE (reels_test5) { auto dcp = make_shared("test/data/reels_test4"); + dcp->check_font_ids(); auto film = new_test_film2 ("reels_test5", {dcp}); film->set_sequence (false); @@ -252,7 +258,7 @@ BOOST_AUTO_TEST_CASE (reels_test5) } { - dcp->set_trim_start (ContentTime::from_seconds (0.5)); + dcp->set_trim_start(film, ContentTime::from_seconds(0.5)); auto p = dcp->reels (film); BOOST_REQUIRE_EQUAL (p.size(), 4U); auto i = p.begin(); @@ -274,7 +280,7 @@ BOOST_AUTO_TEST_CASE (reels_test5) } { - dcp->set_trim_start (ContentTime::from_seconds (1.5)); + dcp->set_trim_start(film, ContentTime::from_seconds(1.5)); auto p = dcp->reels (film); BOOST_REQUIRE_EQUAL (p.size(), 3U); auto i = p.begin(); @@ -309,8 +315,8 @@ BOOST_AUTO_TEST_CASE (reels_test6) */ BOOST_AUTO_TEST_CASE (reels_test7) { - auto A = content_factory("test/data/flat_red.png").front(); - auto B = content_factory("test/data/awkward_length.wav").front(); + auto A = content_factory("test/data/flat_red.png")[0]; + auto B = content_factory("test/data/awkward_length.wav")[0]; auto film = new_test_film2 ("reels_test7", { A, B }); film->set_video_frame_rate (24); A->video->set_length (2 * 24); @@ -345,7 +351,7 @@ BOOST_AUTO_TEST_CASE (reels_test9) make_and_verify_dcp (film); auto B = make_shared(film->dir(film->dcp_name())); - auto film2 = new_test_film2("reels_test9b", {B, content_factory("test/data/dcp_sub4.xml").front()}); + auto film2 = new_test_film2("reels_test9b", {B, content_factory("test/data/dcp_sub4.xml")[0]}); B->set_reference_video(true); B->set_reference_audio(true); film2->set_reel_type(ReelType::BY_VIDEO_CONTENT); @@ -380,7 +386,7 @@ BOOST_AUTO_TEST_CASE (reels_test10) /* Now try to make the VF; this used to fail */ auto ov_dcp = make_shared(ov->dir(ov->dcp_name())); - auto vf = new_test_film2("reels_test10_vf", {ov_dcp, content_factory("test/data/15s.srt").front()}); + auto vf = new_test_film2("reels_test10_vf", {ov_dcp, content_factory("test/data/15s.srt")[0]}); vf->set_reel_type (ReelType::BY_VIDEO_CONTENT); ov_dcp->set_reference_video (true); ov_dcp->set_reference_audio (true); @@ -405,7 +411,7 @@ BOOST_AUTO_TEST_CASE (reels_test11) auto film = new_test_film2 ("reels_test11", {A}); film->set_video_frame_rate (24); A->video->set_length (240); - A->set_video_frame_rate (24); + A->set_video_frame_rate(film, 24); A->set_position (film, DCPTime::from_seconds(1)); film->set_reel_type (ReelType::BY_VIDEO_CONTENT); make_and_verify_dcp (film); @@ -434,11 +440,11 @@ BOOST_AUTO_TEST_CASE (reels_test12) film->set_sequence (false); A->video->set_length (240); - A->set_video_frame_rate (24); + A->set_video_frame_rate(film, 24); A->set_position (film, DCPTime::from_seconds(1)); B->video->set_length (120); - B->set_video_frame_rate (24); + B->set_video_frame_rate(film, 24); B->set_position (film, DCPTime::from_seconds(14)); auto r = film->reels (); @@ -564,7 +570,7 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short4) BOOST_CHECK (film->reels().front() == dcpomatic::DCPTimePeriod(dcpomatic::DCPTime(), dcpomatic::DCPTime::from_frames(263, 24))); film->write_metadata (); - film->make_dcp (); + make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE); BOOST_REQUIRE (!wait_for_jobs()); vector dirs = { film->dir(film->dcp_name(false)) }; @@ -573,3 +579,72 @@ BOOST_AUTO_TEST_CASE (reels_should_not_be_short4) BOOST_REQUIRE (notes.empty()); } + +/** Create a long DCP A then insert it repeatedly into a new project, trimming it differently each time. + * Make a DCP B from that project which refers to A and splits into reels. This was found to go wrong + * when looking at #2268. + */ +BOOST_AUTO_TEST_CASE (repeated_dcp_into_reels) +{ + /* Make a 20s DCP */ + auto A = make_shared("test/data/flat_red.png"); + auto film1 = new_test_film2("repeated_dcp_into_reels1", { A }); + auto constexpr frame_rate = 24; + auto constexpr length_in_seconds = 20; + auto constexpr total_frames = frame_rate * length_in_seconds; + film1->set_video_frame_rate(frame_rate); + A->video->set_length(total_frames); + make_and_verify_dcp(film1); + + /* Make a new project that includes this long DCP 4 times, each + * trimmed to a quarter of the original, i.e. + * /----------------------|----------------------|----------------------|----------------------\ + * | 1st quarter of film1 | 2nd quarter of film1 | 3rd quarter of film1 | 4th quarter of film1 | + * \----------------------|----------------------|----------------------|_---------------------/ + */ + + shared_ptr original_dcp[4] = { + make_shared(film1->dir(film1->dcp_name(false))), + make_shared(film1->dir(film1->dcp_name(false))), + make_shared(film1->dir(film1->dcp_name(false))), + make_shared(film1->dir(film1->dcp_name(false))) + }; + + auto film2 = new_test_film2("repeated_dcp_into_reels2", { original_dcp[0], original_dcp[1], original_dcp[2], original_dcp[3] }); + film2->set_reel_type(ReelType::BY_VIDEO_CONTENT); + film2->set_video_frame_rate(frame_rate); + film2->set_sequence(false); + + for (int i = 0; i < 4; ++i) { + original_dcp[i]->set_position(film2, DCPTime::from_frames(total_frames * i / 4, frame_rate)); + original_dcp[i]->set_trim_start(film2, ContentTime::from_frames(total_frames * i / 4, frame_rate)); + original_dcp[i]->set_trim_end (ContentTime::from_frames(total_frames * (4 - i - 1) / 4, frame_rate)); + original_dcp[i]->set_reference_video(true); + original_dcp[i]->set_reference_audio(true); + } + + make_and_verify_dcp(film2, { dcp::VerificationNote::Code::EXTERNAL_ASSET }); + + dcp::DCP check1(film1->dir(film1->dcp_name())); + check1.read(); + BOOST_REQUIRE(!check1.cpls().empty()); + BOOST_REQUIRE(!check1.cpls()[0]->reels().empty()); + auto picture = check1.cpls()[0]->reels()[0]->main_picture()->asset(); + BOOST_REQUIRE(picture); + auto sound = check1.cpls()[0]->reels()[0]->main_sound()->asset(); + BOOST_REQUIRE(sound); + + dcp::DCP check2(film2->dir(film2->dcp_name())); + check2.read(); + BOOST_REQUIRE(!check2.cpls().empty()); + auto cpl = check2.cpls()[0]; + BOOST_REQUIRE_EQUAL(cpl->reels().size(), 4U); + for (int i = 0; i < 4; ++i) { + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_picture()->entry_point().get_value_or(0), total_frames * i / 4); + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_picture()->duration().get_value_or(0), total_frames / 4); + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_picture()->id(), picture->id()); + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_sound()->entry_point().get_value_or(0), total_frames * i / 4); + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_sound()->duration().get_value_or(0), total_frames / 4); + BOOST_REQUIRE_EQUAL(cpl->reels()[i]->main_sound()->id(), sound->id()); + } +}