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 <libcamera/version.h>
|
||||||
|
|
||||||
#include "dng_writer.h"
|
#include "dng_writer.h"
|
||||||
|
#include "viewfinder_qt.h"
|
||||||
|
|
||||||
using namespace libcamera;
|
using namespace libcamera;
|
||||||
|
|
||||||
|
@ -105,10 +106,11 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
|
||||||
setWindowTitle(title_);
|
setWindowTitle(title_);
|
||||||
connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
|
connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
|
||||||
|
|
||||||
viewfinder_ = new ViewFinder(this);
|
ViewFinderQt *viewfinder = new ViewFinderQt(this);
|
||||||
connect(viewfinder_, &ViewFinder::renderComplete,
|
connect(viewfinder, &ViewFinderQt::renderComplete,
|
||||||
this, &MainWindow::queueRequest);
|
this, &MainWindow::queueRequest);
|
||||||
setCentralWidget(viewfinder_);
|
viewfinder_ = viewfinder;
|
||||||
|
setCentralWidget(viewfinder);
|
||||||
adjustSize();
|
adjustSize();
|
||||||
|
|
||||||
/* Hotplug/unplug support */
|
/* Hotplug/unplug support */
|
||||||
|
|
|
@ -6,12 +6,12 @@ qcam_sources = files([
|
||||||
'format_converter.cpp',
|
'format_converter.cpp',
|
||||||
'main.cpp',
|
'main.cpp',
|
||||||
'main_window.cpp',
|
'main_window.cpp',
|
||||||
'viewfinder.cpp',
|
'viewfinder_qt.cpp',
|
||||||
])
|
])
|
||||||
|
|
||||||
qcam_moc_headers = files([
|
qcam_moc_headers = files([
|
||||||
'main_window.h',
|
'main_window.h',
|
||||||
'viewfinder.h',
|
'viewfinder_qt.h',
|
||||||
])
|
])
|
||||||
|
|
||||||
qcam_resources = files([
|
qcam_resources = files([
|
||||||
|
|
|
@ -2,70 +2,35 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2019, Google Inc.
|
* Copyright (C) 2019, Google Inc.
|
||||||
*
|
*
|
||||||
* viewfinder.h - qcam - Viewfinder
|
* viewfinder.h - qcam - Viewfinder base class
|
||||||
*/
|
*/
|
||||||
#ifndef __QCAM_VIEWFINDER_H__
|
#ifndef __QCAM_VIEWFINDER_H__
|
||||||
#define __QCAM_VIEWFINDER_H__
|
#define __QCAM_VIEWFINDER_H__
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QList>
|
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
#include <QMutex>
|
#include <QList>
|
||||||
#include <QSize>
|
#include <QSize>
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
#include <libcamera/buffer.h>
|
#include <libcamera/buffer.h>
|
||||||
#include <libcamera/pixel_format.h>
|
#include <libcamera/formats.h>
|
||||||
|
|
||||||
#include "format_converter.h"
|
|
||||||
|
|
||||||
class QImage;
|
|
||||||
|
|
||||||
struct MappedBuffer {
|
struct MappedBuffer {
|
||||||
void *memory;
|
void *memory;
|
||||||
size_t size;
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ViewFinder : public QWidget
|
class ViewFinder
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ViewFinder(QWidget *parent);
|
virtual ~ViewFinder() {}
|
||||||
~ViewFinder();
|
|
||||||
|
|
||||||
const QList<libcamera::PixelFormat> &nativeFormats() const;
|
virtual const QList<libcamera::PixelFormat> &nativeFormats() const = 0;
|
||||||
|
|
||||||
int setFormat(const libcamera::PixelFormat &format, const QSize &size);
|
virtual int setFormat(const libcamera::PixelFormat &format, const QSize &size) = 0;
|
||||||
void render(libcamera::FrameBuffer *buffer, MappedBuffer *map);
|
virtual void render(libcamera::FrameBuffer *buffer, MappedBuffer *map) = 0;
|
||||||
void stop();
|
virtual void stop() = 0;
|
||||||
|
|
||||||
QImage getCurrentImage();
|
virtual QImage getCurrentImage() = 0;
|
||||||
|
|
||||||
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__ */
|
#endif /* __QCAM_VIEWFINDER_H__ */
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2019, Google Inc.
|
* 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 <stdint.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
@ -33,24 +33,24 @@ static const QMap<libcamera::PixelFormat, QImage::Format> nativeFormats
|
||||||
{ libcamera::formats::BGR888, QImage::Format_RGB888 },
|
{ libcamera::formats::BGR888, QImage::Format_RGB888 },
|
||||||
};
|
};
|
||||||
|
|
||||||
ViewFinder::ViewFinder(QWidget *parent)
|
ViewFinderQt::ViewFinderQt(QWidget *parent)
|
||||||
: QWidget(parent), buffer_(nullptr)
|
: QWidget(parent), buffer_(nullptr)
|
||||||
{
|
{
|
||||||
icon_ = QIcon(":camera-off.svg");
|
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();
|
static const QList<libcamera::PixelFormat> formats = ::nativeFormats.keys();
|
||||||
return formats;
|
return formats;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ViewFinder::setFormat(const libcamera::PixelFormat &format,
|
int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,
|
||||||
const QSize &size)
|
const QSize &size)
|
||||||
{
|
{
|
||||||
image_ = QImage();
|
image_ = QImage();
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ int ViewFinder::setFormat(const libcamera::PixelFormat &format,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
|
void ViewFinderQt::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
|
||||||
{
|
{
|
||||||
if (buffer->planes().size() != 1) {
|
if (buffer->planes().size() != 1) {
|
||||||
qWarning() << "Multi-planar buffers are not supported";
|
qWarning() << "Multi-planar buffers are not supported";
|
||||||
|
@ -121,7 +121,7 @@ void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
|
||||||
renderComplete(buffer);
|
renderComplete(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewFinder::stop()
|
void ViewFinderQt::stop()
|
||||||
{
|
{
|
||||||
image_ = QImage();
|
image_ = QImage();
|
||||||
|
|
||||||
|
@ -133,14 +133,14 @@ void ViewFinder::stop()
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage ViewFinder::getCurrentImage()
|
QImage ViewFinderQt::getCurrentImage()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex_);
|
QMutexLocker locker(&mutex_);
|
||||||
|
|
||||||
return image_.copy();
|
return image_.copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewFinder::paintEvent(QPaintEvent *)
|
void ViewFinderQt::paintEvent(QPaintEvent *)
|
||||||
{
|
{
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ void ViewFinder::paintEvent(QPaintEvent *)
|
||||||
painter.drawPixmap(point, pixmap_);
|
painter.drawPixmap(point, pixmap_);
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize ViewFinder::sizeHint() const
|
QSize ViewFinderQt::sizeHint() const
|
||||||
{
|
{
|
||||||
return size_.isValid() ? size_ : QSize(640, 480);
|
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