Merge branch 'master' of ssh://git.carlh.net/home/carl/git/dcpomatic
authorCarl Hetherington <cth@carlh.net>
Thu, 5 Jan 2017 09:37:57 +0000 (09:37 +0000)
committerCarl Hetherington <cth@carlh.net>
Thu, 5 Jan 2017 09:37:57 +0000 (09:37 +0000)
14 files changed:
ChangeLog
src/lib/content.cc
src/lib/dcpomatic_time.h
src/lib/ffmpeg.cc
src/lib/film.cc
src/lib/po/fr_FR.po
src/tools/po/fr_FR.po
src/wx/about_dialog.cc
src/wx/film_viewer.h
src/wx/po/fr_FR.po
src/wx/timing_panel.cc
test/reels_test.cc
test/seek_zero_test.cc
test/util_test.cc

index fb7890ec653d25363344f987681a6d93167302d5..6803804ca56ed568e93f7cab46eeb8b690562285 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-01-04  Carl Hetherington  <cth@carlh.net>
+
+       * Fix non frame-aligned trims when using the to-playhead
+       buttons.
+
+2016-12-25  Carl Hetherington  <cth@carlh.net>
+
+       * Updated fr_FR translation from Thierry Journet.
+
 2016-12-21  Carl Hetherington  <cth@carlh.net>
 
        * Add approximate finish time to progress on jobs (#927).
index b5bae69b684f8a57c50a94dc96803ee74571c15a..942e9e533c8535b852af35df0b2108da5d8951fa 100644 (file)
@@ -327,7 +327,7 @@ Content::reel_split_points () const
 {
        list<DCPTime> 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;
 }
 
index 893bce2572e21752a1de59f6dcdb43f9eb8a0ca4..16d93ca28bc83abc01c8273c6ece6cd092b42359 100644 (file)
@@ -118,10 +118,12 @@ public:
         *  at some sampling rate.
         *  @param r Sampling rate.
         */
-       Time<S, O> round_up (float r) const {
-               Type const n = llrintf (HZ / r);
-               Type const a = _t + n - 1;
-               return Time<S, O> (a - (a % n));
+       Time<S, O> ceil (float r) const {
+               return Time<S, O> (llrint (HZ * frames_ceil(r) / double(r)));
+       }
+
+       Time<S, O> floor (float r) const {
+               return Time<S, O> (llrint (HZ * frames_floor(r) / double(r)));
        }
 
        double seconds () const {
@@ -143,7 +145,7 @@ public:
 
        template <typename T>
        int64_t frames_floor (T r) const {
-               return floor (_t * r / HZ);
+               return ::floor (_t * r / HZ);
        }
 
        template <typename T>
@@ -152,7 +154,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 +213,8 @@ public:
        }
 
 private:
-       friend struct dcptime_round_up_test;
+       friend struct dcptime_ceil_test;
+       friend struct dcptime_floor_test;
 
        Type _t;
        static const int HZ = 96000;
index af6c8e1674e66c12b01dcafbbc2f428ddc96d561..ce87cc14f2d7801f2974202008012f624b09d1ae 100644 (file)
@@ -381,7 +381,7 @@ FFmpeg::pts_offset (vector<shared_ptr<FFmpegAudioStream> > 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;
index d331516dd1e9cac9c7b9b979975a1d4578927266..68266b4ec52a3a4f4825eaeb5cd3e5073081052e 100644 (file)
@@ -1416,7 +1416,7 @@ list<DCPTimePeriod>
 Film::reels () const
 {
        list<DCPTimePeriod> p;
-       DCPTime const len = length().round_up (video_frame_rate ());
+       DCPTime const len = length().ceil (video_frame_rate ());
 
        switch (reel_type ()) {
        case REELTYPE_SINGLE:
index 89fb615b040901adf325a42b0f96f7d53d5598a1..3e872127fcedc9392165d83b7f94880370115797 100644 (file)
@@ -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 <gregoire@gisele-productions.eu>\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)"
index 0de32114be044d2ec0cf0b2aac241833328a4f6d..695ca10406bcc4a8384ea9597aad0728091adc20 100644 (file)
@@ -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:12+0100\n"
+"PO-Revision-Date: 2016-12-23 11:18+0100\n"
 "Last-Translator: Grégoire AUSINA <gregoire@gisele-productions.eu>\n"
 "Language-Team: \n"
 "Language: fr_FR\n"
@@ -230,11 +230,9 @@ msgid "Encoding servers..."
 msgstr "Serveurs d'encodage"
 
 #: src/tools/dcpomatic_kdm.cc:276
-#, fuzzy, c-format
+#, c-format
 msgid "File %s already exists.  Do you want to overwrite it?"
-msgstr ""
-"Le répertoire %s existe déjà et n'est pas vide. Etes-vous sûr de vouloir "
-"l'utiliser ?"
+msgstr "Le fichier %s existe déjà. Etes-vous sûr de vouloir le remplacer ?"
 
 #. / TRANSLATORS: this is the heading for a dialog box, which tells the user that the current
 #. / project (Film) has been changed since it was last saved.
index 34f45ed59f6a550bbc195b4881a0a4b20f705126..bcde058625c7dc28e148708673bf9cc552354cd2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2017 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -80,7 +80,7 @@ AboutDialog::AboutDialog (wxWindow* parent)
 
        t = new wxStaticText (
                this, wxID_ANY,
-               _("(C) 2012-2016 Carl Hetherington, Terrence Meiczinger\n Ole Laursen, Brecht Sanders"),
+               _("(C) 2012-2017 Carl Hetherington, Terrence Meiczinger\n Ole Laursen, Brecht Sanders"),
                wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER
                );
 
@@ -246,6 +246,7 @@ AboutDialog::AboutDialog (wxWindow* parent)
        supported_by.Add (wxT ("Aditya Pratama"));
        supported_by.Add (wxT ("Ceridwen Productions"));
        supported_by.Add (wxT ("Ivan Pullman"));
+       supported_by.Add (wxT ("Arts Quest"));
        supported_by.Add (wxT ("Desiderio Garcia Ramirez"));
        supported_by.Add (wxT ("Steve Reverand"));
        supported_by.Add (wxT ("Mark Rolfe"));
index a67820a8ca21229e2b7ef8f40dfaaba7cf617596..aa588b92607d9a3922c1d7a03f70a19a348d603b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2017 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -41,6 +41,7 @@ public:
 
        void set_film (boost::shared_ptr<Film>);
 
+       /** @return our `playhead' position; this may not lie exactly on a frame boundary */
        DCPTime position () const {
                return _position;
        }
index c2c3f28420ee53a86205511f2088ac5596f75370..c4bf8f6c7ddce00f840f1c365d24eb331319cfc5 100644 (file)
@@ -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:17+0100\n"
 "Last-Translator: Grégoire AUSINA <gregoire@gisele-productions.eu>\n"
 "Language-Team: \n"
 "Language: fr_FR\n"
@@ -544,9 +544,8 @@ msgid "Default JPEG2000 bandwidth"
 msgstr "Qualité JPEG2000 par défaut"
 
 #: src/wx/config_dialog.cc:463
-#, fuzzy
 msgid "Default KDM directory"
-msgstr "Dossier de sortie par défaut"
+msgstr "Répertoire KDM par défaut"
 
 #: src/wx/config_dialog.cc:451
 msgid "Default audio delay"
@@ -729,7 +728,7 @@ msgstr "Durée Fondu fin"
 
 #: src/wx/kdm_dialog.cc:132
 msgid "File %s already exists.  Do you want to overwrite it?"
-msgstr ""
+msgstr "Le fichier %s existe déjà. Voulez-vous le remplacer?"
 
 #: src/wx/kdm_output_panel.cc:51
 msgid "Filename format"
@@ -814,12 +813,11 @@ msgstr "Gain pour le canal audio %d dans le canal du DCP %d"
 
 #: src/wx/colour_conversion_editor.cc:60
 msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
 
 #: src/wx/colour_conversion_editor.cc:61
-#, fuzzy
 msgid "Gamma, linearised for small values"
-msgstr "Linéariser la courbe d'entrée gamma pour les bas niveaux"
+msgstr "Gamma, linéarisée pour les bas niveaux"
 
 #: src/wx/config_dialog.cc:1488 src/wx/content_properties_dialog.cc:70
 msgid "General"
@@ -900,7 +898,7 @@ msgstr "puissance d'entrée"
 
 #: src/wx/colour_conversion_editor.cc:58
 msgid "Input transfer function"
-msgstr ""
+msgstr "Fonction transfert d'entrée"
 
 #: src/wx/audio_dialog.cc:351
 #, c-format
@@ -920,9 +918,8 @@ msgid "Interop"
 msgstr "MXF-Interop"
 
 #: src/wx/colour_conversion_editor.cc:203
-#, fuzzy
 msgid "Inverse 2.6 gamma correction on output"
-msgstr "Correction gamma d'entrée"
+msgstr "Inversion de la correction gamma 2.6 en entrée"
 
 #: src/wx/config_dialog.cc:227
 msgid "Issuer"
@@ -1107,7 +1104,8 @@ msgstr "DEMANDE de KDM:"
 msgid "NEEDS OV: "
 msgstr "OV Nécessaire:"
 
-#: src/wx/cinema_dialog.cc:50 src/wx/dcp_panel.cc:72 src/wx/screen_dialog.cc:68
+#: src/wx/cinema_dialog.cc:50 src/wx/dcp_panel.cc:72
+#: src/wx/screen_dialog.cc:68
 msgid "Name"
 msgstr "Nom"
 
@@ -1393,7 +1391,7 @@ msgstr "Résolution"
 
 #: src/wx/image_subtitle_colour_dialog.cc:70
 msgid "Restore to original colours"
-msgstr ""
+msgstr "Rétablir Couleurs originelles"
 
 #: src/wx/normal_job_view.cc:56
 msgid "Resume"
@@ -1421,7 +1419,7 @@ msgstr "Nom commun racine"
 
 #: src/wx/colour_conversion_editor.cc:62
 msgid "S-Gamut3"
-msgstr ""
+msgstr "S-Gamut3"
 
 #: src/wx/config_dialog.cc:1168
 msgid "SCP (for AAM and Doremi)"
@@ -1972,6 +1970,8 @@ msgid ""
 "You cannot add a screen called '%s' as the cinema already has a screen with "
 "this name."
 msgstr ""
+"Vous ne pouvez pas ajouter un écran appelé '%s' car le cinéma possède déjà "
+"un écran appelé ainsi."
 
 #: src/wx/screens_panel.cc:258
 #, c-format
@@ -1979,6 +1979,8 @@ msgid ""
 "You cannot change this screen's name to '%s' as the cinema already has a "
 "screen with this name."
 msgstr ""
+"Vous ne pouvez pas modifier le nom de l'écran en '%s' car le cinéma possède "
+"déjà un écran nommé ainsi."
 
 #: src/wx/report_problem_dialog.cc:66
 msgid "Your email address"
index bd4177ffbaaae51f21926b9c3ebaedd31be44dfd..d7ed46f467eca85192d6b6c355cf375830a72d9b 100644 (file)
@@ -441,14 +441,15 @@ TimingPanel::film_changed (Film::Property p)
 void
 TimingPanel::trim_start_to_playhead_clicked ()
 {
-       DCPTime const ph = _viewer->position ();
+       shared_ptr<const Film> film = _parent->film ();
+       DCPTime const ph = _viewer->position().floor (film->video_frame_rate ());
        optional<DCPTime> new_ph;
 
        _viewer->set_coalesce_player_changes (true);
 
        BOOST_FOREACH (shared_ptr<Content> 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<const Film> film = _parent->film ();
+       DCPTime const ph = _viewer->position().floor (film->video_frame_rate ());
        BOOST_FOREACH (shared_ptr<Content> 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());
                }
        }
index 51cb1f2005dcbe655036bbedc3455a4b8ee71d9c..1951d53748a8f9b4cfeda161c8b83fb3d0fd6bed 100644 (file)
@@ -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;
index faf4c9eac7c35ad5521d5ebb7e7a609446369761..0329364d97ed6a555f8c10859bbe6fcff1bcaf14 100644 (file)
@@ -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<ContentVideo> a = decoder.video->get (first_frame, true);
index 6abc9b5e727273ca9a250939efc287e26d1e584f..334811cb7a9db4caa0219513d32b7ec007c8e129 100644 (file)
@@ -51,21 +51,38 @@ 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(), 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)