CaptureResult.java revision 2807936f5dfdeff25e9ace3482100511a69dcf13
1/*
2 * Copyright (C) 2012 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
17package android.hardware.camera2;
18
19import android.hardware.camera2.impl.CameraMetadataNative;
20
21/**
22 * <p>The results of a single image capture from the image sensor.</p>
23 *
24 * <p>Contains the final configuration for the capture hardware (sensor, lens,
25 * flash), the processing pipeline, the control algorithms, and the output
26 * buffers.</p>
27 *
28 * <p>CaptureResults are produced by a {@link CameraDevice} after processing a
29 * {@link CaptureRequest}. All properties listed for capture requests can also
30 * be queried on the capture result, to determine the final values used for
31 * capture. The result also includes additional metadata about the state of the
32 * camera device during the capture.</p>
33 *
34 */
35public final class CaptureResult extends CameraMetadata {
36
37    private final CameraMetadataNative mResults;
38    private final CaptureRequest mRequest;
39    private final int mSequenceId;
40
41    /**
42     * Takes ownership of the passed-in properties object
43     * @hide
44     */
45    public CaptureResult(CameraMetadataNative results, CaptureRequest parent, int sequenceId) {
46        if (results == null) {
47            throw new IllegalArgumentException("results was null");
48        }
49
50        if (parent == null) {
51            throw new IllegalArgumentException("parent was null");
52        }
53
54        mResults = results;
55        mRequest = parent;
56        mSequenceId = sequenceId;
57    }
58
59    @Override
60    public <T> T get(Key<T> key) {
61        return mResults.get(key);
62    }
63
64    /**
65     * Get the request associated with this result.
66     *
67     * <p>Whenever a request is successfully captured, with
68     * {@link CameraDevice.CaptureListener#onCaptureCompleted},
69     * the {@code result}'s {@code getRequest()} will return that {@code request}.
70     * </p>
71     *
72     * <p>In particular,
73     * <code><pre>cameraDevice.capture(someRequest, new CaptureListener() {
74     *     {@literal @}Override
75     *     void onCaptureCompleted(CaptureRequest myRequest, CaptureResult myResult) {
76     *         assert(myResult.getRequest.equals(myRequest) == true);
77     *     }
78     * };
79     * </code></pre>
80     * </p>
81     *
82     * @return The request associated with this result. Never {@code null}.
83     */
84    public CaptureRequest getRequest() {
85        return mRequest;
86    }
87
88    /**
89     * Get the frame number associated with this result.
90     *
91     * <p>Whenever a request has been processed, regardless of failure or success,
92     * it gets a unique frame number assigned to its future result/failure.</p>
93     *
94     * <p>This value monotonically increments, starting with 0,
95     * for every new result or failure; and the scope is the lifetime of the
96     * {@link CameraDevice}.</p>
97     *
98     * @return int frame number
99     */
100    public int getFrameNumber() {
101        return get(REQUEST_FRAME_COUNT);
102    }
103
104    /**
105     * The sequence ID for this failure that was returned by the
106     * {@link CameraDevice#capture} family of functions.
107     *
108     * <p>The sequence ID is a unique monotonically increasing value starting from 0,
109     * incremented every time a new group of requests is submitted to the CameraDevice.</p>
110     *
111     * @return int The ID for the sequence of requests that this capture result is a part of
112     *
113     * @see CameraDevice.CaptureListener#onCaptureSequenceCompleted
114     */
115    public int getSequenceId() {
116        return mSequenceId;
117    }
118
119    /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
120     * The key entries below this point are generated from metadata
121     * definitions in /system/media/camera/docs. Do not modify by hand or
122     * modify the comment blocks at the start or end.
123     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
124
125    /**
126     * <p>A color transform matrix to use to transform
127     * from sensor RGB color space to output linear sRGB color space</p>
128     * <p>This matrix is either set by HAL when the request
129     * android.colorCorrection.mode is not TRANSFORM_MATRIX, or
130     * directly by the application in the request when the
131     * android.colorCorrection.mode is TRANSFORM_MATRIX.</p>
132     * <p>In the latter case, the HAL may round the matrix to account
133     * for precision issues; the final rounded matrix should be
134     * reported back in this matrix result metadata.</p>
135     */
136    public static final Key<Rational[]> COLOR_CORRECTION_TRANSFORM =
137            new Key<Rational[]>("android.colorCorrection.transform", Rational[].class);
138
139    /**
140     * <p>Gains applying to Bayer color channels for
141     * white-balance</p>
142     * <p>The 4-channel white-balance gains are defined in
143     * the order of [R G_even G_odd B], where G_even is the gain
144     * for green pixels on even rows of the output, and G_odd
145     * is the gain for greenpixels on the odd rows. if a HAL
146     * does not support a separate gain for even/odd green channels,
147     * it should use the G_even value,and write G_odd equal to
148     * G_even in the output result metadata.</p>
149     * <p>This array is either set by HAL when the request
150     * android.colorCorrection.mode is not TRANSFORM_MATRIX, or
151     * directly by the application in the request when the
152     * android.colorCorrection.mode is TRANSFORM_MATRIX.</p>
153     * <p>The ouput should be the gains actually applied by the HAL to
154     * the current frame.</p>
155     */
156    public static final Key<float[]> COLOR_CORRECTION_GAINS =
157            new Key<float[]>("android.colorCorrection.gains", float[].class);
158
159    /**
160     * <p>The ID sent with the latest
161     * CAMERA2_TRIGGER_PRECAPTURE_METERING call</p>
162     * <p>Must be 0 if no
163     * CAMERA2_TRIGGER_PRECAPTURE_METERING trigger received yet
164     * by HAL. Always updated even if AE algorithm ignores the
165     * trigger</p>
166     *
167     * @hide
168     */
169    public static final Key<Integer> CONTROL_AE_PRECAPTURE_ID =
170            new Key<Integer>("android.control.aePrecaptureId", int.class);
171
172    /**
173     * <p>List of areas to use for
174     * metering</p>
175     * <p>Each area is a rectangle plus weight: xmin, ymin,
176     * xmax, ymax, weight. The rectangle is defined inclusive of the
177     * specified coordinates.</p>
178     * <p>The coordinate system is based on the active pixel array,
179     * with (0,0) being the top-left pixel in the active pixel array, and
180     * (android.sensor.info.activeArraySize.width - 1,
181     * android.sensor.info.activeArraySize.height - 1) being the
182     * bottom-right pixel in the active pixel array. The weight
183     * should be nonnegative.</p>
184     * <p>If all regions have 0 weight, then no specific metering area
185     * needs to be used by the HAL. If the metering region is
186     * outside the current android.scaler.cropRegion, the HAL
187     * should ignore the sections outside the region and output the
188     * used sections in the frame metadata</p>
189     */
190    public static final Key<int[]> CONTROL_AE_REGIONS =
191            new Key<int[]>("android.control.aeRegions", int[].class);
192
193    /**
194     * <p>Current state of AE algorithm</p>
195     * <p>Whenever the AE algorithm state changes, a
196     * MSG_AUTOEXPOSURE notification must be send if a
197     * notification callback is registered.</p>
198     * @see #CONTROL_AE_STATE_INACTIVE
199     * @see #CONTROL_AE_STATE_SEARCHING
200     * @see #CONTROL_AE_STATE_CONVERGED
201     * @see #CONTROL_AE_STATE_LOCKED
202     * @see #CONTROL_AE_STATE_FLASH_REQUIRED
203     * @see #CONTROL_AE_STATE_PRECAPTURE
204     */
205    public static final Key<Integer> CONTROL_AE_STATE =
206            new Key<Integer>("android.control.aeState", int.class);
207
208    /**
209     * <p>Whether AF is currently enabled, and what
210     * mode it is set to</p>
211     * <p>Only effective if android.control.mode = AUTO.</p>
212     * <p>If lens is controlled by HAL auto-focus algorithm, the HAL should
213     * report the current AF status in android.control.afState in
214     * result metadata.</p>
215     * @see #CONTROL_AF_MODE_OFF
216     * @see #CONTROL_AF_MODE_AUTO
217     * @see #CONTROL_AF_MODE_MACRO
218     * @see #CONTROL_AF_MODE_CONTINUOUS_VIDEO
219     * @see #CONTROL_AF_MODE_CONTINUOUS_PICTURE
220     * @see #CONTROL_AF_MODE_EDOF
221     */
222    public static final Key<Integer> CONTROL_AF_MODE =
223            new Key<Integer>("android.control.afMode", int.class);
224
225    /**
226     * <p>List of areas to use for focus
227     * estimation</p>
228     * <p>Each area is a rectangle plus weight: xmin, ymin,
229     * xmax, ymax, weight. The rectangle is defined inclusive of the
230     * specified coordinates.</p>
231     * <p>The coordinate system is based on the active pixel array,
232     * with (0,0) being the top-left pixel in the active pixel array, and
233     * (android.sensor.info.activeArraySize.width - 1,
234     * android.sensor.info.activeArraySize.height - 1) being the
235     * bottom-right pixel in the active pixel array. The weight
236     * should be nonnegative.</p>
237     * <p>If all regions have 0 weight, then no specific focus area
238     * needs to be used by the HAL. If the focusing region is
239     * outside the current android.scaler.cropRegion, the HAL
240     * should ignore the sections outside the region and output the
241     * used sections in the frame metadata</p>
242     */
243    public static final Key<int[]> CONTROL_AF_REGIONS =
244            new Key<int[]>("android.control.afRegions", int[].class);
245
246    /**
247     * <p>Current state of AF algorithm</p>
248     * <p>Whenever the AF algorithm state changes, a
249     * MSG_AUTOFOCUS notification must be send if a notification
250     * callback is registered.</p>
251     * @see #CONTROL_AF_STATE_INACTIVE
252     * @see #CONTROL_AF_STATE_PASSIVE_SCAN
253     * @see #CONTROL_AF_STATE_PASSIVE_FOCUSED
254     * @see #CONTROL_AF_STATE_ACTIVE_SCAN
255     * @see #CONTROL_AF_STATE_FOCUSED_LOCKED
256     * @see #CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
257     * @see #CONTROL_AF_STATE_PASSIVE_UNFOCUSED
258     */
259    public static final Key<Integer> CONTROL_AF_STATE =
260            new Key<Integer>("android.control.afState", int.class);
261
262    /**
263     * <p>The ID sent with the latest
264     * CAMERA2_TRIGGER_AUTOFOCUS call</p>
265     * <p>Must be 0 if no CAMERA2_TRIGGER_AUTOFOCUS trigger
266     * received yet by HAL. Always updated even if AF algorithm
267     * ignores the trigger</p>
268     *
269     * @hide
270     */
271    public static final Key<Integer> CONTROL_AF_TRIGGER_ID =
272            new Key<Integer>("android.control.afTriggerId", int.class);
273
274    /**
275     * <p>Whether AWB is currently setting the color
276     * transform fields, and what its illumination target
277     * is</p>
278     * <p>[BC - AWB lock,AWB modes]</p>
279     * <p>Only effective if android.control.mode = AUTO.</p>
280     * @see #CONTROL_AWB_MODE_OFF
281     * @see #CONTROL_AWB_MODE_AUTO
282     * @see #CONTROL_AWB_MODE_INCANDESCENT
283     * @see #CONTROL_AWB_MODE_FLUORESCENT
284     * @see #CONTROL_AWB_MODE_WARM_FLUORESCENT
285     * @see #CONTROL_AWB_MODE_DAYLIGHT
286     * @see #CONTROL_AWB_MODE_CLOUDY_DAYLIGHT
287     * @see #CONTROL_AWB_MODE_TWILIGHT
288     * @see #CONTROL_AWB_MODE_SHADE
289     */
290    public static final Key<Integer> CONTROL_AWB_MODE =
291            new Key<Integer>("android.control.awbMode", int.class);
292
293    /**
294     * <p>List of areas to use for illuminant
295     * estimation</p>
296     * <p>Only used in AUTO mode.</p>
297     * <p>Each area is a rectangle plus weight: xmin, ymin,
298     * xmax, ymax, weight. The rectangle is defined inclusive of the
299     * specified coordinates.</p>
300     * <p>The coordinate system is based on the active pixel array,
301     * with (0,0) being the top-left pixel in the active pixel array, and
302     * (android.sensor.info.activeArraySize.width - 1,
303     * android.sensor.info.activeArraySize.height - 1) being the
304     * bottom-right pixel in the active pixel array. The weight
305     * should be nonnegative.</p>
306     * <p>If all regions have 0 weight, then no specific metering area
307     * needs to be used by the HAL. If the metering region is
308     * outside the current android.scaler.cropRegion, the HAL
309     * should ignore the sections outside the region and output the
310     * used sections in the frame metadata</p>
311     */
312    public static final Key<int[]> CONTROL_AWB_REGIONS =
313            new Key<int[]>("android.control.awbRegions", int[].class);
314
315    /**
316     * <p>Current state of AWB algorithm</p>
317     * <p>Whenever the AWB algorithm state changes, a
318     * MSG_AUTOWHITEBALANCE notification must be send if a
319     * notification callback is registered.</p>
320     * @see #CONTROL_AWB_STATE_INACTIVE
321     * @see #CONTROL_AWB_STATE_SEARCHING
322     * @see #CONTROL_AWB_STATE_CONVERGED
323     * @see #CONTROL_AWB_STATE_LOCKED
324     */
325    public static final Key<Integer> CONTROL_AWB_STATE =
326            new Key<Integer>("android.control.awbState", int.class);
327
328    /**
329     * <p>Overall mode of 3A control
330     * routines</p>
331     * <p>High-level 3A control. When set to OFF, all 3A control
332     * by the HAL is disabled. The application must set the fields for
333     * capture parameters itself.</p>
334     * <p>When set to AUTO, the individual algorithm controls in
335     * android.control.* are in effect, such as android.control.afMode.</p>
336     * <p>When set to USE_SCENE_MODE, the individual controls in
337     * android.control.* are mostly disabled, and the HAL implements
338     * one of the scene mode settings (such as ACTION, SUNSET, or PARTY)
339     * as it wishes. The HAL scene mode 3A settings are provided by
340     * android.control.sceneModeOverrides.</p>
341     * @see #CONTROL_MODE_OFF
342     * @see #CONTROL_MODE_AUTO
343     * @see #CONTROL_MODE_USE_SCENE_MODE
344     */
345    public static final Key<Integer> CONTROL_MODE =
346            new Key<Integer>("android.control.mode", int.class);
347
348    /**
349     * <p>Operation mode for edge
350     * enhancement</p>
351     * <p>Edge/sharpness/detail enhancement. OFF means no
352     * enhancement will be applied by the HAL.</p>
353     * <p>FAST/HIGH_QUALITY both mean HAL-determined enhancement
354     * will be applied. HIGH_QUALITY mode indicates that the
355     * HAL should use the highest-quality enhancement algorithms,
356     * even if it slows down capture rate. FAST means the HAL should
357     * not slow down capture rate when applying edge enhancement.</p>
358     * @see #EDGE_MODE_OFF
359     * @see #EDGE_MODE_FAST
360     * @see #EDGE_MODE_HIGH_QUALITY
361     */
362    public static final Key<Integer> EDGE_MODE =
363            new Key<Integer>("android.edge.mode", int.class);
364
365    /**
366     * <p>Select flash operation mode</p>
367     * @see #FLASH_MODE_OFF
368     * @see #FLASH_MODE_SINGLE
369     * @see #FLASH_MODE_TORCH
370     */
371    public static final Key<Integer> FLASH_MODE =
372            new Key<Integer>("android.flash.mode", int.class);
373
374    /**
375     * <p>Current state of the flash
376     * unit</p>
377     * @see #FLASH_STATE_UNAVAILABLE
378     * @see #FLASH_STATE_CHARGING
379     * @see #FLASH_STATE_READY
380     * @see #FLASH_STATE_FIRED
381     */
382    public static final Key<Integer> FLASH_STATE =
383            new Key<Integer>("android.flash.state", int.class);
384
385    /**
386     * <p>GPS coordinates to include in output JPEG
387     * EXIF</p>
388     */
389    public static final Key<double[]> JPEG_GPS_COORDINATES =
390            new Key<double[]>("android.jpeg.gpsCoordinates", double[].class);
391
392    /**
393     * <p>32 characters describing GPS algorithm to
394     * include in EXIF</p>
395     */
396    public static final Key<String> JPEG_GPS_PROCESSING_METHOD =
397            new Key<String>("android.jpeg.gpsProcessingMethod", String.class);
398
399    /**
400     * <p>Time GPS fix was made to include in
401     * EXIF</p>
402     */
403    public static final Key<Long> JPEG_GPS_TIMESTAMP =
404            new Key<Long>("android.jpeg.gpsTimestamp", long.class);
405
406    /**
407     * <p>Orientation of JPEG image to
408     * write</p>
409     */
410    public static final Key<Integer> JPEG_ORIENTATION =
411            new Key<Integer>("android.jpeg.orientation", int.class);
412
413    /**
414     * <p>Compression quality of the final JPEG
415     * image</p>
416     * <p>85-95 is typical usage range</p>
417     */
418    public static final Key<Byte> JPEG_QUALITY =
419            new Key<Byte>("android.jpeg.quality", byte.class);
420
421    /**
422     * <p>Compression quality of JPEG
423     * thumbnail</p>
424     */
425    public static final Key<Byte> JPEG_THUMBNAIL_QUALITY =
426            new Key<Byte>("android.jpeg.thumbnailQuality", byte.class);
427
428    /**
429     * <p>Resolution of embedded JPEG
430     * thumbnail</p>
431     */
432    public static final Key<android.hardware.camera2.Size> JPEG_THUMBNAIL_SIZE =
433            new Key<android.hardware.camera2.Size>("android.jpeg.thumbnailSize", android.hardware.camera2.Size.class);
434
435    /**
436     * <p>Size of the lens aperture</p>
437     * <p>Will not be supported on most devices. Can only
438     * pick from supported list</p>
439     */
440    public static final Key<Float> LENS_APERTURE =
441            new Key<Float>("android.lens.aperture", float.class);
442
443    /**
444     * <p>State of lens neutral density
445     * filter(s)</p>
446     * <p>Will not be supported on most devices. Can only
447     * pick from supported list</p>
448     */
449    public static final Key<Float> LENS_FILTER_DENSITY =
450            new Key<Float>("android.lens.filterDensity", float.class);
451
452    /**
453     * <p>Lens optical zoom setting</p>
454     * <p>Will not be supported on most devices.</p>
455     */
456    public static final Key<Float> LENS_FOCAL_LENGTH =
457            new Key<Float>("android.lens.focalLength", float.class);
458
459    /**
460     * <p>Distance to plane of sharpest focus,
461     * measured from frontmost surface of the lens</p>
462     * <p>Should be zero for fixed-focus cameras</p>
463     */
464    public static final Key<Float> LENS_FOCUS_DISTANCE =
465            new Key<Float>("android.lens.focusDistance", float.class);
466
467    /**
468     * <p>The range of scene distances that are in
469     * sharp focus (depth of field)</p>
470     * <p>If variable focus not supported, can still report
471     * fixed depth of field range</p>
472     */
473    public static final Key<float[]> LENS_FOCUS_RANGE =
474            new Key<float[]>("android.lens.focusRange", float[].class);
475
476    /**
477     * <p>Whether optical image stabilization is
478     * enabled.</p>
479     * <p>Will not be supported on most devices.</p>
480     * @see #LENS_OPTICAL_STABILIZATION_MODE_OFF
481     * @see #LENS_OPTICAL_STABILIZATION_MODE_ON
482     */
483    public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE =
484            new Key<Integer>("android.lens.opticalStabilizationMode", int.class);
485
486    /**
487     * <p>Current lens status</p>
488     * @see #LENS_STATE_STATIONARY
489     * @see #LENS_STATE_MOVING
490     */
491    public static final Key<Integer> LENS_STATE =
492            new Key<Integer>("android.lens.state", int.class);
493
494    /**
495     * <p>Mode of operation for the noise reduction
496     * algorithm</p>
497     * <p>Noise filtering control. OFF means no noise reduction
498     * will be applied by the HAL.</p>
499     * <p>FAST/HIGH_QUALITY both mean HAL-determined noise filtering
500     * will be applied. HIGH_QUALITY mode indicates that the HAL
501     * should use the highest-quality noise filtering algorithms,
502     * even if it slows down capture rate. FAST means the HAL should not
503     * slow down capture rate when applying noise filtering.</p>
504     * @see #NOISE_REDUCTION_MODE_OFF
505     * @see #NOISE_REDUCTION_MODE_FAST
506     * @see #NOISE_REDUCTION_MODE_HIGH_QUALITY
507     */
508    public static final Key<Integer> NOISE_REDUCTION_MODE =
509            new Key<Integer>("android.noiseReduction.mode", int.class);
510
511    /**
512     * <p>Whether a result given to the framework is the
513     * final one for the capture, or only a partial that contains a
514     * subset of the full set of dynamic metadata
515     * values.</p>
516     * <p>The entries in the result metadata buffers for a
517     * single capture may not overlap, except for this entry. The
518     * FINAL buffers must retain FIFO ordering relative to the
519     * requests that generate them, so the FINAL buffer for frame 3 must
520     * always be sent to the framework after the FINAL buffer for frame 2, and
521     * before the FINAL buffer for frame 4. PARTIAL buffers may be returned
522     * in any order relative to other frames, but all PARTIAL buffers for a given
523     * capture must arrive before the FINAL buffer for that capture. This entry may
524     * only be used by the HAL if quirks.usePartialResult is set to 1.</p>
525     *
526     * <b>Optional</b> - This value may be null on some devices.
527     *
528     * @hide
529     */
530    public static final Key<Boolean> QUIRKS_PARTIAL_RESULT =
531            new Key<Boolean>("android.quirks.partialResult", boolean.class);
532
533    /**
534     * <p>A frame counter set by the framework. This value monotonically
535     * increases with every new result (that is, each new result has a unique
536     * frameCount value).</p>
537     * <p>Reset on release()</p>
538     */
539    public static final Key<Integer> REQUEST_FRAME_COUNT =
540            new Key<Integer>("android.request.frameCount", int.class);
541
542    /**
543     * <p>An application-specified ID for the current
544     * request. Must be maintained unchanged in output
545     * frame</p>
546     *
547     * @hide
548     */
549    public static final Key<Integer> REQUEST_ID =
550            new Key<Integer>("android.request.id", int.class);
551
552    /**
553     * <p>(x, y, width, height).</p>
554     * <p>A rectangle with the top-level corner of (x,y) and size
555     * (width, height). The region of the sensor that is used for
556     * output. Each stream must use this rectangle to produce its
557     * output, cropping to a smaller region if necessary to
558     * maintain the stream's aspect ratio.</p>
559     * <p>HAL2.x uses only (x, y, width)</p>
560     * <p>Any additional per-stream cropping must be done to
561     * maximize the final pixel area of the stream.</p>
562     * <p>For example, if the crop region is set to a 4:3 aspect
563     * ratio, then 4:3 streams should use the exact crop
564     * region. 16:9 streams should further crop vertically
565     * (letterbox).</p>
566     * <p>Conversely, if the crop region is set to a 16:9, then 4:3
567     * outputs should crop horizontally (pillarbox), and 16:9
568     * streams should match exactly. These additional crops must
569     * be centered within the crop region.</p>
570     * <p>The output streams must maintain square pixels at all
571     * times, no matter what the relative aspect ratios of the
572     * crop region and the stream are.  Negative values for
573     * corner are allowed for raw output if full pixel array is
574     * larger than active pixel array. Width and height may be
575     * rounded to nearest larger supportable width, especially
576     * for raw output, where only a few fixed scales may be
577     * possible. The width and height of the crop region cannot
578     * be set to be smaller than floor( activeArraySize.width /
579     * android.scaler.maxDigitalZoom ) and floor(
580     * activeArraySize.height / android.scaler.maxDigitalZoom),
581     * respectively.</p>
582     */
583    public static final Key<android.graphics.Rect> SCALER_CROP_REGION =
584            new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class);
585
586    /**
587     * <p>Duration each pixel is exposed to
588     * light.</p>
589     * <p>If the sensor can't expose this exact duration, it should shorten the
590     * duration exposed to the nearest possible value (rather than expose longer).</p>
591     * <p>1/10000 - 30 sec range. No bulb mode</p>
592     */
593    public static final Key<Long> SENSOR_EXPOSURE_TIME =
594            new Key<Long>("android.sensor.exposureTime", long.class);
595
596    /**
597     * <p>Duration from start of frame exposure to
598     * start of next frame exposure</p>
599     * <p>Exposure time has priority, so duration is set to
600     * max(duration, exposure time + overhead)</p>
601     */
602    public static final Key<Long> SENSOR_FRAME_DURATION =
603            new Key<Long>("android.sensor.frameDuration", long.class);
604
605    /**
606     * <p>Gain applied to image data. Must be
607     * implemented through analog gain only if set to values
608     * below 'maximum analog sensitivity'.</p>
609     * <p>If the sensor can't apply this exact gain, it should lessen the
610     * gain to the nearest possible value (rather than gain more).</p>
611     * <p>ISO 12232:2006 REI method</p>
612     */
613    public static final Key<Integer> SENSOR_SENSITIVITY =
614            new Key<Integer>("android.sensor.sensitivity", int.class);
615
616    /**
617     * <p>Time at start of exposure of first
618     * row</p>
619     * <p>Monotonic, should be synced to other timestamps in
620     * system</p>
621     */
622    public static final Key<Long> SENSOR_TIMESTAMP =
623            new Key<Long>("android.sensor.timestamp", long.class);
624
625    /**
626     * <p>The temperature of the sensor, sampled at the time
627     * exposure began for this frame.</p>
628     * <p>The thermal diode being queried should be inside the sensor PCB, or
629     * somewhere close to it.</p>
630     *
631     * <b>Optional</b> - This value may be null on some devices.
632     *
633     * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> -
634     * Present on all devices that report being FULL level hardware devices in the
635     * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key.
636     */
637    public static final Key<Float> SENSOR_TEMPERATURE =
638            new Key<Float>("android.sensor.temperature", float.class);
639
640    /**
641     * <p>State of the face detector
642     * unit</p>
643     * <p>Whether face detection is enabled, and whether it
644     * should output just the basic fields or the full set of
645     * fields. Value must be one of the
646     * android.statistics.info.availableFaceDetectModes.</p>
647     * @see #STATISTICS_FACE_DETECT_MODE_OFF
648     * @see #STATISTICS_FACE_DETECT_MODE_SIMPLE
649     * @see #STATISTICS_FACE_DETECT_MODE_FULL
650     */
651    public static final Key<Integer> STATISTICS_FACE_DETECT_MODE =
652            new Key<Integer>("android.statistics.faceDetectMode", int.class);
653
654    /**
655     * <p>List of unique IDs for detected
656     * faces</p>
657     * <p>Only available if faceDetectMode == FULL</p>
658     *
659     * @hide
660     */
661    public static final Key<int[]> STATISTICS_FACE_IDS =
662            new Key<int[]>("android.statistics.faceIds", int[].class);
663
664    /**
665     * <p>List of landmarks for detected
666     * faces</p>
667     * <p>Only available if faceDetectMode == FULL</p>
668     *
669     * @hide
670     */
671    public static final Key<int[]> STATISTICS_FACE_LANDMARKS =
672            new Key<int[]>("android.statistics.faceLandmarks", int[].class);
673
674    /**
675     * <p>List of the bounding rectangles for detected
676     * faces</p>
677     * <p>Only available if faceDetectMode != OFF</p>
678     *
679     * @hide
680     */
681    public static final Key<android.graphics.Rect[]> STATISTICS_FACE_RECTANGLES =
682            new Key<android.graphics.Rect[]>("android.statistics.faceRectangles", android.graphics.Rect[].class);
683
684    /**
685     * <p>List of the face confidence scores for
686     * detected faces</p>
687     * <p>Only available if faceDetectMode != OFF. The value should be
688     * meaningful (for example, setting 100 at all times is illegal).</p>
689     *
690     * @hide
691     */
692    public static final Key<byte[]> STATISTICS_FACE_SCORES =
693            new Key<byte[]>("android.statistics.faceScores", byte[].class);
694
695    /**
696     * <p>The shading map is a low-resolution floating-point map
697     * that lists the coefficients used to correct for vignetting, for each
698     * Bayer color channel.</p>
699     * <p>The least shaded section of the image should have a gain factor
700     * of 1; all other sections should have gains above 1.</p>
701     * <p>When android.colorCorrection.mode = TRANSFORM_MATRIX, the map
702     * must take into account the colorCorrection settings.</p>
703     * <p>The shading map is for the entire active pixel array, and is not
704     * affected by the crop region specified in the request. Each shading map
705     * entry is the value of the shading compensation map over a specific
706     * pixel on the sensor.  Specifically, with a (N x M) resolution shading
707     * map, and an active pixel array size (W x H), shading map entry
708     * (x,y) ϵ (0 ... N-1, 0 ... M-1) is the value of the shading map at
709     * pixel ( ((W-1)/(N-1)) * x, ((H-1)/(M-1)) * y) for the four color channels.
710     * The map is assumed to be bilinearly interpolated between the sample points.</p>
711     * <p>The channel order is [R, Geven, Godd, B], where Geven is the green
712     * channel for the even rows of a Bayer pattern, and Godd is the odd rows.
713     * The shading map is stored in a fully interleaved format, and its size
714     * is provided in the camera static metadata by android.lens.info.shadingMapSize.</p>
715     * <p>The shading map should have on the order of 30-40 rows and columns,
716     * and must be smaller than 64x64.</p>
717     * <p>As an example, given a very small map defined as:</p>
718     * <pre><code>android.lens.info.shadingMapSize = [ 4, 3 ]
719     * android.statistics.lensShadingMap =
720     * [ 1.3, 1.2, 1.15, 1.2,  1.2, 1.2, 1.15, 1.2,
721     *     1.1, 1.2, 1.2, 1.2,  1.3, 1.2, 1.3, 1.3,
722     *   1.2, 1.2, 1.25, 1.1,  1.1, 1.1, 1.1, 1.0,
723     *     1.0, 1.0, 1.0, 1.0,  1.2, 1.3, 1.25, 1.2,
724     *   1.3, 1.2, 1.2, 1.3,   1.2, 1.15, 1.1, 1.2,
725     *     1.2, 1.1, 1.0, 1.2,  1.3, 1.15, 1.2, 1.3 ]
726     * </code></pre>
727     * <p>The low-resolution scaling map images for each channel are
728     * (displayed using nearest-neighbor interpolation):</p>
729     * <p><img alt="Red lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/red_shading.png" />
730     * <img alt="Green (even rows) lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/green_e_shading.png" />
731     * <img alt="Green (odd rows) lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/green_o_shading.png" />
732     * <img alt="Blue lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/blue_shading.png" /></p>
733     * <p>As a visualization only, inverting the full-color map to recover an
734     * image of a gray wall (using bicubic interpolation for visual quality) as captured by the sensor gives:</p>
735     * <p><img alt="Image of a uniform white wall (inverse shading map)" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/inv_shading.png" /></p>
736     */
737    public static final Key<float[]> STATISTICS_LENS_SHADING_MAP =
738            new Key<float[]>("android.statistics.lensShadingMap", float[].class);
739
740    /**
741     * <p>The best-fit color channel gains calculated
742     * by the HAL's statistics units for the current output frame</p>
743     * <p>This may be different than the gains used for this frame,
744     * since statistics processing on data from a new frame
745     * typically completes after the transform has already been
746     * applied to that frame.</p>
747     * <p>The 4 channel gains are defined in Bayer domain,
748     * see android.colorCorrection.gains for details.</p>
749     * <p>This value should always be calculated by the AWB block,
750     * regardless of the android.control.* current values.</p>
751     */
752    public static final Key<float[]> STATISTICS_PREDICTED_COLOR_GAINS =
753            new Key<float[]>("android.statistics.predictedColorGains", float[].class);
754
755    /**
756     * <p>The best-fit color transform matrix estimate
757     * calculated by the HAL's statistics units for the current
758     * output frame</p>
759     * <p>The HAL must provide the estimate from its
760     * statistics unit on the white balance transforms to use
761     * for the next frame. These are the values the HAL believes
762     * are the best fit for the current output frame. This may
763     * be different than the transform used for this frame, since
764     * statistics processing on data from a new frame typically
765     * completes after the transform has already been applied to
766     * that frame.</p>
767     * <p>These estimates must be provided for all frames, even if
768     * capture settings and color transforms are set by the application.</p>
769     * <p>This value should always be calculated by the AWB block,
770     * regardless of the android.control.* current values.</p>
771     */
772    public static final Key<Rational[]> STATISTICS_PREDICTED_COLOR_TRANSFORM =
773            new Key<Rational[]>("android.statistics.predictedColorTransform", Rational[].class);
774
775    /**
776     * <p>The HAL estimated scene illumination lighting
777     * frequency</p>
778     * <p>Report NONE if there doesn't appear to be flickering
779     * illumination</p>
780     * @see #STATISTICS_SCENE_FLICKER_NONE
781     * @see #STATISTICS_SCENE_FLICKER_50HZ
782     * @see #STATISTICS_SCENE_FLICKER_60HZ
783     */
784    public static final Key<Integer> STATISTICS_SCENE_FLICKER =
785            new Key<Integer>("android.statistics.sceneFlicker", int.class);
786
787    /**
788     * <p>Table mapping blue input values to output
789     * values</p>
790     * <p>Tonemapping / contrast / gamma curve for the blue
791     * channel, to use when android.tonemap.mode is CONTRAST_CURVE.</p>
792     * <p>See android.tonemap.curveRed for more details.</p>
793     */
794    public static final Key<float[]> TONEMAP_CURVE_BLUE =
795            new Key<float[]>("android.tonemap.curveBlue", float[].class);
796
797    /**
798     * <p>Table mapping green input values to output
799     * values</p>
800     * <p>Tonemapping / contrast / gamma curve for the green
801     * channel, to use when android.tonemap.mode is CONTRAST_CURVE.</p>
802     * <p>See android.tonemap.curveRed for more details.</p>
803     */
804    public static final Key<float[]> TONEMAP_CURVE_GREEN =
805            new Key<float[]>("android.tonemap.curveGreen", float[].class);
806
807    /**
808     * <p>Table mapping red input values to output
809     * values</p>
810     * <p>Tonemapping / contrast / gamma curve for the red
811     * channel, to use when android.tonemap.mode is CONTRAST_CURVE.</p>
812     * <p>Since the input and output ranges may vary depending on
813     * the camera pipeline, the input and output pixel values
814     * are represented by normalized floating-point values
815     * between 0 and 1, with 0 == black and 1 == white.</p>
816     * <p>The curve should be linearly interpolated between the
817     * defined points. The points will be listed in increasing
818     * order of P_IN. For example, if the array is: [0.0, 0.0,
819     * 0.3, 0.5, 1.0, 1.0], then the input-&gt;output mapping
820     * for a few sample points would be: 0 -&gt; 0, 0.15 -&gt;
821     * 0.25, 0.3 -&gt; 0.5, 0.5 -&gt; 0.64</p>
822     */
823    public static final Key<float[]> TONEMAP_CURVE_RED =
824            new Key<float[]>("android.tonemap.curveRed", float[].class);
825
826    /**
827     * @see #TONEMAP_MODE_CONTRAST_CURVE
828     * @see #TONEMAP_MODE_FAST
829     * @see #TONEMAP_MODE_HIGH_QUALITY
830     */
831    public static final Key<Integer> TONEMAP_MODE =
832            new Key<Integer>("android.tonemap.mode", int.class);
833
834    /**
835     * <p>This LED is nominally used to indicate to the user
836     * that the camera is powered on and may be streaming images back to the
837     * Application Processor. In certain rare circumstances, the OS may
838     * disable this when video is processed locally and not transmitted to
839     * any untrusted applications.</p>
840     * <p>In particular, the LED <em>must</em> always be on when the data could be
841     * transmitted off the device. The LED <em>should</em> always be on whenever
842     * data is stored locally on the device.</p>
843     * <p>The LED <em>may</em> be off if a trusted application is using the data that
844     * doesn't violate the above rules.</p>
845     *
846     * @hide
847     */
848    public static final Key<Boolean> LED_TRANSMIT =
849            new Key<Boolean>("android.led.transmit", boolean.class);
850
851    /**
852     * <p>Whether black-level compensation is locked
853     * to its current values, or is free to vary</p>
854     * <p>Whether the black level offset was locked for this frame.
855     * Should be ON if android.blackLevel.lock was ON in the capture request,
856     * unless a change in capture settings forced a black level reset.</p>
857     */
858    public static final Key<Boolean> BLACK_LEVEL_LOCK =
859            new Key<Boolean>("android.blackLevel.lock", boolean.class);
860
861    /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
862     * End generated code
863     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
864
865    /**
866     * <p>
867     * List of the {@link Face Faces} detected through camera face detection
868     * in this result.
869     * </p>
870     * <p>
871     * Only available if {@link #STATISTICS_FACE_DETECT_MODE} {@code !=}
872     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_OFF OFF}.
873     * </p>
874     *
875     * @see Face
876     */
877    public static final Key<Face[]> STATISTICS_FACES =
878            new Key<Face[]>("android.statistics.faces", Face[].class);
879}
880