[libcamera-devel] [PATCH v6 2/4] qcam: new viewfinder hierarchy
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Sep 12 03:25:40 CEST 2020
Hi Show,
Thank you for the patch.
On Fri, Sep 11, 2020 at 04:55:12PM +0800, Show Liu wrote:
> Create viewfinder base class and rename the original viewfinder
s/viewfinder/ViewFinder/
> as QPainter-based ViewFinder
>
> Signed-off-by: Show Liu <show.liu at linaro.org>
> ---
> src/qcam/meson.build | 4 +-
> src/qcam/viewfinder.h | 57 ++++-------------
> .../{viewfinder.cpp => viewfinder_qt.cpp} | 24 +++----
> src/qcam/viewfinder_qt.h | 64 +++++++++++++++++++
> 4 files changed, 89 insertions(+), 60 deletions(-)
> rename src/qcam/{viewfinder.cpp => viewfinder_qt.cpp} (86%)
> create mode 100644 src/qcam/viewfinder_qt.h
This doesn't compile. The following patch fixes it.
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 */
With this,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
I'll apply the above diff when applying the patch, no need for a v7 just
for this.
> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> index e0c6f26..a4bad0a 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 26a1320..67da1df 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
> similarity index 86%
> rename from src/qcam/viewfinder.cpp
> rename to src/qcam/viewfinder_qt.cpp
> index dcf8a15..e436714 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 0000000..d755428
> --- /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