aboutsummaryrefslogtreecommitdiffstats
path: root/7_hardware-compatibility/7_5_cameras.md
blob: 2f7bad04b30de498d7ab581a59b2b70803bbc515 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
## 7.5\. Cameras

If device implementations include at least one camera, they:

*   [C-1-1] MUST declare the `android.hardware.camera.any` feature flag.
*   [C-1-2] MUST be possible for an application to simultaneously allocate
3 RGBA_8888 bitmaps equal to the size of the images produced by the
largest-resolution camera sensor on the device, while camera is open for the
purpose of basic preview and still capture.
*   [C-1-3] MUST ensure that the preinstalled default camera application
handling intents [`MediaStore.ACTION_IMAGE_CAPTURE`](https://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE),
[`MediaStore.ACTION_IMAGE_CAPTURE_SECURE`](https://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE_SECURE),
or
[`MediaStore.ACTION_VIDEO_CAPTURE`](https://developer.android.com/reference/android/provider/MediaStore.html#ACTION_VIDEO_CAPTURE),
is responsible for removing the user location in the image metadata before
sending it to the receiving application when the receiving application does not
have [`ACCESS_FINE_LOCATION`](https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_FINE_LOCATION).

### 7.5.1\. Rear-Facing Camera

A rear-facing camera is a camera located on the side of
the device opposite the display; that is, it images scenes on the far side of
the device, like a traditional camera.

Device implementations:

*   SHOULD include a rear-facing camera.

If device implementations include at least one rear-facing camera, they:

*   [C-1-1] MUST report the feature flag `android.hardware.camera` and
`android.hardware.camera.any`.
*   [C-1-2] MUST have a resolution of at least 2 megapixels.
*   SHOULD have either hardware auto-focus or software auto-focus implemented
in the camera driver (transparent to application software).
*   MAY have fixed-focus or EDOF (extended depth of field) hardware.
*   MAY include a flash.

If the camera includes a flash:

*    [C-2-1] the flash lamp MUST NOT be lit while an
`android.hardware.Camera.PreviewCallback` instance has been registered
on a Camera preview surface, unless the application has explicitly enabled
the flash by enabling the `FLASH_MODE_AUTO` or `FLASH_MODE_ON` attributes
of a `Camera.Parameters` object. Note that this constraint does not apply to the
device’s built-in system camera application, but only to third-party
applications using `Camera.PreviewCallback`.

### 7.5.2\. Front-Facing Camera

A front-facing camera is a camera located on the same side of the device
as the display; that is, a camera typically used to image the user, such
as for video conferencing and similar applications.

Device implementations:

*   MAY include a front-facing camera.

If device implementations include at least one front-facing camera, they:

*   [C-1-1] MUST report the feature flag `android.hardware.camera.any` and
`android.hardware.camera.front`.
*   [C-1-2] MUST have a resolution of at least VGA (640x480 pixels).
*   [C-1-3] MUST NOT use a front-facing camera as the default for the
Camera API and MUST NOT configure the API to treat a front-facing camera as
the default rear-facing camera, even if it is the only camera on the device.
*   [C-1-4] The camera preview MUST be mirrored horizontally relative to the
orientation specified by the application when the current application has
explicitly requested that the Camera
display be rotated via a call to the
[`android.hardware.Camera.setDisplayOrientation()`](
http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int))
method. Conversely, the preview MUST be mirrored along the device’s default
horizontal axis when the current application does not explicitly request
that the Camera display be rotated via a call to the
[`android.hardware.Camera.setDisplayOrientation()`](
http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int))
method.
*   [C-1-5] MUST NOT mirror the final captured still image or video streams
returned to application callbacks or committed to media storage.
*   [C-1-6] MUST mirror the image displayed by the postview in the same manner
as the camera preview image stream.
*   MAY include features (such as auto-focus, flash, etc.) available to
rear-facing cameras as described in [section 7.5.1](#7_5_1_rear-facing_camera).

If device implementations are capable of being rotated by user (such as
automatically via an accelerometer or manually via user input):

*    [C-2-1] The camera preview MUST be mirrored horizontally relative to
the device’s current orientation.

### 7.5.3\. External Camera

Device implementations:

*    MAY include support for an external camera that is not necessarily
always connected.

If device implementations include support for an external camera, they:

*   [C-1-1] MUST declare the platform feature flag
`android.hardware.camera.external` and `android.hardware camera.any`.
*   [C-1-2] MUST support USB Video Class (UVC 1.0 or higher) if the external
camera connects through the USB host port.
*   [C-1-3] MUST pass camera CTS tests with a physical external camera device
connected. Details of camera CTS testing are available at [source.android.com](
https://source.android.com/compatibility/cts/camera-hal).
*   SHOULD support video compressions such as MJPEG to enable transfer of
    high-quality unencoded streams (i.e. raw or independently compressed picture
    streams).
*   MAY support multiple cameras.
*   MAY support camera-based video encoding.

If camera-based video encoding is supported:

*    [C-2-1] A simultaneous
    unencoded / MJPEG stream (QVGA or greater resolution) MUST be accessible to
    the device implementation.

### 7.5.4\. Camera API Behavior

Android includes two API packages to access the camera, the newer
android.hardware.camera2 API expose lower-level camera control to the app,
including efficient zero-copy burst/streaming flows and per-frame controls of
exposure, gain, white balance gains, color conversion, denoising, sharpening,
and more.

The older API package,`android.hardware.Camera`, is marked as deprecated in
Android 5.0 but as it should still be available for apps to use. Android device
implementations MUST ensure the continued support of the API as described in
this section and in the Android SDK.

All features that are common between the deprecated android.hardware.Camera class
and the newer android.hardware.camera2 package MUST have equivalent performance
and quality in both APIs. For example, with equivalent settings,
autofocus speed and accuracy must be identical, and the quality of captured images
must be the same. Features that depend on the different semantics of the two APIs
are not required to have matching speed or quality, but SHOULD match as closely
as possible.

Device implementations MUST implement the following behaviors for the
camera-related APIs, for all available cameras. Device implementations:

*   [C-0-1] MUST use `android.hardware.PixelFormat.YCbCr_420_SP` for preview
data provided to application callbacks when an application has never called
`android.hardware.Camera.Parameters.setPreviewFormat(int)`.
*   [C-0-2] MUST further be in the NV21 encoding format when an application
registers an `android.hardware.Camera.PreviewCallback`
instance and the system calls the `onPreviewFrame()` method and the preview
format is YCbCr_420_SP, the data in the byte[] passed into `onPreviewFrame()`.
That is, NV21 MUST be the default.
*   [C-0-3] MUST support the YV12 format (as denoted by the
`android.graphics.ImageFormat.YV12` constant) for camera previews for both
front- and rear-facing cameras for `android.hardware.Camera`. (The hardware
video encoder and camera may use any native pixel format, but the device
implementation MUST support conversion to YV12.)
*   [C-0-4] MUST support the `android.hardware.ImageFormat.YUV_420_888` and
`android.hardware.ImageFormat.JPEG` formats as outputs through the
`android.media.ImageReader` API for `android.hardware.camera2` devices that
advertise [`REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE`](
https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)
 capability in [`android.request.availableCapabilities`](
 https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#REQUEST_AVAILABLE_CAPABILITIES).
*   [C-0-5] MUST still implement the full [Camera API](
http://developer.android.com/reference/android/hardware/Camera.html)
included in the Android SDK documentation, regardless of whether the device
includes hardware autofocus or other capabilities. For instance, cameras that
lack autofocus MUST still call any registered
`android.hardware.Camera.AutoFocusCallback` instances (even though this has no
relevance to a non-autofocus camera.) Note that this does apply to front-facing
cameras; for instance, even though most front-facing cameras do not support
autofocus, the API callbacks must still be “faked” as described.
*   [C-0-6] MUST recognize and honor each parameter name
defined as a constant in the
[`android.hardware.Camera.Parameters`](
https://developer.android.com/reference/android/hardware/Camera.Parameters.html)
class and the [`android.hardware.camera2.CaptureRequest`](
https://developer.android.com/reference/android/hardware/camera2/CaptureRequest) class.
Conversely, device implementations MUST NOT honor or recognize string constants
passed to the `android.hardware.Camera.setParameters()` method other than those
documented as constants on the `android.hardware.Camera.Parameters`. That is,
device implementations MUST support all standard Camera parameters if the
hardware allows, and MUST NOT support custom Camera parameter types.
For instance, device implementations that support image capture
using high dynamic range (HDR) imaging techniques MUST support camera parameter
`Camera.SCENE_MODE_HDR`.
*   [C-0-7] MUST report the proper level of support with the
[`android.info.supportedHardwareLevel`](
https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL)
property as described in the Android SDK and report the appropriate
[framework feature flags](
http://source.android.com/devices/camera/versioning.html).
*   [C-0-8] MUST also declare its individual camera capabilities of
`android.hardware.camera2` via the
`android.request.availableCapabilities` property
and declare the appropriate [feature flags](
http://source.android.com/devices/camera/versioning.html);
MUST define the feature flag if any of its attached camera devices
supports the feature.
*   [C-0-9] MUST broadcast the `Camera.ACTION_NEW_PICTURE`
intent whenever a new picture is taken by the camera and the entry of the
picture has been added to the media store.
*   [C-0-10] MUST broadcast the `Camera.ACTION_NEW_VIDEO`
intent whenever a new video is recorded by the camera and the entry of the
picture has been added to the media store.
*   [C-0-11] MUST have all cameras accessible via the deprecated
[`android.hardware.Camera`](https://developer.android.com/reference/android/hardware/Camera)
API also accessible via the [`android.hardware.camera2`](https://developer.android.com/reference/android/hardware/camera2/package-summary)
API.
*   [C-0-12] MUST ensure that the facial appearance is NOT altered, including
    but not limited to altering facial geometry, facial skin tone, or facial
    skin smoothening for any [`android.hardware.camera2`](https://developer.android.com/reference/android/hardware/camera2/package-summary)
    or [`android.hardware.Camera`](https://developer.android.com/reference/android/hardware/Camera)
    API.
*   [C-SR] For devices with multiple RGB cameras facing in the same direction,
are STRONGLY RECOMMENDED to support a logical camera device that lists
capability
[`CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA`](
https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA),
consisting of all of the RGB cameras facing that direction as physical sub-devices.

If device implementations provide a proprietary camera API to 3rd-party apps,
they:

*   [C-1-1] MUST implement such a camera API using [`android.hardware.camera2`](https://developer.android.com/reference/android/hardware/camera2/package-summary)
API.
*   MAY provide vendor tags and/or extensions to [`android.hardware.camera2`](https://developer.android.com/reference/android/hardware/camera2/package-summary)
API.

### 7.5.5\. Camera Orientation

If device implementations have a front- or a rear-facing camera, such camera(s):

*   [C-1-1] MUST be oriented so that the long dimension of the camera
aligns with the screen’s long dimension. That is, when the device is held in the
landscape orientation, cameras MUST capture images in the landscape orientation.
This applies regardless of the device’s natural orientation; that is, it applies
to landscape-primary devices as well as portrait-primary devices.