diff options
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 51 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.h | 13 |
2 files changed, 47 insertions, 17 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 4a509aa745..e6154f0d69 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -2306,6 +2306,15 @@ sp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( newRequest->mRotateAndCropAuto = false; } + auto zoomRatioEntry = + newRequest->mSettingsList.begin()->metadata.find(ANDROID_CONTROL_ZOOM_RATIO); + if (zoomRatioEntry.count > 0 && + zoomRatioEntry.data.f[0] == 1.0f) { + newRequest->mZoomRatioIs1x = true; + } else { + newRequest->mZoomRatioIs1x = false; + } + return newRequest; } @@ -4426,13 +4435,17 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { parent->mDistortionMappers.end()) { continue; } - res = parent->mDistortionMappers[it->cameraId].correctCaptureRequest( - &(it->metadata)); - if (res != OK) { - SET_ERR("RequestThread: Unable to correct capture requests " - "for lens distortion for request %d: %s (%d)", - halRequest->frame_number, strerror(-res), res); - return INVALID_OPERATION; + + if (!captureRequest->mDistortionCorrectionUpdated) { + res = parent->mDistortionMappers[it->cameraId].correctCaptureRequest( + &(it->metadata)); + if (res != OK) { + SET_ERR("RequestThread: Unable to correct capture requests " + "for lens distortion for request %d: %s (%d)", + halRequest->frame_number, strerror(-res), res); + return INVALID_OPERATION; + } + captureRequest->mDistortionCorrectionUpdated = true; } } @@ -4443,21 +4456,24 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { continue; } - camera_metadata_entry_t e = it->metadata.find(ANDROID_CONTROL_ZOOM_RATIO); - if (e.count > 0 && e.data.f[0] != 1.0f) { + if (!captureRequest->mZoomRatioIs1x) { cameraIdsWithZoom.insert(it->cameraId); } - res = parent->mZoomRatioMappers[it->cameraId].updateCaptureRequest( - &(it->metadata)); - if (res != OK) { - SET_ERR("RequestThread: Unable to correct capture requests " - "for zoom ratio for request %d: %s (%d)", - halRequest->frame_number, strerror(-res), res); - return INVALID_OPERATION; + if (!captureRequest->mZoomRatioUpdated) { + res = parent->mZoomRatioMappers[it->cameraId].updateCaptureRequest( + &(it->metadata)); + if (res != OK) { + SET_ERR("RequestThread: Unable to correct capture requests " + "for zoom ratio for request %d: %s (%d)", + halRequest->frame_number, strerror(-res), res); + return INVALID_OPERATION; + } + captureRequest->mZoomRatioUpdated = true; } } - if (captureRequest->mRotateAndCropAuto) { + if (captureRequest->mRotateAndCropAuto && + !captureRequest->mRotationAndCropUpdated) { for (it = captureRequest->mSettingsList.begin(); it != captureRequest->mSettingsList.end(); it++) { auto mapper = parent->mRotateAndCropMappers.find(it->cameraId); @@ -4471,6 +4487,7 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { } } } + captureRequest->mRotationAndCropUpdated = true; } } } diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 408f1f9be2..77284cc82e 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -517,6 +517,19 @@ class Camera3Device : // overriding of ROTATE_AND_CROP value and adjustment of coordinates // in several other controls in both the request and the result bool mRotateAndCropAuto; + // Whether this capture request has its zoom ratio set to 1.0x before + // the framework overrides it for camera HAL consumption. + bool mZoomRatioIs1x; + + + // Whether this capture request's distortion correction update has + // been done. + bool mDistortionCorrectionUpdated = false; + // Whether this capture request's rotation and crop update has been + // done. + bool mRotationAndCropUpdated = false; + // Whether this capture request's zoom ratio update has been done. + bool mZoomRatioUpdated = false; }; typedef List<sp<CaptureRequest> > RequestList; |