# Chromium OS camera module work flow

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

Camera HAL往下呼叫camera driver的interface
when mojo error for JpegDecodeAccelerator
cros_camera_service will get into a circle of reopen and recheck status.

* 整體對上層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/

# V4l2的service放這
* src/third_party/libcamera/src/v4l2/v4l2_camera.cpp

* src/third_party/libcamera/src/v4l2/v4l2_camera_file.cpp

* src/third_party/libcamera/src/v4l2/v4l2_camera_proxy.cpp


* src/third_party/libcamera/src/v4l2/v4l2_compat.cpp

* src/third_party/libcamera/src/v4l2/v4l2_compat_manager.cpp

v4l2 API最後會呼叫userspace的ioctl把 cmd帶下去給kernel space driver

再做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.

# 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)
* 
* take a peak
* 
* 
* camera module structure裡面定義了camera module的一些common method and some error code.
* 
* 其他common methods
* 
* 
* 
* 
* 
* 
# 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的介面
* 
* 看起來上層client取用必須自行handle create and free the bridge才能進行下一次的操作
* 
* 上層掛起callback function後的return callback and notify的機制
* 註冊camera algorithm的callback function, 成功會return a buffer handle. 任何時刻必須拿到一個合法的handle才能有下一步操作
* 
* other functions
* Buffer的註冊
* 
* 下指令要操作哪種camera 3A methods, camera 3A lib的行為會是asynchronous進行的
* 
* Buffer的釋放
* 
# Camera HAL development相依的library

路徑:Chromium/src/platform2/camera/include/cros-camera/
* camera HAL需要的Android headers
* media-libs/cros-camera-android-headers
* 路徑
* cros_camera_hal.h
* 實作要看是用哪家的
* 
* 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