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