From 0fc312a5cb51cdc98bdb23623a03f1fbe1156251 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 25 Dec 2016 01:02:04 +0000 Subject: Updated fr_FR translation from Thierry Journet. --- src/lib/po/fr_FR.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/lib') diff --git a/src/lib/po/fr_FR.po b/src/lib/po/fr_FR.po index 89fb615b0..3e872127f 100644 --- a/src/lib/po/fr_FR.po +++ b/src/lib/po/fr_FR.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: DCP-o-matic FRENCH\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-16 16:15+0000\n" -"PO-Revision-Date: 2016-11-14 01:09+0100\n" +"PO-Revision-Date: 2016-12-23 11:11+0100\n" "Last-Translator: Grégoire AUSINA \n" "Language-Team: \n" "Language: fr_FR\n" @@ -920,7 +920,7 @@ msgstr "ArD" #: src/lib/colour_conversion.cc:288 msgid "S-Gamut3/S-Log3" -msgstr "" +msgstr "S-Gamut3/S-Log3" #: src/lib/ffmpeg_content.cc:516 src/lib/ffmpeg_content.cc:535 msgid "SMPTE 170M (BT601)" @@ -932,7 +932,7 @@ msgstr "SMPTE 170M (BT601-6)" #: src/lib/ffmpeg_content.cc:565 msgid "SMPTE 2085, Y'D'zD'x" -msgstr "" +msgstr "SMPTE 2085, Y'D'zD'x" #: src/lib/ffmpeg_content.cc:517 src/lib/ffmpeg_content.cc:536 #: src/lib/ffmpeg_content.cc:561 @@ -952,14 +952,12 @@ msgid "SMPTE ST 428-1 (CIE 1931 XYZ)" msgstr "SMPTE ST 428-1 (CIE 1931 XYZ)" #: src/lib/ffmpeg_content.cc:521 -#, fuzzy msgid "SMPTE ST 431-2 (2011)" -msgstr "SMPTE ST 428-1" +msgstr "SMPTE ST 431-2 (2011)" #: src/lib/ffmpeg_content.cc:522 -#, fuzzy msgid "SMPTE ST 432-1 D65 (2010)" -msgstr "SMPTE ST 428-1" +msgstr "SMPTE ST 432-1 D65 (2010)" #: src/lib/scp_uploader.cc:56 msgid "SSH error (%1)" -- cgit v1.2.3 From 11ac33e140f3aa9d6e992880a1e1b3a4ca649355 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 4 Jan 2017 01:28:54 +0000 Subject: Rename Time::round_up to Time::ceil. --- src/lib/content.cc | 2 +- src/lib/dcpomatic_time.h | 6 +++--- src/lib/ffmpeg.cc | 2 +- src/lib/film.cc | 2 +- test/reels_test.cc | 2 +- test/seek_zero_test.cc | 2 +- test/util_test.cc | 22 +++++++++++----------- 7 files changed, 19 insertions(+), 19 deletions(-) (limited to 'src/lib') diff --git a/src/lib/content.cc b/src/lib/content.cc index b5bae69b6..942e9e533 100644 --- a/src/lib/content.cc +++ b/src/lib/content.cc @@ -327,7 +327,7 @@ Content::reel_split_points () const { list t; /* XXX: this is questionable; perhaps the position itself should be forced to be on a frame boundary */ - t.push_back (position().round_up (film()->video_frame_rate())); + t.push_back (position().ceil (film()->video_frame_rate())); return t; } diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 893bce257..6834ee099 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -118,7 +118,7 @@ public: * at some sampling rate. * @param r Sampling rate. */ - Time round_up (float r) const { + Time ceil (float r) const { Type const n = llrintf (HZ / r); Type const a = _t + n - 1; return Time (a - (a % n)); @@ -152,7 +152,7 @@ public: the calculation will round down before we get the chance to ceil(). */ - return ceil (_t * double(r) / HZ); + return ::ceil (_t * double(r) / HZ); } /** @param r Frames per second */ @@ -211,7 +211,7 @@ public: } private: - friend struct dcptime_round_up_test; + friend struct dcptime_ceil_test; Type _t; static const int HZ = 96000; diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index af6c8e167..ce87cc14f 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -381,7 +381,7 @@ FFmpeg::pts_offset (vector > audio_streams, option /* Now adjust so that the video pts starts on a frame */ if (first_video) { ContentTime const fvc = first_video.get() + po; - po += fvc.round_up (video_frame_rate) - fvc; + po += fvc.ceil (video_frame_rate) - fvc; } return po; diff --git a/src/lib/film.cc b/src/lib/film.cc index d331516dd..68266b4ec 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1416,7 +1416,7 @@ list Film::reels () const { list p; - DCPTime const len = length().round_up (video_frame_rate ()); + DCPTime const len = length().ceil (video_frame_rate ()); switch (reel_type ()) { case REELTYPE_SINGLE: diff --git a/test/reels_test.cc b/test/reels_test.cc index 51cb1f200..1951d5374 100644 --- a/test/reels_test.cc +++ b/test/reels_test.cc @@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE (reels_test3) BOOST_CHECK_EQUAL (i->to.get(), 96000 * 3); ++i; BOOST_CHECK_EQUAL (i->from.get(), 96000 * 3); - BOOST_CHECK_EQUAL (i->to.get(), sub->full_length().round_up(film->video_frame_rate()).get()); + BOOST_CHECK_EQUAL (i->to.get(), sub->full_length().ceil(film->video_frame_rate()).get()); } /** Check creation of a multi-reel DCP with a single .srt subtitle file; diff --git a/test/seek_zero_test.cc b/test/seek_zero_test.cc index faf4c9eac..0329364d9 100644 --- a/test/seek_zero_test.cc +++ b/test/seek_zero_test.cc @@ -62,7 +62,7 @@ BOOST_AUTO_TEST_CASE (seek_zero_test) video_delay = ContentTime (); } - Frame const first_frame = video_delay.round_up (content->active_video_frame_rate ()).frames_round (content->active_video_frame_rate ()); + Frame const first_frame = video_delay.ceil (content->active_video_frame_rate ()).frames_round (content->active_video_frame_rate ()); FFmpegDecoder decoder (content, film->log()); list a = decoder.video->get (first_frame, true); diff --git a/test/util_test.cc b/test/util_test.cc index 6abc9b5e7..c7bf9944d 100644 --- a/test/util_test.cc +++ b/test/util_test.cc @@ -51,21 +51,21 @@ BOOST_AUTO_TEST_CASE (digest_head_tail_test) BOOST_CHECK_THROW (digest_head_tail (p, 1024), OpenFileError); } -/* Straightforward test of DCPTime::round_up */ -BOOST_AUTO_TEST_CASE (dcptime_round_up_test) +/* Straightforward test of DCPTime::ceil */ +BOOST_AUTO_TEST_CASE (dcptime_ceil_test) { - BOOST_CHECK_EQUAL (DCPTime(0).round_up(DCPTime::HZ / 2).get(), 0); - BOOST_CHECK_EQUAL (DCPTime(1).round_up(DCPTime::HZ / 2).get(), 2); - BOOST_CHECK_EQUAL (DCPTime(2).round_up(DCPTime::HZ / 2).get(), 2); - BOOST_CHECK_EQUAL (DCPTime(3).round_up(DCPTime::HZ / 2).get(), 4); + BOOST_CHECK_EQUAL (DCPTime(0).ceil(DCPTime::HZ / 2).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(1).ceil(DCPTime::HZ / 2).get(), 2); + BOOST_CHECK_EQUAL (DCPTime(2).ceil(DCPTime::HZ / 2).get(), 2); + BOOST_CHECK_EQUAL (DCPTime(3).ceil(DCPTime::HZ / 2).get(), 4); - BOOST_CHECK_EQUAL (DCPTime(0).round_up(DCPTime::HZ / 42).get(), 0); - BOOST_CHECK_EQUAL (DCPTime(1).round_up(DCPTime::HZ / 42).get(), 42); - BOOST_CHECK_EQUAL (DCPTime(42).round_up(DCPTime::HZ / 42).get(), 42); - BOOST_CHECK_EQUAL (DCPTime(43).round_up(DCPTime::HZ / 42).get(), 84); + BOOST_CHECK_EQUAL (DCPTime(0).ceil(DCPTime::HZ / 42).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(1).ceil(DCPTime::HZ / 42).get(), 42); + BOOST_CHECK_EQUAL (DCPTime(42).ceil(DCPTime::HZ / 42).get(), 42); + BOOST_CHECK_EQUAL (DCPTime(43).ceil(DCPTime::HZ / 42).get(), 84); /* Check that rounding up to non-integer frame rates works */ - BOOST_CHECK_EQUAL (DCPTime(45312).round_up(29.976).get(), 48045); + BOOST_CHECK_EQUAL (DCPTime(45312).ceil(29.976).get(), 48045); } BOOST_AUTO_TEST_CASE (timecode_test) -- cgit v1.2.3 From 736f9d8154080ea5837b31af623ef863eea1a7c5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 4 Jan 2017 21:41:07 +0000 Subject: Fix non-frame-aligned trims when using trim-to-playhead. Reimplement Time::ceil and add a corresponding Time::floor with tests. ceil returns slightly different results to previously with non-integer frame rates. Then use floor to round the playhead position when trimming. --- ChangeLog | 5 +++++ src/lib/dcpomatic_time.h | 11 +++++++---- src/wx/film_viewer.h | 3 ++- src/wx/timing_panel.cc | 10 ++++++---- test/util_test.cc | 19 ++++++++++++++++++- 5 files changed, 38 insertions(+), 10 deletions(-) (limited to 'src/lib') diff --git a/ChangeLog b/ChangeLog index efc8f7d5c..3b631c2af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-01-04 Carl Hetherington + + * Fix non frame-aligned trims when using the to-playhead + buttons. + 2016-12-25 Carl Hetherington * Updated fr_FR translation from Thierry Journet. diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 6834ee099..16d93ca28 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -119,9 +119,11 @@ public: * @param r Sampling rate. */ Time ceil (float r) const { - Type const n = llrintf (HZ / r); - Type const a = _t + n - 1; - return Time (a - (a % n)); + return Time (llrint (HZ * frames_ceil(r) / double(r))); + } + + Time floor (float r) const { + return Time (llrint (HZ * frames_floor(r) / double(r))); } double seconds () const { @@ -143,7 +145,7 @@ public: template int64_t frames_floor (T r) const { - return floor (_t * r / HZ); + return ::floor (_t * r / HZ); } template @@ -212,6 +214,7 @@ public: private: friend struct dcptime_ceil_test; + friend struct dcptime_floor_test; Type _t; static const int HZ = 96000; diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index a67820a8c..aa588b926 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -41,6 +41,7 @@ public: void set_film (boost::shared_ptr); + /** @return our `playhead' position; this may not lie exactly on a frame boundary */ DCPTime position () const { return _position; } diff --git a/src/wx/timing_panel.cc b/src/wx/timing_panel.cc index bd4177ffb..d7ed46f46 100644 --- a/src/wx/timing_panel.cc +++ b/src/wx/timing_panel.cc @@ -441,14 +441,15 @@ TimingPanel::film_changed (Film::Property p) void TimingPanel::trim_start_to_playhead_clicked () { - DCPTime const ph = _viewer->position (); + shared_ptr film = _parent->film (); + DCPTime const ph = _viewer->position().floor (film->video_frame_rate ()); optional new_ph; _viewer->set_coalesce_player_changes (true); BOOST_FOREACH (shared_ptr i, _parent->selected ()) { if (i->position() < ph && ph < i->end ()) { - FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ()); + FrameRateChange const frc = film->active_frame_rate_change (i->position ()); i->set_trim_start (i->trim_start() + ContentTime (ph - i->position (), frc)); new_ph = i->position (); } @@ -464,10 +465,11 @@ TimingPanel::trim_start_to_playhead_clicked () void TimingPanel::trim_end_to_playhead_clicked () { - DCPTime const ph = _viewer->position (); + shared_ptr film = _parent->film (); + DCPTime const ph = _viewer->position().floor (film->video_frame_rate ()); BOOST_FOREACH (shared_ptr i, _parent->selected ()) { if (i->position() < ph && ph < i->end ()) { - FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ()); + FrameRateChange const frc = film->active_frame_rate_change (i->position ()); i->set_trim_end (ContentTime (i->position() + i->full_length() - ph - DCPTime::from_frames (1, frc.dcp), frc) - i->trim_start()); } } diff --git a/test/util_test.cc b/test/util_test.cc index c7bf9944d..334811cb7 100644 --- a/test/util_test.cc +++ b/test/util_test.cc @@ -65,7 +65,24 @@ BOOST_AUTO_TEST_CASE (dcptime_ceil_test) BOOST_CHECK_EQUAL (DCPTime(43).ceil(DCPTime::HZ / 42).get(), 84); /* Check that rounding up to non-integer frame rates works */ - BOOST_CHECK_EQUAL (DCPTime(45312).ceil(29.976).get(), 48045); + BOOST_CHECK_EQUAL (DCPTime(45312).ceil(29.976).get(), 48038); +} + +/* Straightforward test of DCPTime::floor */ +BOOST_AUTO_TEST_CASE (dcptime_floor_test) +{ + BOOST_CHECK_EQUAL (DCPTime(0).floor(DCPTime::HZ / 2).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(1).floor(DCPTime::HZ / 2).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(2).floor(DCPTime::HZ / 2).get(), 2); + BOOST_CHECK_EQUAL (DCPTime(3).floor(DCPTime::HZ / 2).get(), 2); + + BOOST_CHECK_EQUAL (DCPTime(0).floor(DCPTime::HZ / 42).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(1).floor(DCPTime::HZ / 42).get(), 0); + BOOST_CHECK_EQUAL (DCPTime(42).floor(DCPTime::HZ / 42.0).get(), 42); + BOOST_CHECK_EQUAL (DCPTime(43).floor(DCPTime::HZ / 42.0).get(), 42); + + /* Check that rounding down to non-integer frame rates works */ + BOOST_CHECK_EQUAL (DCPTime(45312).floor(29.976).get(), 44836); } BOOST_AUTO_TEST_CASE (timecode_test) -- cgit v1.2.3