Fix ignore_video checker for separate-3D content (#2246).
authorCarl Hetherington <cth@carlh.net>
Mon, 9 May 2022 23:16:44 +0000 (01:16 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 11 May 2022 18:36:10 +0000 (20:36 +0200)
src/lib/player.cc
test/threed_test.cc

index 53b1733330764aa5b76b988f58b096da6a331f62..f3d78ab323803b396186ba928b5688c129b469a3 100644 (file)
@@ -272,17 +272,17 @@ Player::setup_pieces_unlocked ()
                }
        }
 
                }
        }
 
+       auto ignore_overlap = [](shared_ptr<VideoContent> v) {
+               return v && v->use() && v->frame_type() != VideoFrameType::THREE_D_LEFT && v->frame_type() != VideoFrameType::THREE_D_RIGHT;
+       };
+
        for (auto i = _pieces.begin(); i != _pieces.end(); ++i) {
        for (auto i = _pieces.begin(); i != _pieces.end(); ++i) {
-               if (auto video = (*i)->content->video) {
-                       if (video->use() && video->frame_type() != VideoFrameType::THREE_D_LEFT && video->frame_type() != VideoFrameType::THREE_D_RIGHT) {
-                               /* Look for content later in the content list with in-use video that overlaps this */
-                               auto period = DCPTimePeriod((*i)->content->position(), (*i)->content->end(_film));
-                               auto j = i;
-                               ++j;
-                               for (; j != _pieces.end(); ++j) {
-                                       if ((*j)->content->video && (*j)->content->video->use()) {
-                                               (*i)->ignore_video = DCPTimePeriod((*j)->content->position(), (*j)->content->end(_film)).overlap(period);
-                                       }
+               if (ignore_overlap((*i)->content->video)) {
+                       /* Look for content later in the content list with in-use video that overlaps this */
+                       auto const period = DCPTimePeriod((*i)->content->position(), (*i)->content->end(_film));
+                       for (auto j = std::next(i); j != _pieces.end(); ++j) {
+                               if ((*j)->content->video && ignore_overlap((*j)->content->video)) {
+                                       (*i)->ignore_video = DCPTimePeriod((*j)->content->position(), (*j)->content->end(_film)).overlap(period);
                                }
                        }
                }
                                }
                        }
                }
index 4fe91ebca3679f37616dd8d407e01cedb7949a5a..b4599cf809fe1914625a0ac3de959920596ed4ba 100644 (file)
  */
 
 
  */
 
 
+#include "lib/butler.h"
 #include "lib/config.h"
 #include "lib/content_factory.h"
 #include "lib/cross.h"
 #include "lib/dcp_content_type.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/film.h"
 #include "lib/config.h"
 #include "lib/content_factory.h"
 #include "lib/cross.h"
 #include "lib/dcp_content_type.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/film.h"
+#include "lib/image.h"
 #include "lib/job.h"
 #include "lib/job_manager.h"
 #include "lib/make_dcp.h"
 #include "lib/job.h"
 #include "lib/job_manager.h"
 #include "lib/make_dcp.h"
+#include "lib/player.h"
 #include "lib/ratio.h"
 #include "lib/ratio.h"
+#include "lib/util.h"
 #include "lib/video_content.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
 #include "lib/video_content.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
@@ -255,3 +259,33 @@ BOOST_AUTO_TEST_CASE (threed_test_separate_files_very_different_lengths)
        film->set_three_d (true);
        make_and_verify_dcp (film);
 }
        film->set_three_d (true);
        make_and_verify_dcp (film);
 }
+
+
+BOOST_AUTO_TEST_CASE (threed_test_butler_overfill)
+{
+       auto film = new_test_film2("threed_test_butler_overfill");
+       auto A = make_shared<FFmpegContent>(TestPaths::private_data() / "arrietty_JP-EN.mkv");
+       film->examine_and_add_content(A);
+       auto B = make_shared<FFmpegContent>(TestPaths::private_data() / "arrietty_JP-EN.mkv");
+       film->examine_and_add_content(B);
+       BOOST_REQUIRE (!wait_for_jobs());
+
+       auto player = std::make_shared<Player>(film, Image::Alignment::COMPACT);
+       int const audio_channels = 2;
+       auto butler = std::make_shared<Butler>(film, player, AudioMapping(), audio_channels, boost::bind(PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::PADDED, true, false);
+
+       int const audio_frames = 1920;
+       std::vector<float> audio(audio_frames * audio_channels);
+
+       B->video->set_frame_type(VideoFrameType::THREE_D_RIGHT);
+       B->set_position(film, dcpomatic::DCPTime());
+
+       butler->seek(dcpomatic::DCPTime(), true);
+       Butler::Error error;
+       for (auto i = 0; i < 960; ++i) {
+               butler->get_video(Butler::Behaviour::BLOCKING, &error);
+               butler->get_audio(Butler::Behaviour::BLOCKING, audio.data(), audio_frames);
+       }
+       BOOST_REQUIRE (error.code == Butler::Error::Code::NONE);
+}
+