[libcamera-devel] [PATCH v2 1/5] qcam: viewfinder: Pass stride value to viewfinder

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Wed Sep 22 08:44:33 CEST 2021


Hi Laurent,

On Tue, Sep 07, 2021 at 03:20:40AM +0300, Laurent Pinchart wrote:
> qcam currently assumes that no padding is used at end of lines, and uses
> the image width as the stride. This leads to rendering failures with
> some formats on some platforms. To prepare for stride support, add a
> stride parameter to the ViewFinder::setFormat() function to pass the
> stride from the stream configuration to the viewfinder.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> ---
>  src/qcam/main_window.cpp   | 3 ++-
>  src/qcam/viewfinder.h      | 3 ++-
>  src/qcam/viewfinder_gl.cpp | 7 ++-----
>  src/qcam/viewfinder_gl.h   | 3 ++-
>  src/qcam/viewfinder_qt.cpp | 3 ++-
>  src/qcam/viewfinder_qt.h   | 3 ++-
>  6 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 168dd5ce30e3..bb6b03993add 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -448,7 +448,8 @@ int MainWindow::startCapture()
>  
>  	/* Configure the viewfinder. */
>  	ret = viewfinder_->setFormat(vfConfig.pixelFormat,
> -				     QSize(vfConfig.size.width, vfConfig.size.height));
> +				     QSize(vfConfig.size.width, vfConfig.size.height),
> +				     vfConfig.stride);
>  	if (ret < 0) {
>  		qInfo() << "Failed to set viewfinder format";
>  		return ret;
> diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
> index fb462835fb5f..4c2102a6ed04 100644
> --- a/src/qcam/viewfinder.h
> +++ b/src/qcam/viewfinder.h
> @@ -23,7 +23,8 @@ public:
>  
>  	virtual const QList<libcamera::PixelFormat> &nativeFormats() const = 0;
>  
> -	virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size) = 0;
> +	virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size,
> +			      unsigned int stride) = 0;
>  	virtual void render(libcamera::FrameBuffer *buffer, Image *image) = 0;
>  	virtual void stop() = 0;
>  
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index 32232faa2ad8..aeb1ea02d2d5 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -72,7 +72,7 @@ const QList<libcamera::PixelFormat> &ViewFinderGL::nativeFormats() const
>  }
>  
>  int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
> -			    const QSize &size)
> +			    const QSize &size, unsigned int stride)
>  {
>  	if (format != format_) {
>  		/*
> @@ -92,6 +92,7 @@ int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
>  	}
>  
>  	size_ = size;
> +	stride_ = stride;
>  
>  	updateGeometry();
>  	return 0;
> @@ -119,10 +120,6 @@ void ViewFinderGL::render(libcamera::FrameBuffer *buffer, Image *image)
>  		renderComplete(buffer_);
>  
>  	image_ = image;
> -	/*
> -	 * \todo Get the stride from the buffer instead of computing it naively
> -	 */
> -	stride_ = buffer->metadata().planes()[0].bytesused / size_.height();
>  	update();
>  	buffer_ = buffer;
>  }
> diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h
> index 72a60ecb9159..2b2b1e86035a 100644
> --- a/src/qcam/viewfinder_gl.h
> +++ b/src/qcam/viewfinder_gl.h
> @@ -38,7 +38,8 @@ public:
>  
>  	const QList<libcamera::PixelFormat> &nativeFormats() const override;
>  
> -	int setFormat(const libcamera::PixelFormat &format, const QSize &size) override;
> +	int setFormat(const libcamera::PixelFormat &format, const QSize &size,
> +		      unsigned int stride) override;
>  	void render(libcamera::FrameBuffer *buffer, Image *image) override;
>  	void stop() override;
>  
> diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp
> index 0d357d860014..cd051760160c 100644
> --- a/src/qcam/viewfinder_qt.cpp
> +++ b/src/qcam/viewfinder_qt.cpp
> @@ -52,7 +52,8 @@ const QList<libcamera::PixelFormat> &ViewFinderQt::nativeFormats() const
>  }
>  
>  int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,
> -			    const QSize &size)
> +			    const QSize &size,
> +			    [[maybe_unused]] unsigned int stride)
>  {
>  	image_ = QImage();
>  
> diff --git a/src/qcam/viewfinder_qt.h b/src/qcam/viewfinder_qt.h
> index 6b48ef48a7d1..756f3fa33055 100644
> --- a/src/qcam/viewfinder_qt.h
> +++ b/src/qcam/viewfinder_qt.h
> @@ -31,7 +31,8 @@ public:
>  
>  	const QList<libcamera::PixelFormat> &nativeFormats() const override;
>  
> -	int setFormat(const libcamera::PixelFormat &format, const QSize &size) override;
> +	int setFormat(const libcamera::PixelFormat &format, const QSize &size,
> +		      unsigned int stride) override;
>  	void render(libcamera::FrameBuffer *buffer, Image *image) override;
>  	void stop() override;
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 


More information about the libcamera-devel mailing list