From 03e17a62b43e58c8da5cd6ee23fd0809a82ee448 Mon Sep 17 00:00:00 2001 From: Andy Huibers Date: Tue, 19 Aug 2014 13:22:44 -0700 Subject: [PATCH] Start moving AF and 3A to separate class; improve logging. Change-Id: Ib73415ffd5569fab8c2c3bf5ac0f35616d3ee697 --- src/com/android/camera/one/v2/AutoFocusHelper.java | 119 +++++++++++++++++++++ src/com/android/camera/one/v2/OneCameraImpl.java | 80 +------------- 2 files changed, 123 insertions(+), 76 deletions(-) create mode 100644 src/com/android/camera/one/v2/AutoFocusHelper.java diff --git a/src/com/android/camera/one/v2/AutoFocusHelper.java b/src/com/android/camera/one/v2/AutoFocusHelper.java new file mode 100644 index 000000000..2896a9820 --- /dev/null +++ b/src/com/android/camera/one/v2/AutoFocusHelper.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera.one.v2; + +import android.hardware.camera2.CaptureResult; + +import com.android.camera.debug.Log; +import com.android.camera.one.OneCamera; + +/** + * Helper class to implement autofocus and 3A in camera2-based + * {@link com.android.camera.one.OneCamera} implementations. + */ +public class AutoFocusHelper { + + private static final Log.Tag TAG = new Log.Tag("OneCameraAFHelp"); + + /** + * Convert reported camera2 AF state to OneCamera AutoFocusState. + */ + public static OneCamera.AutoFocusState stateFromCamera2State(int state) { + switch (state) { + case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN: + case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN: + return OneCamera.AutoFocusState.SCANNING; + case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: + case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED: + return OneCamera.AutoFocusState.STOPPED_FOCUSED; + case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: + case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: + return OneCamera.AutoFocusState.STOPPED_UNFOCUSED; + default: + return OneCamera.AutoFocusState.INACTIVE; + } + } + + /** + * Convert reported camera2 AF state to OneCamera AutoFocusMode. + */ + public static OneCamera.AutoFocusMode modeFromCamera2Mode(int mode) { + if (mode == CaptureResult.CONTROL_AF_MODE_AUTO) { + return OneCamera.AutoFocusMode.AUTO; + } else { + // CONTROL_AF_MODE_CONTINUOUS_PICTURE is the other mode used. + return OneCamera.AutoFocusMode.CONTINUOUS_PICTURE; + } + } + + public static void logExtraFocusInfo(CaptureResult result) { + // Nexus 5 has a bug where CONTROL_AF_STATE is missing sometimes. + if (result.get(CaptureResult.CONTROL_AF_STATE) == null) { + // throw new + // IllegalStateException("CaptureResult missing CONTROL_AF_STATE."); + Log.e(TAG, "\n!!!! TotalCaptureResult missing CONTROL_AF_STATE. !!!!\n "); + return; + } + Object tag = result.getRequest().getTag(); + + Log.v(TAG, String.format("af_state:%-17s lens_foc_dist:%.3f lens_state:%-10s %s", + controlAFStateToString(result.get(CaptureResult.CONTROL_AF_STATE)), + result.get(CaptureResult.LENS_FOCUS_DISTANCE), + lensStateToString(result.get(CaptureResult.LENS_STATE)), + (tag == null) ? "" : "[" + tag +"]" + )); + } + + /** + * Utility function: converts CaptureResult.CONTROL_AF_STATE to String. + */ + private static String controlAFStateToString(int controlAFState) { + switch (controlAFState) { + case CaptureResult.CONTROL_AF_STATE_INACTIVE: + return "inactive"; + case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN: + return "passive_scan"; + case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: + return "passive_focused"; + case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN: + return "active_scan"; + case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED: + return "focus_locked"; + case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: + return "not_focus_locked"; + case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: + return "passive_unfocused"; + default: + return "unknown"; + } + } + + /** + * Utility function: converts CaptureResult.LENS_STATE to String. + */ + private static String lensStateToString(int lensState) { + switch (lensState) { + case CaptureResult.LENS_STATE_MOVING: + return "moving"; + case CaptureResult.LENS_STATE_STATIONARY: + return "stationary"; + default: + return "unknown"; + } + } + +} diff --git a/src/com/android/camera/one/v2/OneCameraImpl.java b/src/com/android/camera/one/v2/OneCameraImpl.java index fbf167bfa..7613ef4b9 100644 --- a/src/com/android/camera/one/v2/OneCameraImpl.java +++ b/src/com/android/camera/one/v2/OneCameraImpl.java @@ -163,7 +163,7 @@ public class OneCameraImpl extends AbstractOneCamera { mAutoFocusStateListenerPartialOK = true; autofocusStateChangeDispatcher(partialResult); if (DEBUG_FOCUS_LOG) { - //logExtraFocusInfo(partialResult); + //AutoFocusHelper.logExtraFocusInfo(partialResult); } } else { mAutoFocusStateListenerPartialOK = false; @@ -179,7 +179,7 @@ public class OneCameraImpl extends AbstractOneCamera { autofocusStateChangeDispatcher(result); } if (DEBUG_FOCUS_LOG) { - logExtraFocusInfo(result); + AutoFocusHelper.logExtraFocusInfo(result); } super.onCaptureCompleted(session, request, result); } @@ -603,8 +603,8 @@ public class OneCameraImpl extends AbstractOneCamera { Object tag = result.getRequest().getTag(); // Convert to OneCamera mode and state. - AutoFocusMode resultAFMode = modeFromCamera2Mode(nativeAFControlMode); - AutoFocusState resultAFState = stateFromCamera2State(nativeAFControlState); + AutoFocusMode resultAFMode = AutoFocusHelper.modeFromCamera2Mode(nativeAFControlMode); + AutoFocusState resultAFState = AutoFocusHelper.stateFromCamera2State(nativeAFControlState); boolean lensIsStopped = (resultAFState == AutoFocusState.STOPPED_FOCUSED || resultAFState == AutoFocusState.STOPPED_UNFOCUSED); @@ -636,37 +636,6 @@ public class OneCameraImpl extends AbstractOneCamera { mLastResultAFMode = resultAFMode; } - /** - * Convert reported camera2 AF state to OneCamera AutoFocusState. - */ - private static AutoFocusState stateFromCamera2State(int state) { - switch (state) { - case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN: - case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN: - return AutoFocusState.SCANNING; - case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: - case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED: - return AutoFocusState.STOPPED_FOCUSED; - case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: - case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: - return AutoFocusState.STOPPED_UNFOCUSED; - default: - return AutoFocusState.INACTIVE; - } - } - - /** - * Convert reported camera2 AF state to OneCamera AutoFocusMode. - */ - private static AutoFocusMode modeFromCamera2Mode(int mode) { - if (mode == CaptureResult.CONTROL_AF_MODE_AUTO) { - return AutoFocusMode.AUTO; - } else { - // CONTROL_AF_MODE_CONTINUOUS_PICTURE is the other mode used. - return AutoFocusMode.CONTINUOUS_PICTURE; - } - } - @Override public void triggerAutoFocus() { Log.v(TAG, "triggerAutoFocus()"); @@ -788,45 +757,4 @@ public class OneCameraImpl extends AbstractOneCamera { break; } } - - /** - * Utility function: converts CaptureResult.CONTROL_AF_STATE* to String. - */ - private static String camera2ControlAFStateDesc(int aFState) { - switch (aFState) { - case CaptureResult.CONTROL_AF_STATE_INACTIVE: - return "inactive"; - case CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN: - return "passive_scan"; - case CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED: - return "passive_focused"; - case CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN: - return "active_scan"; - case CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED: - return "focus_locked"; - case CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: - return "not_focus_locked"; - case CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: - return "passive_unfocused"; - default: - return "unknown"; - } - } - - private void logExtraFocusInfo(CaptureResult result) { - Object tag = result.getRequest().getTag(); - // Nexus 5 has a bug where CONTROL_AF_STATE is missing sometimes. - if (result.get(CaptureResult.CONTROL_AF_STATE) == null) { - // throw new - // IllegalStateException("CaptureResult missing CONTROL_AF_STATE."); - Log.e(TAG, "\n!!!! TotalCaptureResult missing CONTROL_AF_STATE. !!!!\n "); - return; - } - Log.v(TAG, "camera2 AF state: " + camera2ControlAFStateDesc(result. - get(CaptureResult.CONTROL_AF_STATE)) + - (tag == null ? "" : (" tag: " + tag))); - if (result.get(CaptureResult.LENS_FOCUS_DISTANCE) != null) { - Log.v(TAG, " lens @ " + result.get(CaptureResult.LENS_FOCUS_DISTANCE)); - } - } } -- 2.11.0