/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * viewfinder.cpp - qcam - Viewfinder */ #include "viewfinder.h" #include #include #include #include #include #include "format_converter.h" ViewFinder::ViewFinder(QWidget *parent) : QWidget(parent), format_(0) { } ViewFinder::~ViewFinder() { } void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map) { if (buffer->planes().size() != 1) { qWarning() << "Multi-planar buffers are not supported"; return; } QMutexLocker locker(&mutex_); /* * \todo We're not supposed to block the pipeline handler thread * for long, implement a better way to save images without * impacting performances. */ converter_.convert(static_cast(map->memory), buffer->metadata().planes[0].bytesused, &image_); update(); renderComplete(buffer); } QImage ViewFinder::getCurrentImage() { QMutexLocker locker(&mutex_); return image_.copy(); } int ViewFinder::setFormat(const libcamera::PixelFormat &format, const QSize &size) { int ret; ret = converter_.configure(format, size); if (ret < 0) return ret; format_ = format; size_ = size; image_ = QImage(size_, QImage::Format_RGB32); updateGeometry(); return 0; } void ViewFinder::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawImage(rect(), image_, image_.rect()); } QSize ViewFinder::sizeHint() const { return size_.isValid() ? size_ : QSize(640, 480); }