• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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.IntDef;
20 import android.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.annotation.SystemApi;
23 import android.hardware.camera2.params.ExtensionSessionConfiguration;
24 import android.hardware.camera2.params.InputConfiguration;
25 import android.hardware.camera2.params.OutputConfiguration;
26 import android.hardware.camera2.params.SessionConfiguration;
27 import android.hardware.camera2.params.StreamConfigurationMap;
28 import android.os.Handler;
29 import android.view.Surface;
30 
31 import java.lang.annotation.Retention;
32 import java.lang.annotation.RetentionPolicy;
33 import java.util.List;
34 import java.util.Set;
35 
36 /**
37  * <p>The CameraDevice class is a representation of a single camera connected to an
38  * Android device, allowing for fine-grain control of image capture and
39  * post-processing at high frame rates.</p>
40  *
41  * <p>Your application must declare the
42  * {@link android.Manifest.permission#CAMERA Camera} permission in its manifest
43  * in order to access camera devices.</p>
44  *
45  * <p>A given camera device may provide support at one of several levels defined
46  * in {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}.
47  * If a device supports {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY} level,
48  * the camera device is running in backward compatibility mode and has minimum camera2 API support.
49  * If a device supports the {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}
50  * level, then Camera2 exposes a feature set that is roughly equivalent to the older
51  * {@link android.hardware.Camera Camera} API, although with a cleaner and more
52  * efficient interface.
53  * If a device supports the {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL EXTERNAL}
54  * level, then the device is a removable camera that provides similar but slightly less features
55  * as the {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} level.
56  * Devices that implement the {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} or
57  * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3 LEVEL3} level of support
58  * provide substantially improved capabilities over the older camera
59  * API. If your application requires a full-level device for
60  * proper operation, declare the "android.hardware.camera.level.full" feature in your
61  * manifest.</p>
62  *
63  * @see CameraManager#openCamera
64  * @see android.Manifest.permission#CAMERA
65  * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
66  */
67 public abstract class CameraDevice implements AutoCloseable {
68 
69     /**
70      * Create a request suitable for a camera preview window. Specifically, this
71      * means that high frame rate is given priority over the highest-quality
72      * post-processing. These requests would normally be used with the
73      * {@link CameraCaptureSession#setRepeatingRequest} method.
74      * This template is guaranteed to be supported on all camera devices.
75      *
76      * @see #createCaptureRequest
77      */
78     public static final int TEMPLATE_PREVIEW = 1;
79 
80     /**
81      * Create a request suitable for still image capture. Specifically, this
82      * means prioritizing image quality over frame rate. These requests would
83      * commonly be used with the {@link CameraCaptureSession#capture} method.
84      * This template is guaranteed to be supported on all camera devices except
85      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT DEPTH_OUTPUT} devices
86      * that are not {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
87      * BACKWARD_COMPATIBLE}.
88      * @see #createCaptureRequest
89      */
90     public static final int TEMPLATE_STILL_CAPTURE = 2;
91 
92     /**
93      * Create a request suitable for video recording. Specifically, this means
94      * that a stable frame rate is used, and post-processing is set for
95      * recording quality. These requests would commonly be used with the
96      * {@link CameraCaptureSession#setRepeatingRequest} method.
97      * This template is guaranteed to be supported on all camera devices except
98      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT DEPTH_OUTPUT} devices
99      * that are not {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
100      * BACKWARD_COMPATIBLE}.
101      *
102      * @see #createCaptureRequest
103      */
104     public static final int TEMPLATE_RECORD  = 3;
105 
106     /**
107      * Create a request suitable for still image capture while recording
108      * video. Specifically, this means maximizing image quality without
109      * disrupting the ongoing recording. These requests would commonly be used
110      * with the {@link CameraCaptureSession#capture} method while a request based on
111      * {@link #TEMPLATE_RECORD} is is in use with {@link CameraCaptureSession#setRepeatingRequest}.
112      * This template is guaranteed to be supported on all camera devices except
113      * legacy devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
114      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}) and
115      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT DEPTH_OUTPUT} devices
116      * that are not {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
117      * BACKWARD_COMPATIBLE}.
118      *
119      * @see #createCaptureRequest
120      */
121     public static final int TEMPLATE_VIDEO_SNAPSHOT = 4;
122 
123     /**
124      * Create a request suitable for zero shutter lag still capture. This means
125      * means maximizing image quality without compromising preview frame rate.
126      * AE/AWB/AF should be on auto mode. This is intended for application-operated ZSL. For
127      * device-operated ZSL, use {@link CaptureRequest#CONTROL_ENABLE_ZSL} if available.
128      * This template is guaranteed to be supported on camera devices that support the
129      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING PRIVATE_REPROCESSING}
130      * capability or the
131      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING YUV_REPROCESSING}
132      * capability.
133      *
134      * @see #createCaptureRequest
135      * @see CaptureRequest#CONTROL_ENABLE_ZSL
136      */
137     public static final int TEMPLATE_ZERO_SHUTTER_LAG = 5;
138 
139     /**
140      * A basic template for direct application control of capture
141      * parameters. All automatic control is disabled (auto-exposure, auto-white
142      * balance, auto-focus), and post-processing parameters are set to preview
143      * quality. The manual capture parameters (exposure, sensitivity, and so on)
144      * are set to reasonable defaults, but should be overriden by the
145      * application depending on the intended use case.
146      * This template is guaranteed to be supported on camera devices that support the
147      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR MANUAL_SENSOR}
148      * capability.
149      *
150      * @see #createCaptureRequest
151      */
152     public static final int TEMPLATE_MANUAL = 6;
153 
154      /** @hide */
155      @Retention(RetentionPolicy.SOURCE)
156      @IntDef(prefix = {"TEMPLATE_"}, value =
157          {TEMPLATE_PREVIEW,
158           TEMPLATE_STILL_CAPTURE,
159           TEMPLATE_RECORD,
160           TEMPLATE_VIDEO_SNAPSHOT,
161           TEMPLATE_ZERO_SHUTTER_LAG,
162           TEMPLATE_MANUAL})
163      public @interface RequestTemplate {};
164 
165      /**
166       * No vibration or sound muting for this camera device. This is the default
167       * mode for all camera devices.
168       *
169       * @see #setCameraAudioRestriction
170       */
171      public static final int AUDIO_RESTRICTION_NONE = 0;
172 
173      /**
174       * Mute vibration from ringtones, alarms or notifications while this camera device is in use.
175       *
176       * @see #setCameraAudioRestriction
177       */
178      public static final int AUDIO_RESTRICTION_VIBRATION = 1;
179 
180      /**
181       * Mute vibration and sound from ringtones, alarms or notifications while this camera device is
182       * in use.
183       *
184       * @see #setCameraAudioRestriction
185       */
186      public static final int AUDIO_RESTRICTION_VIBRATION_SOUND = 3;
187 
188      /** @hide */
189      @Retention(RetentionPolicy.SOURCE)
190      @IntDef(prefix = {"AUDIO_RESTRICTION_"}, value =
191          {AUDIO_RESTRICTION_NONE,
192           AUDIO_RESTRICTION_VIBRATION,
193           AUDIO_RESTRICTION_VIBRATION_SOUND})
194      public @interface CAMERA_AUDIO_RESTRICTION {};
195 
196     /**
197      * Get the ID of this camera device.
198      *
199      * <p>This matches the ID given to {@link CameraManager#openCamera} to instantiate this
200      * this camera device.</p>
201      *
202      * <p>This ID can be used to query the camera device's {@link
203      * CameraCharacteristics fixed properties} with {@link
204      * CameraManager#getCameraCharacteristics}.</p>
205      *
206      * <p>This method can be called even if the device has been closed or has encountered
207      * a serious error.</p>
208      *
209      * @return the ID for this camera device
210      *
211      * @see CameraManager#getCameraCharacteristics
212      * @see CameraManager#getCameraIdList
213      */
214     @NonNull
getId()215     public abstract String getId();
216 
217     /**
218      * <p>Create a new camera capture session by providing the target output set of Surfaces to the
219      * camera device.</p>
220      *
221      * @param outputs The new set of Surfaces that should be made available as
222      *                targets for captured image data.
223      * @param callback The callback to notify about the status of the new capture session.
224      * @param handler The handler on which the callback should be invoked, or {@code null} to use
225      *                the current thread's {@link android.os.Looper looper}.
226      *
227      * @throws IllegalArgumentException if the set of output Surfaces do not meet the requirements,
228      *                                  the callback is null, or the handler is null but the current
229      *                                  thread has no looper.
230      * @throws CameraAccessException if the camera device is no longer connected or has
231      *                               encountered a fatal error
232      * @throws IllegalStateException if the camera device has been closed
233      *
234      * @see CameraCaptureSession
235      * @see StreamConfigurationMap#getOutputFormats()
236      * @see StreamConfigurationMap#getOutputSizes(int)
237      * @see StreamConfigurationMap#getOutputSizes(Class)
238      * @deprecated Please use {@link
239      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
240      *      full set of configuration options available.
241      */
242     @Deprecated
createCaptureSession(@onNull List<Surface> outputs, @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)243     public abstract void createCaptureSession(@NonNull List<Surface> outputs,
244             @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)
245             throws CameraAccessException;
246 
247     /**
248      * <p>Create a new camera capture session by providing the target output set of Surfaces and
249      * its corresponding surface configuration to the camera device.</p>
250      *
251      * @see #createCaptureSession
252      * @see OutputConfiguration
253      * @deprecated Please use {@link
254      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
255      *      full set of configuration options available.
256      */
257     @Deprecated
createCaptureSessionByOutputConfigurations( List<OutputConfiguration> outputConfigurations, CameraCaptureSession.StateCallback callback, @Nullable Handler handler)258     public abstract void createCaptureSessionByOutputConfigurations(
259             List<OutputConfiguration> outputConfigurations,
260             CameraCaptureSession.StateCallback callback, @Nullable Handler handler)
261             throws CameraAccessException;
262     /**
263      * Create a new reprocessable camera capture session by providing the desired reprocessing
264      * input Surface configuration and the target output set of Surfaces to the camera device.
265      *
266      * @param inputConfig The configuration for the input {@link Surface}
267      * @param outputs The new set of Surfaces that should be made available as
268      *                targets for captured image data.
269      * @param callback The callback to notify about the status of the new capture session.
270      * @param handler The handler on which the callback should be invoked, or {@code null} to use
271      *                the current thread's {@link android.os.Looper looper}.
272      *
273      * @throws IllegalArgumentException if the input configuration is null or not supported, the set
274      *                                  of output Surfaces do not meet the requirements, the
275      *                                  callback is null, or the handler is null but the current
276      *                                  thread has no looper.
277      * @throws CameraAccessException if the camera device is no longer connected or has
278      *                               encountered a fatal error
279      * @throws IllegalStateException if the camera device has been closed
280      *
281      * @see #createCaptureSession
282      * @see CameraCaptureSession
283      * @see StreamConfigurationMap#getInputFormats
284      * @see StreamConfigurationMap#getInputSizes
285      * @see StreamConfigurationMap#getValidOutputFormatsForInput
286      * @see StreamConfigurationMap#getOutputSizes
287      * @see android.media.ImageWriter
288      * @see android.media.ImageReader
289      * @deprecated Please use {@link
290      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
291      *      full set of configuration options available.
292      */
293     @Deprecated
createReprocessableCaptureSession(@onNull InputConfiguration inputConfig, @NonNull List<Surface> outputs, @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)294     public abstract void createReprocessableCaptureSession(@NonNull InputConfiguration inputConfig,
295             @NonNull List<Surface> outputs, @NonNull CameraCaptureSession.StateCallback callback,
296             @Nullable Handler handler)
297             throws CameraAccessException;
298 
299     /**
300      * Create a new reprocessable camera capture session by providing the desired reprocessing
301      * input configuration and output {@link OutputConfiguration}
302      * to the camera device.
303      *
304      * @see #createReprocessableCaptureSession
305      * @see OutputConfiguration
306      * @deprecated Please use {@link
307      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
308      *      full set of configuration options available.
309      */
310     @Deprecated
createReprocessableCaptureSessionByConfigurations( @onNull InputConfiguration inputConfig, @NonNull List<OutputConfiguration> outputs, @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)311     public abstract void createReprocessableCaptureSessionByConfigurations(
312             @NonNull InputConfiguration inputConfig,
313             @NonNull List<OutputConfiguration> outputs,
314             @NonNull CameraCaptureSession.StateCallback callback,
315             @Nullable Handler handler)
316             throws CameraAccessException;
317 
318     /**
319      * <p>Create a new constrained high speed capture session.</p>
320      *
321      * @param outputs The new set of Surfaces that should be made available as
322      *                targets for captured high speed image data.
323      * @param callback The callback to notify about the status of the new capture session.
324      * @param handler The handler on which the callback should be invoked, or {@code null} to use
325      *                the current thread's {@link android.os.Looper looper}.
326      *
327      * @throws IllegalArgumentException if the set of output Surfaces do not meet the requirements,
328      *                                  the callback is null, or the handler is null but the current
329      *                                  thread has no looper, or the camera device doesn't support
330      *                                  high speed video capability.
331      * @throws CameraAccessException if the camera device is no longer connected or has
332      *                               encountered a fatal error
333      * @throws IllegalStateException if the camera device has been closed
334      *
335      * @see #createCaptureSession
336      * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE
337      * @see StreamConfigurationMap#getHighSpeedVideoSizes
338      * @see StreamConfigurationMap#getHighSpeedVideoFpsRangesFor
339      * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
340      * @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
341      * @see CameraCaptureSession#captureBurst
342      * @see CameraCaptureSession#setRepeatingBurst
343      * @see CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
344      * @deprecated Please use {@link
345      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
346      *      full set of configuration options available.
347      */
348     @Deprecated
createConstrainedHighSpeedCaptureSession(@onNull List<Surface> outputs, @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)349     public abstract void createConstrainedHighSpeedCaptureSession(@NonNull List<Surface> outputs,
350             @NonNull CameraCaptureSession.StateCallback callback,
351             @Nullable Handler handler)
352             throws CameraAccessException;
353 
354     /**
355      * Initialize a specific device-specific extension augmented camera capture
356      * session.
357      *
358      * <p>Extension sessions can be used to enable device-specific operation modes like
359      * {@link CameraExtensionCharacteristics#EXTENSION_NIGHT} or
360      * {@link CameraExtensionCharacteristics#EXTENSION_HDR}. These modes are less flexible than the
361      * full camera API, but enable access to more sophisticated processing algorithms that can
362      * capture multi-frame bursts to generate single output images. To query for available
363      * extensions on this device call
364      * {@link CameraExtensionCharacteristics#getSupportedExtensions()}.</p>
365      *
366      * <p>This method will also trigger the setup of the internal
367      * processing pipeline for extension augmented preview and multi-frame
368      * still capture.</p>
369      *
370      * <p>If a prior CameraCaptureSession already exists when this method is called, the previous
371      * session will no longer be able to accept new capture requests and will be closed. Any
372      * in-progress capture requests made on the prior session will be completed before it's closed.
373      * </p>
374      *
375      * <p>The CameraExtensionSession will be active until the client
376      * either calls CameraExtensionSession.close() or creates a new camera
377      * capture session. In both cases all internal resources will be
378      * released, continuous repeating requests stopped and any pending
379      * multi-frame capture requests flushed.</p>
380      *
381      * <p>Note that the CameraExtensionSession currently supports at most wo
382      * multi frame capture surface formats: ImageFormat.JPEG will be supported
383      * by all extensions and ImageFormat.YUV_420_888 may or may not be supported.
384      * Clients must query the multi-frame capture format support using
385      * {@link CameraExtensionCharacteristics#getExtensionSupportedSizes(int, int)}.
386      * For repeating requests CameraExtensionSession supports only
387      * {@link android.graphics.SurfaceTexture} as output. Clients can query the supported resolution
388      * for the repeating request output using
389      * {@link CameraExtensionCharacteristics#getExtensionSupportedSizes(int, Class)
390      * getExtensionSupportedSizes(..., Class)}.</p>
391      *
392      * <p>At the very minimum the initialization expects either one valid output
393      * surface for repeating or one valid output for high-quality single requests registered in the
394      * outputs argument of the extension configuration argument. At the maximum the initialization
395      * will accept two valid output surfaces, one for repeating and the other for single requests.
396      * Additional unsupported surfaces passed to ExtensionSessionConfiguration will cause an
397      * {@link IllegalArgumentException} to be thrown.</p>
398      *
399      * @param extensionConfiguration extension configuration
400      * @throws IllegalArgumentException If both the preview and still
401      *                                  capture surfaces are not set or invalid, or if any of the
402      *                                  registered surfaces do not meet the device-specific
403      *                                  extension requirements such as dimensions and/or
404      *                                  (output format)/(surface type), or if the extension is not
405      *                                  supported.
406      * @see CameraExtensionCharacteristics#getSupportedExtensions
407      * @see CameraExtensionCharacteristics#getExtensionSupportedSizes
408      */
createExtensionSession( @onNull ExtensionSessionConfiguration extensionConfiguration)409     public void createExtensionSession(
410             @NonNull ExtensionSessionConfiguration extensionConfiguration)
411             throws CameraAccessException {
412         throw new UnsupportedOperationException("No default implementation");
413     }
414 
415     /**
416      * Standard camera operation mode.
417      *
418      * @see #createCustomCaptureSession
419      * @hide
420      */
421     @SystemApi
422     public static final int SESSION_OPERATION_MODE_NORMAL =
423             0; // ICameraDeviceUser.NORMAL_MODE;
424 
425     /**
426      * Constrained high-speed operation mode.
427      *
428      * @see #createCustomCaptureSession
429      * @hide
430      */
431     @SystemApi
432     public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED =
433             1; // ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE;
434 
435     /**
436      * First vendor-specific operating mode
437      *
438      * @see #createCustomCaptureSession
439      * @hide
440      */
441     @SystemApi
442     public static final int SESSION_OPERATION_MODE_VENDOR_START =
443             0x8000; // ICameraDeviceUser.VENDOR_MODE_START;
444 
445     /** @hide */
446     @Retention(RetentionPolicy.SOURCE)
447     @IntDef(prefix = {"SESSION_OPERATION_MODE"}, value =
448             {SESSION_OPERATION_MODE_NORMAL,
449              SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED,
450              SESSION_OPERATION_MODE_VENDOR_START})
451     public @interface SessionOperatingMode {};
452 
453     /**
454      * Create a new camera capture session with a custom operating mode.
455      *
456      * @param inputConfig The configuration for the input {@link Surface} if a reprocessing session
457      *                is desired, or {@code null} otherwise.
458      * @param outputs The new set of {@link OutputConfiguration OutputConfigurations} that should be
459      *                made available as targets for captured image data.
460      * @param operatingMode The custom operating mode to use; a nonnegative value, either a custom
461      *                vendor value or one of the SESSION_OPERATION_MODE_* values.
462      * @param callback The callback to notify about the status of the new capture session.
463      * @param handler The handler on which the callback should be invoked, or {@code null} to use
464      *                the current thread's {@link android.os.Looper looper}.
465      *
466      * @throws IllegalArgumentException if the input configuration is null or not supported, the set
467      *                                  of output Surfaces do not meet the requirements, the
468      *                                  callback is null, or the handler is null but the current
469      *                                  thread has no looper.
470      * @throws CameraAccessException if the camera device is no longer connected or has
471      *                               encountered a fatal error
472      * @throws IllegalStateException if the camera device has been closed
473      *
474      * @see #createCaptureSession
475      * @see #createReprocessableCaptureSession
476      * @see CameraCaptureSession
477      * @see OutputConfiguration
478      * @deprecated Please use {@link
479      *      #createCaptureSession(android.hardware.camera2.params.SessionConfiguration)} for the
480      *      full set of configuration options available.
481      * @hide
482      */
483     @SystemApi
484     @Deprecated
createCustomCaptureSession( InputConfiguration inputConfig, @NonNull List<OutputConfiguration> outputs, @SessionOperatingMode int operatingMode, @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)485     public abstract void createCustomCaptureSession(
486             InputConfiguration inputConfig,
487             @NonNull List<OutputConfiguration> outputs,
488             @SessionOperatingMode int operatingMode,
489             @NonNull CameraCaptureSession.StateCallback callback,
490             @Nullable Handler handler)
491             throws CameraAccessException;
492 
493     /**
494      * <p>Create a new {@link CameraCaptureSession} using a {@link SessionConfiguration} helper
495      * object that aggregates all supported parameters.</p>
496      * <p>The active capture session determines the set of potential output Surfaces for
497      * the camera device for each capture request. A given request may use all
498      * or only some of the outputs. Once the CameraCaptureSession is created, requests can be
499      * submitted with {@link CameraCaptureSession#capture capture},
500      * {@link CameraCaptureSession#captureBurst captureBurst},
501      * {@link CameraCaptureSession#setRepeatingRequest setRepeatingRequest}, or
502      * {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}.</p>
503      *
504      * <p>Surfaces suitable for inclusion as a camera output can be created for
505      * various use cases and targets:</p>
506      *
507      * <ul>
508      *
509      * <li>For drawing to a {@link android.view.SurfaceView SurfaceView}: Once the SurfaceView's
510      *   Surface is {@link android.view.SurfaceHolder.Callback#surfaceCreated created}, set the size
511      *   of the Surface with {@link android.view.SurfaceHolder#setFixedSize} to be one of the sizes
512      *   returned by {@link StreamConfigurationMap#getOutputSizes(Class)
513      *   getOutputSizes(SurfaceHolder.class)} and then obtain the Surface by calling {@link
514      *   android.view.SurfaceHolder#getSurface}. If the size is not set by the application, it will
515      *   be rounded to the nearest supported size less than 1080p, by the camera device.</li>
516      *
517      * <li>For accessing through an OpenGL texture via a {@link android.graphics.SurfaceTexture
518      *   SurfaceTexture}: Set the size of the SurfaceTexture with {@link
519      *   android.graphics.SurfaceTexture#setDefaultBufferSize} to be one of the sizes returned by
520      *   {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(SurfaceTexture.class)}
521      *   before creating a Surface from the SurfaceTexture with {@link Surface#Surface}. If the size
522      *   is not set by the application, it will be set to be the smallest supported size less than
523      *   1080p, by the camera device.</li>
524      *
525      * <li>For recording with {@link android.media.MediaCodec}: Call
526      *   {@link android.media.MediaCodec#createInputSurface} after configuring
527      *   the media codec to use one of the sizes returned by
528      *   {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(MediaCodec.class)}
529      *   </li>
530      *
531      * <li>For recording with {@link android.media.MediaRecorder}: Call
532      *   {@link android.media.MediaRecorder#getSurface} after configuring the media recorder to use
533      *   one of the sizes returned by
534      *   {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(MediaRecorder.class)},
535      *   or configuring it to use one of the supported
536      *   {@link android.media.CamcorderProfile CamcorderProfiles}.</li>
537      *
538      * <li>For efficient YUV processing with {@link android.renderscript}:
539      *   Create a RenderScript
540      *   {@link android.renderscript.Allocation Allocation} with a supported YUV
541      *   type, the IO_INPUT flag, and one of the sizes returned by
542      *   {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(Allocation.class)},
543      *   Then obtain the Surface with
544      *   {@link android.renderscript.Allocation#getSurface}.</li>
545      *
546      * <li>For access to RAW, uncompressed YUV, or compressed JPEG data in the application: Create an
547      *   {@link android.media.ImageReader} object with one of the supported output formats given by
548      *   {@link StreamConfigurationMap#getOutputFormats()}, setting its size to one of the
549      *   corresponding supported sizes by passing the chosen output format into
550      *   {@link StreamConfigurationMap#getOutputSizes(int)}. Then obtain a
551      *   {@link android.view.Surface} from it with {@link android.media.ImageReader#getSurface()}.
552      *   If the ImageReader size is not set to a supported size, it will be rounded to a supported
553      *   size less than 1080p by the camera device.
554      *   </li>
555      *
556      * </ul>
557      *
558      * <p>The camera device will query each Surface's size and formats upon this
559      * call, so they must be set to a valid setting at this time.</p>
560      *
561      * <p>It can take several hundred milliseconds for the session's configuration to complete,
562      * since camera hardware may need to be powered on or reconfigured. Once the configuration is
563      * complete and the session is ready to actually capture data, the provided
564      * {@link CameraCaptureSession.StateCallback}'s
565      * {@link CameraCaptureSession.StateCallback#onConfigured} callback will be called.</p>
566      *
567      * <p>If a prior CameraCaptureSession already exists when this method is called, the previous
568      * session will no longer be able to accept new capture requests and will be closed. Any
569      * in-progress capture requests made on the prior session will be completed before it's closed.
570      * {@link CameraCaptureSession.StateCallback#onConfigured} for the new session may be invoked
571      * before {@link CameraCaptureSession.StateCallback#onClosed} is invoked for the prior
572      * session. Once the new session is {@link CameraCaptureSession.StateCallback#onConfigured
573      * configured}, it is able to start capturing its own requests. To minimize the transition time,
574      * the {@link CameraCaptureSession#abortCaptures} call can be used to discard the remaining
575      * requests for the prior capture session before a new one is created. Note that once the new
576      * session is created, the old one can no longer have its captures aborted.</p>
577      *
578      * <p>Using larger resolution outputs, or more outputs, can result in slower
579      * output rate from the device.</p>
580      *
581      * <p>Configuring a session with an empty or null list will close the current session, if
582      * any. This can be used to release the current session's target surfaces for another use.</p>
583      *
584      * <h3>Regular capture</h3>
585      *
586      * <p>While any of the sizes from {@link StreamConfigurationMap#getOutputSizes} can be used when
587      * a single output stream is configured, a given camera device may not be able to support all
588      * combination of sizes, formats, and targets when multiple outputs are configured at once.  The
589      * tables below list the maximum guaranteed resolutions for combinations of streams and targets,
590      * given the capabilities of the camera device. These are valid for when the
591      * {@link android.hardware.camera2.params.SessionConfiguration#setInputConfiguration
592      * input configuration} is not set and therefore no reprocessing is active.</p>
593      *
594      * <p>If an application tries to create a session using a set of targets that exceed the limits
595      * described in the below tables, one of three possibilities may occur. First, the session may
596      * be successfully created and work normally. Second, the session may be successfully created,
597      * but the camera device won't meet the frame rate guarantees as described in
598      * {@link StreamConfigurationMap#getOutputMinFrameDuration}. Or third, if the output set
599      * cannot be used at all, session creation will fail entirely, with
600      * {@link CameraCaptureSession.StateCallback#onConfigureFailed} being invoked.</p>
601      *
602      * <p>For the type column, {@code PRIV} refers to any target whose available sizes are found
603      * using {@link StreamConfigurationMap#getOutputSizes(Class)} with no direct application-visible
604      * format, {@code YUV} refers to a target Surface using the
605      * {@link android.graphics.ImageFormat#YUV_420_888} format, {@code JPEG} refers to the
606      * {@link android.graphics.ImageFormat#JPEG} format, and {@code RAW} refers to the
607      * {@link android.graphics.ImageFormat#RAW_SENSOR} format.</p>
608      *
609      * <p>For the maximum size column, {@code PREVIEW} refers to the best size match to the
610      * device's screen resolution, or to 1080p ({@code 1920x1080}), whichever is
611      * smaller. {@code RECORD} refers to the camera device's maximum supported recording resolution,
612      * as determined by {@link android.media.CamcorderProfile}. And {@code MAXIMUM} refers to the
613      * camera device's maximum output resolution for that format or target from
614      * {@link StreamConfigurationMap#getOutputSizes}.</p>
615      *
616      * <p>To use these tables, determine the number and the formats/targets of outputs needed, and
617      * find the row(s) of the table with those targets. The sizes indicate the maximum set of sizes
618      * that can be used; it is guaranteed that for those targets, the listed sizes and anything
619      * smaller from the list given by {@link StreamConfigurationMap#getOutputSizes} can be
620      * successfully used to create a session.  For example, if a row indicates that a 8 megapixel
621      * (MP) YUV_420_888 output can be used together with a 2 MP {@code PRIV} output, then a session
622      * can be created with targets {@code [8 MP YUV, 2 MP PRIV]} or targets {@code [2 MP YUV, 2 MP
623      * PRIV]}; but a session with targets {@code [8 MP YUV, 4 MP PRIV]}, targets {@code [4 MP YUV, 4
624      * MP PRIV]}, or targets {@code [8 MP PRIV, 2 MP YUV]} would not be guaranteed to work, unless
625      * some other row of the table lists such a combination.</p>
626      *
627      * <style scoped>
628      *  #rb { border-right-width: thick; }
629      * </style>
630      * <p>Legacy devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
631      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}) support at
632      * least the following stream combinations:
633      *
634      * <table>
635      * <tr><th colspan="7">LEGACY-level guaranteed configurations</th></tr>
636      * <tr> <th colspan="2" id="rb">Target 1</th> <th colspan="2" id="rb">Target 2</th>  <th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
637      * <tr> <th>Type</th><th id="rb">Max size</th> <th>Type</th><th id="rb">Max size</th> <th>Type</th><th id="rb">Max size</th></tr>
638      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>Simple preview, GPU video processing, or no-preview video recording.</td> </tr>
639      * <tr> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>No-viewfinder still image capture.</td> </tr>
640      * <tr> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>In-application video/image processing.</td> </tr>
641      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>Standard still imaging.</td> </tr>
642      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>In-app processing plus still capture.</td> </tr>
643      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td colspan="2" id="rb"></td> <td>Standard recording.</td> </tr>
644      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td colspan="2" id="rb"></td> <td>Preview plus in-app processing.</td> </tr>
645      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>Still capture plus in-app processing.</td> </tr>
646      * </table><br>
647      * </p>
648      *
649      * <p>Limited-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
650      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}) devices
651      * support at least the following stream combinations in addition to those for
652      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY} devices:
653      *
654      * <table>
655      * <tr><th colspan="7">LIMITED-level additional guaranteed configurations</th></tr>
656      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
657      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
658      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code RECORD }</td> <td colspan="2" id="rb"></td> <td>High-resolution video recording with preview.</td> </tr>
659      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code RECORD }</td> <td colspan="2" id="rb"></td> <td>High-resolution in-app video processing with preview.</td> </tr>
660      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code RECORD }</td> <td colspan="2" id="rb"></td> <td>Two-input in-app video processing.</td> </tr>
661      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code RECORD }</td> <td>{@code JPEG}</td><td id="rb">{@code RECORD }</td> <td>High-resolution recording with video snapshot.</td> </tr>
662      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code RECORD }</td> <td>{@code JPEG}</td><td id="rb">{@code RECORD }</td> <td>High-resolution in-app processing with video snapshot.</td> </tr>
663      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>Two-input in-app processing with still capture.</td> </tr>
664      * </table><br>
665      * </p>
666      *
667      * <p>FULL-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
668      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) devices
669      * support at least the following stream combinations in addition to those for
670      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
671      *
672      * <table>
673      * <tr><th colspan="7">FULL-level additional guaranteed configurations</th></tr>
674      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
675      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
676      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>Maximum-resolution GPU processing with preview.</td> </tr>
677      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>Maximum-resolution in-app processing with preview.</td> </tr>
678      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>Maximum-resolution two-input in-app processsing.</td> </tr>
679      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>Video recording with maximum-size video snapshot</td> </tr>
680      * <tr> <td>{@code YUV }</td><td id="rb">{@code 640x480}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td>Standard video recording plus maximum-resolution in-app processing.</td> </tr>
681      * <tr> <td>{@code YUV }</td><td id="rb">{@code 640x480}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td>Preview plus two-input maximum-resolution in-app processing.</td> </tr>
682      * </table><br>
683      * </p>
684      *
685      * <p>RAW-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
686      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}) devices additionally support
687      * at least the following stream combinations on both
688      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and
689      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
690      *
691      * <table>
692      * <tr><th colspan="7">RAW-capability additional guaranteed configurations</th></tr>
693      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
694      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
695      * <tr> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>No-preview DNG capture.</td> </tr>
696      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>Standard DNG capture.</td> </tr>
697      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td colspan="2" id="rb"></td> <td>In-app processing plus DNG capture.</td> </tr>
698      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td>Video recording with DNG capture.</td> </tr>
699      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td>Preview with in-app processing and DNG capture.</td> </tr>
700      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td>Two-input in-app processing plus DNG capture.</td> </tr>
701      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td>Still capture with simultaneous JPEG and DNG.</td> </tr>
702      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW }</td><td id="rb">{@code MAXIMUM}</td> <td>In-app processing with simultaneous JPEG and DNG.</td> </tr>
703      * </table><br>
704      * </p>
705      *
706      * <p>BURST-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
707      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE BURST_CAPTURE}) devices
708      * support at least the below stream combinations in addition to those for
709      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices. Note that all
710      * FULL-level devices support the BURST capability, and the below list is a strict subset of the
711      * list for FULL-level devices, so this table is only relevant for LIMITED-level devices that
712      * support the BURST_CAPTURE capability.
713      *
714      * <table>
715      * <tr><th colspan="5">BURST-capability additional guaranteed configurations</th></tr>
716      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th rowspan="2">Sample use case(s)</th> </tr>
717      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
718      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td>Maximum-resolution GPU processing with preview.</td> </tr>
719      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td>Maximum-resolution in-app processing with preview.</td> </tr>
720      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code MAXIMUM}</td> <td>Maximum-resolution two-input in-app processsing.</td> </tr>
721      * </table><br>
722      * </p>
723      *
724      * <p>LEVEL-3 ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
725      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3 LEVEL_3})
726      * support at least the following stream combinations in addition to the combinations for
727      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and for
728      * RAW capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
729      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}):
730      *
731      * <table>
732      * <tr><th colspan="11">LEVEL-3 additional guaranteed configurations</th></tr>
733      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
734      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
735      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code 640x480}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>In-app viewfinder analysis with dynamic selection of output format.</td> </tr>
736      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code 640x480}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>In-app viewfinder analysis with dynamic selection of output format.</td> </tr>
737      * </table><br>
738      * </p>
739      *
740      *<p>BACKWARD_COMPATIBLE devices capable of streaming concurrently with other devices as described by
741      * {@link android.hardware.camera2.CameraManager#getConcurrentCameraIds} have the
742      * following guaranteed streams (when streaming concurrently with other devices)</p>
743      * <p> Note: The sizes mentioned for these concurrent streams are the maximum sizes guaranteed
744      * to be supported. Sizes smaller than these, obtained by {@link StreamConfigurationMap#getOutputSizes} for a particular format, are supported as well. </p>
745      *
746      * <table>
747      * <tr><th colspan="5">Concurrent stream guaranteed configurations</th></tr>
748      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th rowspan="2">Sample use case(s)</th> </tr>
749      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
750      * <tr> <td>{@code YUV}</td><td id="rb">{@code s1440p}</td>  <td colspan="2" id="rb"></td> <td>In-app video / image processing.</td> </tr>
751      * <tr> <td>{@code PRIV}</td><td id="rb">{@code s1440p}</td>  <td colspan="2" id="rb"></td> <td>In-app viewfinder analysis.</td> </tr>
752      * <tr> <td>{@code JPEG}</td><td id="rb">{@code s1440p}</td>  <td colspan="2" id="rb"></td> <td>No viewfinder still image capture.</td> </tr>
753      * <tr> <td>{@code YUV / PRIV}</td><td id="rb">{@code s720p}</td> <td>{@code JPEG}</td><td id="rb">{@code s1440p}</td> <td> Standard still imaging.</td> </tr>
754      * <tr> <td>{@code YUV / PRIV}</td><td id="rb">{@code s720p}</td> <td>{@code YUV / PRIV }</td><td id="rb">{@code s1440p}</td> <td>In-app video / processing with preview.</td> </tr>
755      * </table><br>
756      * </p>
757      *
758      * <p> Devices which are not backwards-compatible, support a mandatory single stream of size sVGA with image format {@code DEPTH16} during concurrent operation. </p>
759      *
760      * <p> For guaranteed concurrent stream configurations:</p>
761      * <p> sVGA refers to the camera device's maximum resolution for that format from {@link StreamConfigurationMap#getOutputSizes} or
762      * VGA resolution (640X480) whichever is lower. </p>
763      * <p> s720p refers to the camera device's maximum resolution for that format from {@link StreamConfigurationMap#getOutputSizes} or
764      * 720p(1280X720) whichever is lower. </p>
765      * <p> s1440p refers to the camera device's maximum resolution for that format from {@link StreamConfigurationMap#getOutputSizes} or
766      * 1440p(1920X1440) whichever is lower. </p>
767      * <p>MONOCHROME-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES}
768      * includes {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME MONOCHROME}) devices
769      * supporting {@link android.graphics.ImageFormat#Y8 Y8} support substituting {@code YUV}
770      * streams with {@code Y8} in all guaranteed stream combinations for the device's hardware level
771      * and capabilities.</p>
772      *
773      * <p>Clients can access the above mandatory stream combination tables via
774      * {@link android.hardware.camera2.params.MandatoryStreamCombination}.</p>
775      *
776      * <p>Devices capable of outputting HEIC formats ({@link StreamConfigurationMap#getOutputFormats}
777      * contains {@link android.graphics.ImageFormat#HEIC}) will support substituting {@code JPEG}
778      * streams with {@code HEIC} in all guaranteed stream combinations for the device's hardware
779      * level and capabilities. Calling createCaptureSession with both JPEG and HEIC outputs is not
780      * supported.</p>
781      *
782      * <p>Devices capable of multi-resolution output for a particular format (
783      * {@link android.hardware.camera2.params.MultiResolutionStreamConfigurationMap#getOutputInfo}
784      * returns a non-empty list) support using {@link MultiResolutionImageReader} for MAXIMUM
785      * resolution streams of that format for all mandatory stream combinations. For example,
786      * if a LIMITED camera device supports multi-resolution output streams for both {@code JPEG} and
787      * {@code PRIVATE}, in addition to the stream configurations
788      * in the LIMITED and Legacy table above, the camera device supports the following guaranteed
789      * stream combinations ({@code MULTI_RES} in the Max size column refers to a {@link
790      * MultiResolutionImageReader} created based on the variable max resolutions supported):
791      *
792      * <table>
793      * <tr><th colspan="7">LEGACY-level additional guaranteed combinations with MultiResolutionoutputs</th></tr>
794      * <tr> <th colspan="2" id="rb">Target 1</th> <th colspan="2" id="rb">Target 2</th>  <th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
795      * <tr> <th>Type</th><th id="rb">Max size</th> <th>Type</th><th id="rb">Max size</th> <th>Type</th><th id="rb">Max size</th></tr>
796      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MULTI_RES}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>Simple preview, GPU video processing, or no-preview video recording.</td> </tr>
797      * <tr> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td colspan="2" id="rb"></td> <td colspan="2" id="rb"></td> <td>No-viewfinder still image capture.</td> </tr>
798      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td colspan="2" id="rb"></td> <td>Standard still imaging.</td> </tr>
799      * <tr> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td>Still capture plus in-app processing.</td> </tr>
800      * </table><br>
801      * <table>
802      * <tr><th colspan="7">LIMITED-level additional guaranteed configurations with MultiResolutionoutputs</th></tr>
803      * <tr><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
804      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
805      * <tr> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV }</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td>Two-input in-app processing with still capture.</td> </tr>
806      * </table><br>
807      * The same logic applies to other hardware levels and capabilities.
808      * </p>
809      *
810      * <p> Devices with the ULTRA_HIGH_RESOLUTION_SENSOR capability have some additional guarantees
811      * which clients can take advantage of : </p>
812      * <table>
813      * <tr><th colspan="10">Additional guaranteed combinations for ULTRA_HIGH_RESOLUTION sensors</th></tr>
814      * <tr> <th colspan="3" id="rb">Target 1</th> <th colspan="3" id="rb">Target 2</th>  <th colspan="3" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
815      * <tr> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th></tr>
816      * <tr> <td>{@code YUV / JPEG / RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code PRIV / YUV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td colspan="3" id="rb"></td> <td>Ultra high res still image capture with preview</td> </tr>
817      * <tr> <td>{@code YUV / JPEG / RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code PRIV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td id="rb">{@code PRIV / YUV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code RECORD}</td> <td>Ultra high res still capture with preview + app based RECORD size analysis</td> </tr>
818      * <tr> <td>{@code YUV / JPEG / RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code PRIV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td id="rb">{@code JPEG / YUV / RAW}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code MAX}</td> <td>Ultra high res still image capture with preview + default sensor pixel mode analysis stream</td> </tr>
819      * </table><br>
820      *
821      * <p> Here, SC Map, refers to the {@link StreamConfigurationMap}, the target stream sizes must
822      * be chosen from. {@code DEFAULT} refers to the default sensor pixel mode {@link
823      * StreamConfigurationMap} and {@code MAX_RES} refers to the maximum resolution {@link
824      * StreamConfigurationMap}. The same capture request must not mix targets from
825      * {@link StreamConfigurationMap}s corresponding to different sensor pixel modes.
826      *
827      * <p>Since the capabilities of camera devices vary greatly, a given camera device may support
828      * target combinations with sizes outside of these guarantees, but this can only be tested for
829      * by calling {@link #isSessionConfigurationSupported} or attempting to create a session with
830      * such targets.</p>
831      *
832      * <p>Exception on 176x144 (QCIF) resolution:
833      * Camera devices usually have a fixed capability for downscaling from larger resolution to
834      * smaller, and the QCIF resolution sometimes is not fully supported due to this
835      * limitation on devices with high-resolution image sensors. Therefore, trying to configure a
836      * QCIF resolution stream together with any other stream larger than 1920x1080 resolution
837      * (either width or height) might not be supported, and capture session creation will fail if it
838      * is not.</p>
839      *
840      * <h3>Reprocessing</h3>
841      *
842      * <p>If a camera device supports YUV reprocessing
843      * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING}) or PRIVATE
844      * reprocessing
845      * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING}), the
846      * application can also create a reprocessable capture session to submit reprocess capture
847      * requests in addition to regular capture requests, by setting an
848      * {@link android.hardware.camera2.params.SessionConfiguration#setInputConfiguration
849      * input configuration} for the session. A reprocess capture request takes the next available
850      * buffer from the
851      * session's input Surface, and sends it through the camera device's processing pipeline again,
852      * to produce buffers for the request's target output Surfaces. No new image data is captured
853      * for a reprocess request. However the input buffer provided by the application must be
854      * captured previously by the same camera device in the same session directly (e.g. for
855      * Zero-Shutter-Lag use case) or indirectly (e.g. combining multiple output images).</p>
856      *
857      * <p>The active reprocessable capture session determines an input {@link Surface} and the set
858      * of potential output Surfaces for the camera devices for each capture request. The application
859      * can use {@link #createCaptureRequest createCaptureRequest} to create regular capture requests
860      * to capture new images from the camera device, and use {@link #createReprocessCaptureRequest
861      * createReprocessCaptureRequest} to create reprocess capture requests to process buffers from
862      * the input {@link Surface}. Some combinations of output Surfaces in a session may not be used
863      * in a request simultaneously. The guaranteed combinations of output Surfaces that can be used
864      * in a request simultaneously are listed in the tables under {@link #createCaptureSession
865      * createCaptureSession}. All the output Surfaces in one capture request will come from the
866      * same source, either from a new capture by the camera device, or from the input Surface
867      * depending on if the request is a reprocess capture request.</p>
868      *
869      * <p>Input formats and sizes supported by the camera device can be queried via
870      * {@link StreamConfigurationMap#getInputFormats} and
871      * {@link StreamConfigurationMap#getInputSizes}. For each supported input format, the camera
872      * device supports a set of output formats and sizes for reprocessing that can be queried via
873      * {@link StreamConfigurationMap#getValidOutputFormatsForInput} and
874      * {@link StreamConfigurationMap#getOutputSizes}. While output Surfaces with formats that
875      * aren't valid reprocess output targets for the input configuration can be part of a session,
876      * they cannot be used as targets for a reprocessing request.</p>
877      *
878      * <p>Since the application cannot access {@link android.graphics.ImageFormat#PRIVATE} images
879      * directly, an output Surface created by {@link android.media.ImageReader#newInstance} with
880      * {@link android.graphics.ImageFormat#PRIVATE} as the format will be considered as intended to
881      * be used for reprocessing input and thus the {@link android.media.ImageReader} size must
882      * match one of the supported input sizes for {@link android.graphics.ImageFormat#PRIVATE}
883      * format. Otherwise, creating a reprocessable capture session will fail.</p>
884      *
885      * <p>Starting from API level 30, recreating a reprocessable capture session will flush all the
886      * queued but not yet processed buffers from the input surface.</p>
887      *
888      * <p>The configurations in the tables below are guaranteed for creating a reprocessable
889      * capture session if the camera device supports YUV reprocessing or PRIVATE reprocessing.
890      * However, not all output targets used to create a reprocessable session may be used in a
891      * {@link CaptureRequest} simultaneously. For devices that support only 1 output target in a
892      * reprocess {@link CaptureRequest}, submitting a reprocess {@link CaptureRequest} with multiple
893      * output targets will result in a {@link CaptureFailure}. For devices that support multiple
894      * output targets in a reprocess {@link CaptureRequest}, the guaranteed output targets that can
895      * be included in a {@link CaptureRequest} simultaneously are listed in the tables under
896      * {@link #createCaptureSession createCaptureSession}. For example, with a FULL-capability
897      * ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} {@code == }
898      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) device that supports PRIVATE
899      * reprocessing, an application can create a reprocessable capture session with 1 input,
900      * ({@code PRIV}, {@code MAXIMUM}), and 3 outputs, ({@code PRIV}, {@code MAXIMUM}),
901      * ({@code PRIV}, {@code PREVIEW}), and ({@code YUV}, {@code MAXIMUM}). However, it's not
902      * guaranteed that an application can submit a regular or reprocess capture with ({@code PRIV},
903      * {@code MAXIMUM}) and ({@code YUV}, {@code MAXIMUM}) outputs based on the table listed under
904      * {@link #createCaptureSession createCaptureSession}. In other words, use the tables below to
905      * determine the guaranteed stream configurations for creating a reprocessable capture session,
906      * and use the tables under {@link #createCaptureSession createCaptureSession} to determine the
907      * guaranteed output targets that can be submitted in a regular or reprocess
908      * {@link CaptureRequest} simultaneously.</p>
909      *
910      * <style scoped>
911      *  #rb { border-right-width: thick; }
912      * </style>
913      *
914      * <p>LIMITED-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
915      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}) devices
916      * support at least the following stream combinations for creating a reprocessable capture
917      * session in addition to those listed earlier for regular captures for
918      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
919      *
920      * <table>
921      * <tr><th colspan="11">LIMITED-level additional guaranteed configurations for creating a reprocessable capture session<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is guaranteed only if YUV reprocessing is supported)</th></tr>
922      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
923      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
924      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td></td><td id="rb"></td> <td>No-viewfinder still image reprocessing.</td> </tr>
925      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>ZSL(Zero-Shutter-Lag) still imaging.</td> </tr>
926      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>ZSL still and in-app processing imaging.</td> </tr>
927      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>ZSL in-app processing with still capture.</td> </tr>
928      * </table><br>
929      * </p>
930      *
931      * <p>FULL-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
932      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) devices
933      * support at least the following stream combinations for creating a reprocessable capture
934      * session in addition to those for
935      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
936      *
937      * <table>
938      * <tr><th colspan="11">FULL-level additional guaranteed configurations for creating a reprocessable capture session<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is guaranteed only if YUV reprocessing is supported)</th></tr>
939      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
940      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
941      * <tr> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td></td><td id="rb"></td> <td></td><td id="rb"></td> <td>Maximum-resolution multi-frame image fusion in-app processing with regular preview.</td> </tr>
942      * <tr> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td></td><td id="rb"></td> <td></td><td id="rb"></td> <td>Maximum-resolution multi-frame image fusion two-input in-app processing.</td> </tr>
943      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code RECORD}</td> <td></td><td id="rb"></td> <td>High-resolution ZSL in-app video processing with regular preview.</td> </tr>
944      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>Maximum-resolution ZSL in-app processing with regular preview.</td> </tr>
945      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>Maximum-resolution two-input ZSL in-app processing.</td> </tr>
946      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>ZSL still capture and in-app processing.</td> </tr>
947      * </table><br>
948      * </p>
949      *
950      * <p>RAW-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
951      * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}) devices additionally support
952      * at least the following stream combinations for creating a reprocessable capture session
953      * on both {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and
954      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices
955      *
956      * <table>
957      * <tr><th colspan="11">RAW-capability additional guaranteed configurations for creating a reprocessable capture session<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is guaranteed only if YUV reprocessing is supported)</th></tr>
958      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
959      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
960      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>Mutually exclusive ZSL in-app processing and DNG capture.</td> </tr>
961      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>Mutually exclusive ZSL in-app processing and preview with DNG capture.</td> </tr>
962      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>Mutually exclusive ZSL two-input in-app processing and DNG capture.</td> </tr>
963      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>Mutually exclusive ZSL still capture and preview with DNG capture.</td> </tr>
964      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>Mutually exclusive ZSL in-app processing with still capture and DNG capture.</td> </tr>
965      * </table><br>
966      * </p>
967      *
968      * <p>LEVEL-3 ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
969      * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3 LEVEL_3}) devices
970      * support at least the following stream combinations for creating a reprocessable capture
971      * session in addition to those for
972      * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} devices. Note that while
973      * the second configuration allows for configuring {@code MAXIMUM} {@code YUV} and {@code JPEG}
974      * outputs at the same time, that configuration is not listed for regular capture sessions, and
975      * therefore simultaneous output to both targets is not allowed.
976      *
977      * <table>
978      * <tr><th colspan="13">LEVEL-3 additional guaranteed configurations for creating a reprocessable capture session<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is always guaranteed.</th></tr>
979      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th colspan="2" id="rb">Target 5</th><th rowspan="2">Sample use case(s)</th> </tr>
980      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
981      * <tr> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code 640x480}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td></td><td id="rb"></td> <td>In-app viewfinder analysis with ZSL and RAW.</td> </tr>
982      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MAXIMUM}</td> <td>Same as input</td><td id="rb">{@code MAXIMUM}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code PRIV}</td><td id="rb">{@code 640x480}</td> <td>{@code RAW}</td><td id="rb">{@code MAXIMUM}</td> <td>{@code JPEG}</td><td id="rb">{@code MAXIMUM}</td><td>In-app viewfinder analysis with ZSL, RAW, and JPEG reprocessing output.</td> </tr>
983      * </table><br>
984      * </p>
985      *
986      * <p>If a camera device supports multi-resolution {@code YUV} input and multi-resolution
987      * {@code YUV} output or supports multi-resolution {@code PRIVATE} input and multi-resolution
988      * {@code PRIVATE} output, the additional mandatory stream combinations for LIMITED and FULL devices are listed
989      * below ({@code MULTI_RES} in the Max size column refers to a
990      * {@link MultiResolutionImageReader} for output, and a multi-resolution
991      * {@link InputConfiguration} for input):
992      * <table>
993      * <tr><th colspan="11">LIMITED-level additional guaranteed configurations for creating a reprocessable capture session with multi-resolution input and multi-resolution outputs<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is guaranteed only if YUV reprocessing is supported)</th></tr>
994      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
995      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
996      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td>Same as input</td><td id="rb">{@code MULTI_RES}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td></td><td id="rb"></td> <td></td><td id="rb"></td> <td>No-viewfinder still image reprocessing.</td> </tr>
997      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td>Same as input</td><td id="rb">{@code MULTI_RES}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td></td><td id="rb"></td> <td>ZSL(Zero-Shutter-Lag) still imaging.</td> </tr>
998      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td>Same as input</td><td id="rb">{@code MULTI_RES}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td></td><td id="rb"></td> <td>ZSL still and in-app processing imaging.</td> </tr>
999      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td>Same as input</td><td id="rb">{@code MULTI_RES}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td>ZSL in-app processing with still capture.</td> </tr>
1000      * </table><br>
1001      * <table>
1002      * <tr><th colspan="11">FULL-level additional guaranteed configurations for creating a reprocessable capture session with multi-resolution input and multi-resolution outputs<br>({@code PRIV} input is guaranteed only if PRIVATE reprocessing is supported. {@code YUV} input is guaranteed only if YUV reprocessing is supported)</th></tr>
1003      * <tr><th colspan="2" id="rb">Input</th><th colspan="2" id="rb">Target 1</th><th colspan="2" id="rb">Target 2</th><th colspan="2" id="rb">Target 3</th><th colspan="2" id="rb">Target 4</th><th rowspan="2">Sample use case(s)</th> </tr>
1004      * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th></tr>
1005      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MULTI_RES}</td> <td>{@code PRIV}</td><td id="rb">{@code MULTI_RES}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td></td><td id="rb"></td> <td>Maximum-resolution ZSL in-app processing with regular preview.</td> </tr>
1006      * <tr> <td>{@code PRIV}</td><td id="rb">{@code MULTI_RES}</td> <td>{@code PRIV}</td><td id="rb">{@code MULTI_RES}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td></td><td id="rb"></td> <td>Maximum-resolution two-input ZSL in-app processing.</td> </tr>
1007      * <tr> <td>{@code PRIV}/{@code YUV}</td><td id="rb">{@code MULTI_RES}</td> <td>Same as input</td><td id="rb">{@code MULTI_RES}</td> <td>{@code PRIV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code YUV}</td><td id="rb">{@code PREVIEW}</td> <td>{@code JPEG}</td><td id="rb">{@code MULTI_RES}</td> <td>ZSL still capture and in-app processing.</td> </tr>
1008      * </table><br>
1009      * <p> Devices with the ULTRA_HIGH_RESOLUTION_SENSOR capability have some additional guarantees
1010      * which clients can take advantage of : </p>
1011      * <table>
1012      * <tr><th colspan="13">Additional guaranteed combinations for ULTRA_HIGH_RESOLUTION sensors (YUV / PRIV inputs are guaranteed only if YUV / PRIVATE reprocessing are supported)</th></tr>
1013      * <tr> <th colspan="3" id="rb">Input</th> <th colspan="3" id="rb">Target 1</th> <th colspan="3" id="rb">Target 2</th>  <th colspan="3" id="rb">Target 3</th> <th rowspan="2">Sample use case(s)</th> </tr>
1014      * <tr> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th><th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th> <th>Type</th><th id="rb"> SC Map</th><th id="rb">Max size</th></tr>
1015      * <tr> <td>{@code RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td>{@code RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code PRIV / YUV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td colspan="3" id="rb"></td> <td>RAW remosaic reprocessing with seperate preview</td> </tr>
1016      * <tr> <td>{@code RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td>{@code RAW}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code PRIV / YUV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td id="rb">{@code JPEG / YUV}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td> <td>Ultra high res RAW -> JPEG / YUV with seperate preview</td> </tr>
1017      * <tr> <td>{@code YUV / PRIV}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td> <td>{@code YUV / PRIV}</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td><td id="rb">{@code YUV / PRIV}</td><td id="rb">{@code DEFAULT}</td><td id="rb">{@code PREVIEW}</td><td id="rb">{@code JPEG }</td><td id="rb">{@code MAX_RES}</td><td id="rb">{@code MAX}</td> <td> Ultra high res PRIV / YUV -> YUV / JPEG reprocessing with seperate preview</td> </tr>
1018      * </table><br>
1019      * No additional mandatory stream combinations for RAW capability and LEVEL-3 hardware level.
1020      * </p>
1021      *
1022      * <h3>Constrained high-speed recording</h3>
1023      *
1024      * <p>The application can use a
1025      * {@link android.hardware.camera2.params.SessionConfiguration#SESSION_REGULAR
1026      * normal capture session}
1027      * for high speed capture if the desired high speed FPS ranges are advertised by
1028      * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES}, in which case all API
1029      * semantics associated with normal capture sessions applies.</p>
1030      *
1031      * <p>A
1032      * {@link android.hardware.camera2.params.SessionConfiguration#SESSION_HIGH_SPEED
1033      * high-speed capture session}
1034      * can be use for high speed video recording (>=120fps) when the camera device supports high
1035      * speed video capability (i.e., {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES}
1036      * contains {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO}).
1037      * A constrained high-speed capture session has special limitations compared with a normal
1038      * capture session:</p>
1039      *
1040      * <ul>
1041      *
1042      * <li>In addition to the output target Surface requirements specified above for regular
1043      *   captures, a high speed capture session will only support up to 2 output Surfaces, though
1044      *   the application might choose to configure just one Surface (e.g., preview only). All
1045      *   Surfaces must be either video encoder surfaces (acquired by
1046      *   {@link android.media.MediaRecorder#getSurface} or
1047      *   {@link android.media.MediaCodec#createInputSurface}) or preview surfaces (obtained from
1048      *   {@link android.view.SurfaceView}, {@link android.graphics.SurfaceTexture} via
1049      *   {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}). The Surface sizes
1050      *   must be one of the sizes reported by {@link StreamConfigurationMap#getHighSpeedVideoSizes}.
1051      *   When multiple Surfaces are configured, their size must be same.</li>
1052      *
1053      * <li>An active high speed capture session only accepts request lists created via
1054      *   {@link CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}, and the
1055      *   request list can only be submitted to this session via
1056      *   {@link CameraCaptureSession#captureBurst captureBurst}, or
1057      *   {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}.</li>
1058      *
1059      * <li>The FPS ranges being requested to this session must be selected from
1060      *   {@link StreamConfigurationMap#getHighSpeedVideoFpsRangesFor}. The application can still use
1061      *   {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE} to control the desired FPS range.
1062      *   Switching to an FPS range that has different
1063      *   {@link android.util.Range#getUpper() maximum FPS} may trigger some camera device
1064      *   reconfigurations, which may introduce extra latency. It is recommended that the
1065      *   application avoids unnecessary maximum target FPS changes as much as possible during high
1066      *   speed streaming.</li>
1067      *
1068      * <li>For the request lists submitted to this session, the camera device will override the
1069      *   {@link CaptureRequest#CONTROL_MODE control mode}, auto-exposure (AE), auto-white balance
1070      *   (AWB) and auto-focus (AF) to {@link CameraMetadata#CONTROL_MODE_AUTO},
1071      *   {@link CameraMetadata#CONTROL_AE_MODE_ON}, {@link CameraMetadata#CONTROL_AWB_MODE_AUTO}
1072      *   and {@link CameraMetadata#CONTROL_AF_MODE_CONTINUOUS_VIDEO}, respectively. All
1073      *   post-processing block mode controls will be overridden to be FAST. Therefore, no manual
1074      *   control of capture and post-processing parameters is possible. Beside these, only a subset
1075      *   of controls will work, see
1076      *   {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO} for
1077      *   more details.</li>
1078      *
1079      * </ul>
1080      *
1081      *
1082      * @param config A session configuration (see {@link SessionConfiguration}).
1083      *
1084      * @throws IllegalArgumentException In case the session configuration is invalid; or the output
1085      *                                  configurations are empty; or the session configuration
1086      *                                  executor is invalid.
1087      * @throws CameraAccessException In case the camera device is no longer connected or has
1088      *                               encountered a fatal error.
1089      * @see #createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)
1090      * @see #createCaptureSessionByOutputConfigurations
1091      * @see #createReprocessableCaptureSession
1092      * @see #createConstrainedHighSpeedCaptureSession
1093      */
createCaptureSession( SessionConfiguration config)1094     public void createCaptureSession(
1095             SessionConfiguration config) throws CameraAccessException {
1096         throw new UnsupportedOperationException("No default implementation");
1097     }
1098 
1099     /**
1100      * <p>Create a {@link CaptureRequest.Builder} for new capture requests,
1101      * initialized with template for a target use case. The settings are chosen
1102      * to be the best options for the specific camera device, so it is not
1103      * recommended to reuse the same request for a different camera device;
1104      * create a builder specific for that device and template and override the
1105      * settings as desired, instead.</p>
1106      *
1107      * @param templateType An enumeration selecting the use case for this request. Not all template
1108      * types are supported on every device. See the documentation for each template type for
1109      * details.
1110      * @return a builder for a capture request, initialized with default
1111      * settings for that template, and no output streams
1112      *
1113      * @throws IllegalArgumentException if the templateType is not supported by
1114      * this device.
1115      * @throws CameraAccessException if the camera device is no longer connected or has
1116      *                               encountered a fatal error
1117      * @throws IllegalStateException if the camera device has been closed
1118      */
1119     @NonNull
createCaptureRequest(@equestTemplate int templateType)1120     public abstract CaptureRequest.Builder createCaptureRequest(@RequestTemplate int templateType)
1121             throws CameraAccessException;
1122 
1123     /**
1124      * <p>Create a {@link CaptureRequest.Builder} for new capture requests,
1125      * initialized with template for a target use case. This methods allows
1126      * clients to pass physical camera ids which can be used to customize the
1127      * request for a specific physical camera. The settings are chosen
1128      * to be the best options for the specific logical camera device. If
1129      * additional physical camera ids are passed, then they will also use the
1130      * same settings template. Clients can further modify individual camera
1131      * settings by calling {@link CaptureRequest.Builder#setPhysicalCameraKey}.</p>
1132      *
1133      * <p>Individual physical camera settings will only be honored for camera session
1134      * that was initialiazed with corresponding physical camera id output configuration
1135      * {@link OutputConfiguration#setPhysicalCameraId} and the same output targets are
1136      * also attached in the request by {@link CaptureRequest.Builder#addTarget}.</p>
1137      *
1138      * <p>The output is undefined for any logical camera streams in case valid physical camera
1139      * settings are attached.</p>
1140      *
1141      * @param templateType An enumeration selecting the use case for this request. Not all template
1142      * types are supported on every device. See the documentation for each template type for
1143      * details.
1144      * @param physicalCameraIdSet A set of physical camera ids that can be used to customize
1145      *                            the request for a specific physical camera.
1146      * @return a builder for a capture request, initialized with default
1147      * settings for that template, and no output streams
1148      *
1149      * @throws IllegalArgumentException if the templateType is not supported by
1150      * this device, or one of the physical id arguments matches with logical camera id.
1151      * @throws CameraAccessException if the camera device is no longer connected or has
1152      *                               encountered a fatal error
1153      * @throws IllegalStateException if the camera device has been closed
1154      *
1155      * @see #TEMPLATE_PREVIEW
1156      * @see #TEMPLATE_RECORD
1157      * @see #TEMPLATE_STILL_CAPTURE
1158      * @see #TEMPLATE_VIDEO_SNAPSHOT
1159      * @see #TEMPLATE_MANUAL
1160      * @see CaptureRequest.Builder#setPhysicalCameraKey
1161      * @see CaptureRequest.Builder#getPhysicalCameraKey
1162      */
1163     @NonNull
createCaptureRequest(@equestTemplate int templateType, Set<String> physicalCameraIdSet)1164     public CaptureRequest.Builder createCaptureRequest(@RequestTemplate int templateType,
1165             Set<String> physicalCameraIdSet) throws CameraAccessException {
1166         throw new UnsupportedOperationException("Subclasses must override this method");
1167     }
1168 
1169     /**
1170      * <p>Create a {@link CaptureRequest.Builder} for a new reprocess {@link CaptureRequest} from a
1171      * {@link TotalCaptureResult}.
1172      *
1173      * <p>Each reprocess {@link CaptureRequest} processes one buffer from
1174      * {@link CameraCaptureSession}'s input {@link Surface} to all output {@link Surface Surfaces}
1175      * included in the reprocess capture request. The reprocess input images must be generated from
1176      * one or multiple output images captured from the same camera device. The application can
1177      * provide input images to camera device via {@link android.media.ImageWriter#queueInputImage}.
1178      * The application must use the capture result of one of those output images to create a
1179      * reprocess capture request so that the camera device can use the information to achieve
1180      * optimal reprocess image quality. For camera devices that support only 1 output
1181      * {@link Surface}, submitting a reprocess {@link CaptureRequest} with multiple
1182      * output targets will result in a {@link CaptureFailure}.
1183      *
1184      * @param inputResult The capture result of the output image or one of the output images used
1185      *                       to generate the reprocess input image for this capture request.
1186      *
1187      * @throws IllegalArgumentException if inputResult is null.
1188      * @throws CameraAccessException if the camera device is no longer connected or has
1189      *                               encountered a fatal error
1190      * @throws IllegalStateException if the camera device has been closed
1191      *
1192      * @see CaptureRequest.Builder
1193      * @see TotalCaptureResult
1194      * @see CameraDevice#createCaptureSession(android.hardware.camera2.params.SessionConfiguration)
1195      * @see android.media.ImageWriter
1196      */
1197     @NonNull
createReprocessCaptureRequest( @onNull TotalCaptureResult inputResult)1198     public abstract CaptureRequest.Builder createReprocessCaptureRequest(
1199             @NonNull TotalCaptureResult inputResult) throws CameraAccessException;
1200 
1201     /**
1202      * Close the connection to this camera device as quickly as possible.
1203      *
1204      * <p>Immediately after this call, all calls to the camera device or active session interface
1205      * will throw a {@link IllegalStateException}, except for calls to close(). Once the device has
1206      * fully shut down, the {@link StateCallback#onClosed} callback will be called, and the camera
1207      * is free to be re-opened.</p>
1208      *
1209      * <p>Immediately after this call, besides the final {@link StateCallback#onClosed} calls, no
1210      * further callbacks from the device or the active session will occur, and any remaining
1211      * submitted capture requests will be discarded, as if
1212      * {@link CameraCaptureSession#abortCaptures} had been called, except that no success or failure
1213      * callbacks will be invoked.</p>
1214      *
1215      */
1216     @Override
close()1217     public abstract void close();
1218 
1219     /**
1220      * Checks whether a particular {@link SessionConfiguration} is supported by the camera device.
1221      *
1222      * <p>This method performs a runtime check of a given {@link SessionConfiguration}. The result
1223      * confirms whether or not the passed session configuration can be successfully used to
1224      * create a camera capture session using
1225      * {@link CameraDevice#createCaptureSession(
1226      * android.hardware.camera2.params.SessionConfiguration)}.
1227      * </p>
1228      *
1229      * <p>The method can be called at any point before, during and after active capture session.
1230      * It must not impact normal camera behavior in any way and must complete significantly
1231      * faster than creating a regular or constrained capture session.</p>
1232      *
1233      * <p>Although this method is faster than creating a new capture session, it is not intended
1234      * to be used for exploring the entire space of supported stream combinations. The available
1235      * mandatory stream combinations
1236      * {@link android.hardware.camera2.params.MandatoryStreamCombination} are better suited for this
1237      * purpose.</p>
1238      *
1239      * <p>Note that session parameters will be ignored and calls to
1240      * {@link SessionConfiguration#setSessionParameters} are not required.</p>
1241      *
1242      * @return {@code true} if the given session configuration is supported by the camera device
1243      *         {@code false} otherwise.
1244      * @throws UnsupportedOperationException if the query operation is not supported by the camera
1245      *                                       device
1246      * @throws IllegalArgumentException if the session configuration is invalid
1247      * @throws CameraAccessException if the camera device is no longer connected or has
1248      *                               encountered a fatal error
1249      * @throws IllegalStateException if the camera device has been closed
1250      */
isSessionConfigurationSupported( @onNull SessionConfiguration sessionConfig)1251     public boolean isSessionConfigurationSupported(
1252             @NonNull SessionConfiguration sessionConfig) throws CameraAccessException {
1253         throw new UnsupportedOperationException("Subclasses must override this method");
1254     }
1255 
1256     /**
1257      * A callback objects for receiving updates about the state of a camera device.
1258      *
1259      * <p>A callback instance must be provided to the {@link CameraManager#openCamera} method to
1260      * open a camera device.</p>
1261      *
1262      * <p>These state updates include notifications about the device completing startup (
1263      * allowing for {@link #createCaptureSession} to be called), about device
1264      * disconnection or closure, and about unexpected device errors.</p>
1265      *
1266      * <p>Events about the progress of specific {@link CaptureRequest CaptureRequests} are provided
1267      * through a {@link CameraCaptureSession.CaptureCallback} given to the
1268      * {@link CameraCaptureSession#capture}, {@link CameraCaptureSession#captureBurst},
1269      * {@link CameraCaptureSession#setRepeatingRequest}, or
1270      * {@link CameraCaptureSession#setRepeatingBurst} methods.
1271      *
1272      * @see CameraManager#openCamera
1273      */
1274     public static abstract class StateCallback {
1275        /**
1276          * An error code that can be reported by {@link #onError}
1277          * indicating that the camera device is in use already.
1278          *
1279          * <p>
1280          * This error can be produced when opening the camera fails due to the camera
1281         *  being used by a higher-priority camera API client.
1282          * </p>
1283          *
1284          * @see #onError
1285          */
1286         public static final int ERROR_CAMERA_IN_USE = 1;
1287 
1288         /**
1289          * An error code that can be reported by {@link #onError}
1290          * indicating that the camera device could not be opened
1291          * because there are too many other open camera devices.
1292          *
1293          * <p>
1294          * The system-wide limit for number of open cameras has been reached,
1295          * and more camera devices cannot be opened until previous instances are
1296          * closed.
1297          * </p>
1298          *
1299          * <p>
1300          * This error can be produced when opening the camera fails.
1301          * </p>
1302          *
1303          * @see #onError
1304          */
1305         public static final int ERROR_MAX_CAMERAS_IN_USE = 2;
1306 
1307         /**
1308          * An error code that can be reported by {@link #onError}
1309          * indicating that the camera device could not be opened due to a device
1310          * policy.
1311          *
1312          * @see android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName, boolean)
1313          * @see #onError
1314          */
1315         public static final int ERROR_CAMERA_DISABLED = 3;
1316 
1317        /**
1318          * An error code that can be reported by {@link #onError}
1319          * indicating that the camera device has encountered a fatal error.
1320          *
1321          * <p>The camera device needs to be re-opened to be used again.</p>
1322          *
1323          * @see #onError
1324          */
1325         public static final int ERROR_CAMERA_DEVICE = 4;
1326 
1327         /**
1328          * An error code that can be reported by {@link #onError}
1329          * indicating that the camera service has encountered a fatal error.
1330          *
1331          * <p>The Android device may need to be shut down and restarted to restore
1332          * camera function, or there may be a persistent hardware problem.</p>
1333          *
1334          * <p>An attempt at recovery <i>may</i> be possible by closing the
1335          * CameraDevice and the CameraManager, and trying to acquire all resources
1336          * again from scratch.</p>
1337          *
1338          * @see #onError
1339          */
1340         public static final int ERROR_CAMERA_SERVICE = 5;
1341 
1342         /** @hide */
1343         @Retention(RetentionPolicy.SOURCE)
1344         @IntDef(prefix = {"ERROR_"}, value =
1345             {ERROR_CAMERA_IN_USE,
1346              ERROR_MAX_CAMERAS_IN_USE,
1347              ERROR_CAMERA_DISABLED,
1348              ERROR_CAMERA_DEVICE,
1349              ERROR_CAMERA_SERVICE })
1350         public @interface ErrorCode {};
1351 
1352         /**
1353          * The method called when a camera device has finished opening.
1354          *
1355          * <p>At this point, the camera device is ready to use, and
1356          * {@link CameraDevice#createCaptureSession} can be called to set up the first capture
1357          * session.</p>
1358          *
1359          * @param camera the camera device that has become opened
1360          */
onOpened(@onNull CameraDevice camera)1361         public abstract void onOpened(@NonNull CameraDevice camera); // Must implement
1362 
1363         /**
1364          * The method called when a camera device has been closed with
1365          * {@link CameraDevice#close}.
1366          *
1367          * <p>Any attempt to call methods on this CameraDevice in the
1368          * future will throw a {@link IllegalStateException}.</p>
1369          *
1370          * <p>The default implementation of this method does nothing.</p>
1371          *
1372          * @param camera the camera device that has become closed
1373          */
onClosed(@onNull CameraDevice camera)1374         public void onClosed(@NonNull CameraDevice camera) {
1375             // Default empty implementation
1376         }
1377 
1378         /**
1379          * The method called when a camera device is no longer available for
1380          * use.
1381          *
1382          * <p>This callback may be called instead of {@link #onOpened}
1383          * if opening the camera fails.</p>
1384          *
1385          * <p>Any attempt to call methods on this CameraDevice will throw a
1386          * {@link CameraAccessException}. The disconnection could be due to a
1387          * change in security policy or permissions; the physical disconnection
1388          * of a removable camera device; or the camera being needed for a
1389          * higher-priority camera API client.</p>
1390          *
1391          * <p>There may still be capture callbacks that are invoked
1392          * after this method is called, or new image buffers that are delivered
1393          * to active outputs.</p>
1394          *
1395          * <p>The default implementation logs a notice to the system log
1396          * about the disconnection.</p>
1397          *
1398          * <p>You should clean up the camera with {@link CameraDevice#close} after
1399          * this happens, as it is not recoverable until the camera can be opened
1400          * again. For most use cases, this will be when the camera again becomes
1401          * {@link CameraManager.AvailabilityCallback#onCameraAvailable available}.
1402          * </p>
1403          *
1404          * @param camera the device that has been disconnected
1405          */
onDisconnected(@onNull CameraDevice camera)1406         public abstract void onDisconnected(@NonNull CameraDevice camera); // Must implement
1407 
1408         /**
1409          * The method called when a camera device has encountered a serious error.
1410          *
1411          * <p>This callback may be called instead of {@link #onOpened}
1412          * if opening the camera fails.</p>
1413          *
1414          * <p>This indicates a failure of the camera device or camera service in
1415          * some way. Any attempt to call methods on this CameraDevice in the
1416          * future will throw a {@link CameraAccessException} with the
1417          * {@link CameraAccessException#CAMERA_ERROR CAMERA_ERROR} reason.
1418          * </p>
1419          *
1420          * <p>There may still be capture completion or camera stream callbacks
1421          * that will be called after this error is received.</p>
1422          *
1423          * <p>You should clean up the camera with {@link CameraDevice#close} after
1424          * this happens. Further attempts at recovery are error-code specific.</p>
1425          *
1426          * @param camera The device reporting the error
1427          * @param error The error code.
1428          *
1429          * @see #ERROR_CAMERA_IN_USE
1430          * @see #ERROR_MAX_CAMERAS_IN_USE
1431          * @see #ERROR_CAMERA_DISABLED
1432          * @see #ERROR_CAMERA_DEVICE
1433          * @see #ERROR_CAMERA_SERVICE
1434          */
onError(@onNull CameraDevice camera, @ErrorCode int error)1435         public abstract void onError(@NonNull CameraDevice camera,
1436                 @ErrorCode int error); // Must implement
1437     }
1438 
1439     /**
1440      * Set audio restriction mode when this CameraDevice is being used.
1441      *
1442      * <p>Some camera hardware (e.g. devices with optical image stabilization support)
1443      * are sensitive to device vibration and video recordings can be ruined by unexpected sounds.
1444      * Applications can use this method to suppress vibration or sounds coming from
1445      * ringtones, alarms or notifications.
1446      * Other vibration or sounds (e.g. media playback or accessibility) will not be muted.</p>
1447      *
1448      * <p>The mute mode is a system-wide setting. When multiple CameraDevice objects
1449      * are setting different modes, the system will pick a the mode that's union of
1450      * all modes set by CameraDevice. Applications can also use
1451      * {@link #getCameraAudioRestriction} to query current system-wide camera
1452      * mute mode in effect.</p>
1453      *
1454      * <p>The mute settings from this CameraDevice will be automatically removed when the
1455      * CameraDevice is closed or the application is disconnected from the camera.</p>
1456      *
1457      * @param mode An enumeration selecting the audio restriction mode for this camera device.
1458      *
1459      * @throws IllegalArgumentException if the mode is not supported
1460      *
1461      * @throws CameraAccessException if the camera device is no longer connected or has
1462      *                               encountered a fatal error
1463      * @throws IllegalStateException if the camera device has been closed
1464      *
1465      * @see #getCameraAudioRestriction
1466      */
setCameraAudioRestriction( @AMERA_AUDIO_RESTRICTION int mode)1467     public void setCameraAudioRestriction(
1468             @CAMERA_AUDIO_RESTRICTION int mode) throws CameraAccessException {
1469         throw new UnsupportedOperationException("Subclasses must override this method");
1470     }
1471 
1472     /**
1473      * Get currently applied global camera audio restriction mode.
1474      *
1475      * <p>Application can use this method to retrieve the system-wide camera audio restriction
1476      * settings described in {@link #setCameraAudioRestriction}.</p>
1477      *
1478      * @return The current system-wide mute mode setting in effect
1479      *
1480      * @throws CameraAccessException if the camera device is no longer connected or has
1481      *                               encountered a fatal error
1482      * @throws IllegalStateException if the camera device has been closed
1483      *
1484      * @see #setCameraAudioRestriction
1485      */
getCameraAudioRestriction()1486     public @CAMERA_AUDIO_RESTRICTION int getCameraAudioRestriction() throws CameraAccessException {
1487         throw new UnsupportedOperationException("Subclasses must override this method");
1488     }
1489 
1490     /**
1491      * To be inherited by android.hardware.camera2.* code only.
1492      * @hide
1493      */
CameraDevice()1494     public CameraDevice() {}
1495 }
1496