README.md
1# V4L2 Camera HALv3
2
3The camera.v4l2 library implements a Camera HALv3 using the
4Video For Linux 2 (V4L2) interface. This allows it to theoretically
5work with a wide variety of devices, though the limitations of V4L2
6introduce some [caveats](#V4L2-Deficiencies), causing this HAL to
7not be fully spec-compliant.
8
9## Current status
10
11People are free to use that library if that works for their purpose,
12but it's not maintained by Android Camera team. There is another V4L2
13camera HAL implementation which is maintained by Android Camera team
14starting in Android P. See more information
15[here](https://source.android.com/devices/camera/external-usb-cameras).
16
17## Building a Device with the HAL
18
19To ensure the HAL is built for a device, include the following in your
20`<device>.mk`:
21
22```
23USE_CAMERA_V4L2_HAL := true
24PRODUCT_PACKAGES += camera.v4l2
25PRODUCT_PROPERTY_OVERRIDES += ro.hardware.camera=v4l2
26```
27
28The first line ensures the V4L2 HAL module is visible to the build system.
29This prevents checkbuilds on devices that don't have the necessary support
30from failing. The product packages tells the build system to include the V4L2
31HALv3 library in the system image. The final line tells the hardware manager
32to load the V4L2 HAL instead of a default Camera HAL.
33
34## Requirements for Using the HAL
35
36Devices and cameras wishing to use this HAL must meet
37the following requirements:
38
39* The camera must support BGR32, YUV420, and JPEG formats.
40* The gralloc and other graphics modules used by the device must use
41`HAL_PIXEL_FORMAT_RGBA_8888` as the `HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED`
42
43## Understanding the HAL Code
44
45There are three large pieces to the V4L2 Camera HAL: the general HALv3
46Camera & HAL code, the specific implementation using V4L2,
47and the Metadata system.
48
49For context, you may also wish to read some of the documentation in
50libhardware/include/camera3.h about how the framework interacts with the HAL.
51
52### Camera & HAL Interface
53
54The camera and HAL interfaces are implemented by the Camera and
55V4L2CameraHAL classes.
56
57The V4L2CameraHAL class deals primarily with initialization of the system.
58On creation, it searches /dev/video* nodes for ones with the necessary
59capabilities. These are then all presented to the framework as available
60for use. Further operations are passed to the individual Cameras as appropriate.
61
62The Camera class implements the general logic for handling the camera -
63opening and closing, configuring streams, preparing and tracking requests, etc.
64While it handles the logistics surrounding the camera, actual image
65capture and settings logic are implemented by calling down into the
66[V4L2 Camera](#V4L2-Camera). The Camera (using helper classes) enforces
67restrictions given in the [Metadata](#Metadata) initialized by the V4L2Camera,
68such as limits on the number of in-flight requests per stream.
69Notably, this means you should be able to replace the V4L2 implementation
70with something else, and as long as you fill in the metadata correctly the
71Camera class should "just work".
72
73### V4L2 Specific Implementation
74
75The V4L2Camera class is the implementation of all the capture functionality.
76It includes some methods for the Camera class to verify the setup, but the
77bulk of the class is the request queue. The Camera class submits CaptureRequests
78as they come in and are verified. The V4L2Camera runs these through a three
79stage asynchronous pipeline:
80
81* Acceptance: the V4L2Camera accepts the request, and puts it into waiting to be
82picked up by the enqueuer.
83* Enqueuing: the V4L2Camera reads the request settings, applies them to the
84device, takes a snapshot of the settings, and hands the buffer over to the
85V4L2 driver.
86* Dequeueing: A completed frame is reclaimed from the driver, and sent
87back to the Camera class for final processing (validation, filling in the
88result object, and sending the data back to the framework).
89
90Much of this work is aided by the V4L2Wrapper helper class,
91which provides simpler inputs and outputs around the V4L2 ioctls
92based on their known use by the HAL; filling in common values automatically
93and extracting the information useful to the HAL from the results.
94This wrapper is also used to expose V4L2 controls to their corresponding
95Metadata components.
96
97### Metadata
98
99The Metadata subsystem attempts to organize and simplify handling of
100camera metadata (system/media/camera/docs/docs.html). At the top level
101is the Metadata class and the PartialMetadataInterface. The Metadata
102class provides high level interaction with the individual components -
103filling the static metadata, validating, getting, and setting settings,
104etc. The Metadata class passes all of these things on to the component
105PartialMetadataInterfaces, each of which filter for their specific
106metadata components and perform the requested task.
107
108Some generalized metadata classes are provided to simplify common logic
109for this filtering and application. At a high level, there are three
110types:
111
112* Properties: a static value.
113* Controls: dynamically adjustable values, and optionally an
114associated static property indicating what allowable values are.
115* States: a dynamic read-only value.
116
117The Metadata system uses further interfaces and subclasses to distinguish
118the variety of different functionalities necessary for different metadata
119tags.
120
121#### Metadata Factory
122
123This V4L2 Camera HAL implementation utilizes a metadata factory method.
124This method initializes all the 100+ required metadata components for
125basic HAL spec compliance. Most do nothing/report fixed values,
126but a few are hooked up to the V4L2 driver.
127
128This HAL was initially designed for use with the Raspberry Pi camera module
129v2.1, so the fixed defaults are usually assigned based on that camera.
130
131## V4L2 Deficiencies
132
133* One stream at a time is supported. Notably, this means you must re-configure
134the stream between preview and capture if they're not the same format.
135This makes this HAL not backwards compatible with the Android Camera (v1) API
136as many of its methods attempt to do just that; Camera2 must be used instead.
137* A variety of metadata properties can't be filled in from V4L2,
138such as physical properties of the camera. Thus this HAL will never be capable
139of providing perfectly accurate information for all cameras it can theoretically
140support.
141* Android requires HALs support YUV420, JPEG, and a format of the graphics
142stack's choice ("implementation defined"). Very few cameras actually support
143all of these formats (so far the Raspberry Pi cameras are the only known ones),
144so some form of format conversion built in to the HAL would be a useful feature
145to expand the reach/usefulness of this HAL.
146* V4L2 doesn't make promises about how fast settings will apply, and there's no
147good way to determine what settings were in effect for a given frame. Thus,
148the settings passed into requests and out with results are applied/read as
149a best effort and may be incorrect.
150* Many features V4L2 is capable of are not hooked up to the HAL, so the HAL
151is underfeatured compared to the ideal/what is possible.
152
153## Other Known Issues
154
155* A variety of features are unimplemented: High speed capture,
156flash torch mode, hotplugging/unplugging.
157