# 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
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up