183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin/* 283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * you may not use this file except in compliance with the License. 683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * You may obtain a copy of the License at 783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 1083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Unless required by applicable law or agreed to in writing, software 1183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 1283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * See the License for the specific language governing permissions and 1483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * limitations under the License. 1583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 1683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 1783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinpackage android.hardware.camera2.legacy; 1883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 1983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.Camera; 2083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.Camera.Parameters; 2183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative; 2283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.CaptureRequest; 2383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.CaptureResult; 2483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.utils.ParamsUtils; 2583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.util.Log; 2683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport java.util.Objects; 2883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport static android.hardware.camera2.CaptureRequest.*; 3083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport static com.android.internal.util.Preconditions.*; 3183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 3283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin/** 3383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Map capture request data into legacy focus state transitions. 3483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 3583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>This object will asynchronously process auto-focus changes, so no interaction 3683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * with it is necessary beyond reading the current state and updating with the latest trigger.</p> 3783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 3883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation") 3983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinpublic class LegacyFocusStateMapper { 4083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private static String TAG = "LegacyFocusStateMapper"; 4183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); 4283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 4383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private final Camera mCamera; 4483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 4583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private int mAfStatePrevious = CONTROL_AF_STATE_INACTIVE; 4683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private String mAfModePrevious = null; 4783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 4883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** Guard mAfRun and mAfState */ 4983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private final Object mLock = new Object(); 5083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** Guard access with mLock */ 5183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private int mAfRun = 0; 5283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** Guard access with mLock */ 5383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private int mAfState = CONTROL_AF_STATE_INACTIVE; 5483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 5583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** 5683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Instantiate a new focus state mapper. 5783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 5883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param camera a non-{@code null} camera1 device 5983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 6083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @throws NullPointerException if any of the args were {@code null} 6183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 6283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin public LegacyFocusStateMapper(Camera camera) { 6383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mCamera = checkNotNull(camera, "camera must not be null"); 6483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 6583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 6683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** 6783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Process the AF triggers from the request as a camera1 autofocus routine. 6883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 6983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>This method should be called after the parameters are {@link LegacyRequestMapper mapped} 7083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * with the request.</p> 7183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 7283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>Callbacks are processed in the background, and the next call to {@link #mapResultTriggers} 7383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * will have the latest AF state as reflected by the camera1 callbacks.</p> 7483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 7583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>None of the arguments will be mutated.</p> 7683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 7783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param captureRequest a non-{@code null} request 7883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param parameters a non-{@code null} parameters corresponding to this request (read-only) 7983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 8083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin public void processRequestTriggers(CaptureRequest captureRequest, 8183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters parameters) { 8283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin checkNotNull(captureRequest, "captureRequest must not be null"); 8383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 8483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /* 8583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * control.afTrigger 8683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 8783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int afTrigger = ParamsUtils.getOrDefault(captureRequest, CONTROL_AF_TRIGGER, 8883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_TRIGGER_IDLE); 8983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 9083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin final String afMode = parameters.getFocusMode(); 9183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 9283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (!Objects.equals(mAfModePrevious, afMode)) { 9383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 9483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "processRequestTriggers - AF mode switched from " + mAfModePrevious + 9583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin " to " + afMode); 9683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 9783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 9883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // Switching modes always goes back to INACTIVE; ignore callbacks from previous modes 9983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 10083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 10183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ++mAfRun; 10283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mAfState = CONTROL_AF_STATE_INACTIVE; 10383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 1043a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin mCamera.cancelAutoFocus(); 10583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 10683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 10783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mAfModePrevious = afMode; 10883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 10983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // Passive AF Scanning 11083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 11183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin final int currentAfRun; 11283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 11383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 11483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin currentAfRun = mAfRun; 11583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 11683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 1173968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk Camera.AutoFocusMoveCallback afMoveCallback = new Camera.AutoFocusMoveCallback() { 11883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin @Override 11983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin public void onAutoFocusMoving(boolean start, Camera camera) { 12083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 12183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int latestAfRun = mAfRun; 12283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 12383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 1243968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk Log.v(TAG, 1253968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk "onAutoFocusMoving - start " + start + " latest AF run " + 1263968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk latestAfRun + ", last AF run " + currentAfRun 1273968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk ); 12883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 12983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 13083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (currentAfRun != latestAfRun) { 13183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.d(TAG, 13283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "onAutoFocusMoving - ignoring move callbacks from old af run" 1333968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk + currentAfRun 1343968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk ); 13583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return; 13683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 13783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 13883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int newAfState = start ? 13983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_STATE_PASSIVE_SCAN : 14083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_STATE_PASSIVE_FOCUSED; 14183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // We never send CONTROL_AF_STATE_PASSIVE_UNFOCUSED 14283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 14383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (afMode) { 14483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE: 14583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO: 14683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 14783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // This callback should never be sent in any other AF mode 14883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin default: 14983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "onAutoFocus - got unexpected onAutoFocus in mode " 15083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + afMode); 15183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 15283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 15383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 15483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mAfState = newAfState; 15583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 15683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 1573968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk }; 1583968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk 1593968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk // Only set move callback if we can call autofocus. 1603968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk switch (afMode) { 1613968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk case Parameters.FOCUS_MODE_AUTO: 1623968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk case Parameters.FOCUS_MODE_MACRO: 1633968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE: 1643968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO: 1653968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk mCamera.setAutoFocusMoveCallback(afMoveCallback); 1663968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk } 16783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 16883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 1693968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk 17083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // AF Locking 17183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (afTrigger) { 17283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_TRIGGER_START: 1733a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin 1743a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin int afStateAfterStart; 1753a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin switch (afMode) { 1763a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin case Parameters.FOCUS_MODE_AUTO: 1773a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin case Parameters.FOCUS_MODE_MACRO: 1783a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin afStateAfterStart = CONTROL_AF_STATE_ACTIVE_SCAN; 1793a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin break; 1803a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE: 1813a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO: 1823a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin afStateAfterStart = CONTROL_AF_STATE_PASSIVE_SCAN; 1833968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk break; 1843a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin default: 1853a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin // EDOF, INFINITY 1863a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin afStateAfterStart = CONTROL_AF_STATE_INACTIVE; 1873a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin } 1883a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin 18983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin final int currentAfRun; 19083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 19183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin currentAfRun = ++mAfRun; 1923a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin mAfState = afStateAfterStart; 19383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 19483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 19583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 19683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "processRequestTriggers - got AF_TRIGGER_START, " + 19783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "new AF run is " + currentAfRun); 19883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 19983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2003968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk // Avoid calling autofocus unless we are in a state that supports calling this. 2013968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk if (afStateAfterStart == CONTROL_AF_STATE_INACTIVE) { 2023968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk break; 2033968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk } 2043968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk 20583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mCamera.autoFocus(new Camera.AutoFocusCallback() { 20683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin @Override 20783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin public void onAutoFocus(boolean success, Camera camera) { 20883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 20983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int latestAfRun = mAfRun; 21083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 21183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 21283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "onAutoFocus - success " + success + " latest AF run " + 21383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin latestAfRun + ", last AF run " + currentAfRun); 21483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 21583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 21683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // Ignore old auto-focus results, since another trigger was requested 21783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (latestAfRun != currentAfRun) { 21883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.d(TAG, String.format("onAutoFocus - ignoring AF callback " + 21983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "(old run %d, new run %d)", currentAfRun, latestAfRun)); 22083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 22183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return; 22283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 22383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 22483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int newAfState = success ? 22583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_STATE_FOCUSED_LOCKED : 22683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 22783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 22883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (afMode) { 22983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_AUTO: 23083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE: 23183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO: 23283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case Parameters.FOCUS_MODE_MACRO: 23383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 23483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // This callback should never be sent in any other AF mode 23583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin default: 23683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "onAutoFocus - got unexpected onAutoFocus in mode " 23783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + afMode); 23883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 23983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 24183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mAfState = newAfState; 24283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin }); 24583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 24683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 24783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_TRIGGER_CANCEL: 24883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 2493a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin int updatedAfRun; 25083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2513a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin synchronized (mLock) { 2523a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin updatedAfRun = ++mAfRun; 2533a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin mAfState = CONTROL_AF_STATE_INACTIVE; 2543a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin } 2553a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin 2563a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin mCamera.cancelAutoFocus(); 25783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 25883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 25983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "processRequestTriggers - got AF_TRIGGER_CANCEL, " + 26083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "new AF run is " + updatedAfRun); 26183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 26283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 26383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 26483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 26583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_TRIGGER_IDLE: 26683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // No action necessary. The callbacks will handle transitions. 26783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 26883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin default: 2690a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin Log.w(TAG, "processRequestTriggers - ignoring unknown control.afTrigger = " 2700a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin + afTrigger); 27183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 27283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 27383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 27483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** 27583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Update the {@code result} camera metadata map with the new value for the 27683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * {@code control.afState}. 27783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 27883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>AF callbacks are processed in the background, and each call to {@link #mapResultTriggers} 27983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * will have the latest AF state as reflected by the camera1 callbacks.</p> 28083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 28183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param result a non-{@code null} result 28283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 28383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin public void mapResultTriggers(CameraMetadataNative result) { 28483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin checkNotNull(result, "result must not be null"); 28583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 28683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int newAfState; 28783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin synchronized (mLock) { 28883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin newAfState = mAfState; 28983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 29083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 29183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE && newAfState != mAfStatePrevious) { 29283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, String.format("mapResultTriggers - afState changed from %s to %s", 29383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin afStateToString(mAfStatePrevious), afStateToString(newAfState))); 29483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 29583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 29683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin result.set(CaptureResult.CONTROL_AF_STATE, newAfState); 29783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 29883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mAfStatePrevious = newAfState; 29983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 30083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 30183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private static String afStateToString(int afState) { 30283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (afState) { 30383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_ACTIVE_SCAN: 30483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "ACTIVE_SCAN"; 30583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_FOCUSED_LOCKED: 30683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "FOCUSED_LOCKED"; 30783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_INACTIVE: 30883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "INACTIVE"; 30983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 31083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "NOT_FOCUSED_LOCKED"; 31183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_PASSIVE_FOCUSED: 31283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "PASSIVE_FOCUSED"; 31383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_PASSIVE_SCAN: 31483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "PASSIVE_SCAN"; 31583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_STATE_PASSIVE_UNFOCUSED: 31683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "PASSIVE_UNFOCUSED"; 31783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin default : 31883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return "UNKNOWN(" + afState + ")"; 31983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 32083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 32183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin} 322