[libcamera-devel] [RFC] [PATCH 3/3] qcam: added an option to enable rendering via OpenGL shader

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Mar 20 15:54:21 CET 2020


Hi Show,

Thank you for the patch.

On Fri, Mar 20, 2020 at 04:50:29PM +0800, Show Liu wrote:
> qcam: added an option to enable rendering via OpenGL shader

s/added/Add/

You don't need to repeat the subject line in the commit message, but it
could be useful to add a bit more detail in the commit message (although
in this case the change is fairly trivial).

> Signed-off-by: Show Liu <show.liu at linaro.org>
> ---
>  src/qcam/main.cpp        |  2 ++
>  src/qcam/main_window.cpp | 31 ++++++++++++++++++++++++++++---
>  src/qcam/main_window.h   |  3 +++
>  3 files changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
> index a7ff5c5..7727a09 100644
> --- a/src/qcam/main.cpp
> +++ b/src/qcam/main.cpp
> @@ -39,6 +39,8 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
>  			 "help");
>  	parser.addOption(OptSize, &sizeParser, "Set the stream size",
>  			 "size", true);
> +	parser.addOption(OptOpengl, OptionNone, "Enable YUV format via OpenGL shader",
> +			 "opengl");

How about a renderer option instead, that would take a string value ? It
would be useful to support more renderer in the future if we need to. Or
maybe that will never be needed ?

>  
>  	OptionsParser::Options options = parser.parse(argc, argv);
>  	if (options.isSet(OptHelp))
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 98e55ba..5a5bc88 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -28,6 +28,7 @@
>  
>  #include "main_window.h"
>  #include "viewfinder.h"
> +#include "glwidget.h"

Alphabetical order please.

>  
>  using namespace libcamera;
>  
> @@ -43,7 +44,14 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
>  	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
>  
>  	viewfinder_ = new ViewFinder(this);
> -	setCentralWidget(viewfinder_);
> +	glwidget_ = new GLWidget(this);

I think we should create a base ViewFinder class (renaming the existing
ViewFinder to ViewFinderQImage or ViewFinderQPainter), and make the two
implementations inherit from the base. This code would then become

	if (options_.isSet(OptOpengl))
		viewfinder_ = new ViewFinderGL(this);
	else
		viewfinder_ = new ViewFinderQPainter(this);

	setCentralWidget(viewfinder_);

and you won't have to test for options_.isSet(OptOpengl) anywere below.

> +
> +	if (options_.isSet(OptOpengl)) {
> +		setCentralWidget(glwidget_);
> +	} else {
> +		setCentralWidget(viewfinder_);
> +	}
> +
>  	adjustSize();
>  
>  	ret = openCamera();
> @@ -232,6 +240,7 @@ int MainWindow::startCapture()
>  	}
>  
>  	Stream *stream = cfg.stream();
> +

I don't think this is needed.

>  	ret = viewfinder_->setFormat(cfg.pixelFormat, cfg.size.width,
>  				     cfg.size.height);
>  	if (ret < 0) {
> @@ -239,6 +248,11 @@ int MainWindow::startCapture()
>  		return ret;
>  	}
>  
> +	if (options_.isSet(OptOpengl)) {
> +		glwidget_->setFrameSize(cfg.size.width, cfg.size.height);
> +		glwidget_->setFixedSize(cfg.size.width, cfg.size.height);
> +	}
> +
>  	statusBar()->showMessage(QString(cfg.toString().c_str()));
>  
>  	adjustSize();
> @@ -353,7 +367,13 @@ void MainWindow::stopCapture()
>  
>  void MainWindow::saveImageAs()
>  {
> -	QImage image = viewfinder_->getCurrentImage();
> +	QImage image;
> +	if (options_.isSet(OptOpengl)) {
> +		image = glwidget_->grabFramebuffer();
> +	} else {
> +		image = viewfinder_->getCurrentImage();
> +	}
> +
>  	QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
>  
>  	QString filename = QFileDialog::getSaveFileName(this, "Save Image", defaultPath,
> @@ -416,7 +436,12 @@ int MainWindow::display(FrameBuffer *buffer)
>  	const FrameBuffer::Plane &plane = buffer->planes().front();
>  	void *memory = mappedBuffers_[plane.fd.fd()].first;
>  	unsigned char *raw = static_cast<unsigned char *>(memory);
> -	viewfinder_->display(raw, buffer->metadata().planes[0].bytesused);
> +
> +	if (options_.isSet(OptOpengl)) {
> +		glwidget_->updateFrame(raw);
> +	} else {
> +		viewfinder_->display(raw, buffer->metadata().planes[0].bytesused);
> +	}
>  
>  	return 0;
>  }
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 40aa10a..5501dd1 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -21,6 +21,7 @@
>  #include <libcamera/stream.h>
>  
>  #include "../cam/options.h"
> +#include "glwidget.h"
>  
>  using namespace libcamera;
>  
> @@ -30,6 +31,7 @@ enum {
>  	OptCamera = 'c',
>  	OptHelp = 'h',
>  	OptSize = 's',
> +	OptOpengl = 'o',

Maybe OptOpenGL ?

>  };
>  
>  class MainWindow : public QMainWindow
> @@ -79,6 +81,7 @@ private:
>  
>  	QToolBar *toolbar_;
>  	ViewFinder *viewfinder_;
> +	GLWidget *glwidget_;
>  	std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
>  };
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list