blob: 4fec037bfdeaab5b6ec171c034ddeaf80d7fb67f [file] [log] [blame]
lpage.title=Camera Version Support
@jd:body
<!--
Copyright 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
<ol id="auto-toc">
</ol>
</div>
</div>
<p>This page details version differences in Camera HALs, APIs, and associated
Android Compatibility Test Suite (CTS) tests. It also covers several
architectural changes made to harden and secure the camera framework in Android
7.0 and the updates vendors must make to support these changes in their camera
implementations.</p>
<h2 id=glossary>Terminology</h2>
<p>The following terms are used on this page:</p>
<dl>
<dt>Camera API1</dt>
<dd>The app-level camera framework on Android 4.4 and earlier devices, exposed
through the <code>android.hardware.Camera</code> class.</dd>
<dt>Camera API2</dt>
<dd>The app-level camera framework on Android 5.0 and later devices, exposed
through the<code> android.hardware.camera2</code> package.</dd>
<dt>Camera HAL</dt>
<dd>The camera module layer implemented by SoC vendors. The app-level public
frameworks are built on top of the camera HAL.</dd>
<dt>Camera HAL3.1</dt>
<dd>Version of the camera device HAL released with Android 4.4.</dd>
<dt>Camera HAL3.2</dt>
<dd>Version of the camera device HAL released with Android 5.0.</dd>
<dt>Camera API1 CTS</dt>
<dd>Set of camera Compatibility Test Suite (CTS) tests that run on top of Camera
API1.</dd>
<dt>Camera API2 CTS</dt>
<dd>Additional set of camera CTS tests that run on top of Camera API2.</dd>
</dl>
<h2 id=camera_apis>Camera APIs</h2>
<p>Android includes the following camera APIs.</p>
<h3 id=camera_api1>Camera API1</h3>
<p>Android 5.0 deprecated Camera API1, which continues to be phased out as new
platform development focuses on Camera API2. However, the phase-out period will
be lengthy, and Android releases will continue to support Camera API1 apps for
some time. Specifically, support continues for:</p>
<ul>
<li><em>Camera API1 interfaces for apps</em>. Camera apps built on top of Camera
API1 should work as they do on devices running earlier Android release versions.
</li>
<li><em>Camera HAL versions</em>. Includes support for Camera HAL1.0.</li>
</ul>
<h3 id=camera_api2>Camera API2</h3>
<p>The Camera API2 framework exposes 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. For details, watch the
<a href="https://www.youtube.com/watch?v=92fgcUNCHic&feature=youtu.be&t=29m50s">Google
I/O video overview</a>.</p>
<p>Android 5.0 and later includes Camera API2; however, devices running Android
5.0 and later may not support all Camera API2 features. The
<code>android.info.supportedHardwareLevel</code> property that apps can query
through the Camera API2 interfaces reports one of the following support
levels:</p>
<ul>
<li><code>LEGACY</code>. These devices expose capabilities to apps through the
Camera API2 interfaces that are approximately the same capabilities as those
exposed to apps through the Camera API1 interfaces. The legacy frameworks code
conceptually translates Camera API2 calls into Camera API1 calls; legacy devices
do not support Camera API2 features such as per-frame controls.</li>
<li><code>FULL</code>. These devices support all of major capabilities of Camera
API2 and must use Camera HAL 3.2 or later and Android 5.0 or later.</li>
<li><code>LIMITED</code>. These devices support some Camera API2 capabilities
(but not all) and must use Camera HAL 3.2 or later.</li>
</ul>
<p>Individual capabilities are exposed via the
<code>android.request.availableCapabilities</code> property in the Camera API2
interfaces. <code>FULL</code> devices require the <code>MANUAL_SENSOR</code> and
<code>MANUAL_POST_PROCESSING</code> capabilities, among others. The
<code>RAW</code> capability is optional even for <code>FULL</code> devices.
<code>LIMITED</code> devices can advertise any subset of these capabilities,
including none of them. However, the <code>BACKWARD_COMPATIBLE</code> capability
must always be defined.</p>
<p>The supported hardware level of the device, as well as the specific Camera
API2 capabilities it supports, are available as the following feature flags to
allow Google Play filtering of Camera API2 camera apps.</p>
<ul>
<li><code>android.hardware.camera.hardware_level.full</code>
<li><code>android.hardware.camera.capability.raw</code>
<li><code>android.hardware.camera.capability.manual_sensor</code>
<li><code>android.hardware.camera.capability.manual_post_processing</code>
</ul>
<h2 id=cts_requirements>CTS requirements</h2>
<p>Devices running Android 5.0 and later must pass the Camera API1 CTS, Camera
API2 CTS, and CTS Verifier camera tests.</p>
<p>Devices that do not feature a Camera HAL3.2 implementation and are not
capable of supporting the full Camera API2 interfaces must still pass the Camera
API2 CTS tests. However, the device will be running in Camera API2
<code>LEGACY</code> mode (in which the Camera API2 calls are conceptually mapped
to Camera API1 calls) so any Camera API2 CTS tests related to features or
capabilities beyond Camera API1 will be automatically skipped.</p>
<p>On legacy devices, Camera API2 CTS tests that are not skipped use the
existing public Camera API1 interfaces and capabilities with no new
requirements. Bugs that are exposed (and which cause a Camera API2 CTS failure)
are bugs already present in the device’s existing Camera HAL, and thus would
be found by existing Camera API1 apps. We do not expect many bugs of this nature
(however, any such bugs must be fixed to pass the Camera API2 CTS tests).</p>
<h2 id=hardening>Camera framework hardening</h2>
<p>To harden media and camera framework security, Android 7.0 moves camera
service out of mediaserver. Vendors may need to make changes in the camera HAL
depending on the API and HAL versions in use. The following sections detail
architectural changes in AP1 and AP2 for HAL1 and HAL3, as well as general
requirements.</p>
<h3 id=hardening_api1>Architectural changes for API1</h3>
<p>API1 video recording may assume camera and video encoder live in the same
process. When using API1 on:</p>
<ul>
<li>HAL3, where camera service uses BufferQueue to pass buffers between
processes, <strong>no vendor update</strong> is necessary.
<p><img src="images/ape_camera_n_api1_hal3.png" alt="Android 7.0 camera and media
stack in API1 on HAL3" id="figure1" /></p>
<p class="img-caption"><strong>Figure 1.</strong>Android 7.0 camera and media
stack in API1 on HAL3.</p>
</li>
<li>HAL1, which supports passing metadata in video buffers, <strong>vendors must
update the HAL to use kMetadataBufferTypeNativeHandleSource</strong>.
(<code>kMetadataBufferTypeCameraSource</code> is no longer supported in Android
7.0.)
<p><img src="images/ape_camera_n_api1_hal1.png" alt="Android 7.0 camera and media
stack in API1 on HAL1" id="figure1" /></p>
<p class="img-caption"><strong>Figure 2.</strong>Android 7.0 camera and media
stack in API1 on HAL1.</p>
</li>
</ul>
<h3 id=hardening_api2>Architectural changes for API2</h3>
<p>For API2 on HAL1 or HAL3, BufferQueue passes buffers so those paths continue
to work. The Android 7.0 architecture for API2 on:</p>
<ul>
<li>HAL1 is not affected by the cameraservice move, and <strong>no vendor
update</strong> is necessary.</li>
<li>HAL3 <em>is</em> affected, but <strong>no vendor update</strong> is
necessary:
<p><img src="images/ape_camera_n_api2_hal3.png" alt="Android 7.0 camera and
media stack in API2 on HAL2" id="figure1" /></p>
<p class="img-caption"><strong>Figure 3.</strong>Android 7.0 camera and media
stack in API2 on HAL3.</p>
</li>
</ul>
<h3 id=hardening_general>Additional requirements</h3>
<p>The architectural changes made for hardening media and camera framework
security include the following additional device requirements.</p>
<ul>
<li><strong>General</strong>. Devices require additional bandwidth due to IPC,
which may affect time-sensitive camera use cases such as high-speed video
recording. Vendors can measure actual impact by running
<code>android.hardware.camera2.cts.PerformanceTest</code> and the Google Camera
App for 120/240 FPS high speed video recording. Devices also require a small
amount of additional RAM to create the new process.</li>
<li><strong>Pass metadata in video buffers</strong>(<em>HAL1 only</em>). If HAL1
stores metadata instead of real YUV frame data in video buffers, the HAL must
use <code>kMetadataBufferTypeNativeHandleSource</code> as the metadata buffer
type and pass <code>VideoNativeHandleMetadata</code> in video buffers.
(<code>kMetadataBufferTypeCameraSource</code> is no longer supported on Android
7.0.) With <code>VideoNativeHandleMetadata</code>, camera and media frameworks
are able to pass the video buffers between processes by serializing and
deserializing the native handles properly.</li>
<li><strong>Buffer handle address does not always store the same buffer</strong>
(<em>HAL3 only</em>). For each capture request, HAL3 gets addresses of buffer
handles. HAL cannot use the addresses to identify buffers because the addresses
may store another buffer handle after HAL returns the buffer. You must update
the HAL to use buffer handles to identify the buffers. For example: HAL receives
a buffer handle address A, which stores buffer handle A. After HAL returns
buffer handle A, buffer handle address A may store buffer handle B next time the
HAL receives it.</li>
<li><strong>Update SELinux policies for cameraserver</strong>. If
device-specific SELinux policies give mediaserver permissions to run the camera,
you must update the SELinux policies to give cameraserver proper permissions. We
do not encourage replicating the mediaserver's SELinux policies for cameraserver
(as mediaserver and cameraserver generally require different resources in the
system). Cameraserver should have only the permissions needed to perform camera
functionalities and any unnecessary camera-related permissions in mediaserver
should be removed.</p>
<h3 id=hardening_validation>Validation</h3>
<p>For all devices that include a camera and run Android 7.0, verify the
implementation by running Android 7.0 CTS. Although Android 7.0 does not include
new CTS tests that verify camera service changes, existing CTS tests will fail
if you have not made the updates indicated above.</p>
<h2 id="version-history">Camera HAL version history</h2>
<p>For a list of tests available for evaluating the Android Camera HAL, see the
<a href="{@docRoot}compatibility/cts/camera-hal.html">Camera HAL Testing
Checklist</a>.</p>
<h3 id="34">3.4</h3>
<p>Minor additions to supported metadata and changes to data_space support:</p>
<ul>
<li>Add <code>ANDROID_SENSOR_OPAQUE_RAW_SIZE</code> static metadata as mandatory
if <code>RAW_OPAQUE</code> format is supported.</li>
<li>Add <code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE</code> static
metadata as mandatory if any RAW format is supported.</li>
<li>Switch <code>camera3_stream_t data_space</code> field to a more flexible
definition, using the version 0 definition of dataspace encoding.</li>
<li>General metadata additions which are available to use for HALv3.2 or newer:
<ul>
<li>
<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_3"><code>ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3</code>
</a></li>
<li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST</code></li>
<li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE</code></li>
<li><code>ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL</code></li>
<li><code>ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL</code></li>
<li><code>ANDROID_SENSOR_OPAQUE_RAW_SIZE</code></li>
<li><code>ANDROID_SENSOR_OPTICAL_BLACK_REGIONS</code></li>
</ul>
<li>
</ul>
<h3 id="33">3.3</h3>
<p>Minor revision of expanded-capability HAL:</p>
<ul>
<li>OPAQUE and YUV reprocessing API updates.</li>
<li>Basic support for depth output buffers.</li>
<li>Addition of <code>data_space</code> field to
<code>camera3_stream_t</code>.</li>
<li>Addition of rotation field to <code>camera3_stream_t</code>.</li>
<li>Addition of camera3 stream configuration operation mode to
<code>camera3_stream_configuration_t</code>.</li>
</ul>
<h3 id="32">3.2</h3>
<p>Minor revision of expanded-capability HAL:</p>
<ul>
<li>Deprecates <code>get_metadata_vendor_tag_ops</code>. Use
<code>get_vendor_tag_ops</code> in <code>camera_common.h</code> instead.</li>
<li>Deprecates <code>register_stream_buffers</code>. All gralloc buffers
provided by framework to HAL in <code>process_capture_request</code> may be new
at any time.</li>
<li>Add partial result support. <code>process_capture_result</code> may be
called multiple times with a subset of the available results before the full
result is available.</li>
<li>Add manual template to <code>camera3_request_template</code>. Applications
may use this template to control the capture settings directly.</li>
<li>Rework the bidirectional and input stream specifications.</li>
<li>Change the input buffer return path. The buffer is returned in
<code>process_capture_result</code> instead of
<code>process_capture_request</code>.</li>
</ul>
<h3 id="31">3.1</h3>
<p>Minor revision of expanded-capability HAL:</p>
<ul>
<li><code>configure_streams</code> passes consumer usage flags to the HAL.</li>
<li>flush call to drop all in-flight requests/buffers as fast as possible.</li>
</ul>
<h3 id="30">3.0</h3>
<p>First revision of expanded-capability HAL:</p>
<ul>
<li>Major version change since the ABI is completely different. No change to the
required hardware capabilities or operational model from 2.0.</li>
<li>Reworked input request and stream queue interfaces: Framework calls into HAL
with next request and stream buffers already dequeued. Sync framework support
is included, necessary for efficient implementations.</li>
<li>Moved triggers into requests, most notifications into results.</li>
<li>Consolidated all callbacks into framework into one structure, and all setup
methods into a single <code>initialize()</code> call.</li>
<li>Made stream configuration into a single call to simplify stream management.
Bidirectional streams replace STREAM_FROM_STREAM construct.</li>
<li>Limited mode semantics for older/limited hardware devices.</li>
</ul>
<h3 id="20">2.0</h3>
<p>Initial release of expanded-capability HAL (Android 4.2) [camera2.h]:</p>
<ul>
<li>Sufficient for implementing existing <code>android.hardware.Camera</code>
API.</li>
<li>Allows for ZSL queue in camera service layer.</li>
<li>Not tested for any new features such as manual capture control, Bayer RAW
capture, reprocessing of RAW data, etc.</li>
</ul>
<h3 id="10">1.0</strong></h3>
<p>Initial Android camera HAL (Android 4.0) [camera.h]:</p>
<ul>
<li>Converted from C++ CameraHardwareInterface abstraction layer.</li>
<li>Supports <code>android.hardware.Camera</code> API.</li>
</ul>
<h2 id=module_version>Camera module version history</h2>
<p>This section contains module versioning information for the Camera hardware
module, based on <code>camera_module_t.common.module_api_version</code>. The two
most significant hex digits represent the major version, and the two least
significant represent the minor version.</p>
<h3 id="24">2_4</h3>
<p>This camera module version adds the following API changes:</p>
<ol>
<li><em>Torch mode support</em>. The framework can turn on torch mode for any
camera device that has a flash unit, without opening a camera device. The
camera device has a higher priority accessing the flash unit than the camera
module; opening a camera device will turn off the torch if it had been enabled
through the module interface. When there are any resource conflicts, such as
<code>open()</code> is called to open a camera device, the camera HAL module
must notify the framework through the torch mode status callback that the torch
mode has been turned off.</li>
<li><em>External camera (e.g. USB hot-plug camera) support</em>. The API
updates specify the camera static info is available only when camera is
connected and ready to use for external hot-plug cameras. Calls to get static
info will be invalid calls when camera status is not
<code>CAMERA_DEVICE_STATUS_PRESENT</code>. The framework counts solely on
device status change callbacks to manage the available external camera list.
</li>
<li><em>Camera arbitration hints</em>. Adds support for explicitly indicating
the number of camera devices that can be simultaneously opened and used. To
specify valid combinations of devices, the <code>resource_cost</code> and
<code>conflicting_devices</code> fields should always be set in the
<code>camera_info</code> structure returned by the <code>get_camera_info</code>
call.</li>
<li><em>Module initialization method</em>. Called by the camera service
after the HAL module is loaded to allow for one-time initialization of the HAL.
It is called before any other module methods are invoked.</li>
</ol>
<h3 id="23">2_3</h3>
<p>This camera module version adds open legacy camera HAL device support.
The framework can use it to open the camera device as lower device HAL version
HAL device if the same device can support multiple device API versions.
The standard hardware module open call (common.methods->open) continues
to open the camera device with the latest supported version, which is
also the version listed in <code>camera_info_t.device_version</code>.</p>
<h3 id="22">2_2</h3>
<p>This camera module version adds vendor tag support from the module, and
deprecates the old <code>vendor_tag_query_ops</code> that were previously only
accessible with a device open.</p>
<h3 id="21">2_1</h3>
<p>This camera module version adds support for asynchronous callbacks to the
framework from the camera HAL module, which is used to notify the framework
about changes to the camera module state. Modules that provide a valid
<code>set_callbacks()</code> method must report at least this version number.</p>
<h3 id="20">2_0</h3>
<p>Camera modules that report this version number implement the second version
of the camera module HAL interface. Camera devices openable through this
module may support either version 1.0 or version 2.0 of the camera device
HAL interface. The <code>device_version</code> field of camera_info is always
valid; the <code>static_camera_characteristics</code> field of
<code>camera_info</code> is valid if the <code>device_version</code> field is
2.0 or higher.</p>
<h3 id="10">1_0</h3>
<p>Camera modules that report these version numbers implement the initial
camera module HAL interface. All camera devices openable through this
module support only version 1 of the camera device HAL. The
<code>device_version</code> and <code>static_camera_characteristics</code>
fields of <code>camera_info</code> are not valid. Only the
<code>android.hardware.Camera</code> API can be supported by this module and its
devices.</p>