summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShow Liu <show.liu@linaro.org>2020-09-11 16:55:12 +0800
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-09-15 05:10:35 +0300
commit2daa704c968c8aa7a4b209450f228b41e9d42d85 (patch)
treeb11e6376432fedeac964858e1019166bd379a569
parent4a4a3e715b8314c56a2a32788d92fdec464af7b7 (diff)
qcam: New viewfinder hierarchy
Create ViewFinder base class and rename the original ViewFinder as QPainter-based ViewFinder. Signed-off-by: Show Liu <show.liu@linaro.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/qcam/main_window.cpp8
-rw-r--r--src/qcam/meson.build4
-rw-r--r--src/qcam/viewfinder.h57
-rw-r--r--src/qcam/viewfinder_qt.cpp (renamed from src/qcam/viewfinder.cpp)24
-rw-r--r--src/qcam/viewfinder_qt.h64
5 files changed, 94 insertions, 63 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 612d978a..7406f0bd 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 e0c6f26d..a4bad0a0 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 26a13205..67da1df2 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();
-
- const QList<libcamera::PixelFormat> &nativeFormats() const;
-
- int setFormat(const libcamera::PixelFormat &format, const QSize &size);
- void render(libcamera::FrameBuffer *buffer, MappedBuffer *map);
- void stop();
-
- QImage getCurrentImage();
-
-Q_SIGNALS:
- void renderComplete(libcamera::FrameBuffer *buffer);
-
-protected:
- void paintEvent(QPaintEvent *) override;
- QSize sizeHint() const override;
-
-private:
- FormatConverter converter_;
+ virtual ~ViewFinder() {}
- libcamera::PixelFormat format_;
- QSize size_;
+ virtual const QList<libcamera::PixelFormat> &nativeFormats() const = 0;
- /* Camera stopped icon */
- QSize vfSize_;
- QIcon icon_;
- QPixmap pixmap_;
+ virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size) = 0;
+ virtual void render(libcamera::FrameBuffer *buffer, MappedBuffer *map) = 0;
+ virtual void stop() = 0;
- /* 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
index dcf8a15d..e436714c 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 00000000..d7554288
--- /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__ */