# Chromium OS camera module work flow ![](https://i.imgur.com/86KJu2b.png) Camera的測試包可以在這個路徑找到 https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/camera3_test/ platform2各個目錄的index與說明 https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/ camera Service provider在chrome OS下可以分成兩個部分 1. Platform-specific camera HAL https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/hal/ * 主要放跟camera module平台相關與kernel drivers溝通的interface * 提供所有camera functions * Android camera HAL v3 APIs. 2. Camera HAL v3 adapter https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/hal_adapter/ * 提供給Chrome OS上 所有clients向上的Mojo IPC interface接口 * (clients都是透過Mojo IPC interface跟下面的模組溝通) * 目前Chrome OS上就兩種camera clients * Chrome Browser * Android container * 這兩種clients都透過兩種介面來access camera HAL層的functions. * Camera Module Mojo IPC interface * Camera Device Mojo IPC interface * Mojo IPC interface 跟 Android camera HAL v3 APIs是很類似的 3. V4L2 APIs ![](https://i.imgur.com/sVXhFWE.png) Camera HAL往下呼叫camera driver的interface when mojo error for JpegDecodeAccelerator cros_camera_service will get into a circle of reopen and recheck status. ![](https://i.imgur.com/K7QdtRm.png) * 整體對上層APP的camera service library庫是放在這裡 > src/third_party/libcamera/src/ # Camera service放這 https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/third_party/libcamera/src/libcamera/ ![](https://i.imgur.com/OYmijMw.png) # V4l2的service放這 * src/third_party/libcamera/src/v4l2/v4l2_camera.cpp ![](https://i.imgur.com/Si32tuV.png) * src/third_party/libcamera/src/v4l2/v4l2_camera_file.cpp ![](https://i.imgur.com/2pVSoxp.png) * src/third_party/libcamera/src/v4l2/v4l2_camera_proxy.cpp ![](https://i.imgur.com/Zm0kuFL.png) ![](https://i.imgur.com/AoJse1k.png) * src/third_party/libcamera/src/v4l2/v4l2_compat.cpp ![](https://i.imgur.com/102uVx4.png) * src/third_party/libcamera/src/v4l2/v4l2_compat_manager.cpp ![](https://i.imgur.com/YPOjedx.png) v4l2 API最後會呼叫userspace的ioctl把 cmd帶下去給kernel space driver ![](https://i.imgur.com/HhpIWG9.png) 再做dispatch任務的動作, 進入kernel space driver src/third_party/kernel/v4.4/drivers/media/v4l2-core/ # camera 3A在chrome裡面的設計有什麼不同? 通常camera 3A的存取會放在platform-specific camera HAL裡面 * auto focus * auto exposure * auto white-balance chrome基於security上的考量把camera 3A library另外放到separated sandboxed process. camera HAL可以去 Camera Alogorithm Mojo IPC interface存取 camera 3A library 路徑: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/mojo/algorithm/camera_algorithm.mojom # Encoding/ Decoding JPEG images 當user按下照相的request, camera HAL層必須產生JPEG images 在Chrome OS下的JPEG codec service是透過Chrome browser裡面的GPU process提供的 Decode有兩路可走 SW decode/ HW decode 1. HW decode 如果platform有提供 hardware-accelerated JPEG encoder/decoder JPEG libraries會透過 Mojo IPC機制來跟Chrome GPU process做連接來 encode/decode JPEG images. 3. SW decode HW decode這路不能走的話才走SW decode. ![](https://i.imgur.com/kDH94fj.png) # camera HAL interface (camera_hal.so) * file path * https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/android/header_files/include/hardware/libhardware/include/hardware/camera_common.h * very similiar to Android Camera HAL camera_hal.so參與的file (usb/BUILD.gn) * ![](https://i.imgur.com/xqvL5GW.png) * take a peak * ![](https://i.imgur.com/qKqOdDJ.png) * ![](https://i.imgur.com/62oqQgg.png) * camera module structure裡面定義了camera module的一些common method and some error code. * ![](https://i.imgur.com/I5MQsu2.png) * 其他common methods * ![](https://i.imgur.com/5rdny73.png) * ![](https://i.imgur.com/M9ysrE5.png) * ![](https://i.imgur.com/L7lWoHt.png) * ![](https://i.imgur.com/belsgNX.png) * ![](https://i.imgur.com/Uhn04t4.png) * ![](https://i.imgur.com/VB0s3aI.png) # camera algorithm interface (libcam_algo.so) * file path * https://source.chromium.org/chromiumos/chromiumos/codesearch/+/master:src/platform2/camera/include/cros-camera/camera_algorithm.h * 這裡面放的就是存取camera 3A method的介面 * ![](https://i.imgur.com/KH1o48T.png) * 看起來上層client取用必須自行handle create and free the bridge才能進行下一次的操作 * ![](https://i.imgur.com/FMB8mqx.png) * 上層掛起callback function後的return callback and notify的機制 * 註冊camera algorithm的callback function, 成功會return a buffer handle. 任何時刻必須拿到一個合法的handle才能有下一步操作 * ![](https://i.imgur.com/XcWcJdw.png) * other functions * Buffer的註冊 * ![](https://i.imgur.com/aD2yTEm.png) * 下指令要操作哪種camera 3A methods, camera 3A lib的行為會是asynchronous進行的 * ![](https://i.imgur.com/ZgFeVk5.png) * Buffer的釋放 * ![](https://i.imgur.com/6LND40W.png) # Camera HAL development相依的library ![](https://i.imgur.com/lXrJzSr.png) 路徑:Chromium/src/platform2/camera/include/cros-camera/ * camera HAL需要的Android headers * media-libs/cros-camera-android-headers * 路徑 * cros_camera_hal.h * 實作要看是用哪家的 * ![](https://i.imgur.com/t5xvvDM.png) * isolated camera 3A library * media-libs/cros-camera-libcab * 沒給source code, 只給.so * 路徑 * camera_algorithm.h * camera_algorithm_bridge.h * camera_gpu_algo_header.h * Android gralloc的替代品 * media-libs/cros-camera-libcbm * library提供API來控制拍照的一些buffer handle * camera_buffer_manager.h * some entry port * libcamera_client的入口 * media-libs/cros-camera-libcamera_client * src/platform2/camera/common/libcamera_connector/camera_client.cc * src/platform2/camera/common/libcamera_connector/camera_client_ops.cc * libcamera_metadata的入口 * media-libs/cros-camera-libcamera_metadata * src/platform2/camera/common/libcamera_connector/camera_metadata_utils.cc * * 提供access camera V4L2 devices的functions * media-libs/cros-camera-libcamera_v4l2_device * 路徑 * v4l2_device.h * src/platform2/camera/common/v4l2_device/v4l2_device.cc * src/platform2/camera/common/v4l2_device/v4l2_subdevice.cc * src/platform2/camera/common/v4l2_device/v4l2_video_node.cc * Android libsync的入口 * media-libs/libsync * 提供JPEG image一些utility functions * media-libs/cros-camera-libcamera_exif * 路徑 * exif_utils.h