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>
This commit is contained in:
parent
4a4a3e715b
commit
2daa704c96
5 changed files with 94 additions and 63 deletions
|
@ -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 */
|
||||
|
|
|
@ -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([
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
}
|
64
src/qcam/viewfinder_qt.h
Normal file
64
src/qcam/viewfinder_qt.h
Normal file
|
@ -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__ */
|
Loading…
Add table
Add a link
Reference in a new issue