summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-11-05 15:58:50 +0000
committerCarl Hetherington <cth@carlh.net>2013-11-05 15:58:50 +0000
commitf75cc4ebbffea7a7953af20e8a2ea124767bf949 (patch)
treeb483ddcf71280b73bdc11bc4865748e76b3857ff
parent994ef64ef0cecd69898ab81432e5c5efef7ef97b (diff)
Various fixes to make tests pass again.
-rw-r--r--src/lib/playlist.cc8
-rw-r--r--src/lib/util.cc15
-rw-r--r--test/film_metadata_test.cc10
-rw-r--r--test/test.cc59
-rw-r--r--test/test.h1
-rw-r--r--test/wscript6
6 files changed, 83 insertions, 16 deletions
diff --git a/src/lib/playlist.cc b/src/lib/playlist.cc
index 621b99dd7..c54b24c1c 100644
--- a/src/lib/playlist.cc
+++ b/src/lib/playlist.cc
@@ -82,14 +82,14 @@ Playlist::maybe_sequence_video ()
_sequencing_video = true;
ContentList cl = _content;
- Time last = 0;
+ Time next = 0;
for (ContentList::iterator i = _content.begin(); i != _content.end(); ++i) {
if (!dynamic_pointer_cast<VideoContent> (*i)) {
continue;
}
- (*i)->set_position (last);
- last = (*i)->end ();
+ (*i)->set_position (next);
+ next = (*i)->end() + 1;
}
/* This won't change order, so it does not need a sort */
@@ -260,7 +260,7 @@ Playlist::length () const
{
Time len = 0;
for (ContentList::const_iterator i = _content.begin(); i != _content.end(); ++i) {
- len = max (len, (*i)->end ());
+ len = max (len, (*i)->end() + 1);
}
return len;
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 15efcc099..96b834fcc 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -763,12 +763,17 @@ FrameRateConversion::FrameRateConversion (float source, int dcp)
, repeat (1)
, change_speed (false)
{
- if (source > (dcp * 2)) {
+ if (fabs (source / 2.0 - dcp) < fabs (source - dcp)) {
+ /* The difference between source and DCP frame rate will be lower
+ (i.e. better) if we skip.
+ */
skip = true;
- }
-
- if (source < dcp) {
- repeat = floor (dcp / source);
+ } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
+ /* The difference between source and DCP frame rate would be better
+ if we repeated each frame once; it may be better still if we
+ repeated more than once. Work out the required repeat.
+ */
+ repeat = round (dcp / source);
}
change_speed = !about_equal (source * factor(), dcp);
diff --git a/test/film_metadata_test.cc b/test/film_metadata_test.cc
index 324787f19..1f06aa538 100644
--- a/test/film_metadata_test.cc
+++ b/test/film_metadata_test.cc
@@ -24,9 +24,11 @@
#include "lib/film.h"
#include "lib/dcp_content_type.h"
#include "lib/ratio.h"
+#include "test.h"
using std::string;
using std::stringstream;
+using std::list;
using boost::shared_ptr;
BOOST_AUTO_TEST_CASE (film_metadata_test)
@@ -48,9 +50,9 @@ BOOST_AUTO_TEST_CASE (film_metadata_test)
f->set_j2k_bandwidth (200000000);
f->write_metadata ();
- stringstream s;
- s << "diff -u test/data/metadata.xml.ref " << test_film << "/metadata.xml";
- BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+ list<string> ignore;
+ ignore.push_back ("Key");
+ check_xml ("test/data/metadata.xml.ref", test_film + "/metadata.xml", ignore);
shared_ptr<Film> g (new Film (test_film));
g->read_metadata ();
@@ -60,5 +62,5 @@ BOOST_AUTO_TEST_CASE (film_metadata_test)
BOOST_CHECK_EQUAL (g->container(), Ratio::from_id ("185"));
g->write_metadata ();
- BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+ check_xml ("test/data/metadata.xml.ref", test_film + "/metadata.xml", ignore);
}
diff --git a/test/test.cc b/test/test.cc
index 154510738..1309439d2 100644
--- a/test/test.cc
+++ b/test/test.cc
@@ -19,6 +19,7 @@
#include <vector>
#include <list>
+#include <libxml++/libxml++.h>
#include <libdcp/dcp.h>
#include "lib/config.h"
#include "lib/util.h"
@@ -148,6 +149,64 @@ check_dcp (string ref, string check)
}
void
+check_xml (xmlpp::Element* ref, xmlpp::Element* test, list<string> ignore)
+{
+ BOOST_CHECK_EQUAL (ref->get_name (), test->get_name ());
+ BOOST_CHECK_EQUAL (ref->get_namespace_prefix (), test->get_namespace_prefix ());
+
+ if (find (ignore.begin(), ignore.end(), ref->get_name()) != ignore.end ()) {
+ return;
+ }
+
+ xmlpp::Element::NodeList ref_children = ref->get_children ();
+ xmlpp::Element::NodeList test_children = test->get_children ();
+ BOOST_CHECK_EQUAL (ref_children.size (), test_children.size ());
+
+ xmlpp::Element::NodeList::iterator k = ref_children.begin ();
+ xmlpp::Element::NodeList::iterator l = test_children.begin ();
+ while (k != ref_children.end ()) {
+
+ /* XXX: should be doing xmlpp::EntityReference, xmlpp::XIncludeEnd, xmlpp::XIncludeStart */
+
+ xmlpp::Element* ref_el = dynamic_cast<xmlpp::Element*> (*k);
+ xmlpp::Element* test_el = dynamic_cast<xmlpp::Element*> (*l);
+ BOOST_CHECK ((ref_el && test_el) || (!ref_el && !test_el));
+ if (ref_el && test_el) {
+ check_xml (ref_el, test_el, ignore);
+ }
+
+ xmlpp::ContentNode* ref_cn = dynamic_cast<xmlpp::ContentNode*> (*k);
+ xmlpp::ContentNode* test_cn = dynamic_cast<xmlpp::ContentNode*> (*l);
+ BOOST_CHECK ((ref_cn && test_cn) || (!ref_cn && !test_cn));
+ if (ref_cn && test_cn) {
+ BOOST_CHECK_EQUAL (ref_cn->get_content(), test_cn->get_content ());
+ }
+
+ xmlpp::Attribute* ref_at = dynamic_cast<xmlpp::Attribute*> (*k);
+ xmlpp::Attribute* test_at = dynamic_cast<xmlpp::Attribute*> (*l);
+ BOOST_CHECK ((ref_at && test_at) || (!ref_at && !test_at));
+ if (ref_at && test_at) {
+ BOOST_CHECK_EQUAL (ref_at->get_name(), test_at->get_name ());
+ BOOST_CHECK_EQUAL (ref_at->get_value(), test_at->get_value ());
+ }
+
+ ++k;
+ ++l;
+ }
+}
+
+void
+check_xml (boost::filesystem::path ref, boost::filesystem::path test, list<string> ignore)
+{
+ xmlpp::DomParser* ref_parser = new xmlpp::DomParser (ref.string ());
+ xmlpp::Element* ref_root = ref_parser->get_document()->get_root_node ();
+ xmlpp::DomParser* test_parser = new xmlpp::DomParser (test.string ());
+ xmlpp::Element* test_root = test_parser->get_document()->get_root_node ();
+
+ check_xml (ref_root, test_root, ignore);
+}
+
+void
wait_for_jobs ()
{
JobManager* jm = JobManager::instance ();
diff --git a/test/test.h b/test/test.h
index 5c37f82d8..e49dfc276 100644
--- a/test/test.h
+++ b/test/test.h
@@ -24,4 +24,5 @@ class Film;
extern void wait_for_jobs ();
extern boost::shared_ptr<Film> new_test_film (std::string);
extern void check_dcp (std::string, std::string);
+extern void check_xml (boost::filesystem::path, boost::filesystem::path, std::list<std::string>);
extern boost::filesystem::path test_film_dir (std::string);
diff --git a/test/wscript b/test/wscript
index 7c7aee733..b40b69475 100644
--- a/test/wscript
+++ b/test/wscript
@@ -16,6 +16,9 @@ def build(bld):
obj.use = 'libdcpomatic'
obj.source = """
test.cc
+ scaling_test.cc
+ film_metadata_test.cc
+ frame_rate_test.cc
colour_conversion_test.cc
audio_delay_test.cc
silence_padding_test.cc
@@ -24,15 +27,12 @@ def build(bld):
ffmpeg_audio_test.cc
threed_test.cc
play_test.cc
- frame_rate_test.cc
ffmpeg_pts_offset.cc
ffmpeg_examiner_test.cc
black_fill_test.cc
- scaling_test.cc
ratio_test.cc
pixel_formats_test.cc
make_black_test.cc
- film_metadata_test.cc
stream_test.cc
util_test.cc
ffmpeg_dcp_test.cc