hardware/libcamera
修订版 | 8cf00b64f942376f1bf5e3f5a39c2086c4d51246 (tree) |
---|---|
时间 | 2018-06-11 08:36:17 |
作者 | Michael Goffioul <michael.goffioul@gmai...> |
Commiter | Chih-Wei Huang |
CameraHardware: fix FPS problem
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.
@@ -475,7 +475,7 @@ status_t CameraHardware::startPreviewLocked() | ||
475 | 475 | mParameters.getPreviewSize(&width, &height); |
476 | 476 | } |
477 | 477 | |
478 | - int fps = mParameters.getPreviewFrameRate(); | |
478 | + int fps = getPreviewFrameRate(mParameters); | |
479 | 479 | |
480 | 480 | ALOGD("CameraHardware::startPreviewLocked: Open, %dx%d", width, height); |
481 | 481 |
@@ -722,7 +722,7 @@ status_t CameraHardware::setParameters(const char* parms) | ||
722 | 722 | int w, h; |
723 | 723 | |
724 | 724 | params.getPreviewSize(&w, &h); |
725 | - ALOGD("CameraHardware::setParameters: PREVIEW: Size %dx%d, %d fps, format: %s", w, h, params.getPreviewFrameRate(), params.getPreviewFormat()); | |
725 | + ALOGD("CameraHardware::setParameters: PREVIEW: Size %dx%d, %d fps, format: %s", w, h, getPreviewFrameRate(params), params.getPreviewFormat()); | |
726 | 726 | |
727 | 727 | params.getPictureSize(&w, &h); |
728 | 728 | ALOGD("CameraHardware::setParameters: PICTURE: Size %dx%d, format: %s", w, h, params.getPictureFormat()); |
@@ -866,8 +866,8 @@ void CameraHardware::initDefaultParameters() | ||
866 | 866 | String8 fpsranges(""); |
867 | 867 | for (i = 0; i < avFps.size(); i++) { |
868 | 868 | char descr[32]; |
869 | - int ss = avFps[i]; | |
870 | - sprintf(descr,"(%d,%d)",ss,ss); | |
869 | + int ss = avFps[i] * 1000; | |
870 | + sprintf(descr, "(%d,%d)", ss, ss); | |
871 | 871 | fpsranges.append(descr); |
872 | 872 | if (i < avFps.size() - 1) { |
873 | 873 | fpsranges.append(","); |
@@ -1263,7 +1263,7 @@ int CameraHardware::previewThread() | ||
1263 | 1263 | { |
1264 | 1264 | ALOGV("CameraHardware::previewThread: this=%p",this); |
1265 | 1265 | |
1266 | - int previewFrameRate = mParameters.getPreviewFrameRate(); | |
1266 | + int previewFrameRate = getPreviewFrameRate(mParameters); | |
1267 | 1267 | |
1268 | 1268 | // Calculate how long to wait between frames. |
1269 | 1269 | int delay = (int)(1000000 / previewFrameRate); |
@@ -1783,6 +1783,18 @@ int CameraHardware::pictureThread() | ||
1783 | 1783 | return NO_ERROR; |
1784 | 1784 | } |
1785 | 1785 | |
1786 | +int CameraHardware::getPreviewFrameRate(const CameraParameters& params) | |
1787 | +{ | |
1788 | + int min_fps = -1, max_fps = -1; | |
1789 | + params.getPreviewFpsRange(&min_fps, &max_fps); | |
1790 | + if (max_fps == -1) { | |
1791 | + max_fps = params.getPreviewFrameRate(); | |
1792 | + } else { | |
1793 | + max_fps /= 1000; | |
1794 | + } | |
1795 | + return max_fps; | |
1796 | +} | |
1797 | + | |
1786 | 1798 | /**************************************************************************** |
1787 | 1799 | * Camera API callbacks as defined by camera_device_ops structure. |
1788 | 1800 | * |
@@ -244,6 +244,8 @@ private: | ||
244 | 244 | |
245 | 245 | void fillPreviewWindow(uint8_t* yuyv, int srcWidth, int srcHeight); |
246 | 246 | |
247 | + int getPreviewFrameRate(const CameraParameters& params); | |
248 | + | |
247 | 249 | mutable Mutex mLock; |
248 | 250 | |
249 | 251 | preview_stream_ops* mWin; |