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:
Laurent Pinchart 2020-05-17 23:58:31 +03:00
parent 063c9969f5
commit 2288550f7d
3 changed files with 37 additions and 0 deletions

View file

@ -16,6 +16,9 @@
#include "camera_session.h"
#include "event_loop.h"
#include "file_sink.h"
#ifdef HAVE_KMS
#include "kms_sink.h"
#endif
#include "main.h"
#include "stream_options.h"
@ -66,6 +69,28 @@ CameraSession::CameraSession(CameraManager *cm,
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()) {
case CameraConfiguration::Valid:
break;
@ -161,6 +186,11 @@ int CameraSession::start()
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_[OptFile].toString().empty())
sink_ = std::make_unique<FileSink>(options_[OptFile]);