X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Freels_test.cc;h=5bee4a81918462bb45b3c26d260bd4698b04669d;hb=8b9888ed8247109dc3c09492302e865fa4731460;hp=5bb119f463965ec81d6fe204ba8b0cde17acf685;hpb=8963f0007af1a312017b9627c18b82ec2a577591;p=dcpomatic.git diff --git a/test/reels_test.cc b/test/reels_test.cc index 5bb119f46..5bee4a819 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::make_shared; using std::function; +using std::list; +using std::make_shared; +using std::shared_ptr; +using std::string; +using std::vector; using namespace dcpomatic; @@ -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); @@ -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(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()); + } +}