blob: 63eedf539bfe3810ba22ed879f34d1f7ed9e5b9e [file] [log] [blame]
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001/*
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
Eino-Ville Talvala2f1a2e42013-07-25 17:12:05 -070017package android.hardware.camera2;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080018
Eino-Ville Talvala8b905572015-05-14 15:43:01 -070019import android.annotation.NonNull;
20import android.annotation.Nullable;
21import android.annotation.IntDef;
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -080022import android.annotation.SystemApi;
23import android.annotation.TestApi;
24import static android.hardware.camera2.ICameraDeviceUser.NORMAL_MODE;
25import static android.hardware.camera2.ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE;
Chien-Yu Chen5398a672015-03-19 14:48:43 -070026import android.hardware.camera2.params.InputConfiguration;
Igor Murashkin9c595172014-05-12 13:56:20 -070027import android.hardware.camera2.params.StreamConfigurationMap;
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -070028import android.hardware.camera2.params.OutputConfiguration;
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -070029import android.os.Handler;
Zhijun He599be612013-09-27 13:43:25 -070030import android.view.Surface;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080031
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080032import java.util.List;
Eino-Ville Talvala8b905572015-05-14 15:43:01 -070033import java.lang.annotation.Retention;
34import java.lang.annotation.RetentionPolicy;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080035
36/**
Igor Murashkin21547d62014-06-04 15:21:42 -070037 * <p>The CameraDevice class is a representation of a single camera connected to an
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080038 * 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 two levels: limited or
46 * full. If a device only supports the limited level, then Camera2 exposes a
47 * feature set that is roughly equivalent to the older
48 * {@link android.hardware.Camera Camera} API, although with a cleaner and more
49 * efficient interface. Devices that implement the full level of support
50 * provide substantially improved capabilities over the older camera
51 * API. Applications that target the limited level devices will run unchanged on
52 * the full-level devices; if your application requires a full-level device for
Yin-Chia Yeha636be62015-10-06 13:45:20 -070053 * proper operation, declare the "android.hardware.camera.level.full" feature in your
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080054 * manifest.</p>
55 *
56 * @see CameraManager#openCamera
57 * @see android.Manifest.permission#CAMERA
58 */
Igor Murashkin21547d62014-06-04 15:21:42 -070059public abstract class CameraDevice implements AutoCloseable {
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080060
61 /**
62 * Create a request suitable for a camera preview window. Specifically, this
63 * means that high frame rate is given priority over the highest-quality
64 * post-processing. These requests would normally be used with the
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -070065 * {@link CameraCaptureSession#setRepeatingRequest} method.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -070066 * This template is guaranteed to be supported on all camera devices.
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080067 *
68 * @see #createCaptureRequest
69 */
70 public static final int TEMPLATE_PREVIEW = 1;
71
72 /**
Zhijun Heb8b77bf2013-06-28 16:30:12 -070073 * Create a request suitable for still image capture. Specifically, this
74 * means prioritizing image quality over frame rate. These requests would
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -070075 * commonly be used with the {@link CameraCaptureSession#capture} method.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -070076 * This template is guaranteed to be supported on all camera devices.
Zhijun Heb8b77bf2013-06-28 16:30:12 -070077 *
78 * @see #createCaptureRequest
79 */
80 public static final int TEMPLATE_STILL_CAPTURE = 2;
81
82 /**
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080083 * Create a request suitable for video recording. Specifically, this means
84 * that a stable frame rate is used, and post-processing is set for
85 * recording quality. These requests would commonly be used with the
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -070086 * {@link CameraCaptureSession#setRepeatingRequest} method.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -070087 * This template is guaranteed to be supported on all camera devices.
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080088 *
89 * @see #createCaptureRequest
90 */
Zhijun Heb8b77bf2013-06-28 16:30:12 -070091 public static final int TEMPLATE_RECORD = 3;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -080092
93 /**
94 * Create a request suitable for still image capture while recording
95 * video. Specifically, this means maximizing image quality without
96 * disrupting the ongoing recording. These requests would commonly be used
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -070097 * with the {@link CameraCaptureSession#capture} method while a request based on
98 * {@link #TEMPLATE_RECORD} is is in use with {@link CameraCaptureSession#setRepeatingRequest}.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -070099 * This template is guaranteed to be supported on all camera devices except
100 * legacy devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
101 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY})
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800102 *
103 * @see #createCaptureRequest
104 */
105 public static final int TEMPLATE_VIDEO_SNAPSHOT = 4;
106
107 /**
Zhijun Hebbae94a2013-09-13 11:32:20 -0700108 * Create a request suitable for zero shutter lag still capture. This means
109 * means maximizing image quality without compromising preview frame rate.
Chien-Yu Chen6828bb92017-05-03 12:08:08 -0700110 * AE/AWB/AF should be on auto mode. This is intended for application-operated ZSL. For
111 * device-operated ZSL, use {@link CaptureRequest#CONTROL_ENABLE_ZSL} if available.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -0700112 * This template is guaranteed to be supported on camera devices that support the
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700113 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING PRIVATE_REPROCESSING}
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -0700114 * capability or the
115 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING YUV_REPROCESSING}
116 * capability.
Zhijun Hebbae94a2013-09-13 11:32:20 -0700117 *
118 * @see #createCaptureRequest
Chien-Yu Chen6828bb92017-05-03 12:08:08 -0700119 * @see CaptureRequest#CONTROL_ENABLE_ZSL
Zhijun Hebbae94a2013-09-13 11:32:20 -0700120 */
121 public static final int TEMPLATE_ZERO_SHUTTER_LAG = 5;
122
123 /**
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800124 * A basic template for direct application control of capture
125 * parameters. All automatic control is disabled (auto-exposure, auto-white
126 * balance, auto-focus), and post-processing parameters are set to preview
127 * quality. The manual capture parameters (exposure, sensitivity, and so on)
128 * are set to reasonable defaults, but should be overriden by the
129 * application depending on the intended use case.
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -0700130 * This template is guaranteed to be supported on camera devices that support the
131 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR MANUAL_SENSOR}
132 * capability.
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800133 *
134 * @see #createCaptureRequest
135 */
Zhijun Hebbae94a2013-09-13 11:32:20 -0700136 public static final int TEMPLATE_MANUAL = 6;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800137
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700138 /** @hide */
139 @Retention(RetentionPolicy.SOURCE)
Eino-Ville Talvala16ffbc62017-04-24 13:10:21 -0700140 @IntDef(prefix = {"TEMPLATE_"}, value =
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700141 {TEMPLATE_PREVIEW,
142 TEMPLATE_STILL_CAPTURE,
143 TEMPLATE_RECORD,
144 TEMPLATE_VIDEO_SNAPSHOT,
145 TEMPLATE_ZERO_SHUTTER_LAG,
146 TEMPLATE_MANUAL })
147 public @interface RequestTemplate {};
148
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800149 /**
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700150 * Get the ID of this camera device.
151 *
152 * <p>This matches the ID given to {@link CameraManager#openCamera} to instantiate this
153 * this camera device.</p>
154 *
155 * <p>This ID can be used to query the camera device's {@link
Igor Murashkin68f40062013-09-10 12:15:54 -0700156 * CameraCharacteristics fixed properties} with {@link
157 * CameraManager#getCameraCharacteristics}.</p>
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700158 *
159 * <p>This method can be called even if the device has been closed or has encountered
160 * a serious error.</p>
161 *
162 * @return the ID for this camera device
163 *
Igor Murashkin68f40062013-09-10 12:15:54 -0700164 * @see CameraManager#getCameraCharacteristics
Zhijun He599be612013-09-27 13:43:25 -0700165 * @see CameraManager#getCameraIdList
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700166 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700167 @NonNull
Igor Murashkin21547d62014-06-04 15:21:42 -0700168 public abstract String getId();
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700169
170 /**
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700171 * <p>Create a new camera capture session by providing the target output set of Surfaces to the
172 * camera device.</p>
173 *
174 * <p>The active capture session determines the set of potential output Surfaces for
175 * the camera device for each capture request. A given request may use all
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700176 * or only some of the outputs. Once the CameraCaptureSession is created, requests can be
Hidenari Koshimae0fa49142016-01-08 16:18:28 +0900177 * submitted with {@link CameraCaptureSession#capture capture},
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700178 * {@link CameraCaptureSession#captureBurst captureBurst},
179 * {@link CameraCaptureSession#setRepeatingRequest setRepeatingRequest}, or
180 * {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}.</p>
181 *
182 * <p>Surfaces suitable for inclusion as a camera output can be created for
183 * various use cases and targets:</p>
184 *
185 * <ul>
186 *
Eino-Ville Talvala5ae1ca52014-06-12 16:46:58 -0700187 * <li>For drawing to a {@link android.view.SurfaceView SurfaceView}: Once the SurfaceView's
Eino-Ville Talvalafa0b9a02015-01-20 12:30:59 -0800188 * Surface is {@link android.view.SurfaceHolder.Callback#surfaceCreated created}, set the size
189 * of the Surface with {@link android.view.SurfaceHolder#setFixedSize} to be one of the sizes
190 * returned by {@link StreamConfigurationMap#getOutputSizes(Class)
191 * getOutputSizes(SurfaceHolder.class)} and then obtain the Surface by calling {@link
192 * android.view.SurfaceHolder#getSurface}. If the size is not set by the application, it will
193 * be rounded to the nearest supported size less than 1080p, by the camera device.</li>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700194 *
Eino-Ville Talvalafa0b9a02015-01-20 12:30:59 -0800195 * <li>For accessing through an OpenGL texture via a {@link android.graphics.SurfaceTexture
196 * SurfaceTexture}: Set the size of the SurfaceTexture with {@link
197 * android.graphics.SurfaceTexture#setDefaultBufferSize} to be one of the sizes returned by
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700198 * {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(SurfaceTexture.class)}
Eino-Ville Talvalafa0b9a02015-01-20 12:30:59 -0800199 * before creating a Surface from the SurfaceTexture with {@link Surface#Surface}. If the size
200 * is not set by the application, it will be set to be the smallest supported size less than
201 * 1080p, by the camera device.</li>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700202 *
203 * <li>For recording with {@link android.media.MediaCodec}: Call
204 * {@link android.media.MediaCodec#createInputSurface} after configuring
205 * the media codec to use one of the sizes returned by
206 * {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(MediaCodec.class)}
207 * </li>
208 *
209 * <li>For recording with {@link android.media.MediaRecorder}: Call
210 * {@link android.media.MediaRecorder#getSurface} after configuring the media recorder to use
211 * one of the sizes returned by
212 * {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(MediaRecorder.class)},
213 * or configuring it to use one of the supported
214 * {@link android.media.CamcorderProfile CamcorderProfiles}.</li>
215 *
216 * <li>For efficient YUV processing with {@link android.renderscript}:
217 * Create a RenderScript
218 * {@link android.renderscript.Allocation Allocation} with a supported YUV
219 * type, the IO_INPUT flag, and one of the sizes returned by
220 * {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(Allocation.class)},
221 * Then obtain the Surface with
222 * {@link android.renderscript.Allocation#getSurface}.</li>
223 *
Martin Storsjo5c533e42014-11-19 11:58:03 +0200224 * <li>For access to RAW, uncompressed YUV, or compressed JPEG data in the application: Create an
Sol Boucherb8cee512014-06-11 16:35:57 -0700225 * {@link android.media.ImageReader} object with one of the supported output formats given by
226 * {@link StreamConfigurationMap#getOutputFormats()}, setting its size to one of the
227 * corresponding supported sizes by passing the chosen output format into
228 * {@link StreamConfigurationMap#getOutputSizes(int)}. Then obtain a
229 * {@link android.view.Surface} from it with {@link android.media.ImageReader#getSurface()}.
Eino-Ville Talvalafa0b9a02015-01-20 12:30:59 -0800230 * If the ImageReader size is not set to a supported size, it will be rounded to a supported
231 * size less than 1080p by the camera device.
Sol Boucherb8cee512014-06-11 16:35:57 -0700232 * </li>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700233 *
234 * </ul>
235 *
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700236 * <p>The camera device will query each Surface's size and formats upon this
Sol Boucherb8cee512014-06-11 16:35:57 -0700237 * call, so they must be set to a valid setting at this time.</p>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700238 *
239 * <p>It can take several hundred milliseconds for the session's configuration to complete,
240 * since camera hardware may need to be powered on or reconfigured. Once the configuration is
241 * complete and the session is ready to actually capture data, the provided
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700242 * {@link CameraCaptureSession.StateCallback}'s
243 * {@link CameraCaptureSession.StateCallback#onConfigured} callback will be called.</p>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700244 *
Chien-Yu Chen078c92a2015-06-25 16:54:17 -0700245 * <p>If a prior CameraCaptureSession already exists when this method is called, the previous
246 * session will no longer be able to accept new capture requests and will be closed. Any
247 * in-progress capture requests made on the prior session will be completed before it's closed.
Eino-Ville Talvala3c8c16f2016-09-06 15:28:46 -0700248 * {@link CameraCaptureSession.StateCallback#onConfigured} for the new session may be invoked
249 * before {@link CameraCaptureSession.StateCallback#onClosed} is invoked for the prior
250 * session. Once the new session is {@link CameraCaptureSession.StateCallback#onConfigured
Chien-Yu Chen078c92a2015-06-25 16:54:17 -0700251 * configured}, it is able to start capturing its own requests. To minimize the transition time,
252 * the {@link CameraCaptureSession#abortCaptures} call can be used to discard the remaining
253 * requests for the prior capture session before a new one is created. Note that once the new
254 * session is created, the old one can no longer have its captures aborted.</p>
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700255 *
256 * <p>Using larger resolution outputs, or more outputs, can result in slower
257 * output rate from the device.</p>
258 *
259 * <p>Configuring a session with an empty or null list will close the current session, if
260 * any. This can be used to release the current session's target surfaces for another use.</p>
261 *
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700262 * <p>While any of the sizes from {@link StreamConfigurationMap#getOutputSizes} can be used when
263 * a single output stream is configured, a given camera device may not be able to support all
264 * combination of sizes, formats, and targets when multiple outputs are configured at once. The
265 * tables below list the maximum guaranteed resolutions for combinations of streams and targets,
266 * given the capabilities of the camera device.</p>
267 *
268 * <p>If an application tries to create a session using a set of targets that exceed the limits
269 * described in the below tables, one of three possibilities may occur. First, the session may
270 * be successfully created and work normally. Second, the session may be successfully created,
271 * but the camera device won't meet the frame rate guarantees as described in
272 * {@link StreamConfigurationMap#getOutputMinFrameDuration}. Or third, if the output set
273 * cannot be used at all, session creation will fail entirely, with
Eino-Ville Talvala3c8c16f2016-09-06 15:28:46 -0700274 * {@link CameraCaptureSession.StateCallback#onConfigureFailed} being invoked.</p>
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700275 *
276 * <p>For the type column, {@code PRIV} refers to any target whose available sizes are found
277 * using {@link StreamConfigurationMap#getOutputSizes(Class)} with no direct application-visible
278 * format, {@code YUV} refers to a target Surface using the
279 * {@link android.graphics.ImageFormat#YUV_420_888} format, {@code JPEG} refers to the
280 * {@link android.graphics.ImageFormat#JPEG} format, and {@code RAW} refers to the
281 * {@link android.graphics.ImageFormat#RAW_SENSOR} format.</p>
282 *
283 * <p>For the maximum size column, {@code PREVIEW} refers to the best size match to the
284 * device's screen resolution, or to 1080p ({@code 1920x1080}), whichever is
285 * smaller. {@code RECORD} refers to the camera device's maximum supported recording resolution,
286 * as determined by {@link android.media.CamcorderProfile}. And {@code MAXIMUM} refers to the
287 * camera device's maximum output resolution for that format or target from
288 * {@link StreamConfigurationMap#getOutputSizes}.</p>
289 *
290 * <p>To use these tables, determine the number and the formats/targets of outputs needed, and
291 * find the row(s) of the table with those targets. The sizes indicate the maximum set of sizes
292 * that can be used; it is guaranteed that for those targets, the listed sizes and anything
293 * smaller from the list given by {@link StreamConfigurationMap#getOutputSizes} can be
294 * successfully used to create a session. For example, if a row indicates that a 8 megapixel
295 * (MP) YUV_420_888 output can be used together with a 2 MP {@code PRIV} output, then a session
296 * can be created with targets {@code [8 MP YUV, 2 MP PRIV]} or targets {@code [2 MP YUV, 2 MP
297 * PRIV]}; but a session with targets {@code [8 MP YUV, 4 MP PRIV]}, targets {@code [4 MP YUV, 4
298 * MP PRIV]}, or targets {@code [8 MP PRIV, 2 MP YUV]} would not be guaranteed to work, unless
299 * some other row of the table lists such a combination.</p>
300 *
301 * <style scoped>
302 * #rb { border-right-width: thick; }
303 * </style>
304 * <p>Legacy devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
305 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}) support at
306 * least the following stream combinations:
307 *
308 * <table>
309 * <tr><th colspan="7">LEGACY-level guaranteed configurations</th></tr>
310 * <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>
311 * <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>
312 * <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>
313 * <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>
314 * <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>
315 * <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>
316 * <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>
317 * <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>
318 * <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>
319 * <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>
320 * </table><br>
321 * </p>
322 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800323 * <p>Limited-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700324 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}) devices
325 * support at least the following stream combinations in addition to those for
326 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY} devices:
327 *
328 * <table>
329 * <tr><th colspan="7">LIMITED-level additional guaranteed configurations</th></tr>
330 * <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>
331 * <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>
332 * <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>
333 * <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>
334 * <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>
335 * <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>
336 * <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>
337 * <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>
338 * </table><br>
339 * </p>
340 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800341 * <p>FULL-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700342 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) devices
343 * support at least the following stream combinations in addition to those for
344 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
345 *
346 * <table>
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800347 * <tr><th colspan="7">FULL-level additional guaranteed configurations</th></tr>
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700348 * <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>
349 * <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>
350 * <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>
351 * <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>
352 * <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>
353 * <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>
354 * <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>
355 * <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>
356 * </table><br>
357 * </p>
358 *
359 * <p>RAW-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
360 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}) devices additionally support
361 * at least the following stream combinations on both
362 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and
363 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
364 *
365 * <table>
366 * <tr><th colspan="7">RAW-capability additional guaranteed configurations</th></tr>
367 * <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>
368 * <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>
369 * <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>
370 * <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>
371 * <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>
372 * <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>
373 * <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>
374 * <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>
375 * <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>
376 * <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>
377 * </table><br>
378 * </p>
379 *
Eino-Ville Talvala126a7462014-11-04 16:31:01 -0800380 * <p>BURST-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
381 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE BURST_CAPTURE}) devices
382 * support at least the below stream combinations in addition to those for
383 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices. Note that all
384 * FULL-level devices support the BURST capability, and the below list is a strict subset of the
385 * list for FULL-level devices, so this table is only relevant for LIMITED-level devices that
386 * support the BURST_CAPTURE capability.
387 *
388 * <table>
389 * <tr><th colspan="5">BURST-capability additional guaranteed configurations</th></tr>
390 * <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>
391 * <tr><th>Type</th><th id="rb">Max size</th><th>Type</th><th id="rb">Max size</th> </tr>
392 * <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>
393 * <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>
394 * <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>
395 * </table><br>
396 * </p>
397 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800398 * <p>LEVEL-3 ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
399 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3 LEVEL_3})
400 * support at least the following stream combinations in addition to the combinations for
401 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and for
402 * RAW capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
403 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}):
404 *
405 * <table>
406 * <tr><th colspan="11">LEVEL-3 additional guaranteed configurations</th></tr>
407 * <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>
408 * <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>
409 * <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>
410 * <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>
411 * </table><br>
412 * </p>
413 *
Eino-Ville Talvalaf3621f32014-08-26 14:53:39 -0700414 * <p>Since the capabilities of camera devices vary greatly, a given camera device may support
415 * target combinations with sizes outside of these guarantees, but this can only be tested for
416 * by attempting to create a session with such targets.</p>
417 *
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700418 * @param outputs The new set of Surfaces that should be made available as
419 * targets for captured image data.
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700420 * @param callback The callback to notify about the status of the new capture session.
421 * @param handler The handler on which the callback should be invoked, or {@code null} to use
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700422 * the current thread's {@link android.os.Looper looper}.
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -0700423 *
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700424 * @throws IllegalArgumentException if the set of output Surfaces do not meet the requirements,
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700425 * the callback is null, or the handler is null but the current
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700426 * thread has no looper.
427 * @throws CameraAccessException if the camera device is no longer connected or has
428 * encountered a fatal error
429 * @throws IllegalStateException if the camera device has been closed
430 *
431 * @see CameraCaptureSession
432 * @see StreamConfigurationMap#getOutputFormats()
433 * @see StreamConfigurationMap#getOutputSizes(int)
434 * @see StreamConfigurationMap#getOutputSizes(Class)
435 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700436 public abstract void createCaptureSession(@NonNull List<Surface> outputs,
437 @NonNull CameraCaptureSession.StateCallback callback, @Nullable Handler handler)
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700438 throws CameraAccessException;
439
440 /**
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -0700441 * <p>Create a new camera capture session by providing the target output set of Surfaces and
442 * its corresponding surface configuration to the camera device.</p>
443 *
444 * @see #createCaptureSession
445 * @see OutputConfiguration
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -0700446 */
Zhijun He00347432016-04-07 17:34:10 -0700447 public abstract void createCaptureSessionByOutputConfigurations(
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -0700448 List<OutputConfiguration> outputConfigurations,
Eino-Ville Talvalad5b9c6b2016-12-01 11:29:55 -0800449 CameraCaptureSession.StateCallback callback, @Nullable Handler handler)
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -0700450 throws CameraAccessException;
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700451 /**
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700452 * Create a new reprocessable camera capture session by providing the desired reprocessing
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700453 * input Surface configuration and the target output set of Surfaces to the camera device.
454 *
455 * <p>If a camera device supports YUV reprocessing
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700456 * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING}) or PRIVATE
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700457 * reprocessing
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700458 * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING}), besides
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700459 * the capture session created via {@link #createCaptureSession createCaptureSession}, the
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700460 * application can also create a reprocessable capture session to submit reprocess capture
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700461 * requests in addition to regular capture requests. A reprocess capture request takes the next
462 * available buffer from the session's input Surface, and sends it through the camera device's
463 * processing pipeline again, to produce buffers for the request's target output Surfaces. No
464 * new image data is captured for a reprocess request. However the input buffer provided by
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700465 * the application must be captured previously by the same camera device in the same session
466 * directly (e.g. for Zero-Shutter-Lag use case) or indirectly (e.g. combining multiple output
467 * images).</p>
468 *
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700469 * <p>The active reprocessable capture session determines an input {@link Surface} and the set
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700470 * of potential output Surfaces for the camera devices for each capture request. The application
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700471 * can use {@link #createCaptureRequest createCaptureRequest} to create regular capture requests
472 * to capture new images from the camera device, and use {@link #createReprocessCaptureRequest
473 * createReprocessCaptureRequest} to create reprocess capture requests to process buffers from
474 * the input {@link Surface}. Some combinations of output Surfaces in a session may not be used
475 * in a request simultaneously. The guaranteed combinations of output Surfaces that can be used
476 * in a request simultaneously are listed in the tables under {@link #createCaptureSession
477 * createCaptureSession}. All the output Surfaces in one capture request will come from the
478 * same source, either from a new capture by the camera device, or from the input Surface
479 * depending on if the request is a reprocess capture request.</p>
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700480 *
481 * <p>Input formats and sizes supported by the camera device can be queried via
482 * {@link StreamConfigurationMap#getInputFormats} and
483 * {@link StreamConfigurationMap#getInputSizes}. For each supported input format, the camera
484 * device supports a set of output formats and sizes for reprocessing that can be queried via
485 * {@link StreamConfigurationMap#getValidOutputFormatsForInput} and
486 * {@link StreamConfigurationMap#getOutputSizes}. While output Surfaces with formats that
487 * aren't valid reprocess output targets for the input configuration can be part of a session,
488 * they cannot be used as targets for a reprocessing request.</p>
489 *
490 * <p>Since the application cannot access {@link android.graphics.ImageFormat#PRIVATE} images
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700491 * directly, an output Surface created by {@link android.media.ImageReader#newInstance} with
492 * {@link android.graphics.ImageFormat#PRIVATE} as the format will be considered as intended to
493 * be used for reprocessing input and thus the {@link android.media.ImageReader} size must
494 * match one of the supported input sizes for {@link android.graphics.ImageFormat#PRIVATE}
495 * format. Otherwise, creating a reprocessable capture session will fail.</p>
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700496 *
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700497 * <p>The guaranteed stream configurations listed in
498 * {@link #createCaptureSession createCaptureSession} are also guaranteed to work for
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700499 * {@link #createReprocessableCaptureSession createReprocessableCaptureSession}. In addition,
500 * the configurations in the tables below are also guaranteed for creating a reprocessable
501 * capture session if the camera device supports YUV reprocessing or PRIVATE reprocessing.
502 * However, not all output targets used to create a reprocessable session may be used in a
Chien-Yu Chene90c6d02015-08-25 11:31:58 -0700503 * {@link CaptureRequest} simultaneously. For devices that support only 1 output target in a
504 * reprocess {@link CaptureRequest}, submitting a reprocess {@link CaptureRequest} with multiple
505 * output targets will result in a {@link CaptureFailure}. For devices that support multiple
506 * output targets in a reprocess {@link CaptureRequest}, the guaranteed output targets that can
507 * be included in a {@link CaptureRequest} simultaneously are listed in the tables under
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700508 * {@link #createCaptureSession createCaptureSession}. For example, with a FULL-capability
509 * ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} {@code == }
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700510 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) device that supports PRIVATE
511 * reprocessing, an application can create a reprocessable capture session with 1 input,
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700512 * ({@code PRIV}, {@code MAXIMUM}), and 3 outputs, ({@code PRIV}, {@code MAXIMUM}),
513 * ({@code PRIV}, {@code PREVIEW}), and ({@code YUV}, {@code MAXIMUM}). However, it's not
514 * guaranteed that an application can submit a regular or reprocess capture with ({@code PRIV},
515 * {@code MAXIMUM}) and ({@code YUV}, {@code MAXIMUM}) outputs based on the table listed under
516 * {@link #createCaptureSession createCaptureSession}. In other words, use the tables below to
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700517 * determine the guaranteed stream configurations for creating a reprocessable capture session,
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700518 * and use the tables under {@link #createCaptureSession createCaptureSession} to determine the
519 * guaranteed output targets that can be submitted in a regular or reprocess
520 * {@link CaptureRequest} simultaneously.</p>
521 *
522 * <style scoped>
523 * #rb { border-right-width: thick; }
524 * </style>
525 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800526 * <p>LIMITED-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700527 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}) devices
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700528 * support at least the following stream combinations for creating a reprocessable capture
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700529 * session in addition to those listed in {@link #createCaptureSession createCaptureSession} for
530 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
531 *
532 * <table>
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700533 * <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>
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700534 * <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>
535 * <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>
536 * <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>
537 * <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>
538 * <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>
539 * <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>
540 * </table><br>
541 * </p>
542 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800543 * <p>FULL-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700544 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) devices
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700545 * support at least the following stream combinations for creating a reprocessable capture
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700546 * session in addition to those for
547 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices:
548 *
549 * <table>
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800550 * <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>
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700551 * <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>
552 * <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>
553 * <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>
554 * <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>
555 * <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>
556 * <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>
557 * <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>
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700558 * <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>
559 * </table><br>
560 * </p>
561 *
562 * <p>RAW-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} includes
563 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}) devices additionally support
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700564 * at least the following stream combinations for creating a reprocessable capture session
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700565 * on both {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} and
566 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED} devices
567 *
568 * <table>
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700569 * <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>
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700570 * <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>
571 * <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>
572 * <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>
573 * <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>
574 * <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>
575 * <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>
576 * <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>
577 * </table><br>
578 * </p>
579 *
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800580 * <p>LEVEL-3 ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
581 * {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3 LEVEL_3}) devices
582 * support at least the following stream combinations for creating a reprocessable capture
583 * session in addition to those for
Eino-Ville Talvalaefa0be92016-01-27 14:16:20 -0800584 * {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL} devices. Note that while
585 * the second configuration allows for configuring {@code MAXIMUM} {@code YUV} and {@code JPEG}
586 * outputs at the same time, that configuration is not listed for regular capture sessions, and
587 * therefore simultaneous output to both targets is not allowed.
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800588 *
589 * <table>
590 * <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>
Eino-Ville Talvalaefa0be92016-01-27 14:16:20 -0800591 * <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>
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800592 * <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>
Eino-Ville Talvalaefa0be92016-01-27 14:16:20 -0800593 * <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>
Eino-Ville Talvala7c6d73f2016-01-21 13:55:11 -0800594 * <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>
595 * </table><br>
596 * </p>
597 *
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700598 * @param inputConfig The configuration for the input {@link Surface}
599 * @param outputs The new set of Surfaces that should be made available as
600 * targets for captured image data.
601 * @param callback The callback to notify about the status of the new capture session.
602 * @param handler The handler on which the callback should be invoked, or {@code null} to use
603 * the current thread's {@link android.os.Looper looper}.
604 *
605 * @throws IllegalArgumentException if the input configuration is null or not supported, the set
606 * of output Surfaces do not meet the requirements, the
607 * callback is null, or the handler is null but the current
608 * thread has no looper.
609 * @throws CameraAccessException if the camera device is no longer connected or has
610 * encountered a fatal error
611 * @throws IllegalStateException if the camera device has been closed
612 *
Chien-Yu Chenf723db72015-04-30 13:06:09 -0700613 * @see #createCaptureSession
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700614 * @see CameraCaptureSession
615 * @see StreamConfigurationMap#getInputFormats
616 * @see StreamConfigurationMap#getInputSizes
617 * @see StreamConfigurationMap#getValidOutputFormatsForInput
618 * @see StreamConfigurationMap#getOutputSizes
619 * @see android.media.ImageWriter
620 * @see android.media.ImageReader
621 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700622 public abstract void createReprocessableCaptureSession(@NonNull InputConfiguration inputConfig,
623 @NonNull List<Surface> outputs, @NonNull CameraCaptureSession.StateCallback callback,
624 @Nullable Handler handler)
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700625 throws CameraAccessException;
Yin-Chia Yeh49ea6ae2015-03-09 16:53:14 -0700626
627 /**
Zhijun He445b3162016-01-18 15:34:28 -0800628 * Create a new reprocessable camera capture session by providing the desired reprocessing
629 * input configuration and output {@link OutputConfiguration}
630 * to the camera device.
631 *
632 * @see #createReprocessableCaptureSession
633 * @see OutputConfiguration
634 *
635 */
Zhijun He00347432016-04-07 17:34:10 -0700636 public abstract void createReprocessableCaptureSessionByConfigurations(
Zhijun He445b3162016-01-18 15:34:28 -0800637 @NonNull InputConfiguration inputConfig,
638 @NonNull List<OutputConfiguration> outputs,
639 @NonNull CameraCaptureSession.StateCallback callback,
640 @Nullable Handler handler)
641 throws CameraAccessException;
642
643 /**
Zhijun Heb1300e32015-05-28 12:51:52 -0700644 * <p>Create a new constrained high speed capture session.</p>
645 *
646 * <p>The application can use normal capture session (created via {@link #createCaptureSession})
647 * for high speed capture if the desired high speed FPS ranges are advertised by
648 * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES}, in which case all API
649 * semantics associated with normal capture sessions applies.</p>
650 *
651 * <p>The method creates a specialized capture session that is only targeted at high speed
652 * video recording (>=120fps) use case if the camera device supports high speed video
653 * capability (i.e., {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} contains
654 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO}).
655 * Therefore, it has special characteristics compared with a normal capture session:</p>
656 *
657 * <ul>
658 *
659 * <li>In addition to the output target Surface requirements specified by the
660 * {@link #createCaptureSession} method, an active high speed capture session will support up
661 * to 2 output Surfaces, though the application might choose to configure just one Surface
662 * (e.g., preview only). All Surfaces must be either video encoder surfaces (acquired by
663 * {@link android.media.MediaRecorder#getSurface} or
664 * {@link android.media.MediaCodec#createInputSurface}) or preview surfaces (obtained from
665 * {@link android.view.SurfaceView}, {@link android.graphics.SurfaceTexture} via
666 * {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}). The Surface sizes
667 * must be one of the sizes reported by {@link StreamConfigurationMap#getHighSpeedVideoSizes}.
668 * When multiple Surfaces are configured, their size must be same.</li>
669 *
670 * <li>An active high speed capture session only accepts request lists created via
Eino-Ville Talvala639fffe2015-06-30 10:34:48 -0700671 * {@link CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}, and the
672 * request list can only be submitted to this session via
673 * {@link CameraCaptureSession#captureBurst captureBurst}, or
Zhijun Heb1300e32015-05-28 12:51:52 -0700674 * {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}.</li>
675 *
676 * <li>The FPS ranges being requested to this session must be selected from
677 * {@link StreamConfigurationMap#getHighSpeedVideoFpsRangesFor}. The application can still use
678 * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE} to control the desired FPS range.
679 * Switching to an FPS range that has different
680 * {@link android.util.Range#getUpper() maximum FPS} may trigger some camera device
681 * reconfigurations, which may introduce extra latency. It is recommended that the
682 * application avoids unnecessary maximum target FPS changes as much as possible during high
683 * speed streaming.</li>
684 *
685 * <li>For the request lists submitted to this session, the camera device will override the
686 * {@link CaptureRequest#CONTROL_MODE control mode}, auto-exposure (AE), auto-white balance
687 * (AWB) and auto-focus (AF) to {@link CameraMetadata#CONTROL_MODE_AUTO},
688 * {@link CameraMetadata#CONTROL_AE_MODE_ON}, {@link CameraMetadata#CONTROL_AWB_MODE_AUTO}
689 * and {@link CameraMetadata#CONTROL_AF_MODE_CONTINUOUS_VIDEO}, respectively. All
690 * post-processing block mode controls will be overridden to be FAST. Therefore, no manual
691 * control of capture and post-processing parameters is possible. Beside these, only a subset
692 * of controls will work, see
693 * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO} for
694 * more details.</li>
695 *
696 * </ul>
697 *
698 * @param outputs The new set of Surfaces that should be made available as
699 * targets for captured high speed image data.
700 * @param callback The callback to notify about the status of the new capture session.
701 * @param handler The handler on which the callback should be invoked, or {@code null} to use
702 * the current thread's {@link android.os.Looper looper}.
703 *
704 * @throws IllegalArgumentException if the set of output Surfaces do not meet the requirements,
705 * the callback is null, or the handler is null but the current
706 * thread has no looper, or the camera device doesn't support
707 * high speed video capability.
708 * @throws CameraAccessException if the camera device is no longer connected or has
709 * encountered a fatal error
710 * @throws IllegalStateException if the camera device has been closed
711 *
712 * @see #createCaptureSession
713 * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE
714 * @see StreamConfigurationMap#getHighSpeedVideoSizes
715 * @see StreamConfigurationMap#getHighSpeedVideoFpsRangesFor
716 * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
717 * @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
718 * @see CameraCaptureSession#captureBurst
719 * @see CameraCaptureSession#setRepeatingBurst
Eino-Ville Talvala639fffe2015-06-30 10:34:48 -0700720 * @see CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
Zhijun Heb1300e32015-05-28 12:51:52 -0700721 */
722 public abstract void createConstrainedHighSpeedCaptureSession(@NonNull List<Surface> outputs,
723 @NonNull CameraCaptureSession.StateCallback callback,
724 @Nullable Handler handler)
725 throws CameraAccessException;
726
Zhijun Heb1300e32015-05-28 12:51:52 -0700727 /**
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800728 * Standard camera operation mode.
729 *
730 * @see #createCustomCaptureSession
731 * @hide
732 */
733 @SystemApi
734 @TestApi
735 public static final int SESSION_OPERATION_MODE_NORMAL =
Eino-Ville Talvala4e79fe72017-03-08 16:02:48 -0800736 0; // ICameraDeviceUser.NORMAL_MODE;
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800737
738 /**
739 * Constrained high-speed operation mode.
740 *
741 * @see #createCustomCaptureSession
742 * @hide
743 */
744 @SystemApi
745 @TestApi
746 public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED =
Eino-Ville Talvala4e79fe72017-03-08 16:02:48 -0800747 1; // ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE;
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800748
749 /**
750 * First vendor-specific operating mode
751 *
752 * @see #createCustomCaptureSession
753 * @hide
754 */
755 @SystemApi
756 @TestApi
757 public static final int SESSION_OPERATION_MODE_VENDOR_START =
Eino-Ville Talvala4e79fe72017-03-08 16:02:48 -0800758 0x8000; // ICameraDeviceUser.VENDOR_MODE_START;
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800759
760 /** @hide */
761 @Retention(RetentionPolicy.SOURCE)
Eino-Ville Talvala16ffbc62017-04-24 13:10:21 -0700762 @IntDef(prefix = {"SESSION_OPERATION_MODE"}, value =
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800763 {SESSION_OPERATION_MODE_NORMAL,
764 SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED,
765 SESSION_OPERATION_MODE_VENDOR_START})
766 public @interface SessionOperatingMode {};
767
768 /**
Eino-Ville Talvala0e04e912017-02-28 17:49:41 -0800769 * Create a new camera capture session with a custom operating mode.
770 *
771 * @param inputConfig The configuration for the input {@link Surface} if a reprocessing session
772 * is desired, or {@code null} otherwise.
773 * @param outputs The new set of {@link OutputConfiguration OutputConfigurations} that should be
774 * made available as targets for captured image data.
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800775 * @param operatingMode The custom operating mode to use; a nonnegative value, either a custom
776 * vendor value or one of the SESSION_OPERATION_MODE_* values.
Eino-Ville Talvala0e04e912017-02-28 17:49:41 -0800777 * @param callback The callback to notify about the status of the new capture session.
778 * @param handler The handler on which the callback should be invoked, or {@code null} to use
779 * the current thread's {@link android.os.Looper looper}.
780 *
781 * @throws IllegalArgumentException if the input configuration is null or not supported, the set
782 * of output Surfaces do not meet the requirements, the
783 * callback is null, or the handler is null but the current
784 * thread has no looper.
785 * @throws CameraAccessException if the camera device is no longer connected or has
786 * encountered a fatal error
787 * @throws IllegalStateException if the camera device has been closed
788 *
789 * @see #createCaptureSession
790 * @see #createReprocessableCaptureSession
791 * @see CameraCaptureSession
792 * @see OutputConfiguration
793 * @hide
794 */
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800795 @SystemApi
796 @TestApi
Eino-Ville Talvala0e04e912017-02-28 17:49:41 -0800797 public abstract void createCustomCaptureSession(
798 InputConfiguration inputConfig,
799 @NonNull List<OutputConfiguration> outputs,
Eino-Ville Talvala49c62f52017-02-28 17:57:28 -0800800 @SessionOperatingMode int operatingMode,
Eino-Ville Talvala0e04e912017-02-28 17:49:41 -0800801 @NonNull CameraCaptureSession.StateCallback callback,
802 @Nullable Handler handler)
803 throws CameraAccessException;
804
805 /**
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700806 * <p>Create a {@link CaptureRequest.Builder} for new capture requests,
807 * initialized with template for a target use case. The settings are chosen
808 * to be the best options for the specific camera device, so it is not
809 * recommended to reuse the same request for a different camera device;
810 * create a builder specific for that device and template and override the
811 * settings as desired, instead.</p>
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800812 *
Eino-Ville Talvala16ffbc62017-04-24 13:10:21 -0700813 * @param templateType An enumeration selecting the use case for this request. Not all template
814 * types are supported on every device. See the documentation for each template type for
815 * details.
Eino-Ville Talvala70c22072013-08-27 12:09:04 -0700816 * @return a builder for a capture request, initialized with default
817 * settings for that template, and no output streams
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800818 *
Yin-Chia Yeh0cd24f22015-04-24 17:48:04 -0700819 * @throws IllegalArgumentException if the templateType is not supported by
820 * this device.
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700821 * @throws CameraAccessException if the camera device is no longer connected or has
822 * encountered a fatal error
823 * @throws IllegalStateException if the camera device has been closed
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800824 *
825 * @see #TEMPLATE_PREVIEW
826 * @see #TEMPLATE_RECORD
827 * @see #TEMPLATE_STILL_CAPTURE
828 * @see #TEMPLATE_VIDEO_SNAPSHOT
829 * @see #TEMPLATE_MANUAL
830 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700831 @NonNull
832 public abstract CaptureRequest.Builder createCaptureRequest(@RequestTemplate int templateType)
Igor Murashkin70725502013-06-25 20:27:06 +0000833 throws CameraAccessException;
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800834
835 /**
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700836 * <p>Create a {@link CaptureRequest.Builder} for a new reprocess {@link CaptureRequest} from a
837 * {@link TotalCaptureResult}.
838 *
839 * <p>Each reprocess {@link CaptureRequest} processes one buffer from
840 * {@link CameraCaptureSession}'s input {@link Surface} to all output {@link Surface Surfaces}
841 * included in the reprocess capture request. The reprocess input images must be generated from
842 * one or multiple output images captured from the same camera device. The application can
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700843 * provide input images to camera device via {@link android.media.ImageWriter#queueInputImage}.
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700844 * The application must use the capture result of one of those output images to create a
845 * reprocess capture request so that the camera device can use the information to achieve
Chien-Yu Chene90c6d02015-08-25 11:31:58 -0700846 * optimal reprocess image quality. For camera devices that support only 1 output
847 * {@link Surface}, submitting a reprocess {@link CaptureRequest} with multiple
848 * output targets will result in a {@link CaptureFailure}.
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700849 *
850 * @param inputResult The capture result of the output image or one of the output images used
851 * to generate the reprocess input image for this capture request.
852 *
853 * @throws IllegalArgumentException if inputResult is null.
854 * @throws CameraAccessException if the camera device is no longer connected or has
855 * encountered a fatal error
856 * @throws IllegalStateException if the camera device has been closed
857 *
858 * @see CaptureRequest.Builder
859 * @see TotalCaptureResult
Chien-Yu Chen8062d312015-05-12 14:24:10 -0700860 * @see CameraDevice#createReprocessableCaptureSession
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700861 * @see android.media.ImageWriter
862 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700863 @NonNull
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700864 public abstract CaptureRequest.Builder createReprocessCaptureRequest(
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700865 @NonNull TotalCaptureResult inputResult) throws CameraAccessException;
Chien-Yu Chen5398a672015-03-19 14:48:43 -0700866
867 /**
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700868 * Close the connection to this camera device as quickly as possible.
Eino-Ville Talvala868d9042013-10-03 11:15:21 -0700869 *
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700870 * <p>Immediately after this call, all calls to the camera device or active session interface
871 * will throw a {@link IllegalStateException}, except for calls to close(). Once the device has
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700872 * fully shut down, the {@link StateCallback#onClosed} callback will be called, and the camera
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700873 * is free to be re-opened.</p>
Eino-Ville Talvala868d9042013-10-03 11:15:21 -0700874 *
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700875 * <p>Immediately after this call, besides the final {@link StateCallback#onClosed} calls, no
Eino-Ville Talvalacca00c62014-05-14 10:53:20 -0700876 * further callbacks from the device or the active session will occur, and any remaining
877 * submitted capture requests will be discarded, as if
878 * {@link CameraCaptureSession#abortCaptures} had been called, except that no success or failure
879 * callbacks will be invoked.</p>
Eino-Ville Talvala868d9042013-10-03 11:15:21 -0700880 *
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800881 */
Igor Murashkine363fbb2013-06-25 20:26:06 +0000882 @Override
Igor Murashkin21547d62014-06-04 15:21:42 -0700883 public abstract void close();
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800884
885 /**
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700886 * A callback objects for receiving updates about the state of a camera device.
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700887 *
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700888 * <p>A callback instance must be provided to the {@link CameraManager#openCamera} method to
889 * open a camera device.</p>
Eino-Ville Talvala868d9042013-10-03 11:15:21 -0700890 *
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700891 * <p>These state updates include notifications about the device completing startup (
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -0700892 * allowing for {@link #createCaptureSession} to be called), about device
893 * disconnection or closure, and about unexpected device errors.</p>
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700894 *
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -0700895 * <p>Events about the progress of specific {@link CaptureRequest CaptureRequests} are provided
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700896 * through a {@link CameraCaptureSession.CaptureCallback} given to the
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -0700897 * {@link CameraCaptureSession#capture}, {@link CameraCaptureSession#captureBurst},
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700898 * {@link CameraCaptureSession#setRepeatingRequest}, or
899 * {@link CameraCaptureSession#setRepeatingBurst} methods.
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700900 *
Eino-Ville Talvala868d9042013-10-03 11:15:21 -0700901 * @see CameraManager#openCamera
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800902 */
Eino-Ville Talvalafd887432014-09-04 13:07:40 -0700903 public static abstract class StateCallback {
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700904 /**
905 * An error code that can be reported by {@link #onError}
906 * indicating that the camera device is in use already.
907 *
908 * <p>
Ruben Brunk0f2be132015-04-17 14:23:40 -0700909 * This error can be produced when opening the camera fails due to the camera
910 * being used by a higher-priority camera API client.
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700911 * </p>
912 *
913 * @see #onError
914 */
915 public static final int ERROR_CAMERA_IN_USE = 1;
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700916
Eino-Ville Talvalab2675542012-12-12 13:29:45 -0800917 /**
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700918 * An error code that can be reported by {@link #onError}
919 * indicating that the camera device could not be opened
920 * because there are too many other open camera devices.
921 *
922 * <p>
923 * The system-wide limit for number of open cameras has been reached,
924 * and more camera devices cannot be opened until previous instances are
925 * closed.
926 * </p>
927 *
928 * <p>
929 * This error can be produced when opening the camera fails.
930 * </p>
931 *
932 * @see #onError
933 */
934 public static final int ERROR_MAX_CAMERAS_IN_USE = 2;
935
936 /**
937 * An error code that can be reported by {@link #onError}
938 * indicating that the camera device could not be opened due to a device
939 * policy.
940 *
941 * @see android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName, boolean)
942 * @see #onError
943 */
944 public static final int ERROR_CAMERA_DISABLED = 3;
945
946 /**
947 * An error code that can be reported by {@link #onError}
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700948 * indicating that the camera device has encountered a fatal error.
949 *
950 * <p>The camera device needs to be re-opened to be used again.</p>
951 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700952 * @see #onError
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700953 */
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700954 public static final int ERROR_CAMERA_DEVICE = 4;
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700955
956 /**
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700957 * An error code that can be reported by {@link #onError}
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700958 * indicating that the camera service has encountered a fatal error.
959 *
960 * <p>The Android device may need to be shut down and restarted to restore
961 * camera function, or there may be a persistent hardware problem.</p>
962 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700963 * <p>An attempt at recovery <i>may</i> be possible by closing the
964 * CameraDevice and the CameraManager, and trying to acquire all resources
965 * again from scratch.</p>
966 *
967 * @see #onError
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -0700968 */
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700969 public static final int ERROR_CAMERA_SERVICE = 5;
970
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700971 /** @hide */
972 @Retention(RetentionPolicy.SOURCE)
Eino-Ville Talvala16ffbc62017-04-24 13:10:21 -0700973 @IntDef(prefix = {"ERROR_"}, value =
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700974 {ERROR_CAMERA_IN_USE,
975 ERROR_MAX_CAMERAS_IN_USE,
976 ERROR_CAMERA_DISABLED,
977 ERROR_CAMERA_DEVICE,
978 ERROR_CAMERA_SERVICE })
979 public @interface ErrorCode {};
980
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700981 /**
982 * The method called when a camera device has finished opening.
983 *
Eino-Ville Talvalab67a3b32014-06-06 13:07:20 -0700984 * <p>At this point, the camera device is ready to use, and
985 * {@link CameraDevice#createCaptureSession} can be called to set up the first capture
986 * session.</p>
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700987 *
988 * @param camera the camera device that has become opened
989 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -0700990 public abstract void onOpened(@NonNull CameraDevice camera); // Must implement
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700991
992 /**
Igor Murashkin5c9eaf62013-09-10 19:35:24 -0700993 * The method called when a camera device has been closed with
994 * {@link CameraDevice#close}.
995 *
996 * <p>Any attempt to call methods on this CameraDevice in the
997 * future will throw a {@link IllegalStateException}.</p>
998 *
999 * <p>The default implementation of this method does nothing.</p>
1000 *
1001 * @param camera the camera device that has become closed
1002 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -07001003 public void onClosed(@NonNull CameraDevice camera) {
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001004 // Default empty implementation
1005 }
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001006
1007 /**
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001008 * The method called when a camera device is no longer available for
1009 * use.
1010 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001011 * <p>This callback may be called instead of {@link #onOpened}
1012 * if opening the camera fails.</p>
1013 *
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001014 * <p>Any attempt to call methods on this CameraDevice will throw a
1015 * {@link CameraAccessException}. The disconnection could be due to a
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001016 * change in security policy or permissions; the physical disconnection
1017 * of a removable camera device; or the camera being needed for a
Ruben Brunk0f2be132015-04-17 14:23:40 -07001018 * higher-priority camera API client.</p>
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001019 *
Eino-Ville Talvalafd887432014-09-04 13:07:40 -07001020 * <p>There may still be capture callbacks that are invoked
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001021 * after this method is called, or new image buffers that are delivered
1022 * to active outputs.</p>
1023 *
1024 * <p>The default implementation logs a notice to the system log
1025 * about the disconnection.</p>
1026 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001027 * <p>You should clean up the camera with {@link CameraDevice#close} after
Ruben Brunk0f2be132015-04-17 14:23:40 -07001028 * this happens, as it is not recoverable until the camera can be opened
1029 * again. For most use cases, this will be when the camera again becomes
1030 * {@link CameraManager.AvailabilityCallback#onCameraAvailable available}.
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001031 * </p>
1032 *
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001033 * @param camera the device that has been disconnected
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001034 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -07001035 public abstract void onDisconnected(@NonNull CameraDevice camera); // Must implement
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001036
1037 /**
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001038 * The method called when a camera device has encountered a serious error.
1039 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001040 * <p>This callback may be called instead of {@link #onOpened}
1041 * if opening the camera fails.</p>
1042 *
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001043 * <p>This indicates a failure of the camera device or camera service in
1044 * some way. Any attempt to call methods on this CameraDevice in the
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001045 * future will throw a {@link CameraAccessException} with the
1046 * {@link CameraAccessException#CAMERA_ERROR CAMERA_ERROR} reason.
1047 * </p>
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001048 *
Eino-Ville Talvalafd887432014-09-04 13:07:40 -07001049 * <p>There may still be capture completion or camera stream callbacks
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001050 * that will be called after this error is received.</p>
1051 *
Igor Murashkin5c9eaf62013-09-10 19:35:24 -07001052 * <p>You should clean up the camera with {@link CameraDevice#close} after
1053 * this happens. Further attempts at recovery are error-code specific.</p>
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001054 *
1055 * @param camera The device reporting the error
Eino-Ville Talvala16ffbc62017-04-24 13:10:21 -07001056 * @param error The error code.
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001057 *
Eino-Ville Talvala8b905572015-05-14 15:43:01 -07001058 * @see #ERROR_CAMERA_IN_USE
1059 * @see #ERROR_MAX_CAMERAS_IN_USE
1060 * @see #ERROR_CAMERA_DISABLED
Eino-Ville Talvala4af73c22013-08-14 10:35:46 -07001061 * @see #ERROR_CAMERA_DEVICE
1062 * @see #ERROR_CAMERA_SERVICE
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001063 */
Eino-Ville Talvala8b905572015-05-14 15:43:01 -07001064 public abstract void onError(@NonNull CameraDevice camera,
1065 @ErrorCode int error); // Must implement
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001066 }
Igor Murashkin21547d62014-06-04 15:21:42 -07001067
1068 /**
1069 * To be inherited by android.hardware.camera2.* code only.
1070 * @hide
1071 */
1072 public CameraDevice() {}
Eino-Ville Talvalab2675542012-12-12 13:29:45 -08001073}