[libcamera-devel] [PATCH v2 00/27] libcamera: Handle fallout of FrameBuffer offset support
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Sep 6 04:00:33 CEST 2021
Hello everybody,
This patch series started as an investigation of a qcam failure with
IPU3 after the merge of the FrameBuffer offset support. While a hack in
qcam would be possible, I decided to instead address the core issue and
fix it in V4L2VideoDevice.
Compared to v1, the series now includes fixes for cam and qcam in
addition to the changes needed in the libcamera core. They have been
tested with the Raspberry Pi, IPU3, VIMC and UVC pipeline handlers.
The GStreamer element seems to work fine without any change required.
The V4L2 compatibility layer is still broken, and I haven't tested the
Android HAL yet (any volunteer ?).
The most important change is in patches 13/27 and 14/27, which translate
between V4L2 buffers and libcamera FrameBuffer to handle the case where
a multi-planar frame buffer is used with the V4L2 single-planar API.
It's working more or less by chance at the moment (except in qcam where
it's broken, and possibly in other places I haven't tested). Patches
01/27 to 12/27 are cleanups and additions to prepare for the work in
V4L2VideoDevice, and patch 15/27 is a small cleanup on top. Patches
16/27 and 17/27 then improve the FrameBuffer class API as a cleanup.
Patches 18/27 to 27/27 fix the cam and qcam applications, as well as an
issue in the Android HAL. Worth being noted is patch 19/27 that
introduces an Image class shared by cam and qcam. The class duplicates
the MappedFrameBuffer implementation private to libcamera. I've tried to
rework MappedFrameBuffer into something I would be happy to see in the
public API, but failed to do so in a reasonable amount of time, and I
didn't want to delay this important regression fix.
This series doesn't break any unit test, as vimc doesn't support NV12.
Addition of NV12 support to the vimc kernel driver would be very nice,
in order to test multi-planar support in our unit tests. Volunteers are
welcome ;-)
Laurent Pinchart (27):
libcamera: base: utils: Use size_t for index in utils::enumerate()
libcamera: file_descriptor: Add a function to retrieve the inode
libcamera: v4l2_videodevice: Drop toV4L2PixelFormat()
libcamera: Use V4L2PixelFormat::fromPixelFormat()
libcamera: formats: Move plane info structure to PixelFormatInfo
libcamera: formats: Add planeSize() helpers to PixelFormatInfo
libcamera: formats: Support V4L2 non-contiguous formats
libcamera: framebuffer: Move planes check to constructor
libcamera: framebuffer: Add a function to check if planes are
contiguous
libcamera: v4l2_videodevice: Cache PixelFormatInfo
libcamera: v4l2_videodevice: Document plane handling in createBuffer()
libcamera: v4l2_videodevice: Take stride into account to compute
offsets
libcamera: v4l2_videodevice: Coalesce planes when queuing buffer
libcamera: v4l2_videodevice: Split planes when dequeuing buffer
libcamera: v4l2_videodevice: Use utils::enumerate()
libcamera: framebuffer: Allocate metadata planes at construction time
libcamera: framebuffer: Prevent modifying the number of metadata
planes
android: camera_device: Don't assume all planes use the same fd
cam: Add Image class
cam: file_sink: Use Image class to access pixel data
cam: drm: Support per-plane stride values
cam: drm: Set per-plane offsets when creating DRM frame buffer
cam: drm: Avoid importing the same dmabuf multiple times
qcam: Print bytesused for all planes
qcam: Use Image class to access pixel data
qcam: viewfinder_gl: Support multi-planar buffers
qcam: viewfinder_qt: Support multi-planar buffers
include/libcamera/base/utils.h | 4 +-
include/libcamera/file_descriptor.h | 3 +
include/libcamera/framebuffer.h | 19 +-
include/libcamera/internal/formats.h | 22 +-
include/libcamera/internal/framebuffer.h | 2 +
include/libcamera/internal/v4l2_pixelformat.h | 2 +-
include/libcamera/internal/v4l2_videodevice.h | 3 +-
src/android/camera_device.cpp | 25 +-
src/android/mm/generic_camera_buffer.cpp | 11 +-
src/android/yuv/post_processor_yuv.cpp | 10 +-
src/cam/camera_session.cpp | 4 +-
src/cam/drm.cpp | 38 +-
src/cam/drm.h | 7 +-
src/cam/file_sink.cpp | 44 +--
src/cam/file_sink.h | 6 +-
src/cam/image.cpp | 107 +++++
src/cam/image.h | 52 +++
src/cam/kms_sink.cpp | 28 +-
src/cam/meson.build | 1 +
src/libcamera/file_descriptor.cpp | 26 ++
src/libcamera/formats.cpp | 373 ++++++++++++++----
src/libcamera/framebuffer.cpp | 57 ++-
src/libcamera/pipeline/ipu3/cio2.cpp | 4 +-
src/libcamera/pipeline/ipu3/imgu.cpp | 2 +-
.../pipeline/raspberrypi/raspberrypi.cpp | 8 +-
src/libcamera/pipeline/rkisp1/rkisp1_path.cpp | 6 +-
src/libcamera/pipeline/simple/converter.cpp | 8 +-
src/libcamera/pipeline/simple/simple.cpp | 4 +-
src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 6 +-
src/libcamera/pipeline/vimc/vimc.cpp | 8 +-
src/libcamera/v4l2_pixelformat.cpp | 11 +-
src/libcamera/v4l2_videodevice.cpp | 196 ++++++---
src/qcam/format_converter.cpp | 18 +-
src/qcam/format_converter.h | 9 +-
src/qcam/main_window.cpp | 38 +-
src/qcam/main_window.h | 4 +-
src/qcam/meson.build | 1 +
src/qcam/viewfinder.h | 6 +-
src/qcam/viewfinder_gl.cpp | 45 +--
src/qcam/viewfinder_gl.h | 4 +-
src/qcam/viewfinder_qt.cpp | 20 +-
src/qcam/viewfinder_qt.h | 2 +-
src/v4l2/v4l2_camera_proxy.cpp | 11 +-
test/libtest/buffer_source.cpp | 3 +-
test/utils.cpp | 10 +-
45 files changed, 911 insertions(+), 357 deletions(-)
create mode 100644 src/cam/image.cpp
create mode 100644 src/cam/image.h
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list