| # Chrome OS Platform Camera | |
| The repository hosts the core Chrome OS platform camera components, including: | |
| - 1P Camera Hardware Abstraction Layers (HALs) of different platforms | |
| - Common dependencies and libraries needed by the camera HALs | |
| - [Camera HAL adapter](hal_adapter) to interface with all the camera clients | |
| through Mojo IPC | |
| - [Camera conformance test suite](camera3_test) for the camera HALs | |
| [TOC] | |
| ## System Overview | |
|  | |
| The camera service provider on Chrome OS is a standalone process that can be | |
| divided into two part: | |
| - **Platform-specific camera HAL** that interfaces with the kernel drivers and | |
| provide all the camera functions through the | |
| [**Android camera HAL v3 APIs**](android/header_files/include/hardware/libhardware/include/hardware/camera3.h). | |
| - **Camera HAL v3 adapter** that provides Mojo IPC interface for all the | |
| clients on Chrome OS to access the platform-specific camera HAL. | |
| Currently we have two major camera clients on Chrome OS: _Chrome browser_ and | |
| _Android_. All the clients connect to the camera HAL adapter through the | |
| [**Camera Module Mojo IPC interface**](mojo/camera_common.mojom) and the | |
| [**Camera Device Mojo IPC interface**](mojo/camera3.mojom) to access camera | |
| functions. The Mojo IPC interface is very similar to the Android camera HAL v3 | |
| APIs. | |
| ### Camera 3A Library Sandboxing | |
| Usually the platform-specific camera HAL is accompanied with a proprietary | |
| camera 3A (auto focus, auto exposure, and auto white-balance) library that | |
| provides the algorithms to control the camera subsystem for capturing high | |
| quality images. We isolate the camera 3A library in a separated sandboxed | |
| process for security consideration. The camera HAL accesses the camera 3A | |
| library through the | |
| [**Camera Algorithm Mojo IPC interface**](mojo/algorithm/camera_algorithm.mojom). | |
| ### Encoding / Decoding JPEG images | |
| The camera HAL needs to generate JPEG images when processing still shot | |
| requests. On Chrome OS the JPEG codec service, if supported on the platform, is | |
| provided by the GPU process in Chrome browser. We provide libraries to handle | |
| JPEG encoding and decoding: On platform that supports hardware-accelerated JPEG | |
| encoder/decoder, the JPEG libraries connect to the Chrome GPU process through | |
| Mojo IPC channels to encode/decode JPEG images; otherwise the JPEG | |
| encoding/decoding is done through software. | |
| ## Adding a New Camera HAL | |
| ### Creating a Camera HAL for Chrome OS | |
| The Chrome OS camera HAL are essentially the following shared libraries, plus | |
| and dependencies required by them: | |
| - `camera_hal.so` that provides the | |
| [**camera HAL interface**](android/header_files/include/hardware/libhardware/include/hardware/camera_common.h). | |
| This is very similar to a regular Android camera HAL. _(Required)_ | |
| - `libcam_algo.so` that provides the | |
| [**camera algorithm interface**](include/cros-camera/camera_algorithm.h) for | |
| the isolated camera 3A library. _(Required if the camera HAL requires 3A | |
| library to work)_. | |
| We provide the following packages that are required to build the camera HAL: | |
| - `chromeos-base/cros-camera-android-deps` | |
| A package that installs all the necessary Android headers files and | |
| libraries required by the camera HAL. | |
| - `chromeos-base/cros-camera-libs` | |
| A package that provides all the base functionality and libraries for running | |
| the camera HAL stack. Check the [header files](include/cros-camera) for the | |
| functions provided. Some important ones are: | |
| 1. Functions to access the isolated camera 3A library if the camera HAL | |
| requires it to work. See the | |
| [APIs](include/cros-camera/camera_algorithm.h) for more details. | |
| 2. A replacement for Android gralloc. The library provides | |
| [APIs](include/cros-camera/camera_buffer_manager.h) to import and map | |
| buffer handles received in capture requests. | |
| 3. JPEG [decoder](include/cros-camera/jpeg_decode_accelerator.h) and | |
| [encoder](include/cros-camera/jpeg_encode_accelerator.h) APIs that adapt | |
| to either software or hardware-accelerated implementations based on the | |
| platform capability. | |
| - `media-libs/libsync` | |
| A port of the Android `libsync`. | |
| ### Uploading the Camera HAL Source Code | |
| To add a new camera HAL for a new platform, one needs to upload the source code | |
| of the camera HAL to the camera HAL directory ([1P](hal), | |
| [3P](https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/camera/hal/)). | |
| Examples: | |
| [**Intel camera HAL**](https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/camera/hal/intel/), | |
| [**USB camera HAL**](hal/usb). | |
| ### Adding ebuild Files | |
| After the camera HAL source code is uploaded, one needs to add corresponding | |
| packages to build and install the camera HAL and the required libraries. On | |
| Chrome OS, packages are managed by ebuild files. The following ebuild files are | |
| required for a new camera HAL: | |
| - A ebuild file for the newly added camera HAL. The ebuild file is used to | |
| build and install the platform specific camera HAL and the camera algorithm | |
| (`libcam_algo.so`) shared libraries into the board sysroot. To integrate the | |
| camera HAL into the OS image, a `virtual/cros-camera-hal` ebuild that | |
| includes the newly added camera HAL as `RDEPEND` is required in the | |
| baseboard or board overlay. | |
| - Camera HAL ebuild examples: [**Intel Kabylake camera HAL**], | |
| [**USB camera HAL**] | |
| - Camera HAL virtual ebuild example: | |
| [**Intel Kabylake camera HAL virtual package**] | |
| - For board-specific camera HAL config files, we have the | |
| `virtual/cros-camera-hal-configs` ebuild. One can add a new ebuild to | |
| install the board-specific camera HAL config files, and list the new ebuild | |
| as `RDEPEND` of the virtual ebuild. | |
| - Camera HAL config ebuild example: | |
| [**Intel Kabylake camera HAL configs**] | |
| - Camera HAL config virtual ebuild example: | |
| [**Intel Kabylake camera HAL configs virtual package**] | |
| [**Intel Kabylake camera HAL**]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/HEAD/chipset-kbl/media-libs/cros-camera-hal-intel-ipu3/ | |
| [**USB camera HAL**]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/HEAD/media-libs/cros-camera-hal-usb/ | |
| [**Intel Kabylake camera HAL virtual package**]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/HEAD/baseboard-poppy/virtual/cros-camera-hal/ | |
| [**Intel Kabylake camera HAL configs**]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/HEAD/baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/ | |
| [**Intel Kabylake camera HAL configs virtual package**]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/HEAD/baseboard-poppy/virtual/cros-camera-hal-configs/ |