[libcamera-devel] [PATCH 00/20] libcamera: Multi-stream support for the simple pipeline handler

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jan 31 23:46:42 CET 2021


Hello,

This patch series implements multi-stream support in the simple pipeline
handler.

Multi-stream support in the capture device requires hardware processing
capabilities (at least format conversion and scaling), which would
likely not qualify the platform for support in the simple pipeline
handler. However, for platforms that include a converter, the V4L2 M2M
API allows opening multiple instances of the converter to create
multiple output streams with different formats and resolution (as long
as the hardware has enough bandwidth to run all the processing passes).
This approach is generic and doesn't require any extra hardware feature
compared to what the simple pipeline handler already uses.

The patches starts with refactoring of the converter class to prepare
for multiple streams support, and then refactors the simple pipeline
handler to achieve the same goal. The last two patches enable
multi-streams support

The code has been tested on the MediaTek Pumpkin i500 board. Its
support isn't available in the simple pipeline handler yet due to the
drivers not being upstream, which is an issue that is being addressed.
Enabling it, after importing the kernel headers that define the
MediaTek-specific pixel formats and enabling them in libcamera, only
requires the following change in the simple pipeline handler.

diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 55a5528611c8..6b0170d1aba8 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -132,6 +132,7 @@ namespace {

 static const SimplePipelineInfo supportedDevices[] = {
 	{ "imx7-csi", "pxp", 1 },
+	{ "mtk-camsv-p1", "mtk-mdp3", 3 },
 	{ "qcom-camss", nullptr, 1 },
 	{ "sun6i-csi", nullptr, 1 },
 };

Laurent Pinchart (20):
  libcamera: pipeline: simple: Manage converter with std::unique_ptr<>
  libcamera: pipeline: simple: Don't override stride at configure time
  libcamera: pipeline: simple: converter: Group query functions together
  libcamera: pipeline: simple: converter: Use StreamConfiguration for
    input configuration
  libcamera: pipeline: simple: converter: Configure input stride
  libcamera: pipeline: simple: converter: Differentiate input and output
    buffers count
  libcamera: pipeline: simple: converter: Replace open() with isValid()
  libcamera: pipeline: simple: converter: Decouple input and output
    completion
  libcamera: pipeline: simple: converter: Add multi-stream support
  libcamera: pipeline: simple: Store streams in a vector
  libcamera: pipeline: simple: Drop unused members of configuration
  libcamera: pipeline: simple: Document the pipeline handler design
  libcamera: pipeline: simple: Rename Configuration::pixelFormat
  libcamera: pipeline: simple: Cache pipeline config in
    SimpleCameraConfiguration
  libcamera: pipeline: simple: Add output formats to Configuration
  libcamera: pipeline: simple: Move converter data to camera data
  libcamera: pipeline: simple: Hardcode the number of internal buffers
  libcamera: pipeline: simple: Support configuration of multiple streams
  libcamera: pipeline: simple: Support usage of multiple streams
  libcamera: pipeline: simple: Enable multiple streams for compatible
    devices

 src/libcamera/pipeline/simple/converter.cpp | 398 ++++++++------
 src/libcamera/pipeline/simple/converter.h   |  60 ++-
 src/libcamera/pipeline/simple/simple.cpp    | 542 +++++++++++++-------
 3 files changed, 650 insertions(+), 350 deletions(-)

-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list