diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-05-20 20:20:47 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-05-20 21:56:28 +0200 |
| commit | 48841aa4a4aa4704e1e054b294bac23996be6dd0 (patch) | |
| tree | cad367f33783a03f9216fe59d641c73e2043b5c9 | |
| parent | ce29d071ad8b420d3d4ba6d06487b3513cc86bef (diff) | |
Round the length of video-containing content to the nearest frame.
It seems reasonable, and is in the spirit of how positions are
rounded to frame boundaries.
It also fixes problems with unnecessary frames of black being
created at the end of trimmed files, where there can be
rounding-error-based confusion about where the content stops and
the black begins.
| -rw-r--r-- | src/lib/content.cc | 6 | ||||
| -rw-r--r-- | test/content_test.cc | 28 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/lib/content.cc b/src/lib/content.cc index 2593c01df..4242477d4 100644 --- a/src/lib/content.cc +++ b/src/lib/content.cc @@ -303,7 +303,11 @@ Content::technical_summary () const DCPTime Content::length_after_trim (shared_ptr<const Film> film) const { - return max(DCPTime(), full_length(film) - DCPTime(trim_start() + trim_end(), film->active_frame_rate_change(position()))).round(film->video_frame_rate()); + DCPTime length = max(DCPTime(), full_length(film) - DCPTime(trim_start() + trim_end(), film->active_frame_rate_change(position()))); + if (video) { + length = length.round(film->video_frame_rate()); + } + return length; } /** @return string which changes when something about this content changes which affects diff --git a/test/content_test.cc b/test/content_test.cc index fb66b2e08..1e143f8e4 100644 --- a/test/content_test.cc +++ b/test/content_test.cc @@ -122,3 +122,31 @@ BOOST_AUTO_TEST_CASE (content_test3) BOOST_CHECK (content->trim_start() == ContentTime::from_seconds (15.0 / 25.0)); } + + +/** Content containing video will have its length rounded to the nearest video frame */ +BOOST_AUTO_TEST_CASE (content_test4) +{ + shared_ptr<Film> film = new_test_film2 ("content_test4"); + + shared_ptr<Content> video = content_factory("test/data/count300bd24.m2ts").front(); + film->examine_and_add_content (video); + BOOST_REQUIRE (!wait_for_jobs()); + + video->set_trim_end (dcpomatic::ContentTime(3000)); + BOOST_CHECK (video->length_after_trim(film) == DCPTime::from_frames(299, 24)); +} + + +/** Content containing no video will not have its length rounded to the nearest video frame */ +BOOST_AUTO_TEST_CASE (content_test5) +{ + shared_ptr<Film> film = new_test_film2 ("content_test5"); + + shared_ptr<Content> audio = content_factory("test/data/sine_16_48_220_10.wav").front(); + film->examine_and_add_content (audio); + BOOST_REQUIRE (!wait_for_jobs()); + + audio->set_trim_end (dcpomatic::ContentTime(3000)); + BOOST_CHECK (audio->length_after_trim(film) == DCPTime(957000)); +} |
