diff options
author | Show Liu <show.liu@linaro.org> | 2020-09-11 16:55:12 +0800 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-09-15 05:10:35 +0300 |
commit | 2daa704c968c8aa7a4b209450f228b41e9d42d85 (patch) | |
tree | b11e6376432fedeac964858e1019166bd379a569 /src/qcam/viewfinder.cpp | |
parent | 4a4a3e715b8314c56a2a32788d92fdec464af7b7 (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>
Diffstat (limited to 'src/qcam/viewfinder.cpp')
-rw-r--r-- | src/qcam/viewfinder.cpp | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp deleted file mode 100644 index dcf8a15d..00000000 --- a/src/qcam/viewfinder.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2019, Google Inc. - * - * viewfinder.cpp - qcam - Viewfinder - */ - -#include "viewfinder.h" - -#include <stdint.h> -#include <utility> - -#include <QImage> -#include <QImageWriter> -#include <QMap> -#include <QMutexLocker> -#include <QPainter> -#include <QtDebug> - -#include <libcamera/formats.h> - -#include "format_converter.h" - -static const QMap<libcamera::PixelFormat, QImage::Format> nativeFormats -{ -#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) - { libcamera::formats::ABGR8888, QImage::Format_RGBA8888 }, -#endif - { libcamera::formats::ARGB8888, QImage::Format_RGB32 }, -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - { libcamera::formats::RGB888, QImage::Format_BGR888 }, -#endif - { libcamera::formats::BGR888, QImage::Format_RGB888 }, -}; - -ViewFinder::ViewFinder(QWidget *parent) - : QWidget(parent), buffer_(nullptr) -{ - icon_ = QIcon(":camera-off.svg"); -} - -ViewFinder::~ViewFinder() -{ -} - -const QList<libcamera::PixelFormat> &ViewFinder::nativeFormats() const -{ - static const QList<libcamera::PixelFormat> formats = ::nativeFormats.keys(); - return formats; -} - -int ViewFinder::setFormat(const libcamera::PixelFormat &format, - const QSize &size) -{ - image_ = QImage(); - - /* - * If format conversion is needed, configure the converter and allocate - * the destination image. - */ - if (!::nativeFormats.contains(format)) { - int ret = converter_.configure(format, size); - if (ret < 0) - return ret; - - image_ = QImage(size, QImage::Format_RGB32); - - qInfo() << "Using software format conversion from" - << format.toString().c_str(); - } else { - qInfo() << "Zero-copy enabled"; - } - - format_ = format; - size_ = size; - - updateGeometry(); - return 0; -} - -void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map) -{ - if (buffer->planes().size() != 1) { - qWarning() << "Multi-planar buffers are not supported"; - return; - } - - unsigned char *memory = static_cast<unsigned char *>(map->memory); - size_t size = buffer->metadata().planes[0].bytesused; - - { - QMutexLocker locker(&mutex_); - - if (::nativeFormats.contains(format_)) { - /* - * If the frame format is identical to the display - * format, create a QImage that references the frame - * and store a reference to the frame buffer. The - * previously stored frame buffer, if any, will be - * released. - * - * \todo Get the stride from the buffer instead of - * computing it naively - */ - image_ = QImage(memory, size_.width(), size_.height(), - size / size_.height(), - ::nativeFormats[format_]); - std::swap(buffer, buffer_); - } else { - /* - * Otherwise, convert the format and release the frame - * buffer immediately. - */ - converter_.convert(memory, size, &image_); - } - } - - update(); - - if (buffer) - renderComplete(buffer); -} - -void ViewFinder::stop() -{ - image_ = QImage(); - - if (buffer_) { - renderComplete(buffer_); - buffer_ = nullptr; - } - - update(); -} - -QImage ViewFinder::getCurrentImage() -{ - QMutexLocker locker(&mutex_); - - return image_.copy(); -} - -void ViewFinder::paintEvent(QPaintEvent *) -{ - QPainter painter(this); - - /* If we have an image, draw it. */ - if (!image_.isNull()) { - painter.drawImage(rect(), image_, image_.rect()); - return; - } - - /* - * Otherwise, draw the camera stopped icon. Render it to the pixmap if - * the size has changed. - */ - constexpr int margin = 20; - - if (vfSize_ != size() || pixmap_.isNull()) { - QSize vfSize = size() - QSize{ 2 * margin, 2 * margin }; - QSize pixmapSize{ 1, 1 }; - pixmapSize.scale(vfSize, Qt::KeepAspectRatio); - pixmap_ = icon_.pixmap(pixmapSize); - - vfSize_ = size(); - } - - QPoint point{ margin, margin }; - if (pixmap_.width() < width() - 2 * margin) - point.setX((width() - pixmap_.width()) / 2); - else - point.setY((height() - pixmap_.height()) / 2); - - painter.setBackgroundMode(Qt::OpaqueMode); - painter.drawPixmap(point, pixmap_); -} - -QSize ViewFinder::sizeHint() const -{ - return size_.isValid() ? size_ : QSize(640, 480); -} |