[libcamera-devel,0/9] Add support for external bufferes
mbox series

Message ID 20190704225334.26170-1-jacopo@jmondi.org
Headers show
Series
  • Add support for external bufferes
Related show

Message

Jacopo Mondi July 4, 2019, 10:53 p.m. UTC
>From the RFC cover letter:
-------------------------------------------------------------------------------
The libcamera APIs need to be augmented to allow application to use buffers
whose memory has been allocated outside of the library.

This feature is particularly essential to support the Android camera HAL, which
uses buffers allocated by mean of gralloc and exported by using DMABUF file
descriptor.

Each Stream has a buffer pool which contains buffers which are used to interact
with the underlying video devices and whose memory is directly accessed by
applications in case a Stream uses its internal memory, but could also be mapped
on buffers whose memory is allocated elsewhere by exchanging the dmabuf file
descriptors associated to each buffer's plane.

Extend the StreamConfiguration class with a flag that defines the memory
type a Stream uses (internal or external) and use said flag in pipeline handler
to either allocate memory for the buffer, or prepare to use externally
allocated buffers. As a consequence, rename PipelineHandler::allocateBuffers()
to PipelineHandler::setupBuffers().

On top of this perform buffer mapping for streams using external memory at
request queueing time, hiding the mapping from pipeline handler that will
always only interact with streams from the Stream's internal pool.

Add a map of buffers to each request to perform back-and-forth translation of
application provided buffers to stream internal buffer at request complete time.

Finally, add a test application that use buffers allocated in the vivid output
device to stream a Camera. The test is not meant to be considered for merge, but
more a proof a concept (it has my camera name hardcoded...) and fails for buffer
#0 (but works for all others).
-------------------------------------------------------------------------------

I have included Niklas and Kieran comments and heavily reworked the mapping
operation in the Stream. The rest is more or less the same, with the exception
of support for IPU3 which is now included and for importing multiplane buffers.

Finally, the last patch should be made a test. At the moment it's a development
tool (has the name of my webcam hardcoded...)

Thanks
   j

Jacopo Mondi (9):
  libcamera: stream: Provide accessors to buffers
  libcamera: stream: Add Stream memory type
  libcamera: pipeline: Support external buffers
  libcamera: Rename PipelineHandler::allocateBuffers
  libcamera: request: Rename the Stream to Buffer map
  libcamera: stream: Add operation to map buffers
  libcamera: request: Support buffer mapping
  libcamera: pipeline: ipu3: Use buffer mapping
  [HACK] test: v4l2_videodevice: Add buffer import test

 include/libcamera/buffer.h               |   1 +
 include/libcamera/request.h              |   8 +-
 include/libcamera/stream.h               |  26 +++
 src/cam/capture.cpp                      |   4 +-
 src/libcamera/camera.cpp                 |  11 +-
 src/libcamera/include/pipeline_handler.h |   4 +-
 src/libcamera/pipeline/ipu3/ipu3.cpp     |  45 ++++-
 src/libcamera/pipeline/rkisp1/rkisp1.cpp |  15 +-
 src/libcamera/pipeline/uvcvideo.cpp      |  16 +-
 src/libcamera/pipeline/vimc.cpp          |  16 +-
 src/libcamera/pipeline_handler.cpp       |  12 +-
 src/libcamera/request.cpp                |  61 +++++-
 src/libcamera/stream.cpp                 | 181 +++++++++++++++++-
 src/qcam/main_window.cpp                 |   4 +-
 test/camera/capture.cpp                  |   3 +-
 test/camera/statemachine.cpp             |   3 +-
 test/v4l2_videodevice/buffer_import.cpp  | 234 +++++++++++++++++++++++
 test/v4l2_videodevice/meson.build        |   1 +
 18 files changed, 588 insertions(+), 57 deletions(-)
 create mode 100644 test/v4l2_videodevice/buffer_import.cpp

--
2.21.0