[libcamera-devel,v3,28/30] qcam: viewfinder_gl: Support multi-planar buffers
diff mbox series

Message ID 20210906225636.14683-28-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera: Handle fallout of FrameBuffer offset support
Related show

Commit Message

Laurent Pinchart Sept. 6, 2021, 10:56 p.m. UTC
Now that the ViewFinderGL receives an Image, it can trivially support
multi-planar buffers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
---
 src/qcam/viewfinder_gl.cpp | 38 +++++++++++++++++---------------------
 src/qcam/viewfinder_gl.h   |  2 +-
 2 files changed, 18 insertions(+), 22 deletions(-)

Comments

Kieran Bingham Sept. 7, 2021, 2:10 p.m. UTC | #1
On 06/09/2021 23:56, Laurent Pinchart wrote:
> Now that the ViewFinderGL receives an Image, it can trivially support
> multi-planar buffers.

  \o/

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> ---
>  src/qcam/viewfinder_gl.cpp | 38 +++++++++++++++++---------------------
>  src/qcam/viewfinder_gl.h   |  2 +-
>  2 files changed, 18 insertions(+), 22 deletions(-)
> 
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index 87e4fe03cb8d..32232faa2ad8 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -56,7 +56,7 @@ static const QList<libcamera::PixelFormat> supportedFormats{
>  };
>  
>  ViewFinderGL::ViewFinderGL(QWidget *parent)
> -	: QOpenGLWidget(parent), buffer_(nullptr), data_(nullptr),
> +	: QOpenGLWidget(parent), buffer_(nullptr), image_(nullptr),
>  	  vertexBuffer_(QOpenGLBuffer::VertexBuffer)
>  {
>  }
> @@ -102,6 +102,7 @@ void ViewFinderGL::stop()
>  	if (buffer_) {
>  		renderComplete(buffer_);
>  		buffer_ = nullptr;
> +		image_ = nullptr;
>  	}
>  }
>  
> @@ -114,15 +115,10 @@ QImage ViewFinderGL::getCurrentImage()
>  
>  void ViewFinderGL::render(libcamera::FrameBuffer *buffer, Image *image)
>  {
> -	if (buffer->planes().size() != 1) {
> -		qWarning() << "Multi-planar buffers are not supported";
> -		return;
> -	}
> -
>  	if (buffer_)
>  		renderComplete(buffer_);
>  
> -	data_ = image->data(0).data();
> +	image_ = image;
>  	/*
>  	 * \todo Get the stride from the buffer instead of computing it naively
>  	 */
> @@ -489,7 +485,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  
>  		/* Activate texture UV/VU */
> @@ -503,7 +499,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE_ALPHA,
>  			     GL_UNSIGNED_BYTE,
> -			     data_ + size_.width() * size_.height());
> +			     image_->data(1).data());
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
>  		break;
>  
> @@ -519,7 +515,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  
>  		/* Activate texture U */
> @@ -533,7 +529,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_ + size_.width() * size_.height());
> +			     image_->data(1).data());
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
>  
>  		/* Activate texture V */
> @@ -547,7 +543,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_ + size_.width() * size_.height() * 5 / 4);
> +			     image_->data(2).data());
>  		shaderProgram_.setUniformValue(textureUniformV_, 2);
>  		break;
>  
> @@ -563,7 +559,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  
>  		/* Activate texture V */
> @@ -577,7 +573,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_ + size_.width() * size_.height());
> +			     image_->data(1).data());
>  		shaderProgram_.setUniformValue(textureUniformV_, 2);
>  
>  		/* Activate texture U */
> @@ -591,7 +587,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_ + size_.width() * size_.height() * 5 / 4);
> +			     image_->data(2).data());
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
>  		break;
>  
> @@ -602,7 +598,7 @@ void ViewFinderGL::doRender()
>  		/*
>  		 * Packed YUV formats are stored in a RGBA texture to match the
>  		 * OpenGL texel size with the 4 bytes repeating pattern in YUV.
> -		 * The texture width is thus half of the image with.
> +		 * The texture width is thus half of the image_ with.
>  		 */
>  		glActiveTexture(GL_TEXTURE0);
>  		configureTexture(*textures_[0]);
> @@ -614,7 +610,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_RGBA,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  
>  		/*
> @@ -642,7 +638,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_RGBA,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  		break;
>  
> @@ -658,7 +654,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_RGB,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  		break;
>  
> @@ -689,7 +685,7 @@ void ViewFinderGL::doRender()
>  			     0,
>  			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
> -			     data_);
> +			     image_->data(0).data());
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  		shaderProgram_.setUniformValue(textureUniformBayerFirstRed_,
>  					       firstRed_);
> @@ -714,7 +710,7 @@ void ViewFinderGL::paintGL()
>  				   << "create fragment shader failed.";
>  		}
>  
> -	if (data_) {
> +	if (image_) {
>  		glClearColor(0.0, 0.0, 0.0, 1.0);
>  		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>  
> diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h
> index 7cd8ef3316b9..72a60ecb9159 100644
> --- a/src/qcam/viewfinder_gl.h
> +++ b/src/qcam/viewfinder_gl.h
> @@ -67,7 +67,7 @@ private:
>  	libcamera::PixelFormat format_;
>  	QSize size_;
>  	unsigned int stride_;
> -	unsigned char *data_;
> +	Image *image_;
>  
>  	/* Shaders */
>  	QOpenGLShaderProgram shaderProgram_;
>

Patch
diff mbox series

diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 87e4fe03cb8d..32232faa2ad8 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -56,7 +56,7 @@  static const QList<libcamera::PixelFormat> supportedFormats{
 };
 
 ViewFinderGL::ViewFinderGL(QWidget *parent)
-	: QOpenGLWidget(parent), buffer_(nullptr), data_(nullptr),
+	: QOpenGLWidget(parent), buffer_(nullptr), image_(nullptr),
 	  vertexBuffer_(QOpenGLBuffer::VertexBuffer)
 {
 }
@@ -102,6 +102,7 @@  void ViewFinderGL::stop()
 	if (buffer_) {
 		renderComplete(buffer_);
 		buffer_ = nullptr;
+		image_ = nullptr;
 	}
 }
 
@@ -114,15 +115,10 @@  QImage ViewFinderGL::getCurrentImage()
 
 void ViewFinderGL::render(libcamera::FrameBuffer *buffer, Image *image)
 {
-	if (buffer->planes().size() != 1) {
-		qWarning() << "Multi-planar buffers are not supported";
-		return;
-	}
-
 	if (buffer_)
 		renderComplete(buffer_);
 
-	data_ = image->data(0).data();
+	image_ = image;
 	/*
 	 * \todo Get the stride from the buffer instead of computing it naively
 	 */
@@ -489,7 +485,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 
 		/* Activate texture UV/VU */
@@ -503,7 +499,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE_ALPHA,
 			     GL_UNSIGNED_BYTE,
-			     data_ + size_.width() * size_.height());
+			     image_->data(1).data());
 		shaderProgram_.setUniformValue(textureUniformU_, 1);
 		break;
 
@@ -519,7 +515,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 
 		/* Activate texture U */
@@ -533,7 +529,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_ + size_.width() * size_.height());
+			     image_->data(1).data());
 		shaderProgram_.setUniformValue(textureUniformU_, 1);
 
 		/* Activate texture V */
@@ -547,7 +543,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_ + size_.width() * size_.height() * 5 / 4);
+			     image_->data(2).data());
 		shaderProgram_.setUniformValue(textureUniformV_, 2);
 		break;
 
@@ -563,7 +559,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 
 		/* Activate texture V */
@@ -577,7 +573,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_ + size_.width() * size_.height());
+			     image_->data(1).data());
 		shaderProgram_.setUniformValue(textureUniformV_, 2);
 
 		/* Activate texture U */
@@ -591,7 +587,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_ + size_.width() * size_.height() * 5 / 4);
+			     image_->data(2).data());
 		shaderProgram_.setUniformValue(textureUniformU_, 1);
 		break;
 
@@ -602,7 +598,7 @@  void ViewFinderGL::doRender()
 		/*
 		 * Packed YUV formats are stored in a RGBA texture to match the
 		 * OpenGL texel size with the 4 bytes repeating pattern in YUV.
-		 * The texture width is thus half of the image with.
+		 * The texture width is thus half of the image_ with.
 		 */
 		glActiveTexture(GL_TEXTURE0);
 		configureTexture(*textures_[0]);
@@ -614,7 +610,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_RGBA,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 
 		/*
@@ -642,7 +638,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_RGBA,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 		break;
 
@@ -658,7 +654,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_RGB,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 		break;
 
@@ -689,7 +685,7 @@  void ViewFinderGL::doRender()
 			     0,
 			     GL_LUMINANCE,
 			     GL_UNSIGNED_BYTE,
-			     data_);
+			     image_->data(0).data());
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 		shaderProgram_.setUniformValue(textureUniformBayerFirstRed_,
 					       firstRed_);
@@ -714,7 +710,7 @@  void ViewFinderGL::paintGL()
 				   << "create fragment shader failed.";
 		}
 
-	if (data_) {
+	if (image_) {
 		glClearColor(0.0, 0.0, 0.0, 1.0);
 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h
index 7cd8ef3316b9..72a60ecb9159 100644
--- a/src/qcam/viewfinder_gl.h
+++ b/src/qcam/viewfinder_gl.h
@@ -67,7 +67,7 @@  private:
 	libcamera::PixelFormat format_;
 	QSize size_;
 	unsigned int stride_;
-	unsigned char *data_;
+	Image *image_;
 
 	/* Shaders */
 	QOpenGLShaderProgram shaderProgram_;