+ film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
+ film->set_three_d (true);
+ make_and_verify_dcp (film);
+}
+
+
+/** Basic sanity check of THREE_D_LEFT and THREE_D_RIGHT; at the moment this is just to make sure
+ * that such a transcode completes without error.
+ */
+BOOST_AUTO_TEST_CASE (threed_test3)
+{
+ shared_ptr<Film> film = new_test_film2 ("threed_test3");
+ auto L = make_shared<FFmpegContent>("test/data/test.mp4");
+ film->examine_and_add_content (L);
+ auto R = make_shared<FFmpegContent>("test/data/test.mp4");
+ film->examine_and_add_content (R);
+ BOOST_REQUIRE (!wait_for_jobs());
+
+ L->video->set_frame_type (VideoFrameType::THREE_D_LEFT);
+ R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT);
+
+ film->set_three_d (true);
+ make_and_verify_dcp (film);
+}
+
+
+BOOST_AUTO_TEST_CASE (threed_test4)
+{
+ ConfigRestorer cr;
+
+ /* Try to stop out-of-memory crashes on my laptop */
+ Config::instance()->set_master_encoding_threads (boost::thread::hardware_concurrency() / 4);
+
+ auto film = new_test_film2 ("threed_test4");
+ auto L = make_shared<FFmpegContent>(TestPaths::private_data() / "LEFT_TEST_DCP3D4K.mov");
+ film->examine_and_add_content (L);
+ auto R = make_shared<FFmpegContent>(TestPaths::private_data() / "RIGHT_TEST_DCP3D4K.mov");
+ film->examine_and_add_content (R);
+ BOOST_REQUIRE (!wait_for_jobs());
+
+ L->video->set_frame_type (VideoFrameType::THREE_D_LEFT);
+ R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT);
+ /* There doesn't seem much point in encoding the whole input, especially as we're only
+ * checking for errors during the encode and not the result. Also decoding these files
+ * (4K HQ Prores) is very slow.
+ */
+ L->set_trim_end (dcpomatic::ContentTime::from_seconds(22));
+ R->set_trim_end (dcpomatic::ContentTime::from_seconds(22));
+
+ film->set_three_d (true);
+ make_and_verify_dcp (film, {dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D});
+}
+
+
+BOOST_AUTO_TEST_CASE (threed_test5)
+{
+ auto film = new_test_film2 ("threed_test5");
+ auto L = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv");
+ film->examine_and_add_content (L);
+ auto R = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv");
+ film->examine_and_add_content (R);
+ BOOST_REQUIRE (!wait_for_jobs());
+
+ L->video->set_frame_type (VideoFrameType::THREE_D_LEFT);
+ R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT);
+ /* There doesn't seem much point in encoding the whole input, especially as we're only
+ * checking for errors during the encode and not the result.
+ */
+ L->set_trim_end (dcpomatic::ContentTime::from_seconds(3 * 60 + 20));
+ R->set_trim_end (dcpomatic::ContentTime::from_seconds(3 * 60 + 20));
+
+ film->set_three_d (true);
+ make_and_verify_dcp (film, {dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K});
+}
+
+
+BOOST_AUTO_TEST_CASE (threed_test6)
+{
+ auto film = new_test_film2 ("threed_test6");
+ auto L = make_shared<FFmpegContent>("test/data/3dL.mp4");
+ film->examine_and_add_content (L);
+ auto R = make_shared<FFmpegContent>("test/data/3dR.mp4");
+ film->examine_and_add_content (R);
+ BOOST_REQUIRE (!wait_for_jobs());
+
+ L->video->set_frame_type (VideoFrameType::THREE_D_LEFT);
+ R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT);
+