OSDN Git Service

Camera2: Use the triggerAfWithAuto quirk
authorEino-Ville Talvala <etalvala@google.com>
Thu, 4 Oct 2012 07:56:40 +0000 (00:56 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Thu, 4 Oct 2012 23:34:11 +0000 (16:34 -0700)
When this quirk is set, and a scene mode is enabled, do AF calls with
AF mode AUTO instead of whatever the scene more override AF mode is.

Bug: 7159577
Change-Id: I3ea6b8386abc0968047fc9bba3a35c5db5bdcfd3

services/camera/libcameraservice/Camera2Client.cpp
services/camera/libcameraservice/camera2/Parameters.cpp
services/camera/libcameraservice/camera2/Parameters.h

index 9bcaef1..ed4567e 100644 (file)
@@ -956,6 +956,16 @@ status_t Camera2Client::autoFocus() {
             return INVALID_OPERATION;
         }
 
+        if (l.mParameters.quirks.triggerAfWithAuto &&
+                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
+                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO) {
+            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
+                    __FUNCTION__, l.mParameters.focusMode);
+            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
+            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
+            updateRequests(l.mParameters);
+        }
+
         l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
         triggerId = l.mParameters.currentAfTriggerId;
     }
@@ -977,6 +987,16 @@ status_t Camera2Client::cancelAutoFocus() {
     {
         SharedParameters::Lock l(mParameters);
         triggerId = ++l.mParameters.afTriggerCounter;
+
+        // When using triggerAfWithAuto quirk, may need to reset focus mode to
+        // the real state at this point.
+        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
+            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
+                    l.mParameters.shadowFocusMode);
+            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
+            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
+            updateRequests(l.mParameters);
+        }
     }
     syncWithDevice();
 
index 7740df2..b05cdaf 100644 (file)
@@ -607,6 +607,7 @@ status_t Parameters::initialize(const CameraMetadata *info) {
         params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
                 supportedFocusModes);
     }
+    shadowFocusMode = FOCUS_MODE_INVALID;
 
     camera_metadata_ro_entry_t max3aRegions =
         staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
@@ -1363,6 +1364,8 @@ status_t Parameters::set(const String8& paramString) {
                 }
             }
         }
+        // Always reset shadow focus mode to avoid reverting settings
+        shadowFocusMode = FOCUS_MODE_INVALID;
         // Update in case of override
         newParams.set(CameraParameters::KEY_FOCUS_MODE,
                 focusModeEnumToString(validatedParams.focusMode));
index a85500f..53ddf99 100644 (file)
@@ -88,6 +88,9 @@ struct Parameters {
         FOCUS_MODE_INVALID = -1
     } focusMode;
 
+    // For use with triggerAfWithAuto quirk
+    focusMode_t shadowFocusMode;
+
     struct Area {
         int left, top, right, bottom;
         int weight;