X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fplayer_test.cc;h=8d557322a84bcecd216e9a272225bc3d43535e3c;hb=7d651ec877927e0887da48ce441e5c5158e1f34f;hp=a1b0f1148f32423bebb08bbc478b619603808007;hpb=be002888ff3d46bf339f42433038388c7972ae63;p=dcpomatic.git diff --git a/test/player_test.cc b/test/player_test.cc index a1b0f1148..8d557322a 100644 --- a/test/player_test.cc +++ b/test/player_test.cc @@ -23,8 +23,6 @@ * @ingroup selfcontained */ -#include -#include #include "lib/film.h" #include "lib/ffmpeg_content.h" #include "lib/dcp_content_type.h" @@ -33,7 +31,11 @@ #include "lib/player.h" #include "lib/video_content.h" #include "lib/image_content.h" +#include "lib/text_subtitle_content.h" +#include "lib/content_factory.h" #include "test.h" +#include +#include using std::cout; using std::list; @@ -115,3 +117,72 @@ BOOST_AUTO_TEST_CASE (player_black_fill_test) check_dcp (ref.string(), check.string()); } + +/** Check behaviour with an awkward playlist whose data does not end on a video frame start */ +BOOST_AUTO_TEST_CASE (player_subframe_test) +{ + shared_ptr film = new_test_film ("reels_test7"); + film->set_name ("reels_test7"); + film->set_container (Ratio::from_id ("185")); + film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST")); + shared_ptr A = content_factory(film, "test/data/flat_red.png").front(); + film->examine_and_add_content (A); + BOOST_REQUIRE (!wait_for_jobs ()); + shared_ptr B = content_factory(film, "test/data/awkward_length.wav").front(); + film->examine_and_add_content (B); + BOOST_REQUIRE (!wait_for_jobs ()); + film->set_video_frame_rate (24); + A->video->set_length (3 * 24); + + BOOST_CHECK (A->full_length() == DCPTime::from_frames(3 * 24, 24)); + BOOST_CHECK (B->full_length() == DCPTime(289920)); + /* Length should be rounded up from B's length to the next video frame */ + BOOST_CHECK (film->length() == DCPTime::from_frames(3 * 24 + 1, 24)); + + shared_ptr player (new Player (film, film->playlist ())); + player->setup_pieces (); + BOOST_REQUIRE_EQUAL (player->_black._periods.size(), 1); + BOOST_CHECK (player->_black._periods.front() == DCPTimePeriod(DCPTime::from_frames(3 * 24, 24), DCPTime::from_frames(3 * 24 + 1, 24))); + BOOST_REQUIRE_EQUAL (player->_silent._periods.size(), 1); + BOOST_CHECK (player->_silent._periods.front() == DCPTimePeriod(DCPTime(289920), DCPTime::from_frames(3 * 24 + 1, 24))); +} + +static Frame video_frames; +static Frame audio_frames; + +static void +video (shared_ptr, DCPTime) +{ + ++video_frames; +} + +static void +audio (shared_ptr audio, DCPTime) +{ + audio_frames += audio->frames(); +} + +/** Check with a video-only file that the video and audio emissions happen more-or-less together */ +BOOST_AUTO_TEST_CASE (player_interleave_test) +{ + shared_ptr film = new_test_film ("ffmpeg_transcoder_basic_test_subs"); + film->set_name ("ffmpeg_transcoder_basic_test"); + film->set_container (Ratio::from_id ("185")); + film->set_audio_channels (6); + + shared_ptr c (new FFmpegContent (film, "test/data/test.mp4")); + film->examine_and_add_content (c); + BOOST_REQUIRE (!wait_for_jobs ()); + + shared_ptr s (new TextSubtitleContent (film, "test/data/subrip.srt")); + film->examine_and_add_content (s); + BOOST_REQUIRE (!wait_for_jobs ()); + + shared_ptr player (new Player(film, film->playlist())); + player->Video.connect (bind (&video, _1, _2)); + player->Audio.connect (bind (&audio, _1, _2)); + video_frames = audio_frames = 0; + while (!player->pass ()) { + BOOST_CHECK (abs(video_frames - (audio_frames / 2000)) < 8); + } +}