mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-21 15:53:54 +03:00
qcam: viewfinder: Make the viewfinder hold a reference to a buffer
The viewfinder is currently expected to render frames to the screen synchronously in the display() function, or at least to copy data so that the buffer can be queued in a new request when the function returns. This prevents optimisations when the capture format is identical to the display format. Make the viewfinder take ownership of the buffer, and notify of its release through a signal. The release is currently still synchronous, this will be addressed in a subsequent patch. Rename the ViewFinder::display() function to render() to better describe its purpose, as it's meant to start the rendering and not display the frame synchronously. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
b73192036d
commit
615f7438ad
5 changed files with 16 additions and 14 deletions
|
@ -63,6 +63,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
|
|||
connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
|
||||
|
||||
viewfinder_ = new ViewFinder(this);
|
||||
connect(viewfinder_, &ViewFinder::renderComplete,
|
||||
this, &MainWindow::queueRequest);
|
||||
setCentralWidget(viewfinder_);
|
||||
adjustSize();
|
||||
|
||||
|
@ -518,15 +520,8 @@ void MainWindow::processCapture()
|
|||
<< "timestamp:" << metadata.timestamp
|
||||
<< "fps:" << fixed << qSetRealNumberPrecision(2) << fps;
|
||||
|
||||
/* Display the buffer and requeue it to the camera. */
|
||||
display(buffer);
|
||||
|
||||
queueRequest(buffer);
|
||||
}
|
||||
|
||||
void MainWindow::display(FrameBuffer *buffer)
|
||||
{
|
||||
viewfinder_->display(buffer, &mappedBuffers_[buffer]);
|
||||
/* Render the frame on the viewfinder. */
|
||||
viewfinder_->render(buffer, &mappedBuffers_[buffer]);
|
||||
}
|
||||
|
||||
void MainWindow::queueRequest(FrameBuffer *buffer)
|
||||
|
|
|
@ -55,6 +55,8 @@ private Q_SLOTS:
|
|||
|
||||
void saveImageAs();
|
||||
|
||||
void queueRequest(FrameBuffer *buffer);
|
||||
|
||||
private:
|
||||
int createToolbars();
|
||||
|
||||
|
@ -66,8 +68,6 @@ private:
|
|||
|
||||
void requestComplete(Request *request);
|
||||
void processCapture();
|
||||
void display(FrameBuffer *buffer);
|
||||
void queueRequest(FrameBuffer *buffer);
|
||||
|
||||
/* UI elements */
|
||||
QToolBar *toolbar_;
|
||||
|
|
|
@ -8,6 +8,7 @@ qcam_sources = files([
|
|||
|
||||
qcam_moc_headers = files([
|
||||
'main_window.h',
|
||||
'viewfinder.h',
|
||||
])
|
||||
|
||||
qcam_resources = files([
|
||||
|
|
|
@ -25,8 +25,7 @@ ViewFinder::~ViewFinder()
|
|||
delete image_;
|
||||
}
|
||||
|
||||
void ViewFinder::display(const libcamera::FrameBuffer *buffer,
|
||||
MappedBuffer *map)
|
||||
void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
|
||||
{
|
||||
if (buffer->planes().size() != 1) {
|
||||
qWarning() << "Multi-planar buffers are not supported";
|
||||
|
@ -44,6 +43,8 @@ void ViewFinder::display(const libcamera::FrameBuffer *buffer,
|
|||
converter_.convert(static_cast<unsigned char *>(map->memory),
|
||||
buffer->metadata().planes[0].bytesused, image_);
|
||||
update();
|
||||
|
||||
renderComplete(buffer);
|
||||
}
|
||||
|
||||
QImage ViewFinder::getCurrentImage()
|
||||
|
|
|
@ -27,15 +27,20 @@ struct MappedBuffer {
|
|||
|
||||
class ViewFinder : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ViewFinder(QWidget *parent);
|
||||
~ViewFinder();
|
||||
|
||||
int setFormat(const libcamera::PixelFormat &format, const QSize &size);
|
||||
void display(const libcamera::FrameBuffer *buffer, MappedBuffer *map);
|
||||
void render(libcamera::FrameBuffer *buffer, MappedBuffer *map);
|
||||
|
||||
QImage getCurrentImage();
|
||||
|
||||
Q_SIGNALS:
|
||||
void renderComplete(libcamera::FrameBuffer *buffer);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *) override;
|
||||
QSize sizeHint() const override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue