CameraDeviceUserShim.java revision 0e04e910a6b0d8a7464df9721535dfba21527c37
1feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk/* 2feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Copyright (C) 2014 The Android Open Source Project 3feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * 4feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * you may not use this file except in compliance with the License. 6feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * You may obtain a copy of the License at 7feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * 8feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * 10feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * See the License for the specific language governing permissions and 14feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * limitations under the License. 15feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk */ 16feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 17feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkpackage android.hardware.camera2.legacy; 18feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 195d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvalaimport android.hardware.ICameraService; 20feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.Camera; 21a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.Camera.CameraInfo; 22feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.CameraAccessException; 23a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.camera2.CameraCharacteristics; 24feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.CaptureRequest; 25feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.ICameraDeviceCallbacks; 26feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.ICameraDeviceUser; 27feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.impl.CameraMetadataNative; 282f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvalaimport android.hardware.camera2.impl.CaptureResultExtras; 29bfbbee756663aeeb38706bb1bd4841dcd050f91bYin-Chia Yehimport android.hardware.camera2.params.OutputConfiguration; 305d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvalaimport android.hardware.camera2.utils.SubmitInfo; 31a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.os.ConditionVariable; 32feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.os.IBinder; 33a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.os.Looper; 342f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvalaimport android.os.Handler; 352f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvalaimport android.os.HandlerThread; 362f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvalaimport android.os.Message; 37feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.os.RemoteException; 385d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvalaimport android.os.ServiceSpecificException; 39feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.util.Log; 40feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.util.SparseArray; 41feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.view.Surface; 42feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 43feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport java.util.ArrayList; 44feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport java.util.List; 45feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 468ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsicimport static android.system.OsConstants.EACCES; 478ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsicimport static android.system.OsConstants.ENODEV; 488ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic 49feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk/** 50feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Compatibility implementation of the Camera2 API binder interface. 51feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * 52feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * <p> 53feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * This is intended to be called from the same process as client 54feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * {@link android.hardware.camera2.CameraDevice}, and wraps a 55feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * {@link android.hardware.camera2.legacy.LegacyCameraDevice} that emulates Camera2 service using 56feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * the Camera1 API. 57feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * </p> 58feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * 59feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * <p> 60feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Keep up to date with ICameraDeviceUser.aidl. 61feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * </p> 62feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk */ 636653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin@SuppressWarnings("deprecation") 64feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkpublic class CameraDeviceUserShim implements ICameraDeviceUser { 65feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private static final String TAG = "CameraDeviceUserShim"; 66feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 67a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala private static final boolean DEBUG = false; 68a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static final int OPEN_CAMERA_TIMEOUT_MS = 5000; // 5 sec (same as api1 cts timeout) 69feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 70feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private final LegacyCameraDevice mLegacyDevice; 71feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 72feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private final Object mConfigureLock = new Object(); 73feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private int mSurfaceIdCounter; 74feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private boolean mConfiguring; 75feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk private final SparseArray<Surface> mSurfaces; 76a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final CameraCharacteristics mCameraCharacteristics; 77a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final CameraLooper mCameraInit; 782f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private final CameraCallbackThread mCameraCallbacks; 792f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 80feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 81a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin protected CameraDeviceUserShim(int cameraId, LegacyCameraDevice legacyCamera, 822f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CameraCharacteristics characteristics, CameraLooper cameraInit, 832f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CameraCallbackThread cameraCallbacks) { 84feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mLegacyDevice = legacyCamera; 85feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mConfiguring = false; 86feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mSurfaces = new SparseArray<Surface>(); 87a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mCameraCharacteristics = characteristics; 88a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mCameraInit = cameraInit; 892f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mCameraCallbacks = cameraCallbacks; 90feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 91feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mSurfaceIdCounter = 0; 92feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 93feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 948ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic private static int translateErrorsFromCamera1(int errorCode) { 958ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic if (errorCode == -EACCES) { 965d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return ICameraService.ERROR_PERMISSION_DENIED; 978ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic } 988ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic 998ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic return errorCode; 1008ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic } 1018ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsic 102a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 103a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Create a separate looper/thread for the camera to run on; open the camera. 104a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 105a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * <p>Since the camera automatically latches on to the current thread's looper, 106a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * it's important that we have our own thread with our own looper to guarantee 107a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * that the camera callbacks get correctly posted to our own thread.</p> 108a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 109a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static class CameraLooper implements Runnable, AutoCloseable { 110a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final int mCameraId; 111a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private Looper mLooper; 112a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private volatile int mInitErrors; 113a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final Camera mCamera = Camera.openUninitialized(); 114a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final ConditionVariable mStartDone = new ConditionVariable(); 115a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private final Thread mThread; 116a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 117a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 118a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Spin up a new thread, immediately open the camera in the background. 119a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 120a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * <p>Use {@link #waitForOpen} to block until the camera is finished opening.</p> 121a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 122a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param cameraId numeric camera Id 123a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 124a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @see #waitForOpen 125a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 126a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public CameraLooper(int cameraId) { 127a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mCameraId = cameraId; 128a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 129a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mThread = new Thread(this); 130a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mThread.start(); 131a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 132a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 133a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public Camera getCamera() { 134a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return mCamera; 135a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 136a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 137a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin @Override 138a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public void run() { 139a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // Set up a looper to be used by camera. 140a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Looper.prepare(); 141a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 142a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // Save the looper so that we can terminate this thread 143a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // after we are done with it. 144a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mLooper = Looper.myLooper(); 145db70a9785315a29c1d0d1233d883062b8d07c46fEino-Ville Talvala mInitErrors = mCamera.cameraInitUnspecified(mCameraId); 146a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mStartDone.open(); 147a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Looper.loop(); // Blocks forever until #close is called. 148a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 149a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 150a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 151a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Quit the looper safely; then join until the thread shuts down. 152a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 153a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin @Override 154a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public void close() { 155a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin if (mLooper == null) { 156a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return; 157a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 158a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 159a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mLooper.quitSafely(); 160a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin try { 161a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mThread.join(); 162a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } catch (InterruptedException e) { 163a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin throw new AssertionError(e); 164a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 165a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 166a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mLooper = null; 167a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 168a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 169a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 170a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Block until the camera opens; then return its initialization error code (if any). 171a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 172a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param timeoutMs timeout in milliseconds 173a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 174a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @return int error code 175a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1765d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala * @throws ServiceSpecificException if the camera open times out with ({@code CAMERA_ERROR}) 177a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 178a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public int waitForOpen(int timeoutMs) { 179a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // Block until the camera is open asynchronously 180a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin if (!mStartDone.block(timeoutMs)) { 181a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Log.e(TAG, "waitForOpen - Camera failed to open after timeout of " 182a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin + OPEN_CAMERA_TIMEOUT_MS + " ms"); 183a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin try { 184a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mCamera.release(); 185a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } catch (RuntimeException e) { 186a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Log.e(TAG, "connectBinderShim - Failed to release camera after timeout ", e); 187a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 188a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1895d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION); 190a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 191a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 192a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return mInitErrors; 193a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 194a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 195a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1962f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /** 1972f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala * A thread to process callbacks to send back to the camera client. 1982f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala * 1992f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala * <p>This effectively emulates one-way binder semantics when in the same process as the 2002f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala * callee.</p> 2012f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala */ 2022f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private static class CameraCallbackThread implements ICameraDeviceCallbacks { 2032f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private static final int CAMERA_ERROR = 0; 2042f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private static final int CAMERA_IDLE = 1; 2052f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private static final int CAPTURE_STARTED = 2; 2062f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private static final int RESULT_RECEIVED = 3; 207be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala private static final int PREPARED = 4; 2082da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen private static final int REPEATING_REQUEST_ERROR = 5; 20988f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang private static final int REQUEST_QUEUE_EMPTY = 6; 2102f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2112f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private final HandlerThread mHandlerThread; 2122f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private Handler mHandler; 2132f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2142f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private final ICameraDeviceCallbacks mCallbacks; 2152f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2162f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public CameraCallbackThread(ICameraDeviceCallbacks callbacks) { 2172f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mCallbacks = callbacks; 2182f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2192f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mHandlerThread = new HandlerThread("LegacyCameraCallback"); 2202f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mHandlerThread.start(); 2212f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2222f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2232f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public void close() { 2242f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mHandlerThread.quitSafely(); 2252f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2262f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2272f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala @Override 228acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala public void onDeviceError(final int errorCode, final CaptureResultExtras resultExtras) { 2292f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Message msg = getHandler().obtainMessage(CAMERA_ERROR, 2302f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*arg1*/ errorCode, /*arg2*/ 0, 2312f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*obj*/ resultExtras); 2322f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala getHandler().sendMessage(msg); 2332f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2342f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2352f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala @Override 236acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala public void onDeviceIdle() { 2372f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Message msg = getHandler().obtainMessage(CAMERA_IDLE); 2382f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala getHandler().sendMessage(msg); 2392f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2402f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2412f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala @Override 2422f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public void onCaptureStarted(final CaptureResultExtras resultExtras, final long timestamp) { 2432f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Message msg = getHandler().obtainMessage(CAPTURE_STARTED, 2442f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*arg1*/ (int) (timestamp & 0xFFFFFFFFL), 2452f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*arg2*/ (int) ( (timestamp >> 32) & 0xFFFFFFFFL), 2462f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*obj*/ resultExtras); 2472f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala getHandler().sendMessage(msg); 2482f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2492f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2502f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala @Override 2512f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public void onResultReceived(final CameraMetadataNative result, 2522f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala final CaptureResultExtras resultExtras) { 2532f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Object[] resultArray = new Object[] { result, resultExtras }; 2542f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Message msg = getHandler().obtainMessage(RESULT_RECEIVED, 2552f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala /*obj*/ resultArray); 2562f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala getHandler().sendMessage(msg); 2572f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2582f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2592f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala @Override 260ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala public void onPrepared(int streamId) { 261be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala Message msg = getHandler().obtainMessage(PREPARED, 262be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala /*arg1*/ streamId, /*arg2*/ 0); 263be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala getHandler().sendMessage(msg); 264ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala } 265ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala 2662da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen @Override 2672da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen public void onRepeatingRequestError(long lastFrameNumber) { 2682da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen Message msg = getHandler().obtainMessage(REPEATING_REQUEST_ERROR, 2692da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen /*arg1*/ (int) (lastFrameNumber & 0xFFFFFFFFL), 2702da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen /*arg2*/ (int) ( (lastFrameNumber >> 32) & 0xFFFFFFFFL)); 2712da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen getHandler().sendMessage(msg); 2722da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen } 2732da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen 274ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala @Override 27588f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang public void onRequestQueueEmpty() { 27688f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang Message msg = getHandler().obtainMessage(REQUEST_QUEUE_EMPTY, 27788f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang /* arg1 */ 0, /* arg2 */ 0); 27888f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang getHandler().sendMessage(msg); 27988f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang } 28088f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang 28188f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang @Override 2822f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public IBinder asBinder() { 2832f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala // This is solely intended to be used for in-process binding. 2842f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala return null; 2852f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2862f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2872f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private Handler getHandler() { 2882f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala if (mHandler == null) { 2892f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mHandler = new CallbackHandler(mHandlerThread.getLooper()); 2902f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2912f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala return mHandler; 2922f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2932f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2942f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala private class CallbackHandler extends Handler { 2952f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public CallbackHandler(Looper l) { 2962f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala super(l); 2972f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 2982f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 2996653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin @Override 3002f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala public void handleMessage(Message msg) { 3012f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala try { 3022f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala switch (msg.what) { 3032f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala case CAMERA_ERROR: { 3042f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala int errorCode = msg.arg1; 3052f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CaptureResultExtras resultExtras = (CaptureResultExtras) msg.obj; 306acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala mCallbacks.onDeviceError(errorCode, resultExtras); 3072f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala break; 3082f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3092f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala case CAMERA_IDLE: 310acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala mCallbacks.onDeviceIdle(); 3112f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala break; 3122f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala case CAPTURE_STARTED: { 3132f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala long timestamp = msg.arg2 & 0xFFFFFFFFL; 3142f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala timestamp = (timestamp << 32) | (msg.arg1 & 0xFFFFFFFFL); 3152f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CaptureResultExtras resultExtras = (CaptureResultExtras) msg.obj; 3162f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mCallbacks.onCaptureStarted(resultExtras, timestamp); 3172f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala break; 3182f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3192f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala case RESULT_RECEIVED: { 3202f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala Object[] resultArray = (Object[]) msg.obj; 3212f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CameraMetadataNative result = (CameraMetadataNative) resultArray[0]; 3222f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CaptureResultExtras resultExtras = (CaptureResultExtras) resultArray[1]; 3232f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mCallbacks.onResultReceived(result, resultExtras); 3242f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala break; 3252f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 326be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala case PREPARED: { 327be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala int streamId = msg.arg1; 328be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala mCallbacks.onPrepared(streamId); 329be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala break; 330be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala } 3312da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen case REPEATING_REQUEST_ERROR: { 3322da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen long lastFrameNumber = msg.arg2 & 0xFFFFFFFFL; 3332da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen lastFrameNumber = (lastFrameNumber << 32) | (msg.arg1 & 0xFFFFFFFFL); 3342da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen mCallbacks.onRepeatingRequestError(lastFrameNumber); 3352da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen break; 3362da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen } 33788f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang case REQUEST_QUEUE_EMPTY: { 33888f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang mCallbacks.onRequestQueueEmpty(); 33988f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang break; 34088f1af241045d446358c692e183e5ecb152bad91Shuzhen Wang } 3412f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala default: 3422f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala throw new IllegalArgumentException( 3432f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala "Unknown callback message " + msg.what); 3442f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3452f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } catch (RemoteException e) { 3462f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala throw new IllegalStateException( 3472f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala "Received remote exception during camera callback " + msg.what, e); 3482f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3492f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3502f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3512f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala } 3522f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 353feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk public static CameraDeviceUserShim connectBinderShim(ICameraDeviceCallbacks callbacks, 354feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk int cameraId) { 355feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 356feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "Opening shim Camera device"); 357feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 358a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 359a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 360a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Put the camera open on a separate thread with its own looper; otherwise 361a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * if the main thread is used then the callbacks might never get delivered 362a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * (e.g. in CTS which run its own default looper only after tests) 363a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 364a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 365a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraLooper init = new CameraLooper(cameraId); 366a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 3672f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala CameraCallbackThread threadCallbacks = new CameraCallbackThread(callbacks); 3682f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala 369a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // TODO: Make this async instead of blocking 370a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin int initErrors = init.waitForOpen(OPEN_CAMERA_TIMEOUT_MS); 371a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Camera legacyCamera = init.getCamera(); 372a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin 373feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk // Check errors old HAL initialization 3745d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala LegacyExceptionUtils.throwOnServiceError(initErrors); 375a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin 3766653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin // Disable shutter sounds (this will work unconditionally) for api2 clients 3776653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin legacyCamera.disableShutterSound(); 3786653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin 379a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraInfo info = new CameraInfo(); 380a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Camera.getCameraInfo(cameraId, info); 381a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 382eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala Camera.Parameters legacyParameters = null; 383eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala try { 384eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala legacyParameters = legacyCamera.getParameters(); 385eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala } catch (RuntimeException e) { 3865d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, 3875d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala "Unable to get initial parameters: " + e.getMessage()); 388eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala } 389eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala 390a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraCharacteristics characteristics = 391eecc904f13e7a105f5548c953e4caa306fe06f0dEino-Ville Talvala LegacyMetadataMapper.createCharacteristics(legacyParameters, info); 392df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin LegacyCameraDevice device = new LegacyCameraDevice( 3932f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala cameraId, legacyCamera, characteristics, threadCallbacks); 3942f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala return new CameraDeviceUserShim(cameraId, device, characteristics, init, threadCallbacks); 395feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 396feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 397feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 398feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk public void disconnect() { 399feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 400feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "disconnect called."); 401feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 402a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 403e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 404e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk Log.w(TAG, "Cannot disconnect, device has already been closed."); 405e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 406e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 407a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin try { 408a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mLegacyDevice.close(); 409a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } finally { 410a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mCameraInit.close(); 4112f75e7d7ef2ef29ac4b1287dc44cf62cfbaf50b3Eino-Ville Talvala mCameraCallbacks.close(); 412a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 413feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 414feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 415feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 4165d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public SubmitInfo submitRequest(CaptureRequest request, boolean streaming) { 417feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 418feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "submitRequest called."); 419feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 420e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 4215d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot submit request, device has been closed."; 4225d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4235d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 424e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 425e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 426feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 427feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 4285d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot submit request, configuration change in progress."; 4295d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4305d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 431feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 432feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 4335d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return mLegacyDevice.submitRequest(request, streaming); 434feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 435feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 436feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 4375d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public SubmitInfo submitRequestList(CaptureRequest[] request, boolean streaming) { 438feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 439feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "submitRequestList called."); 440feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 441e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 4425d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot submit request list, device has been closed."; 4435d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4445d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 445e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 446e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 447feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 448feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 4495d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot submit request, configuration change in progress."; 4505d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4515d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 452feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 453feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 4545d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return mLegacyDevice.submitRequestList(request, streaming); 455feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 456feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 457feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 4585d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public long cancelRequest(int requestId) { 459feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 460feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "cancelRequest called."); 461feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 462e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 4635d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot cancel request, device has been closed."; 4645d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4655d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 466e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 467e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 468feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 469feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 4705d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot cancel request, configuration change in progress."; 4715d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4725d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 473feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 474feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 4755d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return mLegacyDevice.cancelRequest(requestId); 476feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 477feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 478feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 4795d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void beginConfigure() { 480feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 481feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "beginConfigure called."); 482feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 483e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 4845d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot begin configure, device has been closed."; 4855d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4865d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 487e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 488e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 489feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 490feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 4915d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot begin configure, configuration change already in progress."; 4925d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 4935d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 494feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 495feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mConfiguring = true; 496feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 497feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 498feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 499feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 5000e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala public void endConfigure(int operatingMode) { 501feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 502feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "endConfigure called."); 503feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 504e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 5055d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot end configure, device has been closed."; 5065d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5075d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 508e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 509e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 5100e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala if (operatingMode != ICameraDeviceUser.NORMAL_MODE) { 5110e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala String err = "LEGACY devices do not support this operating mode"; 5120e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala Log.e(TAG, err); 5130e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_ILLEGAL_ARGUMENT, err); 5140e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala } 5150e04e910a6b0d8a7464df9721535dfba21527c37Eino-Ville Talvala 516385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala SparseArray<Surface> surfaces = null; 517feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 518feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (!mConfiguring) { 5195d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot end configure, no configuration change in progress."; 5205d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5215d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 522feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 523385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala if (mSurfaces != null) { 524385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala surfaces = mSurfaces.clone(); 525feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 526feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mConfiguring = false; 527feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 5285d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala mLegacyDevice.configureOutputs(surfaces); 529feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 530feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 531feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 5325d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void deleteStream(int streamId) { 533feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 534feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "deleteStream called."); 535feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 536e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 5375d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot delete stream, device has been closed."; 5385d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5395d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 540e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 541e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 542feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 543feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (!mConfiguring) { 5445d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot delete stream, no configuration change in progress."; 5455d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5465d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 547feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 548feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk int index = mSurfaces.indexOfKey(streamId); 549feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (index < 0) { 5505d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot delete stream, stream id " + streamId + " doesn't exist."; 5515d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5525d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_ILLEGAL_ARGUMENT, err); 553feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 554feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mSurfaces.removeAt(index); 555feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 556feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 557feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 558feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 559bfbbee756663aeeb38706bb1bd4841dcd050f91bYin-Chia Yeh public int createStream(OutputConfiguration outputConfiguration) { 560feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 561feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "createStream called."); 562feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 563e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 5645d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot create stream, device has been closed."; 5655d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5665d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 567e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 568e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 569feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 570feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (!mConfiguring) { 5715d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot create stream, beginConfigure hasn't been called yet."; 5725d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5735d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 574feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 575bfbbee756663aeeb38706bb1bd4841dcd050f91bYin-Chia Yeh if (outputConfiguration.getRotation() != OutputConfiguration.ROTATION_0) { 5765d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot create stream, stream rotation is not supported."; 5775d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5785d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_ILLEGAL_ARGUMENT, err); 579bfbbee756663aeeb38706bb1bd4841dcd050f91bYin-Chia Yeh } 580feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk int id = ++mSurfaceIdCounter; 581bfbbee756663aeeb38706bb1bd4841dcd050f91bYin-Chia Yeh mSurfaces.put(id, outputConfiguration.getSurface()); 582feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk return id; 583feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 584feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 585feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 586feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 5874bd7abe72a647ceb2175a4fe66aa640815c116f8Shuzhen Wang public void finalizeOutputConfigurations(int steamId, OutputConfiguration config) { 5884bd7abe72a647ceb2175a4fe66aa640815c116f8Shuzhen Wang String err = "Finalizing output configuration is not supported on legacy devices"; 589c8b181e95d17c00f9fe4a8338c4cdd0eeac3a0dcZhijun He Log.e(TAG, err); 590c8b181e95d17c00f9fe4a8338c4cdd0eeac3a0dcZhijun He throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 591c8b181e95d17c00f9fe4a8338c4cdd0eeac3a0dcZhijun He } 592c8b181e95d17c00f9fe4a8338c4cdd0eeac3a0dcZhijun He 593c8b181e95d17c00f9fe4a8338c4cdd0eeac3a0dcZhijun He @Override 5945398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen public int createInputStream(int width, int height, int format) { 5955d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Creating input stream is not supported on legacy devices"; 5965d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 5975d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 5985398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen } 5995398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen 6005398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen @Override 6015d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public Surface getInputSurface() { 6025d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Getting input surface is not supported on legacy devices"; 6035d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6045d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 6055398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen } 6065398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen 6075398a676809faaf3c6c2875edc1907ad6b8e1c89Chien-Yu Chen @Override 6085d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public CameraMetadataNative createDefaultRequest(int templateId) { 609feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 610feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "createDefaultRequest called."); 611feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 612e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 6135d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot create default request, device has been closed."; 6145d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6155d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 616e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 617a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 618a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraMetadataNative template; 619a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin try { 620a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin template = 621a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin LegacyMetadataMapper.createRequestTemplate(mCameraCharacteristics, templateId); 622a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } catch (IllegalArgumentException e) { 6235d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "createDefaultRequest - invalid templateId specified"; 6245d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6255d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_ILLEGAL_ARGUMENT, err); 626a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 627a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 6285d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return template; 629feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 630feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 631feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 6325d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public CameraMetadataNative getCameraInfo() { 633feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 634feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "getCameraInfo called."); 635feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 636feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk // TODO: implement getCameraInfo. 637feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.e(TAG, "getCameraInfo unimplemented."); 6385d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return null; 639feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 640feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 641feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 6425d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void waitUntilIdle() throws RemoteException { 643feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 644feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "waitUntilIdle called."); 645feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 646e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 6475d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot wait until idle, device has been closed."; 6485d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6495d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 650e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 651e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 652feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 653feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 6545d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot wait until idle, configuration change in progress."; 6555d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6565d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 657feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 658feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 659feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk mLegacyDevice.waitUntilIdle(); 660feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 661feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 662feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 6635d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public long flush() { 664feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (DEBUG) { 665feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk Log.d(TAG, "flush called."); 666feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 667e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk if (mLegacyDevice.isClosed()) { 6685d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot flush, device has been closed."; 6695d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6705d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 671e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk } 672e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 673feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk synchronized(mConfigureLock) { 674feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk if (mConfiguring) { 6755d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot flush, configuration change in progress."; 6765d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6775d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_INVALID_OPERATION, err); 678feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 679feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 6805d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala return mLegacyDevice.flush(); 681feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 682feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk 6835d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void prepare(int streamId) { 684ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala if (DEBUG) { 685ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala Log.d(TAG, "prepare called."); 686ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala } 687ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala if (mLegacyDevice.isClosed()) { 6885d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot prepare stream, device has been closed."; 6895d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 6905d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 691ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala } 692ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala 693be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala // LEGACY doesn't support actual prepare, just signal success right away 694be6d98526988f914365a2999b8d3ca11e24e5aebEino-Ville Talvala mCameraCallbacks.onPrepared(streamId); 695ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala } 696ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala 6975d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void prepare2(int maxCount, int streamId) { 6987ed1aaa369b6a459c776a9a6e96c33014b30f278Ruben Brunk // We don't support this in LEGACY mode. 6995d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala prepare(streamId); 7007ed1aaa369b6a459c776a9a6e96c33014b30f278Ruben Brunk } 7017ed1aaa369b6a459c776a9a6e96c33014b30f278Ruben Brunk 7025d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala public void tearDown(int streamId) { 70314c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala if (DEBUG) { 70414c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala Log.d(TAG, "tearDown called."); 70514c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala } 70614c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala if (mLegacyDevice.isClosed()) { 7075d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala String err = "Cannot tear down stream, device has been closed."; 7085d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala Log.e(TAG, err); 7095d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); 71014c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala } 71114c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala 71214c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala // LEGACY doesn't support actual teardown, so just a no-op 71314c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala } 71414c09fa3c5371b977c77e5813eabb81941040627Eino-Ville Talvala 715feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk @Override 716feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk public IBinder asBinder() { 717feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk // This is solely intended to be used for in-process binding. 718feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk return null; 719feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk } 720feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk} 721