[libcamera-devel] [PATCH v7 2/4] qcam: New viewfinder hierarchy

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Sep 15 04:46:21 CEST 2020


From: Show Liu <show.liu at linaro.org>

Create ViewFinder base class and rename the original ViewFinder
as QPainter-based ViewFinder.

Signed-off-by: Show Liu <show.liu at linaro.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/qcam/main_window.cpp                      |  8 ++-
 src/qcam/meson.build                          |  4 +-
 src/qcam/viewfinder.h                         | 57 ++++-------------
 .../{viewfinder.cpp => viewfinder_qt.cpp}     | 24 +++----
 src/qcam/viewfinder_qt.h                      | 64 +++++++++++++++++++
 5 files changed, 94 insertions(+), 63 deletions(-)
 rename src/qcam/{viewfinder.cpp => viewfinder_qt.cpp} (86%)
 create mode 100644 src/qcam/viewfinder_qt.h

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 612d978a73df..7406f0bd4512 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -28,6 +28,7 @@
 #include <libcamera/version.h>
 
 #include "dng_writer.h"
+#include "viewfinder_qt.h"
 
 using namespace libcamera;
 
@@ -105,10 +106,11 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
 	setWindowTitle(title_);
 	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
 
-	viewfinder_ = new ViewFinder(this);
-	connect(viewfinder_, &ViewFinder::renderComplete,
+	ViewFinderQt *viewfinder = new ViewFinderQt(this);
+	connect(viewfinder, &ViewFinderQt::renderComplete,
 		this, &MainWindow::queueRequest);
-	setCentralWidget(viewfinder_);
+	viewfinder_ = viewfinder;
+	setCentralWidget(viewfinder);
 	adjustSize();
 
 	/* Hotplug/unplug support */
diff --git a/src/qcam/meson.build b/src/qcam/meson.build
index e0c6f26dfef5..a4bad0a0659e 100644
--- a/src/qcam/meson.build
+++ b/src/qcam/meson.build
@@ -6,12 +6,12 @@ qcam_sources = files([
     'format_converter.cpp',
     'main.cpp',
     'main_window.cpp',
-    'viewfinder.cpp',
+    'viewfinder_qt.cpp',
 ])
 
 qcam_moc_headers = files([
     'main_window.h',
-    'viewfinder.h',
+    'viewfinder_qt.h',
 ])
 
 qcam_resources = files([
diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
index 26a1320537d2..67da1df26a0c 100644
--- a/src/qcam/viewfinder.h
+++ b/src/qcam/viewfinder.h
@@ -2,70 +2,35 @@
 /*
  * Copyright (C) 2019, Google Inc.
  *
- * viewfinder.h - qcam - Viewfinder
+ * viewfinder.h - qcam - Viewfinder base class
  */
 #ifndef __QCAM_VIEWFINDER_H__
 #define __QCAM_VIEWFINDER_H__
 
-#include <stddef.h>
-
-#include <QIcon>
-#include <QList>
 #include <QImage>
-#include <QMutex>
+#include <QList>
 #include <QSize>
-#include <QWidget>
 
 #include <libcamera/buffer.h>
-#include <libcamera/pixel_format.h>
-
-#include "format_converter.h"
-
-class QImage;
+#include <libcamera/formats.h>
 
 struct MappedBuffer {
 	void *memory;
 	size_t size;
 };
 
-class ViewFinder : public QWidget
+class ViewFinder
 {
-	Q_OBJECT
-
 public:
-	ViewFinder(QWidget *parent);
-	~ViewFinder();
+	virtual ~ViewFinder() {}
 
-	const QList<libcamera::PixelFormat> &nativeFormats() const;
+	virtual const QList<libcamera::PixelFormat> &nativeFormats() const = 0;
 
-	int setFormat(const libcamera::PixelFormat &format, const QSize &size);
-	void render(libcamera::FrameBuffer *buffer, MappedBuffer *map);
-	void stop();
+	virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size) = 0;
+	virtual void render(libcamera::FrameBuffer *buffer, MappedBuffer *map) = 0;
+	virtual void stop() = 0;
 
-	QImage getCurrentImage();
-
-Q_SIGNALS:
-	void renderComplete(libcamera::FrameBuffer *buffer);
-
-protected:
-	void paintEvent(QPaintEvent *) override;
-	QSize sizeHint() const override;
-
-private:
-	FormatConverter converter_;
-
-	libcamera::PixelFormat format_;
-	QSize size_;
-
-	/* Camera stopped icon */
-	QSize vfSize_;
-	QIcon icon_;
-	QPixmap pixmap_;
-
-	/* Buffer and render image */
-	libcamera::FrameBuffer *buffer_;
-	QImage image_;
-	QMutex mutex_; /* Prevent concurrent access to image_ */
+	virtual QImage getCurrentImage() = 0;
 };
 
-#endif /* __QCAM_VIEWFINDER__ */
+#endif /* __QCAM_VIEWFINDER_H__ */
diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder_qt.cpp
similarity index 86%
rename from src/qcam/viewfinder.cpp
rename to src/qcam/viewfinder_qt.cpp
index dcf8a15d2df6..e436714c6bdb 100644
--- a/src/qcam/viewfinder.cpp
+++ b/src/qcam/viewfinder_qt.cpp
@@ -2,10 +2,10 @@
 /*
  * Copyright (C) 2019, Google Inc.
  *
- * viewfinder.cpp - qcam - Viewfinder
+ * viewfinder_qt.cpp - qcam - QPainter-based ViewFinder
  */
 
-#include "viewfinder.h"
+#include "viewfinder_qt.h"
 
 #include <stdint.h>
 #include <utility>
@@ -33,24 +33,24 @@ static const QMap<libcamera::PixelFormat, QImage::Format> nativeFormats
 	{ libcamera::formats::BGR888, QImage::Format_RGB888 },
 };
 
-ViewFinder::ViewFinder(QWidget *parent)
+ViewFinderQt::ViewFinderQt(QWidget *parent)
 	: QWidget(parent), buffer_(nullptr)
 {
 	icon_ = QIcon(":camera-off.svg");
 }
 
-ViewFinder::~ViewFinder()
+ViewFinderQt::~ViewFinderQt()
 {
 }
 
-const QList<libcamera::PixelFormat> &ViewFinder::nativeFormats() const
+const QList<libcamera::PixelFormat> &ViewFinderQt::nativeFormats() const
 {
 	static const QList<libcamera::PixelFormat> formats = ::nativeFormats.keys();
 	return formats;
 }
 
-int ViewFinder::setFormat(const libcamera::PixelFormat &format,
-			  const QSize &size)
+int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,
+			    const QSize &size)
 {
 	image_ = QImage();
 
@@ -78,7 +78,7 @@ int ViewFinder::setFormat(const libcamera::PixelFormat &format,
 	return 0;
 }
 
-void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
+void ViewFinderQt::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
 {
 	if (buffer->planes().size() != 1) {
 		qWarning() << "Multi-planar buffers are not supported";
@@ -121,7 +121,7 @@ void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
 		renderComplete(buffer);
 }
 
-void ViewFinder::stop()
+void ViewFinderQt::stop()
 {
 	image_ = QImage();
 
@@ -133,14 +133,14 @@ void ViewFinder::stop()
 	update();
 }
 
-QImage ViewFinder::getCurrentImage()
+QImage ViewFinderQt::getCurrentImage()
 {
 	QMutexLocker locker(&mutex_);
 
 	return image_.copy();
 }
 
-void ViewFinder::paintEvent(QPaintEvent *)
+void ViewFinderQt::paintEvent(QPaintEvent *)
 {
 	QPainter painter(this);
 
@@ -175,7 +175,7 @@ void ViewFinder::paintEvent(QPaintEvent *)
 	painter.drawPixmap(point, pixmap_);
 }
 
-QSize ViewFinder::sizeHint() const
+QSize ViewFinderQt::sizeHint() const
 {
 	return size_.isValid() ? size_ : QSize(640, 480);
 }
diff --git a/src/qcam/viewfinder_qt.h b/src/qcam/viewfinder_qt.h
new file mode 100644
index 000000000000..d755428887c0
--- /dev/null
+++ b/src/qcam/viewfinder_qt.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * viewfinder_qt.h - qcam - QPainter-based ViewFinder
+ */
+#ifndef __QCAM_VIEWFINDER_QT_H__
+#define __QCAM_VIEWFINDER_QT_H__
+
+#include <QIcon>
+#include <QImage>
+#include <QList>
+#include <QMutex>
+#include <QSize>
+#include <QWidget>
+
+#include <libcamera/buffer.h>
+#include <libcamera/formats.h>
+#include <libcamera/pixel_format.h>
+
+#include "format_converter.h"
+#include "viewfinder.h"
+
+class ViewFinderQt : public QWidget, public ViewFinder
+{
+	Q_OBJECT
+
+public:
+	ViewFinderQt(QWidget *parent);
+	~ViewFinderQt();
+
+	const QList<libcamera::PixelFormat> &nativeFormats() const override;
+
+	int setFormat(const libcamera::PixelFormat &format, const QSize &size) override;
+	void render(libcamera::FrameBuffer *buffer, MappedBuffer *map) override;
+	void stop() override;
+
+	QImage getCurrentImage() override;
+
+Q_SIGNALS:
+	void renderComplete(libcamera::FrameBuffer *buffer);
+
+protected:
+	void paintEvent(QPaintEvent *) override;
+	QSize sizeHint() const override;
+
+private:
+	FormatConverter converter_;
+
+	libcamera::PixelFormat format_;
+	QSize size_;
+
+	/* Camera stopped icon */
+	QSize vfSize_;
+	QIcon icon_;
+	QPixmap pixmap_;
+
+	/* Buffer and render image */
+	libcamera::FrameBuffer *buffer_;
+	QImage image_;
+	QMutex mutex_; /* Prevent concurrent access to image_ */
+};
+
+#endif /* __QCAM_VIEWFINDER_QT_H__ */
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list