[libcamera-devel] [PATCH v3 28/30] qcam: viewfinder_gl: Support multi-planar buffers
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Sep 7 16:10:22 CEST 2021
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 at ideasonboard.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at 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_;
>
More information about the libcamera-devel
mailing list