LCamDev: implement configureSessionModeCReq
We can, theoretically, now change the v4l camera's mode.
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
#include <boostAsioLinkageFix.h>
|
||||
|
||||
#include <cameraSession.h>
|
||||
#include <sessionModeConfigure.h>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace lcamera_dev {
|
||||
@@ -26,4 +29,56 @@ bool CameraSession::decrementRefcount()
|
||||
return s.rsrc.refcount == 0;
|
||||
}
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<LcameraDevConfiguredCameraMode>
|
||||
CameraSession::configureSessionModeCReq(
|
||||
const LcameraDevCameraModeRequest& request)
|
||||
{
|
||||
sscl::co::CoQutex::ReleaseHandle sessionGuard =
|
||||
co_await s.lock.getAcquireInvocationAndSuspensionPolicy();
|
||||
|
||||
if (s.rsrc.isStreaming)
|
||||
{
|
||||
throw std::runtime_error(
|
||||
"lcameraDev: cannot configure session mode while streaming");
|
||||
}
|
||||
|
||||
validateCameraModeRequest(request);
|
||||
rejectFullPlanarOptionalAtConfigureApi(request);
|
||||
|
||||
if (s.rsrc.configuredMode.has_value()
|
||||
&& cameraModeRequestsEqual(s.rsrc.configuredRequest, request))
|
||||
{
|
||||
co_return *s.rsrc.configuredMode;
|
||||
}
|
||||
|
||||
if (s.rsrc.configuredMode.has_value())
|
||||
{
|
||||
throw std::runtime_error(
|
||||
"lcameraDev: conflicting camera mode request on configured "
|
||||
"session");
|
||||
}
|
||||
|
||||
std::shared_ptr<libcamera::CameraConfiguration> heldConfiguration;
|
||||
const LcameraDevConfiguredCameraMode resolvedMode =
|
||||
configureLibcameraSessionMode(
|
||||
s.rsrc.camera,
|
||||
request,
|
||||
heldConfiguration);
|
||||
|
||||
const ConfigureSessionModeStatus status =
|
||||
applyModeRequestToSessionState(
|
||||
s.rsrc,
|
||||
request,
|
||||
resolvedMode,
|
||||
heldConfiguration);
|
||||
|
||||
if (status != ConfigureSessionModeStatus::Configured)
|
||||
{
|
||||
throw std::logic_error(
|
||||
"lcameraDev: unexpected configure session mode status");
|
||||
}
|
||||
|
||||
co_return *s.rsrc.configuredMode;
|
||||
}
|
||||
|
||||
} // namespace lcamera_dev
|
||||
|
||||
Reference in New Issue
Block a user