From c5f67166138c3849cc49f1223742343ce4b11b9f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 21 May 2019 01:47:22 +0100 Subject: [PATCH] Give an error if 2D content is set to 3D (#1565). Also run 3D tests with more parallel jobs to speed them up. Backported from 11c07c6fd98620c859c7d3dcf6a4bbf6a05e567e in v2.15.x. --- src/lib/job_manager.h | 2 ++ src/lib/video_decoder.cc | 27 ++++++++++++++++++++++----- src/lib/video_decoder.h | 5 +++-- src/wx/film_viewer.cc | 6 +++++- test/threed_test.cc | 35 +++++++++++++++++++++++++++++++---- 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h index e0b72994d..2788fc657 100644 --- a/src/lib/job_manager.h +++ b/src/lib/job_manager.h @@ -32,6 +32,7 @@ class Job; class Film; class Playlist; +struct threed_test7; extern bool wait_for_jobs (); @@ -73,6 +74,7 @@ public: private: /* This function is part of the test suite */ friend bool ::wait_for_jobs (); + friend struct threed_test7; JobManager (); ~JobManager (); diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 813320eb8..de1df727f 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -65,12 +65,28 @@ VideoDecoder::emit (shared_ptr film, shared_ptr im break; case VIDEO_FRAME_TYPE_3D: { - /* We receive the same frame index twice for 3D; hence we know which + /* We should receive the same frame index twice for 3D; hence we know which frame this one is. */ - bool const same = (_last_emitted && _last_emitted.get() == frame); - Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); - _last_emitted = frame; + bool const same = (_last_emitted_frame && _last_emitted_frame.get() == frame); + if (!same && _last_emitted_eyes && *_last_emitted_eyes == EYES_LEFT) { + /* We just got a new frame index but the last frame was left-eye; it looks like + this content is not really 3D. + */ + boost::throw_exception ( + DecodeError( + String::compose( + _("The content file %1 is set as 3D but does not appear to contain 3D images. Please set it to 2D. " + "You can still make a 3D DCP from this content by ticking the 3D option in the DCP video tab."), + _content->path(0) + ) + ) + ); + } + Eyes const eyes = same ? EYES_RIGHT : EYES_LEFT; + Data (ContentVideo (image, frame, eyes, PART_WHOLE)); + _last_emitted_frame = frame; + _last_emitted_eyes = eyes; break; } case VIDEO_FRAME_TYPE_3D_ALTERNATE: @@ -102,5 +118,6 @@ void VideoDecoder::seek () { _position = ContentTime(); - _last_emitted.reset (); + _last_emitted_frame.reset (); + _last_emitted_eyes.reset (); } diff --git a/src/lib/video_decoder.h b/src/lib/video_decoder.h index 0fc7ca5a4..ed56feea0 100644 --- a/src/lib/video_decoder.h +++ b/src/lib/video_decoder.h @@ -62,9 +62,10 @@ public: boost::signals2::signal Data; private: - /** Time of last thing to be emitted */ boost::shared_ptr _content; - boost::optional _last_emitted; + /** Frame of last thing to be emitted */ + boost::optional _last_emitted_frame; + boost::optional _last_emitted_eyes; ContentTime _position; }; diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 6d050157c..25665325d 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -234,7 +234,11 @@ FilmViewer::get () _player_video.first->eyes() != EYES_BOTH ); - _butler->rethrow (); + try { + _butler->rethrow (); + } catch (DecodeError& e) { + error_dialog (_video_view->get(), e.what()); + } display_player_video (); } diff --git a/test/threed_test.cc b/test/threed_test.cc index c749694c6..6d0524d72 100644 --- a/test/threed_test.cc +++ b/test/threed_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2016 Carl Hetherington + Copyright (C) 2013-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -23,13 +23,17 @@ * @ingroup completedcp */ -#include #include "test.h" #include "lib/film.h" #include "lib/ratio.h" +#include "lib/config.h" #include "lib/dcp_content_type.h" #include "lib/ffmpeg_content.h" #include "lib/video_content.h" +#include "lib/job_manager.h" +#include "lib/cross.h" +#include "lib/job.h" +#include #include using std::cout; @@ -103,6 +107,8 @@ BOOST_AUTO_TEST_CASE (threed_test3) BOOST_AUTO_TEST_CASE (threed_test4) { + Config::instance()->set_master_encoding_threads (8); + shared_ptr film = new_test_film2 ("threed_test4"); shared_ptr L (new FFmpegContent(private_data / "LEFT_TEST_DCP3D4K.mov")); film->examine_and_add_content (L); @@ -118,10 +124,14 @@ BOOST_AUTO_TEST_CASE (threed_test4) film->write_metadata (); BOOST_REQUIRE (!wait_for_jobs ()); + + Config::instance()->set_master_encoding_threads (8); } BOOST_AUTO_TEST_CASE (threed_test5) { + Config::instance()->set_master_encoding_threads (8); + shared_ptr film = new_test_film2 ("threed_test5"); shared_ptr L (new FFmpegContent(private_data / "boon_telly.mkv")); film->examine_and_add_content (L); @@ -137,6 +147,8 @@ BOOST_AUTO_TEST_CASE (threed_test5) film->write_metadata (); BOOST_REQUIRE (!wait_for_jobs ()); + + Config::instance()->set_master_encoding_threads (1); } BOOST_AUTO_TEST_CASE (threed_test6) @@ -159,7 +171,7 @@ BOOST_AUTO_TEST_CASE (threed_test6) check_dcp ("test/data/threed_test6", film->dir(film->dcp_name())); } -/** Check 2D content set as being 3D; this fails with a -114 in some versions */ +/** Check 2D content set as being 3D; this should give an informative error */ BOOST_AUTO_TEST_CASE (threed_test7) { shared_ptr film = new_test_film2 ("threed_test7"); @@ -173,5 +185,20 @@ BOOST_AUTO_TEST_CASE (threed_test7) film->make_dcp (); film->write_metadata (); - BOOST_REQUIRE (!wait_for_jobs()); + JobManager* jm = JobManager::instance (); + while (jm->work_to_do ()) { + while (signal_manager->ui_idle()) {} + dcpomatic_sleep (1); + } + + BOOST_REQUIRE (jm->errors()); + shared_ptr failed; + BOOST_FOREACH (shared_ptr i, jm->_jobs) { + if (i->finished_in_error()) { + BOOST_REQUIRE (!failed); + failed = i; + } + } + BOOST_REQUIRE (failed); + BOOST_CHECK_EQUAL (failed->error_summary(), "The content file test/data/red_24.mp4 is set as 3D but does not appear to contain 3D images. Please set it to 2D. You can still make a 3D DCP from this content by ticking the 3D option in the DCP video tab."); } -- 2.30.2