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;
18 
19 import android.hardware.camera2.CameraCaptureSession;
20 import android.hardware.camera2.CaptureFailure;
21 import android.hardware.camera2.CaptureRequest;
22 import android.hardware.camera2.CaptureResult;
23 import android.hardware.camera2.TotalCaptureResult;
24 import android.os.Build;
25 import android.view.Surface;
26 
27 import androidx.annotation.RequiresApi;
28 import androidx.camera.camera2.internal.compat.ApiCompat;
29 
30 import org.jspecify.annotations.NonNull;
31 
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.List;
35 
36 /**
37  * Different implementations of {@link CameraCaptureSession.CaptureCallback}.
38  */
39 public final class Camera2CaptureCallbacks {
Camera2CaptureCallbacks()40     private Camera2CaptureCallbacks() {
41     }
42 
43     /** Returns a session capture callback which does nothing. */
createNoOpCallback()44     public static CameraCaptureSession.@NonNull CaptureCallback createNoOpCallback() {
45         return new NoOpSessionCaptureCallback();
46     }
47 
48     /** Returns a session capture callback which calls a list of other callbacks. */
createComboCallback( List<CameraCaptureSession.CaptureCallback> callbacks)49     static CameraCaptureSession.CaptureCallback createComboCallback(
50             List<CameraCaptureSession.CaptureCallback> callbacks) {
51         return new ComboSessionCaptureCallback(callbacks);
52     }
53 
54     /** Returns a session capture callback which calls a list of other callbacks. */
createComboCallback( CameraCaptureSession.CaptureCallback @onNull .... callbacks)55     public static CameraCaptureSession.@NonNull CaptureCallback createComboCallback(
56             CameraCaptureSession.CaptureCallback @NonNull ... callbacks) {
57         return createComboCallback(Arrays.asList(callbacks));
58     }
59 
60     static final class NoOpSessionCaptureCallback
61             extends CameraCaptureSession.CaptureCallback {
62         @Override
onCaptureBufferLost( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull Surface surface, long frame)63         public void onCaptureBufferLost(
64                 @NonNull CameraCaptureSession session,
65                 @NonNull CaptureRequest request,
66                 @NonNull Surface surface,
67                 long frame) {
68         }
69 
70         @Override
onCaptureCompleted( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result)71         public void onCaptureCompleted(
72                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
73                 @NonNull TotalCaptureResult result) {
74         }
75 
76         @Override
onCaptureFailed( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure)77         public void onCaptureFailed(
78                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
79                 @NonNull CaptureFailure failure) {
80         }
81 
82         @Override
onCaptureProgressed( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult)83         public void onCaptureProgressed(
84                 @NonNull CameraCaptureSession session,
85                 @NonNull CaptureRequest request,
86                 @NonNull CaptureResult partialResult) {
87         }
88 
89         @Override
onCaptureSequenceAborted(@onNull CameraCaptureSession session, int sequenceId)90         public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
91                 int sequenceId) {
92         }
93 
94         @Override
onCaptureSequenceCompleted( @onNull CameraCaptureSession session, int sequenceId, long frame)95         public void onCaptureSequenceCompleted(
96                 @NonNull CameraCaptureSession session, int sequenceId, long frame) {
97         }
98 
99         @Override
onCaptureStarted( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frame)100         public void onCaptureStarted(
101                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
102                 long timestamp, long frame) {
103         }
104     }
105 
106     private static final class ComboSessionCaptureCallback
107             extends CameraCaptureSession.CaptureCallback {
108         private final List<CameraCaptureSession.CaptureCallback> mCallbacks = new ArrayList<>();
109 
ComboSessionCaptureCallback(List<CameraCaptureSession.CaptureCallback> callbacks)110         ComboSessionCaptureCallback(List<CameraCaptureSession.CaptureCallback> callbacks) {
111             for (CameraCaptureSession.CaptureCallback callback : callbacks) {
112                 // A no-op callback doesn't do anything, so avoid adding it to the final list.
113                 if (!(callback instanceof NoOpSessionCaptureCallback)) {
114                     mCallbacks.add(callback);
115                 }
116             }
117         }
118 
119         @RequiresApi(api = Build.VERSION_CODES.N)
120         @Override
onCaptureBufferLost( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull Surface surface, long frame)121         public void onCaptureBufferLost(
122                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
123                 @NonNull Surface surface, long frame) {
124             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
125                 ApiCompat.Api24Impl.onCaptureBufferLost(callback, session, request, surface, frame);
126             }
127         }
128 
129         @Override
onCaptureCompleted( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result)130         public void onCaptureCompleted(
131                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
132                 @NonNull TotalCaptureResult result) {
133             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
134                 callback.onCaptureCompleted(session, request, result);
135             }
136         }
137 
138         @Override
onCaptureFailed( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure)139         public void onCaptureFailed(
140                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
141                 @NonNull CaptureFailure failure) {
142             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
143                 callback.onCaptureFailed(session, request, failure);
144             }
145         }
146 
147         @Override
onCaptureProgressed( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult)148         public void onCaptureProgressed(
149                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
150                 @NonNull CaptureResult partialResult) {
151             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
152                 callback.onCaptureProgressed(session, request, partialResult);
153             }
154         }
155 
156         @Override
onCaptureSequenceAborted(@onNull CameraCaptureSession session, int sequenceId)157         public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
158                 int sequenceId) {
159             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
160                 callback.onCaptureSequenceAborted(session, sequenceId);
161             }
162         }
163 
164         @Override
onCaptureSequenceCompleted( @onNull CameraCaptureSession session, int sequenceId, long frame)165         public void onCaptureSequenceCompleted(
166                 @NonNull CameraCaptureSession session, int sequenceId, long frame) {
167             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
168                 callback.onCaptureSequenceCompleted(session, sequenceId, frame);
169             }
170         }
171 
172         @Override
onCaptureStarted( @onNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frame)173         public void onCaptureStarted(
174                 @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
175                 long timestamp, long frame) {
176             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
177                 callback.onCaptureStarted(session, request, timestamp, frame);
178             }
179         }
180     }
181 }
182