Fix bad rounding of timecodes for display.
authorCarl Hetherington <cth@carlh.net>
Tue, 18 Mar 2014 15:19:13 +0000 (15:19 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 18 Mar 2014 15:19:13 +0000 (15:19 +0000)
Reported-by: GĂ©rald Maruccia
ChangeLog
src/wx/timecode.cc

index 45847805a4b6ec914323cd8cd4fc314a829a92fd..f4830e40d2d972f97396cb3aedb8e33cb5c62330 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2014-03-18  Carl Hetherington  <cth@carlh.net>
 
+       * Fix bad rounding of timecodes.
+
        * Tentative support for 3D from alternate frames of the source.
 
 2014-03-17  Carl Hetherington  <cth@carlh.net>
index ac4fd46c4971f2009be8fd40fbc7bd9d9be0e2f1..a8c90b4882623a1ab027bdaee5745769ac6023b5 100644 (file)
@@ -85,20 +85,24 @@ Timecode::Timecode (wxWindow* parent)
 void
 Timecode::set (Time t, int fps)
 {
-       int const h = t / (3600 * TIME_HZ);
-       t -= h * 3600 * TIME_HZ;
-       int const m = t / (60 * TIME_HZ);
-       t -= m * 60 * TIME_HZ;
-       int const s = t / TIME_HZ;
-       t -= s * TIME_HZ;
-       int const f = divide_with_round (t * fps, TIME_HZ);
+       /* Do this calculation with frames so that we can round
+          to a frame boundary at the start rather than the end.
+       */
+       int64_t f = divide_with_round (t * fps, TIME_HZ);
+       
+       int const h = f / (3600 * fps);
+       f -= h * 3600 * fps;
+       int const m = f / (60 * fps);
+       f -= m * 60 * fps;
+       int const s = f / fps;
+       f -= s * fps;
 
        checked_set (_hours, lexical_cast<string> (h));
        checked_set (_minutes, lexical_cast<string> (m));
        checked_set (_seconds, lexical_cast<string> (s));
        checked_set (_frames, lexical_cast<string> (f));
 
-       _fixed->SetLabel (wxString::Format ("%02d:%02d:%02d.%02d", h, m, s, f));
+       _fixed->SetLabel (wxString::Format ("%02d:%02d:%02d.%02ld", h, m, s, f));
 }
 
 Time