From c90ff0d85c88a18730787d511ebc7a6f6c21a2ba Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 6 May 2015 23:58:16 +0100 Subject: Pad times with zeros; add Time::rebase(). --- src/dcp_time.cc | 13 +++++++++++-- src/dcp_time.h | 1 + test/dcp_time_test.cc | 12 +++++++++--- test/write_subtitle_test.cc | 4 ++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/dcp_time.cc b/src/dcp_time.cc index c3c60f66..8e152ad2 100644 --- a/src/dcp_time.cc +++ b/src/dcp_time.cc @@ -238,12 +238,15 @@ dcp::operator/ (Time a, Time const & b) return float (at) / bt; } -/** @return A string of the form h:m:s:e */ +/** @return A string of the form h:m:s:e padded as in 00:00:00:000 */ string Time::to_string () const { stringstream str; - str << h << ":" << m << ":" << s << ":" << e; + str << setw(2) << setfill('0') << h << ":" + << setw(2) << setfill('0') << m << ":" + << setw(2) << setfill('0') << s << ":" + << setw(3) << setfill('0') << e; return str.str (); } @@ -258,3 +261,9 @@ Time::to_seconds () const { return h * 3600 + m * 60 + s + double(e) / tcr; } + +Time +Time::rebase (int tcr_) const +{ + return Time (h, m, s, rint (float (e) * tcr_ / tcr), tcr_); +} diff --git a/src/dcp_time.h b/src/dcp_time.h index c7391e63..907a8306 100644 --- a/src/dcp_time.h +++ b/src/dcp_time.h @@ -72,6 +72,7 @@ public: std::string to_string () const; double to_seconds () const; int64_t to_editable_units (int tcr_) const; + Time rebase (int tcr_) const; private: void set (double seconds, int tcr); diff --git a/test/dcp_time_test.cc b/test/dcp_time_test.cc index c987517e..3315523b 100644 --- a/test/dcp_time_test.cc +++ b/test/dcp_time_test.cc @@ -30,7 +30,7 @@ BOOST_AUTO_TEST_CASE (dcp_time) BOOST_CHECK_EQUAL (t.s, 34); BOOST_CHECK_EQUAL (t.m, 18); BOOST_CHECK_EQUAL (t.h, 11); - BOOST_CHECK_EQUAL (t.to_string(), "11:18:34:73"); + BOOST_CHECK_EQUAL (t.to_string(), "11:18:34:073"); /* Use a tcr of 24 so that the editable event is a frame */ dcp::Time a (3, 2, 3, 4, 24); @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE (dcp_time) BOOST_CHECK_EQUAL (r.m, 58); BOOST_CHECK_EQUAL (r.s, 58); BOOST_CHECK_EQUAL (r.e, 23); - BOOST_CHECK_EQUAL (r.to_string(), "0:58:58:23"); + BOOST_CHECK_EQUAL (r.to_string(), "00:58:58:023"); /* Different tcr (25) */ a = dcp::Time (1, 58, 56, 2, 25); @@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE (dcp_time) BOOST_CHECK_EQUAL (r.m, 6); BOOST_CHECK_EQUAL (r.s, 8); BOOST_CHECK_EQUAL (r.e, 3); - BOOST_CHECK_EQUAL (r.to_string(), "3:6:8:3"); + BOOST_CHECK_EQUAL (r.to_string(), "03:06:08:003"); /* Another arbitrary tcr (30) */ a = dcp::Time (24, 12, 6, 3, 30); @@ -88,4 +88,10 @@ BOOST_AUTO_TEST_CASE (dcp_time) b = dcp::Time (0, 0, 0, 4, 48); r = a + b; BOOST_CHECK_EQUAL (r, dcp::Time (0, 0, 0, 240, 1152)); + + /* Check rebase() */ + a = dcp::Time (1, 58, 56, 2, 25); + BOOST_CHECK_EQUAL (a.rebase (250), dcp::Time (1, 58, 56, 20, 250)); + b = dcp::Time (9, 12, 41, 17, 99); + BOOST_CHECK_EQUAL (b.rebase (250), dcp::Time (9, 12, 41, 43, 250)); } diff --git a/test/write_subtitle_test.cc b/test/write_subtitle_test.cc index 8416abfb..b5daa2b1 100644 --- a/test/write_subtitle_test.cc +++ b/test/write_subtitle_test.cc @@ -77,12 +77,12 @@ BOOST_AUTO_TEST_CASE (write_subtitle_test) " 1\n" " EN\n" " \n" - " \n" + " \n" " Hello world\n" " \n" " \n" " \n" - " \n" + " \n" " What's going on\n" " \n" " \n" -- cgit v1.2.3