1 /* 2 * Copyright 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.camera.camera2.internal.util; 18 19 import android.hardware.camera2.CameraCaptureSession; 20 import android.hardware.camera2.CameraDevice; 21 import android.hardware.camera2.CaptureFailure; 22 import android.hardware.camera2.CaptureRequest; 23 import android.hardware.camera2.CaptureResult; 24 import android.hardware.camera2.TotalCaptureResult; 25 import android.view.Surface; 26 27 import androidx.annotation.RestrictTo; 28 import androidx.annotation.RestrictTo.Scope; 29 30 import java.util.concurrent.Semaphore; 31 import java.util.concurrent.TimeUnit; 32 33 /** 34 * Camera2 callbacks which release specific semaphores on each event. 35 * 36 */ 37 @RestrictTo(Scope.LIBRARY) 38 public final class SemaphoreReleasingCamera2Callbacks { 39 SemaphoreReleasingCamera2Callbacks()40 private SemaphoreReleasingCamera2Callbacks() { 41 } 42 43 /** 44 * A device state callback which releases a different semaphore for each method. 45 * 46 */ 47 @RestrictTo(Scope.LIBRARY) 48 public static final class DeviceStateCallback extends CameraDevice.StateCallback { 49 private static final String TAG = DeviceStateCallback.class.getSimpleName(); 50 51 private final Semaphore mOnOpenedSemaphore = new Semaphore(0); 52 private final Semaphore mOnClosedSemaphore = new Semaphore(0); 53 private final Semaphore mOnDisconnectedSemaphore = new Semaphore(0); 54 private final Semaphore mOnErrorSemaphore = new Semaphore(0); 55 56 @Override onOpened(CameraDevice cameraDevice)57 public void onOpened(CameraDevice cameraDevice) { 58 mOnOpenedSemaphore.release(); 59 } 60 61 @Override onClosed(CameraDevice cameraDevice)62 public void onClosed(CameraDevice cameraDevice) { 63 mOnClosedSemaphore.release(); 64 } 65 66 @Override onDisconnected(CameraDevice cameraDevice)67 public void onDisconnected(CameraDevice cameraDevice) { 68 mOnDisconnectedSemaphore.release(); 69 } 70 71 @Override onError(CameraDevice cameraDevice, int error)72 public void onError(CameraDevice cameraDevice, int error) { 73 mOnErrorSemaphore.release(); 74 } 75 waitForOnOpened(int count)76 public void waitForOnOpened(int count) throws InterruptedException { 77 mOnOpenedSemaphore.acquire(count); 78 } 79 waitForOnClosed(int count)80 public void waitForOnClosed(int count) throws InterruptedException { 81 mOnClosedSemaphore.acquire(count); 82 } 83 waitForOnDisconnected(int count)84 public void waitForOnDisconnected(int count) throws InterruptedException { 85 mOnDisconnectedSemaphore.acquire(count); 86 } 87 waitForOnError(int count)88 public void waitForOnError(int count) throws InterruptedException { 89 mOnErrorSemaphore.acquire(count); 90 } 91 } 92 93 /** 94 * A session state callback which releases a different semaphore for each method. 95 * 96 */ 97 @RestrictTo(Scope.LIBRARY) 98 public static final class SessionStateCallback extends CameraCaptureSession.StateCallback { 99 private static final int WAIT_TIMEOUT = 10000; 100 private static final String TAG = SessionStateCallback.class.getSimpleName(); 101 102 private final Semaphore mOnConfiguredSemaphore = new Semaphore(0); 103 private final Semaphore mOnActiveSemaphore = new Semaphore(0); 104 private final Semaphore mOnClosedSemaphore = new Semaphore(0); 105 private final Semaphore mOnReadySemaphore = new Semaphore(0); 106 private final Semaphore mOnCaptureQueueEmptySemaphore = new Semaphore(0); 107 private final Semaphore mOnSurfacePreparedSemaphore = new Semaphore(0); 108 private final Semaphore mOnConfigureFailedSemaphore = new Semaphore(0); 109 110 @Override onConfigured(CameraCaptureSession session)111 public void onConfigured(CameraCaptureSession session) { 112 mOnConfiguredSemaphore.release(); 113 } 114 115 @Override onActive(CameraCaptureSession session)116 public void onActive(CameraCaptureSession session) { 117 mOnActiveSemaphore.release(); 118 } 119 120 @Override onClosed(CameraCaptureSession session)121 public void onClosed(CameraCaptureSession session) { 122 mOnClosedSemaphore.release(); 123 } 124 125 @Override onReady(CameraCaptureSession session)126 public void onReady(CameraCaptureSession session) { 127 mOnReadySemaphore.release(); 128 } 129 130 @Override onCaptureQueueEmpty(CameraCaptureSession session)131 public void onCaptureQueueEmpty(CameraCaptureSession session) { 132 mOnCaptureQueueEmptySemaphore.release(); 133 } 134 135 @Override onSurfacePrepared(CameraCaptureSession session, Surface surface)136 public void onSurfacePrepared(CameraCaptureSession session, Surface surface) { 137 mOnSurfacePreparedSemaphore.release(); 138 } 139 140 @Override onConfigureFailed(CameraCaptureSession session)141 public void onConfigureFailed(CameraCaptureSession session) { 142 mOnConfigureFailedSemaphore.release(); 143 } 144 waitForOnConfigured(int count)145 public boolean waitForOnConfigured(int count) throws InterruptedException { 146 return mOnConfiguredSemaphore.tryAcquire(count, WAIT_TIMEOUT, TimeUnit.MILLISECONDS); 147 } 148 waitForOnActive(int count)149 public boolean waitForOnActive(int count) throws InterruptedException { 150 return mOnActiveSemaphore.tryAcquire(count, WAIT_TIMEOUT, TimeUnit.MILLISECONDS); 151 } 152 waitForOnClosed(int count)153 public boolean waitForOnClosed(int count) throws InterruptedException { 154 return mOnClosedSemaphore.tryAcquire(count, WAIT_TIMEOUT, TimeUnit.MILLISECONDS); 155 } 156 waitForOnReady(int count)157 public boolean waitForOnReady(int count) throws InterruptedException { 158 return mOnReadySemaphore.tryAcquire(count, WAIT_TIMEOUT, TimeUnit.MILLISECONDS); 159 } 160 waitForOnCaptureQueueEmpty(int count)161 public boolean waitForOnCaptureQueueEmpty(int count) throws InterruptedException { 162 return mOnCaptureQueueEmptySemaphore.tryAcquire(count, WAIT_TIMEOUT, 163 TimeUnit.MILLISECONDS); 164 } 165 waitForOnSurfacePrepared(int count)166 public boolean waitForOnSurfacePrepared(int count) throws InterruptedException { 167 return mOnSurfacePreparedSemaphore.tryAcquire(count, WAIT_TIMEOUT, 168 TimeUnit.MILLISECONDS); 169 } 170 waitForOnConfigureFailed(int count)171 public boolean waitForOnConfigureFailed(int count) throws InterruptedException { 172 return mOnConfigureFailedSemaphore.tryAcquire(count, WAIT_TIMEOUT, 173 TimeUnit.MILLISECONDS); 174 } 175 } 176 177 /** 178 * A session capture callback which releases a different semaphore for each method. 179 * 180 */ 181 @RestrictTo(Scope.LIBRARY) 182 public static final class SessionCaptureCallback extends CameraCaptureSession.CaptureCallback { 183 private static final String TAG = SessionCaptureCallback.class.getSimpleName(); 184 185 private final Semaphore mOnCaptureBufferLostSemaphore = new Semaphore(0); 186 private final Semaphore mOnCaptureCompletedSemaphore = new Semaphore(0); 187 private final Semaphore mOnCaptureFailedSemaphore = new Semaphore(0); 188 private final Semaphore mOnCaptureProgressedSemaphore = new Semaphore(0); 189 private final Semaphore mOnCaptureSequenceAbortedSemaphore = new Semaphore(0); 190 private final Semaphore mOnCaptureSequenceCompletedSemaphore = new Semaphore(0); 191 private final Semaphore mOnCaptureStartedSemaphore = new Semaphore(0); 192 193 @Override onCaptureBufferLost( CameraCaptureSession session, CaptureRequest request, Surface surface, long frame)194 public void onCaptureBufferLost( 195 CameraCaptureSession session, CaptureRequest request, Surface surface, long frame) { 196 mOnCaptureBufferLostSemaphore.release(); 197 } 198 199 @Override onCaptureCompleted( CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)200 public void onCaptureCompleted( 201 CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 202 mOnCaptureCompletedSemaphore.release(); 203 } 204 205 @Override onCaptureFailed( CameraCaptureSession session, CaptureRequest request, CaptureFailure failure)206 public void onCaptureFailed( 207 CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) { 208 mOnCaptureFailedSemaphore.release(); 209 } 210 211 @Override onCaptureProgressed( CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult)212 public void onCaptureProgressed( 213 CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) { 214 mOnCaptureProgressedSemaphore.release(); 215 } 216 217 @Override onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId)218 public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) { 219 mOnCaptureSequenceAbortedSemaphore.release(); 220 } 221 222 @Override onCaptureSequenceCompleted( CameraCaptureSession session, int sequenceId, long frame)223 public void onCaptureSequenceCompleted( 224 CameraCaptureSession session, int sequenceId, long frame) { 225 mOnCaptureSequenceCompletedSemaphore.release(); 226 } 227 228 @Override onCaptureStarted( CameraCaptureSession session, CaptureRequest request, long timestamp, long frame)229 public void onCaptureStarted( 230 CameraCaptureSession session, CaptureRequest request, long timestamp, long frame) { 231 mOnCaptureStartedSemaphore.release(); 232 } 233 waitForOnCaptureBufferLost(int count)234 public void waitForOnCaptureBufferLost(int count) throws InterruptedException { 235 mOnCaptureBufferLostSemaphore.acquire(count); 236 } 237 waitForOnCaptureCompleted(int count)238 public void waitForOnCaptureCompleted(int count) throws InterruptedException { 239 mOnCaptureCompletedSemaphore.acquire(count); 240 } 241 waitForOnCaptureFailed(int count)242 public void waitForOnCaptureFailed(int count) throws InterruptedException { 243 mOnCaptureFailedSemaphore.acquire(count); 244 } 245 waitForOnCaptureProgressed(int count)246 public void waitForOnCaptureProgressed(int count) throws InterruptedException { 247 mOnCaptureProgressedSemaphore.acquire(count); 248 } 249 waitForOnCaptureSequenceAborted(int count)250 public void waitForOnCaptureSequenceAborted(int count) throws InterruptedException { 251 mOnCaptureSequenceAbortedSemaphore.acquire(count); 252 } 253 waitForOnCaptureSequenceCompleted(int count)254 public void waitForOnCaptureSequenceCompleted(int count) throws InterruptedException { 255 mOnCaptureSequenceCompletedSemaphore.acquire(count); 256 } 257 waitForOnCaptureStarted(int count)258 public void waitForOnCaptureStarted(int count) throws InterruptedException { 259 mOnCaptureStartedSemaphore.acquire(count); 260 } 261 } 262 } 263