[libcamera-devel,v4,00/32] libcamera: Rework buffer API
mbox series

Message ID 20200112010212.2609025-1-niklas.soderlund@ragnatech.se
Headers show
Series
  • libcamera: Rework buffer API
Related show

Message

Niklas Söderlund Jan. 12, 2020, 1:01 a.m. UTC
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 quite large and some patches are also quite 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/32, 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/32 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 (1):
  v4l2: camera_proxy: Call V4L2Camera::getBufferFd() directly

Niklas Söderlund (31):
  libcamera: request: remove prepare()
  libcamera: Add FileDescriptor to help pass numerical fds around
  test: file_descriptor: Add test
  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                    | 113 ++---
 include/libcamera/camera.h                    |  13 +-
 include/libcamera/file_descriptor.h           |  47 ++
 include/libcamera/framebuffer_allocator.h     |  45 ++
 include/libcamera/meson.build                 |   2 +
 include/libcamera/request.h                   |  16 +-
 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                      | 411 +++++------------
 src/libcamera/camera.cpp                      | 184 +++-----
 src/libcamera/file_descriptor.cpp             | 203 +++++++++
 src/libcamera/framebuffer_allocator.cpp       | 215 +++++++++
 src/libcamera/include/pipeline_handler.h      |  13 +-
 src/libcamera/include/v4l2_videodevice.h      |  66 ++-
 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            |  75 ++-
 src/libcamera/request.cpp                     |  60 +--
 src/libcamera/stream.cpp                      | 248 +---------
 src/libcamera/v4l2_videodevice.cpp            | 426 ++++++++++++------
 src/qcam/main_window.cpp                      |  86 ++--
 src/qcam/main_window.h                        |   7 +-
 src/v4l2/v4l2_camera.cpp                      |  63 +--
 src/v4l2/v4l2_camera.h                        |  44 +-
 src/v4l2/v4l2_camera_proxy.cpp                |  46 +-
 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 +-
 51 files changed, 2101 insertions(+), 1959 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

Comments

Laurent Pinchart Jan. 12, 2020, 1:43 p.m. UTC | #1
Hi Niklas,

On Sun, Jan 12, 2020 at 02:01:40AM +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 quite large and some patches are also quite 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/32, 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/32 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.

Fully reviewed \o/ There are just a handful of minor comments, I think
you can address them and push the result to master. Please remember to
remove the changelog from individual patches before doing so.

Thank you for the great work ! There's more needed as I think we can
improve the interface towards pipeline handlers, but that can be done on
top.

> Laurent Pinchart (1):
>   v4l2: camera_proxy: Call V4L2Camera::getBufferFd() directly
> 
> Niklas Söderlund (31):
>   libcamera: request: remove prepare()
>   libcamera: Add FileDescriptor to help pass numerical fds around
>   test: file_descriptor: Add test
>   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                    | 113 ++---
>  include/libcamera/camera.h                    |  13 +-
>  include/libcamera/file_descriptor.h           |  47 ++
>  include/libcamera/framebuffer_allocator.h     |  45 ++
>  include/libcamera/meson.build                 |   2 +
>  include/libcamera/request.h                   |  16 +-
>  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                      | 411 +++++------------
>  src/libcamera/camera.cpp                      | 184 +++-----
>  src/libcamera/file_descriptor.cpp             | 203 +++++++++
>  src/libcamera/framebuffer_allocator.cpp       | 215 +++++++++
>  src/libcamera/include/pipeline_handler.h      |  13 +-
>  src/libcamera/include/v4l2_videodevice.h      |  66 ++-
>  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            |  75 ++-
>  src/libcamera/request.cpp                     |  60 +--
>  src/libcamera/stream.cpp                      | 248 +---------
>  src/libcamera/v4l2_videodevice.cpp            | 426 ++++++++++++------
>  src/qcam/main_window.cpp                      |  86 ++--
>  src/qcam/main_window.h                        |   7 +-
>  src/v4l2/v4l2_camera.cpp                      |  63 +--
>  src/v4l2/v4l2_camera.h                        |  44 +-
>  src/v4l2/v4l2_camera_proxy.cpp                |  46 +-
>  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 +-
>  51 files changed, 2101 insertions(+), 1959 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
Niklas Söderlund Jan. 12, 2020, 6:09 p.m. UTC | #2
Hi,

This series is now pushed to master with Laurent's comments addressed.

On 2020-01-12 02:01:40 +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 quite large and some patches are also quite 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/32, 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/32 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 (1):
>   v4l2: camera_proxy: Call V4L2Camera::getBufferFd() directly
> 
> Niklas Söderlund (31):
>   libcamera: request: remove prepare()
>   libcamera: Add FileDescriptor to help pass numerical fds around
>   test: file_descriptor: Add test
>   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                    | 113 ++---
>  include/libcamera/camera.h                    |  13 +-
>  include/libcamera/file_descriptor.h           |  47 ++
>  include/libcamera/framebuffer_allocator.h     |  45 ++
>  include/libcamera/meson.build                 |   2 +
>  include/libcamera/request.h                   |  16 +-
>  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                      | 411 +++++------------
>  src/libcamera/camera.cpp                      | 184 +++-----
>  src/libcamera/file_descriptor.cpp             | 203 +++++++++
>  src/libcamera/framebuffer_allocator.cpp       | 215 +++++++++
>  src/libcamera/include/pipeline_handler.h      |  13 +-
>  src/libcamera/include/v4l2_videodevice.h      |  66 ++-
>  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            |  75 ++-
>  src/libcamera/request.cpp                     |  60 +--
>  src/libcamera/stream.cpp                      | 248 +---------
>  src/libcamera/v4l2_videodevice.cpp            | 426 ++++++++++++------
>  src/qcam/main_window.cpp                      |  86 ++--
>  src/qcam/main_window.h                        |   7 +-
>  src/v4l2/v4l2_camera.cpp                      |  63 +--
>  src/v4l2/v4l2_camera.h                        |  44 +-
>  src/v4l2/v4l2_camera_proxy.cpp                |  46 +-
>  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 +-
>  51 files changed, 2101 insertions(+), 1959 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
> 
> -- 
> 2.24.1
>