summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-07-12 15:21:31 +0100
committerCarl Hetherington <cth@carlh.net>2017-07-12 15:21:31 +0100
commit2517ec798da291dedc02dd7a7a432f7aa63133e4 (patch)
tree275fdd498846450725f4400ebb5863ba2a5ac15c
parent7698ee82874ee9cb5fa4b251a0a7e7e2df81fcfb (diff)
Add some tests; fix failure to make DCP when there is a bit of audio right at the end of the film (with no corresponding video).
-rw-r--r--src/lib/player.cc6
-rw-r--r--src/lib/player.h1
-rw-r--r--src/lib/video_content.cc6
-rw-r--r--src/lib/video_content.h2
m---------test/data0
-rw-r--r--test/empty_test.cc54
-rw-r--r--test/player_test.cc34
-rw-r--r--test/reels_test.cc12
8 files changed, 102 insertions, 13 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index adaee931e..3ed0e4f45 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -156,8 +156,8 @@ Player::setup_pieces ()
}
}
- _black = Empty (_playlist, bind(&Content::video, _1));
- _silent = Empty (_playlist, bind(&Content::audio, _1));
+ _black = Empty (_film, bind(&Content::video, _1));
+ _silent = Empty (_film, bind(&Content::audio, _1));
_last_video_time = DCPTime ();
_last_audio_time = DCPTime ();
@@ -552,7 +552,7 @@ Player::pass ()
/* Emit any audio that is ready */
- DCPTime pull_to = _playlist->length ();
+ DCPTime pull_to = _film->length ();
for (map<AudioStreamPtr, StreamState>::const_iterator i = _stream_states.begin(); i != _stream_states.end(); ++i) {
if (!i->second.piece->done && i->second.last_push_end < pull_to) {
pull_to = i->second.last_push_end;
diff --git a/src/lib/player.h b/src/lib/player.h
index 230f7f4f8..ee7f89aaa 100644
--- a/src/lib/player.h
+++ b/src/lib/player.h
@@ -89,6 +89,7 @@ private:
friend struct player_time_calculation_test1;
friend struct player_time_calculation_test2;
friend struct player_time_calculation_test3;
+ friend struct player_subframe_test;
void setup_pieces ();
void flush ();
diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc
index 30a463089..92219b4c7 100644
--- a/src/lib/video_content.cc
+++ b/src/lib/video_content.cc
@@ -538,3 +538,9 @@ VideoContent::use_template (shared_ptr<const VideoContent> c)
_fade_in = c->_fade_in;
_fade_out = c->_fade_out;
}
+
+void
+VideoContent::modify_position (DCPTime& pos) const
+{
+ pos = pos.ceil (_parent->film()->video_frame_rate());
+}
diff --git a/src/lib/video_content.h b/src/lib/video_content.h
index 623a1858b..19ea113f7 100644
--- a/src/lib/video_content.h
+++ b/src/lib/video_content.h
@@ -168,6 +168,8 @@ public:
void take_from_examiner (boost::shared_ptr<VideoExaminer>);
void add_properties (std::list<UserProperty> &) const;
+ void modify_position (DCPTime& pos) const;
+
static boost::shared_ptr<VideoContent> from_xml (Content* parent, cxml::ConstNodePtr, int);
private:
diff --git a/test/data b/test/data
-Subproject e4f09e5b45400f04a868f29409b291b27c426c0
+Subproject afcff70aee5dd8d2fd83164cd56e9d842b13285
diff --git a/test/empty_test.cc b/test/empty_test.cc
index b7dce1ab8..326ae9530 100644
--- a/test/empty_test.cc
+++ b/test/empty_test.cc
@@ -43,17 +43,59 @@ BOOST_AUTO_TEST_CASE (empty_test1)
film->examine_and_add_content (contentB);
wait_for_jobs ();
+ int const vfr = film->video_frame_rate ();
+
contentA->video->set_scale (VideoContentScale (Ratio::from_id ("185")));
contentA->video->set_length (3);
- contentA->set_position (DCPTime::from_frames (2, film->video_frame_rate ()));
+ contentA->set_position (DCPTime::from_frames (2, vfr));
contentB->video->set_scale (VideoContentScale (Ratio::from_id ("185")));
contentB->video->set_length (1);
- contentB->set_position (DCPTime::from_frames (7, film->video_frame_rate ()));
+ contentB->set_position (DCPTime::from_frames (7, vfr));
- Empty black (film->playlist(), bind(&Content::video, _1));
+ Empty black (film, bind(&Content::video, _1));
BOOST_REQUIRE_EQUAL (black._periods.size(), 2);
BOOST_CHECK (black._periods.front().from == DCPTime());
- BOOST_CHECK (black._periods.front().to == DCPTime::from_frames(2, film->video_frame_rate()));
- BOOST_CHECK (black._periods.back().from == DCPTime::from_frames(5, film->video_frame_rate()));
- BOOST_CHECK (black._periods.back().to == DCPTime::from_frames(7, film->video_frame_rate()));
+ BOOST_CHECK (black._periods.front().to == DCPTime::from_frames(2, vfr));
+ BOOST_CHECK (black._periods.back().from == DCPTime::from_frames(5, vfr));
+ BOOST_CHECK (black._periods.back().to == DCPTime::from_frames(7, vfr));
+}
+
+/** Some tests where the first empty period is not at time 0 */
+BOOST_AUTO_TEST_CASE (empty_test2)
+{
+ shared_ptr<Film> film = new_test_film ("empty_test1");
+ film->set_dcp_content_type (DCPContentType::from_isdcf_name ("FTR"));
+ film->set_name ("empty_test1");
+ film->set_container (Ratio::from_id ("185"));
+ film->set_sequence (false);
+ shared_ptr<ImageContent> contentA (new ImageContent (film, "test/data/simple_testcard_640x480.png"));
+ shared_ptr<ImageContent> contentB (new ImageContent (film, "test/data/simple_testcard_640x480.png"));
+
+ film->examine_and_add_content (contentA);
+ film->examine_and_add_content (contentB);
+ wait_for_jobs ();
+
+ int const vfr = film->video_frame_rate ();
+
+ contentA->video->set_scale (VideoContentScale (Ratio::from_id ("185")));
+ contentA->video->set_length (3);
+ contentA->set_position (DCPTime(0));
+ contentB->video->set_scale (VideoContentScale (Ratio::from_id ("185")));
+ contentB->video->set_length (1);
+ contentB->set_position (DCPTime::from_frames (7, vfr));
+
+ Empty black (film, bind(&Content::video, _1));
+ BOOST_REQUIRE_EQUAL (black._periods.size(), 1);
+ BOOST_CHECK (black._periods.front().from == DCPTime::from_frames(3, vfr));
+ BOOST_CHECK (black._periods.front().to == DCPTime::from_frames(7, vfr));
+
+ /* position should initially be the start of the first empty period */
+ BOOST_CHECK (black.position() == DCPTime::from_frames(3, vfr));
+
+ /* check that done() works */
+ BOOST_CHECK (!black.done ());
+ black.set_position (DCPTime::from_frames (4, vfr));
+ BOOST_CHECK (!black.done ());
+ black.set_position (DCPTime::from_frames (7, vfr));
+ BOOST_CHECK (black.done ());
}
diff --git a/test/player_test.cc b/test/player_test.cc
index a1b0f1148..14a1fa0c6 100644
--- a/test/player_test.cc
+++ b/test/player_test.cc
@@ -23,8 +23,6 @@
* @ingroup selfcontained
*/
-#include <iostream>
-#include <boost/test/unit_test.hpp>
#include "lib/film.h"
#include "lib/ffmpeg_content.h"
#include "lib/dcp_content_type.h"
@@ -33,7 +31,10 @@
#include "lib/player.h"
#include "lib/video_content.h"
#include "lib/image_content.h"
+#include "lib/content_factory.h"
#include "test.h"
+#include <boost/test/unit_test.hpp>
+#include <iostream>
using std::cout;
using std::list;
@@ -115,3 +116,32 @@ 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> 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<Content> A = content_factory(film, "test/data/flat_red.png").front();
+ film->examine_and_add_content (A);
+ BOOST_REQUIRE (!wait_for_jobs ());
+ shared_ptr<Content> 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> 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)));
+}
diff --git a/test/reels_test.cc b/test/reels_test.cc
index 6c617d6b2..72a3fe7d3 100644
--- a/test/reels_test.cc
+++ b/test/reels_test.cc
@@ -31,11 +31,13 @@
#include "lib/dcp_content.h"
#include "lib/video_content.h"
#include "lib/text_subtitle_content.h"
+#include "lib/content_factory.h"
#include "test.h"
#include <boost/test/unit_test.hpp>
#include <boost/foreach.hpp>
using std::list;
+using std::cout;
using boost::shared_ptr;
/** Test Film::reels() */
@@ -307,14 +309,20 @@ BOOST_AUTO_TEST_CASE (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<FFmpegContent> A (new FFmpegContent (film, "test/data/flat_red.png"));
+ shared_ptr<Content> A = content_factory(film, "test/data/flat_red.png").front();
film->examine_and_add_content (A);
BOOST_REQUIRE (!wait_for_jobs ());
- shared_ptr<FFmpegContent> B (new FFmpegContent (film, "test/data/awkward_length.wav"));
+ shared_ptr<Content> 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);
film->set_reel_type (REELTYPE_BY_VIDEO_CONTENT);
+ BOOST_REQUIRE_EQUAL (film->reels().size(), 2);
+ BOOST_CHECK (film->reels().front() == DCPTimePeriod(DCPTime(0), DCPTime::from_frames(3 * 24, 24)));
+ BOOST_CHECK (film->reels().back() == DCPTimePeriod(DCPTime::from_frames(3 * 24, 24), DCPTime::from_frames(3 * 24 + 1, 24)));
+
film->make_dcp ();
BOOST_REQUIRE (!wait_for_jobs ());
}