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