/*
- 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 (shared_ptr<Player>(new Player(film, film->playlist())), film->log(), 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);
- 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) == DCPTime());
+ 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);
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
+ );
+
+ 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();
+}
+