| Message ID | 20200110193808.2266294-1-niklas.soderlund@ragnatech.se |
|---|---|
| Headers | show |
| Series |
|
| Related | show |
Hi Niklas, Thank you for the patches. On Fri, Jan 10, 2020 at 08:37:35PM +0100, Niklas Söderlund wrote: > Hi, > > This series reworks the buffer API across the whole library. The two > main reasons for the rework is > > - The current buffer API is cumbersome to work with as the variations > between internally allocated buffers (from a V4L2 video device) and > externally (from other source in the system or other V4l2 video > device) is slightly different. > > - V4L2 concepts such as buffer index have "leaked" into the application > facing interface which makes the API less intuitive to work with as > one needs to know more about V4L2 and its limitations to use. > > As changing the buffer API touches most parts of the library this series > is unfortunately quiet large and some patches are also quiet large. I s/quiet/quite/ > have really tried to break things apart as best I could. You've done a great job there, it made the series much easier to review. > The series starts by adding the new FrameBuffer interface building > blocks and then slowly proceeds to replace the existing API with the new > one. The series is tested on all upstream pipelines and IPAs without any > regressions. > > One note on 18/33, there is a temporary hack which is introduced in this > patch that allows both the Buffer and FrameBuffer API to function side > by side. That is i the V4L2VideoDevice is setup using the Buffer API > slots related to Buffer will be emitted while if it is setup with the > FrameBuffer API slots related to FrameBuffers are emitted. This hack is > removed later in 27/33 where the Buffer API is completely removed. > > I have incorporated all prototype patches published by Laurent on top of > this series. Either in their original form or squashed if the code is > introduced in this patch-set (FileDescriptor). Big thanks to Laurent for > this work. You're more than welcome. I've reviewed the whole series, and I think v4 will be fully reviewed. There's however one part I still dislike: the API towards pipeline handlers. We can probably refactor this on top, or squash the changes if they're ready in time. I'll try to give it a go. > Laurent Pinchart (2): > v4l2: camera_proxy: Call V4L2Camera::getBufferFd() directly > libcamera: v4l2_videodevice: Use FileDescriptor where appropriate > > Niklas Söderlund (31): > libcamera: Add FileDescriptor to help pass numerical fds around > test: file_descriptor: Add test > libcamera: utils: Add exchange() > v4l2: Rename FrameMetadata to V4L2FrameMetadata > v4l2: camera: Handle memory mapping of buffers directly > libcamera: buffer: Add FrameMetadata container for metadata > information > libcamera: buffer: Add FrameBuffer interface > ipa: Switch to FrameBuffer interface > libcamera: buffer: Switch from Plane to FrameBuffer::Plane > libcamera: buffers: Remove Plane class > libcamera: buffer: Drop private function setRequest() > libcamera: v4l2_videodevice: Align which type variable is used in > queueBuffer() > libcamera: v4l2_videodevice: Extract exportDmabufFd() > libcamera: request: In addBuffer() do not fetch stream from Buffer > libcamera: buffer: Move captured metadata to FrameMetadata > libcamera: v4l2_videodevice: Add V4L2BufferCache to deal with index > mapping > libcamera: v4l2_videodevice: Add FrameBuffer interface > test: v4l2_videodevice: Switch to FrameBuffer interface > test: camera: buffer_import: Update to FrameBuffer restrictions > libcamera: pipeline: rkisp1: Destroy frame information before > completing request > libcamera: pipeline: rkisp1: Switch to FrameBuffer interface for stat > and param > libcamera: pipeline: ipu3: Switch to FrameBuffer interface for cio2 > and stat > libcamera: pipeline: Add FrameBuffer handlers > libcamera: allocator: Add FrameBufferAllocator to help applications > allocate buffers > libcamera: Switch to FrameBuffer interface > libcamera: v4l2_videodevice: Remove Buffer interface > libcamera: Remove dead code after switch to FrameBuffer > cam: Cache buffer memory mapping > qcam: Cache buffer memory mapping > libcamera: pipeline: Remove explicit buffer handling > libcamera: camera: Remove the prepared state > > include/ipa/ipa_interface.h | 2 +- > include/libcamera/buffer.h | 111 ++--- > include/libcamera/camera.h | 13 +- > include/libcamera/file_descriptor.h | 46 ++ > include/libcamera/framebuffer_allocator.h | 45 ++ > include/libcamera/meson.build | 2 + > include/libcamera/request.h | 14 +- > include/libcamera/stream.h | 23 - > src/android/camera_device.cpp | 43 +- > src/cam/buffer_writer.cpp | 33 +- > src/cam/buffer_writer.h | 8 +- > src/cam/capture.cpp | 64 +-- > src/cam/capture.h | 5 +- > src/ipa/libipa/ipa_interface_wrapper.cpp | 9 +- > src/ipa/rkisp1/rkisp1.cpp | 40 +- > src/libcamera/buffer.cpp | 422 +++++------------ > src/libcamera/camera.cpp | 173 +++---- > src/libcamera/file_descriptor.cpp | 170 +++++++ > src/libcamera/framebuffer_allocator.cpp | 218 +++++++++ > src/libcamera/include/pipeline_handler.h | 13 +- > src/libcamera/include/utils.h | 9 + > src/libcamera/include/v4l2_videodevice.h | 65 ++- > src/libcamera/ipa_context_wrapper.cpp | 8 +- > src/libcamera/ipa_interface.cpp | 7 +- > src/libcamera/meson.build | 2 + > src/libcamera/pipeline/ipu3/ipu3.cpp | 277 +++++------- > src/libcamera/pipeline/rkisp1/rkisp1.cpp | 192 ++++---- > src/libcamera/pipeline/uvcvideo.cpp | 40 +- > src/libcamera/pipeline/vimc.cpp | 40 +- > src/libcamera/pipeline_handler.cpp | 70 ++- > src/libcamera/request.cpp | 38 +- > src/libcamera/stream.cpp | 248 +--------- > src/libcamera/utils.cpp | 8 + > src/libcamera/v4l2_videodevice.cpp | 424 ++++++++++++------ > src/qcam/main_window.cpp | 86 ++-- > src/qcam/main_window.h | 7 +- > src/v4l2/v4l2_camera.cpp | 69 +-- > src/v4l2/v4l2_camera.h | 43 +- > src/v4l2/v4l2_camera_proxy.cpp | 42 +- > src/v4l2/v4l2_camera_proxy.h | 2 +- > src/v4l2/v4l2_compat_manager.cpp | 2 +- > test/camera/buffer_import.cpp | 382 ++++------------ > test/camera/capture.cpp | 48 +- > test/camera/statemachine.cpp | 89 +--- > test/file-descriptor.cpp | 208 +++++++++ > test/ipa/ipa_wrappers_test.cpp | 41 +- > test/meson.build | 1 + > test/v4l2_videodevice/buffer_sharing.cpp | 34 +- > test/v4l2_videodevice/capture_async.cpp | 18 +- > test/v4l2_videodevice/request_buffers.cpp | 11 +- > test/v4l2_videodevice/stream_on_off.cpp | 6 +- > test/v4l2_videodevice/v4l2_m2mdevice.cpp | 40 +- > test/v4l2_videodevice/v4l2_videodevice_test.h | 2 +- > 53 files changed, 2086 insertions(+), 1927 deletions(-) > create mode 100644 include/libcamera/file_descriptor.h > create mode 100644 include/libcamera/framebuffer_allocator.h > create mode 100644 src/libcamera/file_descriptor.cpp > create mode 100644 src/libcamera/framebuffer_allocator.cpp > create mode 100644 test/file-descriptor.cpp
Hi, This series reworks the buffer API across the whole library. The two main reasons for the rework is - The current buffer API is cumbersome to work with as the variations between internally allocated buffers (from a V4L2 video device) and externally (from other source in the system or other V4l2 video device) is slightly different. - V4L2 concepts such as buffer index have "leaked" into the application facing interface which makes the API less intuitive to work with as one needs to know more about V4L2 and its limitations to use. As changing the buffer API touches most parts of the library this series is unfortunately quiet large and some patches are also quiet large. I have really tried to break things apart as best I could. The series starts by adding the new FrameBuffer interface building blocks and then slowly proceeds to replace the existing API with the new one. The series is tested on all upstream pipelines and IPAs without any regressions. One note on 18/33, there is a temporary hack which is introduced in this patch that allows both the Buffer and FrameBuffer API to function side by side. That is i the V4L2VideoDevice is setup using the Buffer API slots related to Buffer will be emitted while if it is setup with the FrameBuffer API slots related to FrameBuffers are emitted. This hack is removed later in 27/33 where the Buffer API is completely removed. I have incorporated all prototype patches published by Laurent on top of this series. Either in their original form or squashed if the code is introduced in this patch-set (FileDescriptor). Big thanks to Laurent for this work. Laurent Pinchart (2): v4l2: camera_proxy: Call V4L2Camera::getBufferFd() directly libcamera: v4l2_videodevice: Use FileDescriptor where appropriate Niklas Söderlund (31): libcamera: Add FileDescriptor to help pass numerical fds around test: file_descriptor: Add test libcamera: utils: Add exchange() v4l2: Rename FrameMetadata to V4L2FrameMetadata v4l2: camera: Handle memory mapping of buffers directly libcamera: buffer: Add FrameMetadata container for metadata information libcamera: buffer: Add FrameBuffer interface ipa: Switch to FrameBuffer interface libcamera: buffer: Switch from Plane to FrameBuffer::Plane libcamera: buffers: Remove Plane class libcamera: buffer: Drop private function setRequest() libcamera: v4l2_videodevice: Align which type variable is used in queueBuffer() libcamera: v4l2_videodevice: Extract exportDmabufFd() libcamera: request: In addBuffer() do not fetch stream from Buffer libcamera: buffer: Move captured metadata to FrameMetadata libcamera: v4l2_videodevice: Add V4L2BufferCache to deal with index mapping libcamera: v4l2_videodevice: Add FrameBuffer interface test: v4l2_videodevice: Switch to FrameBuffer interface test: camera: buffer_import: Update to FrameBuffer restrictions libcamera: pipeline: rkisp1: Destroy frame information before completing request libcamera: pipeline: rkisp1: Switch to FrameBuffer interface for stat and param libcamera: pipeline: ipu3: Switch to FrameBuffer interface for cio2 and stat libcamera: pipeline: Add FrameBuffer handlers libcamera: allocator: Add FrameBufferAllocator to help applications allocate buffers libcamera: Switch to FrameBuffer interface libcamera: v4l2_videodevice: Remove Buffer interface libcamera: Remove dead code after switch to FrameBuffer cam: Cache buffer memory mapping qcam: Cache buffer memory mapping libcamera: pipeline: Remove explicit buffer handling libcamera: camera: Remove the prepared state include/ipa/ipa_interface.h | 2 +- include/libcamera/buffer.h | 111 ++--- include/libcamera/camera.h | 13 +- include/libcamera/file_descriptor.h | 46 ++ include/libcamera/framebuffer_allocator.h | 45 ++ include/libcamera/meson.build | 2 + include/libcamera/request.h | 14 +- include/libcamera/stream.h | 23 - src/android/camera_device.cpp | 43 +- src/cam/buffer_writer.cpp | 33 +- src/cam/buffer_writer.h | 8 +- src/cam/capture.cpp | 64 +-- src/cam/capture.h | 5 +- src/ipa/libipa/ipa_interface_wrapper.cpp | 9 +- src/ipa/rkisp1/rkisp1.cpp | 40 +- src/libcamera/buffer.cpp | 422 +++++------------ src/libcamera/camera.cpp | 173 +++---- src/libcamera/file_descriptor.cpp | 170 +++++++ src/libcamera/framebuffer_allocator.cpp | 218 +++++++++ src/libcamera/include/pipeline_handler.h | 13 +- src/libcamera/include/utils.h | 9 + src/libcamera/include/v4l2_videodevice.h | 65 ++- src/libcamera/ipa_context_wrapper.cpp | 8 +- src/libcamera/ipa_interface.cpp | 7 +- src/libcamera/meson.build | 2 + src/libcamera/pipeline/ipu3/ipu3.cpp | 277 +++++------- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 192 ++++---- src/libcamera/pipeline/uvcvideo.cpp | 40 +- src/libcamera/pipeline/vimc.cpp | 40 +- src/libcamera/pipeline_handler.cpp | 70 ++- src/libcamera/request.cpp | 38 +- src/libcamera/stream.cpp | 248 +--------- src/libcamera/utils.cpp | 8 + src/libcamera/v4l2_videodevice.cpp | 424 ++++++++++++------ src/qcam/main_window.cpp | 86 ++-- src/qcam/main_window.h | 7 +- src/v4l2/v4l2_camera.cpp | 69 +-- src/v4l2/v4l2_camera.h | 43 +- src/v4l2/v4l2_camera_proxy.cpp | 42 +- src/v4l2/v4l2_camera_proxy.h | 2 +- src/v4l2/v4l2_compat_manager.cpp | 2 +- test/camera/buffer_import.cpp | 382 ++++------------ test/camera/capture.cpp | 48 +- test/camera/statemachine.cpp | 89 +--- test/file-descriptor.cpp | 208 +++++++++ test/ipa/ipa_wrappers_test.cpp | 41 +- test/meson.build | 1 + test/v4l2_videodevice/buffer_sharing.cpp | 34 +- test/v4l2_videodevice/capture_async.cpp | 18 +- test/v4l2_videodevice/request_buffers.cpp | 11 +- test/v4l2_videodevice/stream_on_off.cpp | 6 +- test/v4l2_videodevice/v4l2_m2mdevice.cpp | 40 +- test/v4l2_videodevice/v4l2_videodevice_test.h | 2 +- 53 files changed, 2086 insertions(+), 1927 deletions(-) create mode 100644 include/libcamera/file_descriptor.h create mode 100644 include/libcamera/framebuffer_allocator.h create mode 100644 src/libcamera/file_descriptor.cpp create mode 100644 src/libcamera/framebuffer_allocator.cpp create mode 100644 test/file-descriptor.cpp