Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rethinking the kernel camera framework

Rethinking the kernel camera framework

Video4Linux (V4L2) has enabled hundreds of different multimedia devices, from TV tuners to the webcam that has accompanied you during the pandemic. Unfortunately, it has been neglected by vendors when they have implemented camera stacks for mobile devices.

In this talk we will explore the reasons why V4L2 has not proliferated with complex ISP systems and what can be done to support those devices from an Open Source perspective.

Ricardo Ribalda, Google

Kernel Recipes

June 09, 2024
Tweet

More Decks by Kernel Recipes

Other Decks in Technology

Transcript

  1. Sergey Senozhatsky, Fei Shao, Yunke Cao, Tomasz Figa, Ricardo Ribalda

    Kernel CAM Rethinking the kernel camera framework Paris, 1st June 2022
  2. Operating system (for driver developers) Program My framework Driver Hardware

    open(/dev/my_device) read(fd) ioctl(fd,IOC_,... ) my_init() my_alloc() my_read_from() inb() outb()
  3. Great diversity of output • There are more than 200

    video formats ◦ grep -c "^#define V4L2_PIX_FMT" include/uapi/linux/videodev2.h -> 202! Userspace Kernel Hardware Userspace Kernel Hardware Userspace Kernel Hardware
  4. Multiple ways to do the same thing • Do you

    want a 640x480 image from a 24Mpix (6000*400)?: ◦ Cropping ◦ Binning ◦ Interpolate • Image is too dark? ◦ Exposure time ◦ Analog Gain ◦ Digital Gain
  5. Do it fast or don’t do it • Big data

    rates ◦ 1080p RGB32@60fps -> 474 MiB/sec! • Low latency • Most of the time handled by other hardware ◦ GPU ◦ TPU ◦ CODEC
  6. Cameras drive the consumer market • Work from home/anywhere •

    E-learning • Deciding factor for purchase
  7. Video4Linux 2 (non media controller) Program Video Buffer 2 Driver

    Hardware Control Framework Video Helpers Media Subsystem libv4l2 • Output can be converted via software to 4 standard formats. • The driver makes most of the decisions for us. • Hardware produces decent images by default.
  8. Video4Linux 2 (media controller) Program Video Buffer 2 Driver Hardware

    Control Framework Video Helpers Media Subsystem Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers
  9. Video4Linux 2 (post media controller) Program Video Buffer 2 Driver

    Hardware Control Framework Video Helpers Media Subsystem Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers Video Buffer 2 Driver Hardware Control Framework Video Helpers • Software stack needs to know about the internals of the hardware. • All the decisions are taken by the software stack. • A lot of Image tuning before we can use the images.
  10. What is CAM? Userspace Kernel Hardware • New kernel subsystem.

    • No media abstractions. • Fluid collaboration between userspace and other subsystems. • Two components: ◦ Entities ◦ Operations
  11. KCAM components: Entities Root MIPI Codec Sensor ISP DMA VCM

    • Organized in a tree, based on the hardware architecture. • Single register-set. • Can throw events.
  12. KCAM components: Entities Root MIPI Codec Sensor ISP DMA VCM

    • Organized in a tree, based on the hardware architecture. • Single register-set. • Can throw events.
  13. KCAM components: Operations • Read and/or write to an entity

    ◦ regmap ◦ parameter buffers • Can depend on: ◦ Events ◦ Other operation ◦ Fence • Can create a fence http://www.paella10.com/calculadora/paellas/paella-valenciana/
  14. KCAM components: Operations Operation List Configure Sensor Trigger image Init

    ISP Start DMA ioctl ready Circular buffer fence_out fence_in signal
  15. Show me the code!! #define CAM_MAX_DEPENDENCIES 8 struct cam_operation_add {

    __u32 id; __u32 fence_out; __u32 flags; /* * Pre-execution dependencies list and dependency execution mode */ __u32 mode; struct cam_dependency deps[CAM_MAX_DEPENDENCIES]; /* * Execution context specific data (if any) */ __u64 delay_ns; __u64 rd_wr_list; __u32 entity; } __attribute__((packed)); enum cam_dependency_type { CAM_DEPENDENCY_NONE, CAM_DEPENDENCY_OP, CAM_DEPENDENCY_EVENT, CAM_DEPENDENCY_FENCE_IN, }; struct cam_dependency { __u32 type; __u32 id; } __attribute__((packed)); enum cam_dependency_mode { CAM_DEPENDENCY_WEAK_ORDER, CAM_DEPENDENCY_STRICT_ORDER, };
  16. Testing (lots of) • Software testing: ◦ kunit ◦ libkc

    ◦ vcam ◦ error injection • Hardware testing ◦ ChromeOS test infra ◦ human test
  17. Comparison Userspace Kernel Hardware libcamera • Limitless functionality • Fast

    upstream • Small drivers • Operations vs Streams Kernel CAM Userspace Kernel Hardware libcamera Media Controller
  18. Governance • There must be an open source stack before

    a driver is merged. ◦ Similar to DRM model. • Compliance-test with minimum requirements.
  19. Benchmark the stack Camera Service Kernel Userspace Hardware Clients Android

    Camera Framework Sors Svers SoC ISP Drivers h/EEPROM Sensor/Actuator/Flash/EEP ROM SoC VMs So SoC ISP Chrome Video Capture Device VMs Generic V4L2 Frameworks Sensor/Actuator/Fl ash/ EEPROM Drivers Sensor/Actuator/Fl ash/ EEPROM Drivers Sensor/Actuator/Flash/ EEPROM Drivers Camera Service Clients Android Camera Framework Sors Svers CAM drivers h/EEPROM Sensor/Actuator/Flash/EEP ROM SoC VMs So SoC ISP Chrome Video Capture Device VMs CAM Sensor/Actuator/Fl ash/ EEPROM Drivers Sensor/Actuator/Fl ash/ EEPROM Drivers Sensor/Actuator/Flash/ EEPROM Drivers Libcamera - cam Secret Sauce Secret Sauce
  20. How to contribute • Show me the code! ◦ https://chromium.googlesource.com/chromiumos/third_party/kernel/+/ref

    s/heads/kcam • Mailing List ◦ [email protected] • Bugs: ◦ WIP • Join the team ◦ https://crosjobs.page.link/event