Fix non-frame-aligned trims when using trim-to-playhead.
[dcpomatic.git] / src / lib / dcpomatic_time.h
index 6834ee099616a94c273175fa8323378f8372fd14..16d93ca28bc83abc01c8273c6ece6cd092b42359 100644 (file)
@@ -119,9 +119,11 @@ public:
         *  @param r Sampling rate.
         */
        Time<S, O> ceil (float r) const {
-               Type const n = llrintf (HZ / r);
-               Type const a = _t + n - 1;
-               return Time<S, O> (a - (a % n));
+               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>
@@ -212,6 +214,7 @@ public:
 
 private:
        friend struct dcptime_ceil_test;
+       friend struct dcptime_floor_test;
 
        Type _t;
        static const int HZ = 96000;