Age | Commit message (Collapse) | Author |
|
Implement the camera configuration thru out the library, tests, cam and
qcam tools.
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Instead of requesting the default configuration for a set of streams
where the application has to figure out which streams provided by the
camera is best suited for its intended usage, have the library figure
this out by using stream usages.
The application asks the library for a list of streams and a suggested
default configuration for them by supplying a list of stream usages.
Once the list is retrieved the application can fine-tune the returned
configuration and then try to apply it to the camera.
Currently no pipeline handler is prepared to handle stream usages but
nor did it make use of the list of Stream IDs which was the previous
interface. The main reason for this is that all cameras currently only
provide one stream each. This will still be the case but the API will be
prepared to expand both pipeline handlers and applications to support
streams usages.
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
When the camera provides MJPEG, use the QImage JPEG decompression code
to convert that to RGB.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
|
|
qcam is a sample camera GUI application based on Qt. It demonstrates
integration of the Qt event loop with libcamera.
The application lets the user select a camera through the GUI, and then
captures a single stream from the camera and displays it in a window.
Only streams in YUYV formats are supported for now.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
8' href='#n128'>128
129
130
131
132
133
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* qcam - Main application window
*/
#pragma once
#include <memory>
#include <vector>
#include <libcamera/camera.h>
#include <libcamera/camera_manager.h>
#include <libcamera/controls.h>
#include <libcamera/framebuffer.h>
#include <libcamera/framebuffer_allocator.h>
#include <libcamera/request.h>
#include <libcamera/stream.h>
#include <QElapsedTimer>
#include <QIcon>
#include <QMainWindow>
#include <QMutex>
#include <QObject>
#include <QPushButton>
#include <QQueue>
#include <QTimer>
#include "../common/stream_options.h"
#include "viewfinder.h"
class QAction;
class CameraSelectorDialog;
class Image;
class HotplugEvent;
enum {
OptCamera = 'c',
OptHelp = 'h',
OptRenderer = 'r',
OptStream = 's',
OptVerbose = 'v',
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(libcamera::CameraManager *cm,
const OptionsParser::Options &options);
~MainWindow();
bool event(QEvent *e) override;
private Q_SLOTS:
void quit();
void updateTitle();
void switchCamera();
void toggleCapture(bool start);
void saveImageAs();
void captureRaw();
void processRaw(libcamera::FrameBuffer *buffer,
const libcamera::ControlList &metadata);
void renderComplete(libcamera::FrameBuffer *buffer);
private:
int createToolbars();
std::string chooseCamera();
int openCamera();
int startCapture();
void stopCapture();
void addCamera(std::shared_ptr<libcamera::Camera> camera);
void removeCamera(std::shared_ptr<libcamera::Camera> camera);
int queueRequest(libcamera::Request *request);
void requestComplete(libcamera::Request *request);
void processCapture();
void processHotplug(HotplugEvent *e);
void processViewfinder(libcamera::FrameBuffer *buffer);
/* UI elements */
QToolBar *toolbar_;
QAction *startStopAction_;
QPushButton *cameraSelectButton_;
QAction *saveRaw_;
ViewFinder *viewfinder_;
QIcon iconPlay_;
QIcon iconStop_;
QString title_;
QTimer titleTimer_;
CameraSelectorDialog *cameraSelectorDialog_;
/* Options */
const OptionsParser::Options &options_;
/* Camera manager, camera, configuration and buffers */
libcamera::CameraManager *cm_;
std::shared_ptr<libcamera::Camera> camera_;
libcamera::FrameBufferAllocator *allocator_;
std::unique_ptr<libcamera::CameraConfiguration> config_;
std::map<libcamera::FrameBuffer *, std::unique_ptr<Image>> mappedBuffers_;
/* Capture state, buffers queue and statistics */
bool isCapturing_;
bool captureRaw_;
libcamera::Stream *vfStream_;
libcamera::Stream *rawStream_;
std::map<const libcamera::Stream *, QQueue<libcamera::FrameBuffer *>> freeBuffers_;
QQueue<libcamera::Request *> doneQueue_;
QQueue<libcamera::Request *> freeQueue_;
QMutex mutex_; /* Protects freeBuffers_, doneQueue_, and freeQueue_ */
uint64_t lastBufferTime_;
QElapsedTimer frameRateInterval_;
uint32_t previousFrames_;
uint32_t framesCaptured_;
std::vector<std::unique_ptr<libcamera::Request>> requests_;
};