Merge "Revise capture interval calculation in StagefrightRecorder" into oc-dev
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 95f378f..3b7c61b 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -709,26 +709,18 @@
 status_t StagefrightRecorder::setParamCaptureFps(double fps) {
     ALOGV("setParamCaptureFps: %.2f", fps);
 
-    constexpr int64_t k1E12 = 1000000000000ll;
-    int64_t fpsx1e12 = k1E12 * fps;
-    if (fpsx1e12 == 0) {
-        ALOGE("FPS is zero or too small");
-        return BAD_VALUE;
-    }
-
-    // This does not overflow since 10^6 * 10^12 < 2^63
-    int64_t timeUs = 1000000ll * k1E12 / fpsx1e12;
-
-    // Not allowing time more than a day and a millisecond for error margin.
-    // Note: 1e12 / 86400 = 11574074.(074) and 1e18 / 11574074 = 86400000553;
-    //       therefore 1 ms of margin should be sufficient.
-    if (timeUs <= 0 || timeUs > 86400001000ll) {
-        ALOGE("Time between frame capture (%lld) is out of range [0, 1 Day]", (long long)timeUs);
+    // FPS value is from Java layer where double follows IEEE-754, which is not
+    // necessarily true for double here.
+    constexpr double kIeee754Epsilon = 2.220446049250313e-16;
+    constexpr double kEpsilon = std::max(std::numeric_limits<double>::epsilon(), kIeee754Epsilon);
+    // Not allowing fps less than 1 frame / day minus epsilon.
+    if (fps < 1.0 / 86400 - kEpsilon) {
+        ALOGE("fps (%lf) is out of range (>= 1 frame / day)", fps);
         return BAD_VALUE;
     }
 
     mCaptureFps = fps;
-    mTimeBetweenCaptureUs = timeUs;
+    mTimeBetweenCaptureUs = std::llround(1e6 / fps);
     return OK;
 }