cam: Add support for viewfinder through DRM/KMS
Use the KMSSink class to display the viewfinder stream, if any, through DRM/KMS. The output connector is selected through the new -D/--display argument. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
063c9969f5
commit
2288550f7d
3 changed files with 37 additions and 0 deletions
|
@ -16,6 +16,9 @@
|
||||||
#include "camera_session.h"
|
#include "camera_session.h"
|
||||||
#include "event_loop.h"
|
#include "event_loop.h"
|
||||||
#include "file_sink.h"
|
#include "file_sink.h"
|
||||||
|
#ifdef HAVE_KMS
|
||||||
|
#include "kms_sink.h"
|
||||||
|
#endif
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "stream_options.h"
|
#include "stream_options.h"
|
||||||
|
|
||||||
|
@ -66,6 +69,28 @@ CameraSession::CameraSession(CameraManager *cm,
|
||||||
|
|
||||||
bool strictFormats = options_.isSet(OptStrictFormats);
|
bool strictFormats = options_.isSet(OptStrictFormats);
|
||||||
|
|
||||||
|
#ifdef HAVE_KMS
|
||||||
|
if (options_.isSet(OptDisplay)) {
|
||||||
|
if (options_.isSet(OptFile)) {
|
||||||
|
std::cerr << "--display and --file options are mutually exclusive"
|
||||||
|
<< std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roles.size() != 1) {
|
||||||
|
std::cerr << "Display doesn't support multiple streams"
|
||||||
|
<< std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roles[0] != StreamRole::Viewfinder) {
|
||||||
|
std::cerr << "Display requires a viewfinder stream"
|
||||||
|
<< std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (config->validate()) {
|
switch (config->validate()) {
|
||||||
case CameraConfiguration::Valid:
|
case CameraConfiguration::Valid:
|
||||||
break;
|
break;
|
||||||
|
@ -161,6 +186,11 @@ int CameraSession::start()
|
||||||
|
|
||||||
camera_->requestCompleted.connect(this, &CameraSession::requestComplete);
|
camera_->requestCompleted.connect(this, &CameraSession::requestComplete);
|
||||||
|
|
||||||
|
#ifdef HAVE_KMS
|
||||||
|
if (options_.isSet(OptDisplay))
|
||||||
|
sink_ = std::make_unique<KMSSink>(options_[OptDisplay].toString());
|
||||||
|
#endif
|
||||||
|
|
||||||
if (options_.isSet(OptFile)) {
|
if (options_.isSet(OptFile)) {
|
||||||
if (!options_[OptFile].toString().empty())
|
if (!options_[OptFile].toString().empty())
|
||||||
sink_ = std::make_unique<FileSink>(options_[OptFile]);
|
sink_ = std::make_unique<FileSink>(options_[OptFile]);
|
||||||
|
|
|
@ -132,6 +132,12 @@ int CamApp::parseOptions(int argc, char *argv[])
|
||||||
"Capture until interrupted by user or until <count> frames captured",
|
"Capture until interrupted by user or until <count> frames captured",
|
||||||
"capture", ArgumentOptional, "count", false,
|
"capture", ArgumentOptional, "count", false,
|
||||||
OptCamera);
|
OptCamera);
|
||||||
|
#ifdef HAVE_KMS
|
||||||
|
parser.addOption(OptDisplay, OptionString,
|
||||||
|
"Display viewfinder through DRM/KMS on specified connector",
|
||||||
|
"display", ArgumentOptional, "connector", false,
|
||||||
|
OptCamera);
|
||||||
|
#endif
|
||||||
parser.addOption(OptFile, OptionString,
|
parser.addOption(OptFile, OptionString,
|
||||||
"Write captured frames to disk\n"
|
"Write captured frames to disk\n"
|
||||||
"If the file name ends with a '/', it sets the directory in which\n"
|
"If the file name ends with a '/', it sets the directory in which\n"
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
enum {
|
enum {
|
||||||
OptCamera = 'c',
|
OptCamera = 'c',
|
||||||
OptCapture = 'C',
|
OptCapture = 'C',
|
||||||
|
OptDisplay = 'D',
|
||||||
OptFile = 'F',
|
OptFile = 'F',
|
||||||
OptHelp = 'h',
|
OptHelp = 'h',
|
||||||
OptInfo = 'I',
|
OptInfo = 'I',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue