Fill test disk partitions with random noise to expose more bugs.
[dcpomatic.git] / test / butler_test.cc
index 213561341afb345bb8cc7d9442d399775004cc72..7fd5ea57113bdb43135b281000a86204b3140284 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2017 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2017-2022 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
+#include "lib/audio_content.h"
+#include "lib/audio_mapping.h"
 #include "lib/butler.h"
-#include "lib/film.h"
-#include "lib/dcp_content_type.h"
-#include "lib/ratio.h"
 #include "lib/content_factory.h"
-#include "lib/audio_mapping.h"
+#include "lib/dcp_content_type.h"
+#include "lib/film.h"
 #include "lib/player.h"
+#include "lib/ratio.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
 
-using boost::shared_ptr;
+
+using std::make_shared;
+using std::shared_ptr;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
+using namespace dcpomatic;
+
 
 BOOST_AUTO_TEST_CASE (butler_test1)
 {
-       shared_ptr<Film> film = new_test_film ("butler_test1");
-       film->set_dcp_content_type (DCPContentType::from_isdcf_name ("FTR"));
+       auto film = new_test_film ("butler_test1");
+       film->set_dcp_content_type (DCPContentType::from_isdcf_name("FTR"));
        film->set_name ("butler_test1");
        film->set_container (Ratio::from_id ("185"));
 
-       shared_ptr<Content> video = content_factory(film, "test/data/flat_red.png").front ();
+       auto video = content_factory("test/data/flat_red.png").front();
        film->examine_and_add_content (video);
-       shared_ptr<Content> audio = content_factory(film, "test/data/staircase.wav").front ();
+       auto audio = content_factory("test/data/staircase.wav").front();
        film->examine_and_add_content (audio);
        BOOST_REQUIRE (!wait_for_jobs ());
 
        film->set_audio_channels (6);
 
        /* This is the map of the player output (5.1) to the butler output (also 5.1) */
-       AudioMapping map = AudioMapping (6, 6);
+       auto map = AudioMapping (6, 6);
        for (int i = 0; i < 6; ++i) {
                map.set (i, i, 1);
        }
 
-       Butler butler (film, shared_ptr<Player>(new Player(film, film->playlist())), map, 6);
+       Butler butler (
+               film,
+               make_shared<Player>(film, Image::Alignment::COMPACT),
+               map,
+               6,
+               boost::bind(&PlayerVideo::force, AV_PIX_FMT_RGB24),
+               VideoRange::FULL,
+               Image::Alignment::COMPACT,
+               false,
+               false,
+               Butler::Audio::ENABLED
+               );
 
-       BOOST_CHECK (butler.get_video().second == DCPTime());
-       BOOST_CHECK (butler.get_video().second == DCPTime::from_frames(1, 24));
-       BOOST_CHECK (butler.get_video().second == DCPTime::from_frames(2, 24));
+       BOOST_CHECK (butler.get_video(Butler::Behaviour::BLOCKING, 0).second == DCPTime());
+       BOOST_CHECK (butler.get_video(Butler::Behaviour::BLOCKING, 0).second == DCPTime::from_frames(1, 24));
+       BOOST_CHECK (butler.get_video(Butler::Behaviour::BLOCKING, 0).second == DCPTime::from_frames(2, 24));
        /* XXX: check the frame contents */
 
        float buffer[256 * 6];
-       BOOST_REQUIRE (!butler.get_audio (buffer, 256));
+       BOOST_REQUIRE (butler.get_audio(Butler::Behaviour::BLOCKING, buffer, 256) == DCPTime());
        for (int i = 0; i < 256; ++i) {
                BOOST_REQUIRE_EQUAL (buffer[i * 6 + 0], 0);
                BOOST_REQUIRE_EQUAL (buffer[i * 6 + 1], 0);
@@ -69,3 +89,49 @@ BOOST_AUTO_TEST_CASE (butler_test1)
                BOOST_REQUIRE_EQUAL (buffer[i * 6 + 5], 0);
        }
 }
+
+
+BOOST_AUTO_TEST_CASE (butler_test2)
+{
+       auto content = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv");
+       BOOST_REQUIRE (!content.empty());
+       auto film = new_test_film2 ("butler_test2", { content.front() });
+       BOOST_REQUIRE (content.front()->audio);
+       content.front()->audio->set_delay(100);
+
+       /* This is the map of the player output (5.1) to the butler output (also 5.1) */
+       auto map = AudioMapping (6, 6);
+       for (int i = 0; i < 6; ++i) {
+               map.set (i, i, 1);
+       }
+
+       Butler butler (
+               film,
+               make_shared<Player>(film, Image::Alignment::COMPACT),
+               map,
+               6,
+               boost::bind(&PlayerVideo::force, AV_PIX_FMT_RGB24),
+               VideoRange::FULL,
+               Image::Alignment::COMPACT,
+               false,
+               false,
+               Butler::Audio::ENABLED
+               );
+
+       int const audio_frames_per_video_frame = 48000 / 25;
+       float audio_buffer[audio_frames_per_video_frame * 6];
+       for (int i = 0; i < 16; ++i) {
+               butler.get_video(Butler::Behaviour::BLOCKING, 0);
+               butler.get_audio(Butler::Behaviour::BLOCKING, audio_buffer, audio_frames_per_video_frame);
+       }
+
+       butler.seek (DCPTime::from_seconds(60), false);
+
+       for (int i = 0; i < 240; ++i) {
+               butler.get_video(Butler::Behaviour::BLOCKING, 0);
+               butler.get_audio(Butler::Behaviour::BLOCKING, audio_buffer, audio_frames_per_video_frame);
+       }
+
+       butler.rethrow();
+}
+