1 /*
2  * Copyright (C) 2014 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 android.hardware.camera2;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.hardware.camera2.params.OutputConfiguration;
22 import android.os.Handler;
23 import android.view.Surface;
24 
25 import java.util.List;
26 
27 
28 /**
29  * A configured capture session for a {@link CameraDevice}, used for capturing images from the
30  * camera or reprocessing images captured from the camera in the same session previously.
31  *
32  * <p>A CameraCaptureSession is created by providing a set of target output surfaces to
33  * {@link CameraDevice#createCaptureSession createCaptureSession}, or by providing an
34  * {@link android.hardware.camera2.params.InputConfiguration} and a set of target output surfaces to
35  * {@link CameraDevice#createReprocessableCaptureSession createReprocessableCaptureSession} for a
36  * reprocessable capture session. Once created, the session is active until a new session is
37  * created by the camera device, or the camera device is closed.</p>
38  *
39  * <p>All capture sessions can be used for capturing images from the camera but only reprocessable
40  * capture sessions can reprocess images captured from the camera in the same session previously.
41  * </p>
42  *
43  * <p>Creating a session is an expensive operation and can take several hundred milliseconds, since
44  * it requires configuring the camera device's internal pipelines and allocating memory buffers for
45  * sending images to the desired targets. Therefore the setup is done asynchronously, and
46  * {@link CameraDevice#createCaptureSession createCaptureSession} and
47  * {@link CameraDevice#createReprocessableCaptureSession createReprocessableCaptureSession} will
48  * send the ready-to-use CameraCaptureSession to the provided listener's
49  * {@link CameraCaptureSession.StateCallback#onConfigured onConfigured} callback. If configuration
50  * cannot be completed, then the
51  * {@link CameraCaptureSession.StateCallback#onConfigureFailed onConfigureFailed} is called, and the
52  * session will not become active.</p>
53  *<!--
54  * <p>Any capture requests (repeating or non-repeating) submitted before the session is ready will
55  * be queued up and will begin capture once the session becomes ready. In case the session cannot be
56  * configured and {@link StateCallback#onConfigureFailed onConfigureFailed} is called, all queued
57  * capture requests are discarded.</p>
58  *-->
59  * <p>If a new session is created by the camera device, then the previous session is closed, and its
60  * associated {@link StateCallback#onClosed onClosed} callback will be invoked.  All
61  * of the session methods will throw an IllegalStateException if called once the session is
62  * closed.</p>
63  *
64  * <p>A closed session clears any repeating requests (as if {@link #stopRepeating} had been called),
65  * but will still complete all of its in-progress capture requests as normal, before a newly
66  * created session takes over and reconfigures the camera device.</p>
67  */
68 public abstract class CameraCaptureSession implements AutoCloseable {
69 
70     /**
71      * Used to identify invalid session ID.
72      * @hide
73      */
74     public static final int SESSION_ID_NONE = -1;
75 
76     /**
77      * Get the camera device that this session is created for.
78      */
79     @NonNull
getDevice()80     public abstract CameraDevice getDevice();
81 
82     /**
83      * <p>Pre-allocate all buffers for an output Surface.</p>
84      *
85      * <p>Normally, the image buffers for a given output Surface are allocated on-demand,
86      * to minimize startup latency and memory overhead.</p>
87      *
88      * <p>However, in some cases, it may be desirable for the buffers to be allocated before
89      * any requests targeting the Surface are actually submitted to the device. Large buffers
90      * may take some time to allocate, which can result in delays in submitting requests until
91      * sufficient buffers are allocated to reach steady-state behavior. Such delays can cause
92      * bursts to take longer than desired, or cause skips or stutters in preview output.</p>
93      *
94      * <p>The prepare() method can be used to perform this preallocation. It may only be called for
95      * a given output Surface before that Surface is used as a target for a request. The number of
96      * buffers allocated is the sum of the count needed by the consumer providing the output
97      * Surface, and the maximum number needed by the camera device to fill its pipeline. Since this
98      * may be a larger number than what is actually required for steady-state operation, using
99      * prepare may result in higher memory consumption than the normal on-demand behavior results
100      * in. Prepare() will also delay the time to first output to a given Surface, in exchange for
101      * smoother frame rate once the allocation is complete.</p>
102      *
103      * <p>For example, an application that creates an
104      * {@link android.media.ImageReader#newInstance ImageReader} with a maxImages argument of 10,
105      * but only uses 3 simultaneous Images at once would normally only cause those 3 images to be
106      * allocated (plus what is needed by the camera device for smooth operation).  But using
107      * prepare() on the ImageReader Surface will result in all 10 Images being allocated. So
108      * applications using this method should take care to request only the number of buffers
109      * actually necessary for their application.</p>
110      *
111      * <p>If the same output Surface is used in consecutive sessions (without closing the first
112      * session explicitly), then its already-allocated buffers are carried over, and if it was
113      * used as a target of a capture request in the first session, prepare cannot be called on it
114      * in the second session.</p>
115      *
116      * <p>Once allocation is complete, {@link StateCallback#onSurfacePrepared} will be invoked with
117      * the Surface provided to this method. Between the prepare call and the onSurfacePrepared call,
118      * the Surface provided to prepare must not be used as a target of a CaptureRequest submitted
119      * to this session.</p>
120      *
121      * <p>Note that if 2 surfaces share the same stream via {@link
122      * OutputConfiguration#enableSurfaceSharing} and {@link OutputConfiguration#addSurface},
123      * prepare() only needs to be called on one surface, and {link
124      * StateCallback#onSurfacePrepared} will be triggered for both surfaces.</p>
125      *
126      * <p>{@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}
127      * devices cannot pre-allocate output buffers; for those devices,
128      * {@link StateCallback#onSurfacePrepared} will be immediately called, and no preallocation is
129      * done.</p>
130      *
131      * @param surface the output Surface for which buffers should be pre-allocated. Must be one of
132      * the output Surfaces used to create this session.
133      *
134      * @throws CameraAccessException if the camera device is no longer connected or has
135      *                               encountered a fatal error
136      * @throws IllegalStateException if this session is no longer active, either because the session
137      *                               was explicitly closed, a new session has been created
138      *                               or the camera device has been closed.
139      * @throws IllegalArgumentException if the Surface is invalid, not part of this Session, or has
140      *                                  already been used as a target of a CaptureRequest in this
141      *                                  session or immediately prior sessions.
142      *
143      * @see StateCallback#onSurfacePrepared
144      */
prepare(@onNull Surface surface)145     public abstract void prepare(@NonNull Surface surface) throws CameraAccessException;
146 
147     /**
148      * <p>Pre-allocate at most maxCount buffers for an output Surface.</p>
149      *
150      * <p>Like the {@link #prepare(Surface)} method, this method can be used to allocate output
151      * buffers for a given Surface.  However, while the {@link #prepare(Surface)} method allocates
152      * the maximum possible buffer count, this method allocates at most maxCount buffers.</p>
153      *
154      * <p>If maxCount is greater than the possible maximum count (which is the sum of the buffer
155      * count requested by the creator of the Surface and the count requested by the camera device),
156      * only the possible maximum count is allocated, in which case the function acts exactly like
157      * {@link #prepare(Surface)}.</p>
158      *
159      * <p>The restrictions on when this method can be called are the same as for
160      * {@link #prepare(Surface)}.</p>
161      *
162      * <p>Repeated calls to this method are allowed, and a mix of {@link #prepare(Surface)} and
163      * this method is also allowed. Note that after the first call to {@link #prepare(Surface)},
164      * subsequent calls to either prepare method are effectively no-ops.  In addition, this method
165      * is not additive in terms of buffer count.  This means calling it twice with maxCount = 2
166      * will only allocate 2 buffers, not 4 (assuming the possible maximum is at least 2); to
167      * allocate two buffers on the first call and two on the second, the application needs to call
168      * prepare with prepare(surface, 2) and prepare(surface, 4).</p>
169      *
170      * @param maxCount the buffer count to try to allocate. If this is greater than the possible
171      *                 maximum for this output, the possible maximum is allocated instead. If
172      *                 maxCount buffers are already allocated, then prepare will do nothing.
173      * @param surface the output Surface for which buffers should be pre-allocated.
174      *
175      * @throws CameraAccessException if the camera device is no longer connected or has
176      *                               encountered a fatal error.
177      * @throws IllegalStateException if this session is no longer active, either because the
178      *                               session was explicitly closed, a new session has been created
179      *                               or the camera device has been closed.
180      * @throws IllegalArgumentException if the Surface is invalid, not part of this Session,
181      *                                  or has already been used as a target of a CaptureRequest in
182      *                                  this session or immediately prior sessions without an
183      *                                  intervening tearDown call.
184      *
185      * @hide
186      */
prepare(int maxCount, @NonNull Surface surface)187     public abstract void prepare(int maxCount, @NonNull Surface surface)
188             throws CameraAccessException;
189 
190     /**
191      * <p>Free all buffers allocated for an output Surface.</p>
192      *
193      * <p>Normally, once allocated, the image buffers for a given output Surface remain allocated
194      * for the lifetime of the capture session, to minimize latency of captures and to reduce
195      * memory allocation overhead.</p>
196      *
197      * <p>However, in some cases, it may be desirable for allocated buffers to be freed to reduce
198      * the application's memory consumption, if the particular output Surface will not be used by
199      * the application for some time.</p>
200      *
201      * <p>The tearDown() method can be used to perform this operation. After the call finishes, all
202      * unfilled image buffers will have been freed. Any future use of the target Surface may require
203      * allocation of additional buffers, as if the session had just been created.  Buffers being
204      * held by the application (either explicitly as Image objects from ImageReader, or implicitly
205      * as the current texture in a SurfaceTexture or the current contents of a RS Allocation, will
206      * remain valid and allocated even when tearDown is invoked.</p>
207      *
208      * <p>A Surface that has had tearDown() called on it is eligible to have prepare() invoked on it
209      * again even if it was used as a request target before the tearDown() call, as long as it
210      * doesn't get used as a target of a request between the tearDown() and prepare() calls.</p>
211      *
212      * @param surface the output Surface for which buffers should be freed. Must be one of the
213      * the output Surfaces used to create this session.
214      *
215      * @throws CameraAccessException if the camera device is no longer connected or has
216      *                               encountered a fatal error.
217      * @throws IllegalStateException if this session is no longer active, either because the session
218      *                               was explicitly closed, a new session has been created
219      *                               or the camera device has been closed.
220      * @throws IllegalArgumentException if the Surface is invalid, not part of this Session, or has
221      *                                  already been used as a target of a CaptureRequest in this
222      *                                  session or immediately prior sessions.
223      *
224      * @hide
225      */
tearDown(@onNull Surface surface)226     public abstract void tearDown(@NonNull Surface surface) throws CameraAccessException;
227 
228     /**
229      * <p>Finalize the output configurations that now have their deferred and/or extra Surfaces
230      * included.</p>
231      *
232      * <p>For camera use cases where a preview and other output configurations need to be
233      * configured, it can take some time for the preview Surface to be ready. For example, if the
234      * preview Surface is obtained from {@link android.view.SurfaceView}, the SurfaceView will only
235      * be ready after the UI layout is done, potentially delaying camera startup.</p>
236      *
237      * <p>To speed up camera startup time, the application can configure the
238      * {@link CameraCaptureSession} with the eventual preview size (via
239      * {@link OutputConfiguration#OutputConfiguration(Size,Class) a deferred OutputConfiguration}),
240      * and defer the preview output configuration until the Surface is ready. After the
241      * {@link CameraCaptureSession} is created successfully with this deferred output and other
242      * normal outputs, the application can start submitting requests as long as they do not include
243      * deferred output Surfaces. Once a deferred Surface is ready, the application can add the
244      * Surface to the deferred output configuration with the
245      * {@link OutputConfiguration#addSurface} method, and then update the deferred output
246      * configuration via this method, before it can submit capture requests with this output
247      * target.</p>
248      *
249      * <p>This function can also be called in case where multiple surfaces share the same
250      * OutputConfiguration, and one of the surfaces becomes available after the {@link
251      * CameraCaptureSession} is created. In that case, the application must first create the
252      * OutputConfiguration with the available Surface, then enable furture surface sharing via
253      * {@link OutputConfiguration#enableSurfaceSharing}, before creating the CameraCaptureSession.
254      * After the CameraCaptureSession is created, and once the extra Surface becomes available, the
255      * application must then call {@link OutputConfiguration#addSurface} before finalizing the
256      * configuration with this method.</p>
257      *
258      * <p>If the provided OutputConfigurations are unchanged from session creation, this function
259      * call has no effect. This function must only be called once for a particular output
260      * configuration. </p>
261      *
262      * <p>The output Surfaces included by this list of
263      * {@link OutputConfiguration OutputConfigurations} can be used as {@link CaptureRequest}
264      * targets as soon as this call returns.</p>
265      *
266      * <p>This method is not supported by
267      * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}-level devices.</p>
268      *
269      * @param outputConfigs a list of {@link OutputConfiguration OutputConfigurations} that
270      *            have had {@link OutputConfiguration#addSurface addSurface} invoked with a valid
271      *            output Surface after {@link CameraDevice#createCaptureSessionByOutputConfigurations}.
272      * @throws CameraAccessException if the camera device is no longer connected or has encountered
273      *             a fatal error.
274      * @throws IllegalStateException if this session is no longer active, either because the session
275      *             was explicitly closed, a new session has been created, or the camera device has
276      *             been closed.
277      * @throws IllegalArgumentException for invalid output configurations, including ones where the
278      *             source of the Surface is no longer valid or the Surface is from a unsupported
279      *             source. Or if one of the output configuration was already finished with an
280      *             included surface in a prior call.
281      */
finalizeOutputConfigurations( List<OutputConfiguration> outputConfigs)282     public abstract void finalizeOutputConfigurations(
283             List<OutputConfiguration> outputConfigs) throws CameraAccessException;
284 
285     /**
286      * <p>Submit a request for an image to be captured by the camera device.</p>
287      *
288      * <p>The request defines all the parameters for capturing the single image,
289      * including sensor, lens, flash, and post-processing settings.</p>
290      *
291      * <p>Each request will produce one {@link CaptureResult} and produce new frames for one or more
292      * target Surfaces, set with the CaptureRequest builder's
293      * {@link CaptureRequest.Builder#addTarget} method. The target surfaces (set with
294      * {@link CaptureRequest.Builder#addTarget}) must be a subset of the surfaces provided when this
295      * capture session was created.</p>
296      *
297      * <p>Multiple regular and reprocess requests can be in progress at once. If there are only
298      * regular requests or reprocess requests in progress, they are processed in first-in,
299      * first-out order. If there are both regular and reprocess requests in progress, regular
300      * requests are processed in first-in, first-out order and reprocess requests are processed in
301      * first-in, first-out order, respectively. However, the processing order of a regular request
302      * and a reprocess request in progress is not specified. In other words, a regular request
303      * will always be processed before regular requets that are submitted later. A reprocess request
304      * will always be processed before reprocess requests that are submitted later. However, a
305      * regular request may not be processed before reprocess requests that are submitted later.<p>
306      *
307      * <p>Requests submitted through this method have higher priority than
308      * those submitted through {@link #setRepeatingRequest} or
309      * {@link #setRepeatingBurst}, and will be processed as soon as the current
310      * repeat/repeatBurst processing completes.</p>
311      *
312      * <p>All capture sessions can be used for capturing images from the camera but only capture
313      * sessions created by
314      * {@link CameraDevice#createReprocessableCaptureSession createReprocessableCaptureSession}
315      * can submit reprocess capture requests. Submitting a reprocess request to a regular capture
316      * session will result in an {@link IllegalArgumentException}.</p>
317      *
318      * @param request the settings for this capture
319      * @param listener The callback object to notify once this request has been
320      * processed. If null, no metadata will be produced for this capture,
321      * although image data will still be produced.
322      * @param handler the handler on which the listener should be invoked, or
323      * {@code null} to use the current thread's {@link android.os.Looper
324      * looper}.
325      *
326      * @return int A unique capture sequence ID used by
327      *             {@link CaptureCallback#onCaptureSequenceCompleted}.
328      *
329      * @throws CameraAccessException if the camera device is no longer connected or has
330      *                               encountered a fatal error
331      * @throws IllegalStateException if this session is no longer active, either because the session
332      *                               was explicitly closed, a new session has been created
333      *                               or the camera device has been closed.
334      * @throws IllegalArgumentException if the request targets no Surfaces or Surfaces that are not
335      *                                  configured as outputs for this session; or the request
336      *                                  targets a set of Surfaces that cannot be submitted
337      *                                  simultaneously in a reprocessable capture session; or a
338      *                                  reprocess capture request is submitted in a
339      *                                  non-reprocessable capture session; or the reprocess capture
340      *                                  request was created with a {@link TotalCaptureResult} from
341      *                                  a different session; or the capture targets a Surface in
342      *                                  the middle of being {@link #prepare prepared}; or the
343      *                                  handler is null, the listener is not null, and the calling
344      *                                  thread has no looper.
345      *
346      * @see #captureBurst
347      * @see #setRepeatingRequest
348      * @see #setRepeatingBurst
349      * @see #abortCaptures
350      * @see CameraDevice#createReprocessableCaptureSession
351      */
capture(@onNull CaptureRequest request, @Nullable CaptureCallback listener, @Nullable Handler handler)352     public abstract int capture(@NonNull CaptureRequest request,
353             @Nullable CaptureCallback listener, @Nullable Handler handler)
354             throws CameraAccessException;
355 
356     /**
357      * Submit a list of requests to be captured in sequence as a burst. The
358      * burst will be captured in the minimum amount of time possible, and will
359      * not be interleaved with requests submitted by other capture or repeat
360      * calls.
361      *
362      * <p>Regular and reprocess requests can be mixed together in a single burst. Regular requests
363      * will be captured in order and reprocess requests will be processed in order, respectively.
364      * However, the processing order between a regular request and a reprocess request is not
365      * specified. Each capture produces one {@link CaptureResult} and image buffers for one or more
366      * target {@link android.view.Surface surfaces}. The target surfaces (set with
367      * {@link CaptureRequest.Builder#addTarget}) must be a subset of the surfaces provided when
368      * this capture session was created.</p>
369      *
370      * <p>The main difference between this method and simply calling
371      * {@link #capture} repeatedly is that this method guarantees that no
372      * other requests will be interspersed with the burst.</p>
373      *
374      * <p>All capture sessions can be used for capturing images from the camera but only capture
375      * sessions created by
376      * {@link CameraDevice#createReprocessableCaptureSession createReprocessableCaptureSession}
377      * can submit reprocess capture requests. Submitting a reprocess request to a regular
378      * capture session will result in an {@link IllegalArgumentException}.</p>
379      *
380      * @param requests the list of settings for this burst capture
381      * @param listener The callback object to notify each time one of the
382      * requests in the burst has been processed. If null, no metadata will be
383      * produced for any requests in this burst, although image data will still
384      * be produced.
385      * @param handler the handler on which the listener should be invoked, or
386      * {@code null} to use the current thread's {@link android.os.Looper
387      * looper}.
388      *
389      * @return int A unique capture sequence ID used by
390      *             {@link CaptureCallback#onCaptureSequenceCompleted}.
391      *
392      * @throws CameraAccessException if the camera device is no longer connected or has
393      *                               encountered a fatal error
394      * @throws IllegalStateException if this session is no longer active, either because the session
395      *                               was explicitly closed, a new session has been created
396      *                               or the camera device has been closed.
397      * @throws IllegalArgumentException If the requests target no Surfaces, or the requests target
398      *                                  Surfaces not currently configured as outputs; or one of the
399      *                                  requests targets a set of Surfaces that cannot be submitted
400      *                                  simultaneously in a reprocessable capture session; or a
401      *                                  reprocess capture request is submitted in a
402      *                                  non-reprocessable capture session; or one of the reprocess
403      *                                  capture requests was created with a
404      *                                  {@link TotalCaptureResult} from a different session; or one
405      *                                  of the captures targets a Surface in the middle of being
406      *                                  {@link #prepare prepared}; or if the handler is null, the
407      *                                  listener is not null, and the calling thread has no looper.
408      *
409      * @see #capture
410      * @see #setRepeatingRequest
411      * @see #setRepeatingBurst
412      * @see #abortCaptures
413      */
captureBurst(@onNull List<CaptureRequest> requests, @Nullable CaptureCallback listener, @Nullable Handler handler)414     public abstract int captureBurst(@NonNull List<CaptureRequest> requests,
415             @Nullable CaptureCallback listener, @Nullable Handler handler)
416             throws CameraAccessException;
417 
418     /**
419      * Request endlessly repeating capture of images by this capture session.
420      *
421      * <p>With this method, the camera device will continually capture images
422      * using the settings in the provided {@link CaptureRequest}, at the maximum
423      * rate possible.</p>
424      *
425      * <p>Repeating requests are a simple way for an application to maintain a
426      * preview or other continuous stream of frames, without having to
427      * continually submit identical requests through {@link #capture}.</p>
428      *
429      * <p>Repeat requests have lower priority than those submitted
430      * through {@link #capture} or {@link #captureBurst}, so if
431      * {@link #capture} is called when a repeating request is active, the
432      * capture request will be processed before any further repeating
433      * requests are processed.<p>
434      *
435      * <p>To stop the repeating capture, call {@link #stopRepeating}. Calling
436      * {@link #abortCaptures} will also clear the request.</p>
437      *
438      * <p>Calling this method will replace any earlier repeating request or
439      * burst set up by this method or {@link #setRepeatingBurst}, although any
440      * in-progress burst will be completed before the new repeat request will be
441      * used.</p>
442      *
443      * <p>This method does not support reprocess capture requests because each reprocess
444      * {@link CaptureRequest} must be created from the {@link TotalCaptureResult} that matches
445      * the input image to be reprocessed. This is either the {@link TotalCaptureResult} of capture
446      * that is sent for reprocessing, or one of the {@link TotalCaptureResult TotalCaptureResults}
447      * of a set of captures, when data from the whole set is combined by the application into a
448      * single reprocess input image. The request must be capturing images from the camera. If a
449      * reprocess capture request is submitted, this method will throw IllegalArgumentException.</p>
450      *
451      * @param request the request to repeat indefinitely
452      * @param listener The callback object to notify every time the
453      * request finishes processing. If null, no metadata will be
454      * produced for this stream of requests, although image data will
455      * still be produced.
456      * @param handler the handler on which the listener should be invoked, or
457      * {@code null} to use the current thread's {@link android.os.Looper
458      * looper}.
459      *
460      * @return int A unique capture sequence ID used by
461      *             {@link CaptureCallback#onCaptureSequenceCompleted}.
462      *
463      * @throws CameraAccessException if the camera device is no longer connected or has
464      *                               encountered a fatal error
465      * @throws IllegalStateException if this session is no longer active, either because the session
466      *                               was explicitly closed, a new session has been created
467      *                               or the camera device has been closed.
468      * @throws IllegalArgumentException If the request references no Surfaces or references Surfaces
469      *                                  that are not currently configured as outputs; or the request
470      *                                  is a reprocess capture request; or the capture targets a
471      *                                  Surface in the middle of being {@link #prepare prepared}; or
472      *                                  the handler is null, the listener is not null, and the
473      *                                  calling thread has no looper; or no requests were passed in.
474      *
475      * @see #capture
476      * @see #captureBurst
477      * @see #setRepeatingBurst
478      * @see #stopRepeating
479      * @see #abortCaptures
480      */
setRepeatingRequest(@onNull CaptureRequest request, @Nullable CaptureCallback listener, @Nullable Handler handler)481     public abstract int setRepeatingRequest(@NonNull CaptureRequest request,
482             @Nullable CaptureCallback listener, @Nullable Handler handler)
483             throws CameraAccessException;
484 
485     /**
486      * <p>Request endlessly repeating capture of a sequence of images by this
487      * capture session.</p>
488      *
489      * <p>With this method, the camera device will continually capture images,
490      * cycling through the settings in the provided list of
491      * {@link CaptureRequest CaptureRequests}, at the maximum rate possible.</p>
492      *
493      * <p>If a request is submitted through {@link #capture} or
494      * {@link #captureBurst}, the current repetition of the request list will be
495      * completed before the higher-priority request is handled. This guarantees
496      * that the application always receives a complete repeat burst captured in
497      * minimal time, instead of bursts interleaved with higher-priority
498      * captures, or incomplete captures.</p>
499      *
500      * <p>Repeating burst requests are a simple way for an application to
501      * maintain a preview or other continuous stream of frames where each
502      * request is different in a predicatable way, without having to continually
503      * submit requests through {@link #captureBurst}.</p>
504      *
505      * <p>To stop the repeating capture, call {@link #stopRepeating}. Any
506      * ongoing burst will still be completed, however. Calling
507      * {@link #abortCaptures} will also clear the request.</p>
508      *
509      * <p>Calling this method will replace a previously-set repeating request or
510      * burst set up by this method or {@link #setRepeatingRequest}, although any
511      * in-progress burst will be completed before the new repeat burst will be
512      * used.</p>
513      *
514      * <p>This method does not support reprocess capture requests because each reprocess
515      * {@link CaptureRequest} must be created from the {@link TotalCaptureResult} that matches
516      * the input image to be reprocessed. This is either the {@link TotalCaptureResult} of capture
517      * that is sent for reprocessing, or one of the {@link TotalCaptureResult TotalCaptureResults}
518      * of a set of captures, when data from the whole set is combined by the application into a
519      * single reprocess input image. The request must be capturing images from the camera. If a
520      * reprocess capture request is submitted, this method will throw IllegalArgumentException.</p>
521      *
522      * @param requests the list of requests to cycle through indefinitely
523      * @param listener The callback object to notify each time one of the
524      * requests in the repeating bursts has finished processing. If null, no
525      * metadata will be produced for this stream of requests, although image
526      * data will still be produced.
527      * @param handler the handler on which the listener should be invoked, or
528      * {@code null} to use the current thread's {@link android.os.Looper
529      * looper}.
530      *
531      * @return int A unique capture sequence ID used by
532      *             {@link CaptureCallback#onCaptureSequenceCompleted}.
533      *
534      * @throws CameraAccessException if the camera device is no longer connected or has
535      *                               encountered a fatal error
536      * @throws IllegalStateException if this session is no longer active, either because the session
537      *                               was explicitly closed, a new session has been created
538      *                               or the camera device has been closed.
539      * @throws IllegalArgumentException If the requests reference no Surfaces or reference Surfaces
540      *                                  not currently configured as outputs; or one of the requests
541      *                                  is a reprocess capture request; or one of the captures
542      *                                  targets a Surface in the middle of being
543      *                                  {@link #prepare prepared}; or the handler is null, the
544      *                                  listener is not null, and the calling thread has no looper;
545      *                                  or no requests were passed in.
546      *
547      * @see #capture
548      * @see #captureBurst
549      * @see #setRepeatingRequest
550      * @see #stopRepeating
551      * @see #abortCaptures
552      */
setRepeatingBurst(@onNull List<CaptureRequest> requests, @Nullable CaptureCallback listener, @Nullable Handler handler)553     public abstract int setRepeatingBurst(@NonNull List<CaptureRequest> requests,
554             @Nullable CaptureCallback listener, @Nullable Handler handler)
555             throws CameraAccessException;
556 
557     /**
558      * <p>Cancel any ongoing repeating capture set by either
559      * {@link #setRepeatingRequest setRepeatingRequest} or
560      * {@link #setRepeatingBurst}. Has no effect on requests submitted through
561      * {@link #capture capture} or {@link #captureBurst captureBurst}.</p>
562      *
563      * <p>Any currently in-flight captures will still complete, as will any burst that is
564      * mid-capture. To ensure that the device has finished processing all of its capture requests
565      * and is in ready state, wait for the {@link StateCallback#onReady} callback after
566      * calling this method.</p>
567      *
568      * @throws CameraAccessException if the camera device is no longer connected or has
569      *                               encountered a fatal error
570      * @throws IllegalStateException if this session is no longer active, either because the session
571      *                               was explicitly closed, a new session has been created
572      *                               or the camera device has been closed.
573      *
574      * @see #setRepeatingRequest
575      * @see #setRepeatingBurst
576      * @see StateCallback#onIdle
577      */
stopRepeating()578     public abstract void stopRepeating() throws CameraAccessException;
579 
580     /**
581      * Discard all captures currently pending and in-progress as fast as possible.
582      *
583      * <p>The camera device will discard all of its current work as fast as possible. Some in-flight
584      * captures may complete successfully and call {@link CaptureCallback#onCaptureCompleted}, while
585      * others will trigger their {@link CaptureCallback#onCaptureFailed} callbacks. If a repeating
586      * request or a repeating burst is set, it will be cleared.</p>
587      *
588      * <p>This method is the fastest way to switch the camera device to a new session with
589      * {@link CameraDevice#createCaptureSession} or
590      * {@link CameraDevice#createReprocessableCaptureSession}, at the cost of discarding in-progress
591      * work. It must be called before the new session is created. Once all pending requests are
592      * either completed or thrown away, the {@link StateCallback#onReady} callback will be called,
593      * if the session has not been closed. Otherwise, the {@link StateCallback#onClosed}
594      * callback will be fired when a new session is created by the camera device.</p>
595      *
596      * <p>Cancelling will introduce at least a brief pause in the stream of data from the camera
597      * device, since once the camera device is emptied, the first new request has to make it through
598      * the entire camera pipeline before new output buffers are produced.</p>
599      *
600      * <p>This means that using {@code abortCaptures()} to simply remove pending requests is not
601      * recommended; it's best used for quickly switching output configurations, or for cancelling
602      * long in-progress requests (such as a multi-second capture).</p>
603      *
604      * @throws CameraAccessException if the camera device is no longer connected or has
605      *                               encountered a fatal error
606      * @throws IllegalStateException if this session is no longer active, either because the session
607      *                               was explicitly closed, a new session has been created
608      *                               or the camera device has been closed.
609      *
610      * @see #setRepeatingRequest
611      * @see #setRepeatingBurst
612      * @see CameraDevice#createCaptureSession
613      * @see CameraDevice#createReprocessableCaptureSession
614      */
abortCaptures()615     public abstract void abortCaptures() throws CameraAccessException;
616 
617     /**
618      * Return if the application can submit reprocess capture requests with this camera capture
619      * session.
620      *
621      * @return {@code true} if the application can submit reprocess capture requests with this
622      *         camera capture session. {@code false} otherwise.
623      *
624      * @see CameraDevice#createReprocessableCaptureSession
625      */
isReprocessable()626     public abstract boolean isReprocessable();
627 
628     /**
629      * Get the input Surface associated with a reprocessable capture session.
630      *
631      * <p>Each reprocessable capture session has an input {@link Surface} where the reprocess
632      * capture requests get the input images from, rather than the camera device. The application
633      * can create a {@link android.media.ImageWriter ImageWriter} with this input {@link Surface}
634      * and use it to provide input images for reprocess capture requests. When the reprocessable
635      * capture session is closed, the input {@link Surface} is abandoned and becomes invalid.</p>
636      *
637      * @return The {@link Surface} where reprocessing capture requests get the input images from. If
638      *         this is not a reprocess capture session, {@code null} will be returned.
639      *
640      * @see CameraDevice#createReprocessableCaptureSession
641      * @see android.media.ImageWriter
642      * @see android.media.ImageReader
643      */
644     @Nullable
getInputSurface()645     public abstract Surface getInputSurface();
646 
647     /**
648      * Close this capture session asynchronously.
649      *
650      * <p>Closing a session frees up the target output Surfaces of the session for reuse with either
651      * a new session, or to other APIs that can draw to Surfaces.</p>
652      *
653      * <p>Note that creating a new capture session with {@link CameraDevice#createCaptureSession}
654      * will close any existing capture session automatically, and call the older session listener's
655      * {@link StateCallback#onClosed} callback. Using {@link CameraDevice#createCaptureSession}
656      * directly without closing is the recommended approach for quickly switching to a new session,
657      * since unchanged target outputs can be reused more efficiently.</p>
658      *
659      * <p>Once a session is closed, all methods on it will throw an IllegalStateException, and any
660      * repeating requests or bursts are stopped (as if {@link #stopRepeating()} was called).
661      * However, any in-progress capture requests submitted to the session will be completed as
662      * normal; once all captures have completed and the session has been torn down,
663      * {@link StateCallback#onClosed} will be called.</p>
664      *
665      * <p>Closing a session is idempotent; closing more than once has no effect.</p>
666      */
667     @Override
close()668     public abstract void close();
669 
670     /**
671      * A callback object for receiving updates about the state of a camera capture session.
672      *
673      */
674     public static abstract class StateCallback {
675 
676         /**
677          * This method is called when the camera device has finished configuring itself, and the
678          * session can start processing capture requests.
679          *
680          * <p>If there are capture requests already queued with the session, they will start
681          * processing once this callback is invoked, and the session will call {@link #onActive}
682          * right after this callback is invoked.</p>
683          *
684          * <p>If no capture requests have been submitted, then the session will invoke
685          * {@link #onReady} right after this callback.</p>
686          *
687          * <p>If the camera device configuration fails, then {@link #onConfigureFailed} will
688          * be invoked instead of this callback.</p>
689          *
690          * @param session the session returned by {@link CameraDevice#createCaptureSession}
691          */
onConfigured(@onNull CameraCaptureSession session)692         public abstract void onConfigured(@NonNull CameraCaptureSession session);
693 
694         /**
695          * This method is called if the session cannot be configured as requested.
696          *
697          * <p>This can happen if the set of requested outputs contains unsupported sizes,
698          * or too many outputs are requested at once.</p>
699          *
700          * <p>The session is considered to be closed, and all methods called on it after this
701          * callback is invoked will throw an IllegalStateException. Any capture requests submitted
702          * to the session prior to this callback will be discarded and will not produce any
703          * callbacks on their listeners.</p>
704          *
705          * @param session the session returned by {@link CameraDevice#createCaptureSession}
706          */
onConfigureFailed(@onNull CameraCaptureSession session)707         public abstract void onConfigureFailed(@NonNull CameraCaptureSession session);
708 
709         /**
710          * This method is called every time the session has no more capture requests to process.
711          *
712          * <p>During the creation of a new session, this callback is invoked right after
713          * {@link #onConfigured} if no capture requests were submitted to the session prior to it
714          * completing configuration.</p>
715          *
716          * <p>Otherwise, this callback will be invoked any time the session finishes processing
717          * all of its active capture requests, and no repeating request or burst is set up.</p>
718          *
719          * @param session the session returned by {@link CameraDevice#createCaptureSession}
720          *
721          */
onReady(@onNull CameraCaptureSession session)722         public void onReady(@NonNull CameraCaptureSession session) {
723             // default empty implementation
724         }
725 
726         /**
727          * This method is called when the session starts actively processing capture requests.
728          *
729          * <p>If capture requests are submitted prior to {@link #onConfigured} being called,
730          * then the session will start processing those requests immediately after the callback,
731          * and this method will be immediately called after {@link #onConfigured}.
732          *
733          * <p>If the session runs out of capture requests to process and calls {@link #onReady},
734          * then this callback will be invoked again once new requests are submitted for capture.</p>
735          *
736          * @param session the session returned by {@link CameraDevice#createCaptureSession}
737          */
onActive(@onNull CameraCaptureSession session)738         public void onActive(@NonNull CameraCaptureSession session) {
739             // default empty implementation
740         }
741 
742         /**
743          * This method is called when camera device's input capture queue becomes empty,
744          * and is ready to accept the next request.
745          *
746          * <p>Pending capture requests exist in one of two queues: the in-flight queue where requests
747          * are already in different stages of processing pipeline, and an input queue where requests
748          * wait to enter the in-flight queue. The input queue is needed because more requests may be
749          * submitted than the current camera device pipeline depth.</p>
750          *
751          * <p>This callback is fired when the input queue becomes empty, and the camera device may
752          * have to fall back to the repeating request if set, or completely skip the next frame from
753          * the sensor. This can cause glitches to camera preview output, for example. This callback
754          * will only fire after requests queued by capture() or captureBurst(), not after a
755          * repeating request or burst enters the in-flight queue. For example, in the common case
756          * of a repeating request and a single-shot JPEG capture, this callback only fires when the
757          * JPEG request has entered the in-flight queue for capture.</p>
758          *
759          * <p>By only sending a new {@link #capture} or {@link #captureBurst} when the input
760          * queue is empty, pipeline latency can be minimized.</p>
761          *
762          * <p>This callback is not fired when the session is first created. It is different from
763          * {@link #onReady}, which is fired when all requests in both queues have been processed.</p>
764          *
765          * @param session
766          *            The session returned by {@link CameraDevice#createCaptureSession}
767          */
onCaptureQueueEmpty(@onNull CameraCaptureSession session)768         public void onCaptureQueueEmpty(@NonNull CameraCaptureSession session) {
769             // default empty implementation
770         }
771 
772         /**
773          * This method is called when the session is closed.
774          *
775          * <p>A session is closed when a new session is created by the parent camera device,
776          * or when the parent camera device is closed (either by the user closing the device,
777          * or due to a camera device disconnection or fatal error).</p>
778          *
779          * <p>Once a session is closed, all methods on it will throw an IllegalStateException, and
780          * any repeating requests or bursts are stopped (as if {@link #stopRepeating()} was called).
781          * However, any in-progress capture requests submitted to the session will be completed
782          * as normal.</p>
783          *
784          * @param session the session returned by {@link CameraDevice#createCaptureSession}
785          */
onClosed(@onNull CameraCaptureSession session)786         public void onClosed(@NonNull CameraCaptureSession session) {
787             // default empty implementation
788         }
789 
790         /**
791          * This method is called when the buffer pre-allocation for an output Surface is complete.
792          *
793          * <p>Buffer pre-allocation for an output Surface is started by the {@link #prepare} call.
794          * While allocation is underway, the Surface must not be used as a capture target.
795          * Once this callback fires, the output Surface provided can again be used as a target for
796          * a capture request.</p>
797          *
798          * <p>In case of a error during pre-allocation (such as running out of suitable memory),
799          * this callback is still invoked after the error is encountered, though some buffers may
800          * not have been successfully pre-allocated.</p>
801          *
802          * @param session the session returned by {@link CameraDevice#createCaptureSession}
803          * @param surface the Surface that was used with the {@link #prepare} call.
804          */
onSurfacePrepared(@onNull CameraCaptureSession session, @NonNull Surface surface)805         public void onSurfacePrepared(@NonNull CameraCaptureSession session,
806                 @NonNull Surface surface) {
807             // default empty implementation
808         }
809     }
810 
811     /**
812      * <p>A callback object for tracking the progress of a {@link CaptureRequest} submitted to the
813      * camera device.</p>
814      *
815      * <p>This callback is invoked when a request triggers a capture to start,
816      * and when the capture is complete. In case on an error capturing an image,
817      * the error method is triggered instead of the completion method.</p>
818      *
819      * @see #capture
820      * @see #captureBurst
821      * @see #setRepeatingRequest
822      * @see #setRepeatingBurst
823      */
824     public static abstract class CaptureCallback {
825 
826         /**
827          * This constant is used to indicate that no images were captured for
828          * the request.
829          *
830          * @hide
831          */
832         public static final int NO_FRAMES_CAPTURED = -1;
833 
834         /**
835          * This method is called when the camera device has started capturing
836          * the output image for the request, at the beginning of image exposure, or
837          * when the camera device has started processing an input image for a reprocess
838          * request.
839          *
840          * <p>For a regular capture request, this callback is invoked right as
841          * the capture of a frame begins, so it is the most appropriate time
842          * for playing a shutter sound, or triggering UI indicators of capture.</p>
843          *
844          * <p>The request that is being used for this capture is provided, along
845          * with the actual timestamp for the start of exposure. For a reprocess
846          * request, this timestamp will be the input image's start of exposure
847          * which matches {@link CaptureResult#SENSOR_TIMESTAMP the result timestamp field}
848          * of the {@link TotalCaptureResult} that was used to
849          * {@link CameraDevice#createReprocessCaptureRequest create the reprocess request}.
850          * This timestamp matches the timestamps that will be
851          * included in {@link CaptureResult#SENSOR_TIMESTAMP the result timestamp field},
852          * and in the buffers sent to each output Surface. These buffer
853          * timestamps are accessible through, for example,
854          * {@link android.media.Image#getTimestamp() Image.getTimestamp()} or
855          * {@link android.graphics.SurfaceTexture#getTimestamp()}.
856          * The frame number included is equal to the frame number that will be included in
857          * {@link CaptureResult#getFrameNumber}.</p>
858          *
859          * <p>For the simplest way to play a shutter sound camera shutter or a
860          * video recording start/stop sound, see the
861          * {@link android.media.MediaActionSound} class.</p>
862          *
863          * <p>The default implementation of this method does nothing.</p>
864          *
865          * @param session the session returned by {@link CameraDevice#createCaptureSession}
866          * @param request the request for the capture that just begun
867          * @param timestamp the timestamp at start of capture for a regular request, or
868          *                  the timestamp at the input image's start of capture for a
869          *                  reprocess request, in nanoseconds.
870          * @param frameNumber the frame number for this capture
871          *
872          * @see android.media.MediaActionSound
873          */
onCaptureStarted(@onNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber)874         public void onCaptureStarted(@NonNull CameraCaptureSession session,
875                 @NonNull CaptureRequest request, long timestamp, long frameNumber) {
876             // default empty implementation
877         }
878 
879         /**
880          * This method is called when some results from an image capture are
881          * available.
882          *
883          * <p>The result provided here will contain some subset of the fields of
884          * a full result. Multiple onCapturePartial calls may happen per
885          * capture; a given result field will only be present in one partial
886          * capture at most. The final onCaptureCompleted call will always
887          * contain all the fields, whether onCapturePartial was called or
888          * not.</p>
889          *
890          * <p>The default implementation of this method does nothing.</p>
891          *
892          * @param session the session returned by {@link CameraDevice#createCaptureSession}
893          * @param request The request that was given to the CameraDevice
894          * @param result The partial output metadata from the capture, which
895          * includes a subset of the CaptureResult fields.
896          *
897          * @see #capture
898          * @see #captureBurst
899          * @see #setRepeatingRequest
900          * @see #setRepeatingBurst
901          *
902          * @hide
903          */
onCapturePartial(CameraCaptureSession session, CaptureRequest request, CaptureResult result)904         public void onCapturePartial(CameraCaptureSession session,
905                 CaptureRequest request, CaptureResult result) {
906             // default empty implementation
907         }
908 
909         /**
910          * This method is called when an image capture makes partial forward progress; some
911          * (but not all) results from an image capture are available.
912          *
913          * <p>The result provided here will contain some subset of the fields of
914          * a full result. Multiple {@link #onCaptureProgressed} calls may happen per
915          * capture; a given result field will only be present in one partial
916          * capture at most. The final {@link #onCaptureCompleted} call will always
917          * contain all the fields (in particular, the union of all the fields of all
918          * the partial results composing the total result).</p>
919          *
920          * <p>For each request, some result data might be available earlier than others. The typical
921          * delay between each partial result (per request) is a single frame interval.
922          * For performance-oriented use-cases, applications should query the metadata they need
923          * to make forward progress from the partial results and avoid waiting for the completed
924          * result.</p>
925          *
926          * <p>For a particular request, {@link #onCaptureProgressed} may happen before or after
927          * {@link #onCaptureStarted}.</p>
928          *
929          * <p>Each request will generate at least {@code 1} partial results, and at most
930          * {@link CameraCharacteristics#REQUEST_PARTIAL_RESULT_COUNT} partial results.</p>
931          *
932          * <p>Depending on the request settings, the number of partial results per request
933          * will vary, although typically the partial count could be the same as long as the
934          * camera device subsystems enabled stay the same.</p>
935          *
936          * <p>The default implementation of this method does nothing.</p>
937          *
938          * @param session the session returned by {@link CameraDevice#createCaptureSession}
939          * @param request The request that was given to the CameraDevice
940          * @param partialResult The partial output metadata from the capture, which
941          * includes a subset of the {@link TotalCaptureResult} fields.
942          *
943          * @see #capture
944          * @see #captureBurst
945          * @see #setRepeatingRequest
946          * @see #setRepeatingBurst
947          */
onCaptureProgressed(@onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult)948         public void onCaptureProgressed(@NonNull CameraCaptureSession session,
949                 @NonNull CaptureRequest request, @NonNull CaptureResult partialResult) {
950             // default empty implementation
951         }
952 
953         /**
954          * This method is called when an image capture has fully completed and all the
955          * result metadata is available.
956          *
957          * <p>This callback will always fire after the last {@link #onCaptureProgressed};
958          * in other words, no more partial results will be delivered once the completed result
959          * is available.</p>
960          *
961          * <p>For performance-intensive use-cases where latency is a factor, consider
962          * using {@link #onCaptureProgressed} instead.</p>
963          *
964          * <p>The default implementation of this method does nothing.</p>
965          *
966          * @param session the session returned by {@link CameraDevice#createCaptureSession}
967          * @param request The request that was given to the CameraDevice
968          * @param result The total output metadata from the capture, including the
969          * final capture parameters and the state of the camera system during
970          * capture.
971          *
972          * @see #capture
973          * @see #captureBurst
974          * @see #setRepeatingRequest
975          * @see #setRepeatingBurst
976          */
onCaptureCompleted(@onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result)977         public void onCaptureCompleted(@NonNull CameraCaptureSession session,
978                 @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
979             // default empty implementation
980         }
981 
982         /**
983          * This method is called instead of {@link #onCaptureCompleted} when the
984          * camera device failed to produce a {@link CaptureResult} for the
985          * request.
986          *
987          * <p>Other requests are unaffected, and some or all image buffers from
988          * the capture may have been pushed to their respective output
989          * streams.</p>
990          *
991          * <p>The default implementation of this method does nothing.</p>
992          *
993          * @param session
994          *            The session returned by {@link CameraDevice#createCaptureSession}
995          * @param request
996          *            The request that was given to the CameraDevice
997          * @param failure
998          *            The output failure from the capture, including the failure reason
999          *            and the frame number.
1000          *
1001          * @see #capture
1002          * @see #captureBurst
1003          * @see #setRepeatingRequest
1004          * @see #setRepeatingBurst
1005          */
onCaptureFailed(@onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure)1006         public void onCaptureFailed(@NonNull CameraCaptureSession session,
1007                 @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {
1008             // default empty implementation
1009         }
1010 
1011         /**
1012          * This method is called independently of the others in CaptureCallback,
1013          * when a capture sequence finishes and all {@link CaptureResult}
1014          * or {@link CaptureFailure} for it have been returned via this listener.
1015          *
1016          * <p>In total, there will be at least one result/failure returned by this listener
1017          * before this callback is invoked. If the capture sequence is aborted before any
1018          * requests have been processed, {@link #onCaptureSequenceAborted} is invoked instead.</p>
1019          *
1020          * <p>The default implementation does nothing.</p>
1021          *
1022          * @param session
1023          *            The session returned by {@link CameraDevice#createCaptureSession}
1024          * @param sequenceId
1025          *            A sequence ID returned by the {@link #capture} family of functions.
1026          * @param frameNumber
1027          *            The last frame number (returned by {@link CaptureResult#getFrameNumber}
1028          *            or {@link CaptureFailure#getFrameNumber}) in the capture sequence.
1029          *
1030          * @see CaptureResult#getFrameNumber()
1031          * @see CaptureFailure#getFrameNumber()
1032          * @see CaptureResult#getSequenceId()
1033          * @see CaptureFailure#getSequenceId()
1034          * @see #onCaptureSequenceAborted
1035          */
onCaptureSequenceCompleted(@onNull CameraCaptureSession session, int sequenceId, long frameNumber)1036         public void onCaptureSequenceCompleted(@NonNull CameraCaptureSession session,
1037                 int sequenceId, long frameNumber) {
1038             // default empty implementation
1039         }
1040 
1041         /**
1042          * This method is called independently of the others in CaptureCallback,
1043          * when a capture sequence aborts before any {@link CaptureResult}
1044          * or {@link CaptureFailure} for it have been returned via this listener.
1045          *
1046          * <p>Due to the asynchronous nature of the camera device, not all submitted captures
1047          * are immediately processed. It is possible to clear out the pending requests
1048          * by a variety of operations such as {@link CameraCaptureSession#stopRepeating} or
1049          * {@link CameraCaptureSession#abortCaptures}. When such an event happens,
1050          * {@link #onCaptureSequenceCompleted} will not be called.</p>
1051          *
1052          * <p>The default implementation does nothing.</p>
1053          *
1054          * @param session
1055          *            The session returned by {@link CameraDevice#createCaptureSession}
1056          * @param sequenceId
1057          *            A sequence ID returned by the {@link #capture} family of functions.
1058          *
1059          * @see CaptureResult#getFrameNumber()
1060          * @see CaptureFailure#getFrameNumber()
1061          * @see CaptureResult#getSequenceId()
1062          * @see CaptureFailure#getSequenceId()
1063          * @see #onCaptureSequenceCompleted
1064          */
onCaptureSequenceAborted(@onNull CameraCaptureSession session, int sequenceId)1065         public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
1066                 int sequenceId) {
1067             // default empty implementation
1068         }
1069 
1070         /**
1071          * <p>This method is called if a single buffer for a capture could not be sent to its
1072          * destination surface.</p>
1073          *
1074          * <p>If the whole capture failed, then {@link #onCaptureFailed} will be called instead. If
1075          * some but not all buffers were captured but the result metadata will not be available,
1076          * then onCaptureFailed will be invoked with {@link CaptureFailure#wasImageCaptured}
1077          * returning true, along with one or more calls to {@link #onCaptureBufferLost} for the
1078          * failed outputs.</p>
1079          *
1080          * @param session
1081          *            The session returned by {@link CameraDevice#createCaptureSession}
1082          * @param request
1083          *            The request that was given to the CameraDevice
1084          * @param target
1085          *            The target Surface that the buffer will not be produced for
1086          * @param frameNumber
1087          *            The frame number for the request
1088          */
onCaptureBufferLost(@onNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull Surface target, long frameNumber)1089         public void onCaptureBufferLost(@NonNull CameraCaptureSession session,
1090                 @NonNull CaptureRequest request, @NonNull Surface target, long frameNumber) {
1091             // default empty implementation
1092         }
1093     }
1094 
1095 }
1096