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

Show Liu show.liu at linaro.org
Fri Mar 20 09:50:29 CET 2020


qcam: added an option to enable rendering via OpenGL shader

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");
 
 	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"
 
 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);
+
+	if (options_.isSet(OptOpengl)) {
+		setCentralWidget(glwidget_);
+	} else {
+		setCentralWidget(viewfinder_);
+	}
+
 	adjustSize();
 
 	ret = openCamera();
@@ -232,6 +240,7 @@ int MainWindow::startCapture()
 	}
 
 	Stream *stream = cfg.stream();
+
 	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',
 };
 
 class MainWindow : public QMainWindow
@@ -79,6 +81,7 @@ private:
 
 	QToolBar *toolbar_;
 	ViewFinder *viewfinder_;
+	GLWidget *glwidget_;
 	std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
 };
 
-- 
2.20.1



More information about the libcamera-devel mailing list