[libcamera-devel] [PATCH v3] cam: kms-sink: Once we have found a suitable pipeline to select, return
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Feb 7 23:28:16 CET 2022
Hi Eric,
Thank you for the patch.
On Mon, Feb 07, 2022 at 03:01:36PM +0000, Eric Curtin wrote:
> The break only breaks out of the innermost loop which is not the most
> optimal. It also breaks cam on my machines.
I'd expand this a bit.
cam: kms_sink: Use the first suitable pipeline found
When searching for a suitable pipeline, we mistakenly only break from
the inner loop. This results in the last suitable output being selected.
Pick the first one instead.
> Fixes: 1de0f90dd432 ("cam: kms_sink: Print display pipelineconfiguration")
> Signed-off-by: Eric Curtin <ecurtin at redhat.com>
> ---
>
> Changes in v3:
> - Add "cam: kms_sink:" tag
>
> Changes in v2:
> - Change function name to selectPipeline
> - Return int rather than pointer
> - Formatting
> - Mention in commit message that it fixes a bug on my machine also
>
> src/cam/kms_sink.cpp | 18 ++++++++++++------
> src/cam/kms_sink.h | 1 +
> 2 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp
> index d30fba78..973cd370 100644
> --- a/src/cam/kms_sink.cpp
> +++ b/src/cam/kms_sink.cpp
> @@ -136,7 +136,7 @@ int KMSSink::configure(const libcamera::CameraConfiguration &config)
> return 0;
> }
>
> -int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
> +int KMSSink::selectPipeline(const libcamera::PixelFormat &format)
> {
> /*
> * If the requested format has an alpha channel, also consider the X
> @@ -174,25 +174,31 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
> crtc_ = crtc;
> plane_ = plane;
> format_ = format;
> - break;
> + return 0;
> }
>
> if (plane->supportsFormat(xFormat)) {
> crtc_ = crtc;
> plane_ = plane;
> format_ = xFormat;
> - break;
> + return 0;
> }
> }
> }
> }
>
> - if (!crtc_) {
> + return -EPIPE;
> +}
> +
> +int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
> +{
> + const int ret = selectPipeline(format);
> + if (ret) {
> std::cerr
> << "Unable to find display pipeline for format "
> << format.toString() << std::endl;
>
> - return -EPIPE;
> + return ret;
> }
>
> std::cout
> @@ -200,7 +206,7 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)
> << ", connector " << connector_->name()
> << " (" << connector_->id() << ")" << std::endl;
>
> - return 0;
> + return ret;
This change isn't needed.
With these changes,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
If you agree with those changes there's no need to resubmit, I'll make
those small modifications before pushing.
> }
>
> int KMSSink::start()
> diff --git a/src/cam/kms_sink.h b/src/cam/kms_sink.h
> index 1e4290ad..4a0a872c 100644
> --- a/src/cam/kms_sink.h
> +++ b/src/cam/kms_sink.h
> @@ -47,6 +47,7 @@ private:
> libcamera::Request *camRequest_;
> };
>
> + int selectPipeline(const libcamera::PixelFormat &format);
> int configurePipeline(const libcamera::PixelFormat &format);
> void requestComplete(DRM::AtomicRequest *request);
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list