Android's camera Hardware Abstraction Layer (HAL) connects the higher level camera framework APIs in Camera 2 to your underlying camera driver and hardware. The camera subsystem includes implementations for camera pipeline components while the camera HAL provides interfaces for use in implementing your version of these components.
The following figure and list describe the HAL components:
frameworks/av/
provides a
native equivalent to the
CameraDevice
and
CameraCaptureSession
classes. See also,
NDK camera2 reference.frameworks/av/camera/camera/aidl/android/hardware
directory that
call into camera service.
ICameraService
is the interface to the camera service;
ICameraDeviceUser
is the interface to a specific opened camera device; and
ICameraServiceListener
and
ICameraDeviceCallbacks
are the respective CameraService and CameraDevice callbacks to the application
framework.frameworks/av/services/camera/libcameraservice/CameraService.cpp
,
is the actual code that interacts with the HAL.The HAL sits between the camera driver and the higher level Android framework and defines an interface you must implement so apps can correctly operate the camera hardware. From Android 8.0, the Camera HAL interface is part of Project Treble and the corresponding HIDL interfaces are defined in hardware/interfaces/camera.
A typical binderized HAL must implement the following HIDL interfaces:
Reference HIDL implementations are available for CameraProvider.cpp, CameraDevice.cpp and CameraDeviceSession.cpp. The implementation wraps old HALs that still use the legacy API. Starting with Android 8.0, Camera HAL implementations must use the HIDL API; use of the legacy interface is not supported.
For more information on Treble and HAL development, see Treble Resources.
This section describes the architecture of the legacy HAL components and how to implement the HAL. Camera HAL implementations on Android 8.0 and higher must use the HIDL API instead, described above.
The following figure and list describe the legacy camera HAL components:
frameworks/base/core/jni/android_hardware_Camera.cpp
. This code
calls the lower level native code to obtain access to the physical camera
and returns data that is used to create the
android.hardware.Camera
object at the framework level.frameworks/av/camera/Camera.cpp
provides a native equivalent to the
android.hardware.Camera
class. This class calls the IPC binder proxies to obtain access to the camera
service.frameworks/av/camera
directory that calls into camera service.
ICameraService is the interface to the camera service, ICamera is the
interface to a specific opened camera device, and ICameraClient is the
device's interface back to the application framework.frameworks/av/services/camera/libcameraservice/CameraService.cpp
,
is the actual code that interacts with the HAL.The HAL sits between the camera driver and the higher level Android framework
and defines an interface you must implement so apps can correctly operate the
camera hardware. The HAL interface is defined in the
hardware/libhardware/include/hardware/camera.h
and
hardware/libhardware/include/hardware/camera_common.h
header files.
camera_common.h
defines camera_module
, a standard
structure to obtain general information about the camera, such as the camera ID
and properties common to all cameras (i.e., whether it is a front- or
back-facing camera).
camera.h
contains code that corresponds to
android.hardware.Camera. This header file declares a
camera_device
struct that in turn contains a
camera_device_ops
struct with pointers to functions that implement
the HAL interface. For documentation on the camera parameters developers can
set, refer to frameworks/av/include/camera/CameraParameters.h
.
These parameters are set with the function pointed to by int
(*set_parameters)(struct camera_device *, const char *parms)
in the HAL.
For an example of a HAL implementation, refer to the implementation for the
Galaxy Nexus HAL in hardware/ti/omap4xxx/camera
.
Set up the Android build system to correctly package the HAL implementation
into a shared library and copy it to the appropriate location by creating an
Android.mk
file:
device/<company_name>/<device_name>/camera
directory to contain your library's source files.Android.mk
file to build the shared library. Ensure
the Makefile contains the following lines:
LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Your library must be named camera.<device_name>
(.so
is appended automatically), so Android can correctly load the
library. For an example, see the Makefile for the Galaxy Nexus camera located in
hardware/ti/omap4xxx/Android.mk
.
frameworks/native/data/etc
directory with your
device's Makefile. For example, to specify your device has a camera flash and
can autofocus, add the following lines in your device's
<device>/<company_name>/<device_name>/device.mk
Makefile:
PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
For an example of a device Makefile, see
device/samsung/tuna/device.mk
.
device/<company_name>/<device_name>/media_profiles.xml
and device/<company_name>/<device_name>/media_codecs.xml
XML files. For details, see
Exposing codecs to the
framework.device/<company_name>/<device_name>/device.mk
Makefile
to copy the media_profiles.xml
and media_codecs.xml
files to the appropriate location:
# media config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
PRODUCT_PACKAGES
variable in your device's
device/<company>/<device>/device.mk
Makefile:
PRODUCT_PACKAGES := \ Gallery2 \ ...