Fix error when padding is needed in 3D encodes (#2476).
authorCarl Hetherington <cth@carlh.net>
Sun, 5 Mar 2023 13:06:11 +0000 (14:06 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 5 Mar 2023 13:06:11 +0000 (14:06 +0100)
src/lib/player.cc
test/threed_test.cc

index 018571fe27b020955d8c80240f5374c287fba578..abcefcab5c57fcae7afbc5db48589cd12088d343 100644 (file)
@@ -770,7 +770,12 @@ Player::pass ()
        }
        case BLACK:
                LOG_DEBUG_PLAYER ("Emit black for gap at %1", to_string(_black.position()));
        }
        case BLACK:
                LOG_DEBUG_PLAYER ("Emit black for gap at %1", to_string(_black.position()));
-               emit_video (black_player_video_frame(Eyes::BOTH), _black.position());
+               if (film->three_d()) {
+                       emit_video(black_player_video_frame(Eyes::LEFT), _black.position());
+                       emit_video(black_player_video_frame(Eyes::RIGHT), _black.position());
+               } else {
+                       emit_video(black_player_video_frame(Eyes::BOTH), _black.position());
+               }
                _black.set_position (_black.position() + one_video_frame());
                break;
        case SILENT:
                _black.set_position (_black.position() + one_video_frame());
                break;
        case SILENT:
index a2e116f9a7aa1802d396cfe05665e0b9665107e1..87ddd25aec252b75f64a333b4725a08f513f72cd 100644 (file)
@@ -339,3 +339,22 @@ BOOST_AUTO_TEST_CASE(threed_passthrough_test, * boost::unit_test::depends_on("th
        }
 }
 
        }
 }
 
+/* #2476 was a writer error when 3D picture padding is needed */
+BOOST_AUTO_TEST_CASE(threed_test_when_padding_needed)
+{
+       auto left = content_factory("test/data/flat_red.png").front();
+       auto right = content_factory("test/data/flat_red.png").front();
+       auto sound = content_factory("test/data/sine_440.wav").front();
+       auto film = new_test_film2("threed_test_when_padding_needed", { left, right, sound });
+
+       left->video->set_frame_type(VideoFrameType::THREE_D_LEFT);
+       left->set_position(film, dcpomatic::DCPTime());
+       left->video->set_length(23);
+       right->video->set_frame_type(VideoFrameType::THREE_D_RIGHT);
+       right->set_position(film, dcpomatic::DCPTime());
+       right->video->set_frame_type(VideoFrameType::THREE_D_RIGHT);
+       right->video->set_length(23);
+       film->set_three_d(true);
+
+       make_and_verify_dcp(film);
+}