OSDN Git Service

CameraHardware: fix FPS problem
authorMichael Goffioul <michael.goffioul@gmail.com>
Fri, 8 Jun 2018 20:02:21 +0000 (13:02 -0700)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Sun, 10 Jun 2018 23:36:17 +0000 (07:36 +0800)
The values reported by Camera.Parameters.getSupportedPreviewFpsRange()
are in actual FPS, while the API expects value to be multiplied by 1000.
This creates a problem in an app that is using Chrome/53 webview,
whereby the webcam is limited to 1fps. The patch fixes it.

CameraHardware.cpp
CameraHardware.h

index 7bbffc6..0345039 100644 (file)
@@ -475,7 +475,7 @@ status_t CameraHardware::startPreviewLocked()
         mParameters.getPreviewSize(&width, &height);
     }
 
-    int fps = mParameters.getPreviewFrameRate();
+    int fps = getPreviewFrameRate(mParameters);
 
     ALOGD("CameraHardware::startPreviewLocked: Open, %dx%d", width, height);
 
@@ -722,7 +722,7 @@ status_t CameraHardware::setParameters(const char* parms)
     int w, h;
 
     params.getPreviewSize(&w, &h);
-    ALOGD("CameraHardware::setParameters: PREVIEW: Size %dx%d, %d fps, format: %s", w, h, params.getPreviewFrameRate(), params.getPreviewFormat());
+    ALOGD("CameraHardware::setParameters: PREVIEW: Size %dx%d, %d fps, format: %s", w, h, getPreviewFrameRate(params), params.getPreviewFormat());
 
     params.getPictureSize(&w, &h);
     ALOGD("CameraHardware::setParameters: PICTURE: Size %dx%d, format: %s", w, h, params.getPictureFormat());
@@ -866,8 +866,8 @@ void CameraHardware::initDefaultParameters()
     String8 fpsranges("");
     for (i = 0; i < avFps.size(); i++) {
         char descr[32];
-        int ss = avFps[i];
-        sprintf(descr,"(%d,%d)",ss,ss);
+        int ss = avFps[i] * 1000;
+        sprintf(descr, "(%d,%d)", ss, ss);
         fpsranges.append(descr);
         if (i < avFps.size() - 1) {
             fpsranges.append(",");
@@ -1263,7 +1263,7 @@ int CameraHardware::previewThread()
 {
     ALOGV("CameraHardware::previewThread: this=%p",this);
 
-    int previewFrameRate = mParameters.getPreviewFrameRate();
+    int previewFrameRate = getPreviewFrameRate(mParameters);
 
     // Calculate how long to wait between frames.
     int delay = (int)(1000000 / previewFrameRate);
@@ -1783,6 +1783,18 @@ int CameraHardware::pictureThread()
     return NO_ERROR;
 }
 
+int CameraHardware::getPreviewFrameRate(const CameraParameters& params)
+{
+    int min_fps = -1, max_fps = -1;
+    params.getPreviewFpsRange(&min_fps, &max_fps);
+    if (max_fps == -1) {
+        max_fps = params.getPreviewFrameRate();
+    } else {
+        max_fps /= 1000;
+    }
+    return max_fps;
+}
+
 /****************************************************************************
  * Camera API callbacks as defined by camera_device_ops structure.
  *
index 946023b..f3cb20e 100644 (file)
@@ -244,6 +244,8 @@ private:
 
     void fillPreviewWindow(uint8_t* yuyv, int srcWidth, int srcHeight);
 
+    int getPreviewFrameRate(const CameraParameters& params);
+
     mutable Mutex       mLock;
 
     preview_stream_ops* mWin;