2026-06-13 12:02:04 -04:00
|
|
|
#ifndef LCAMERA_DEV_CAMERA_SESSION_H
|
|
|
|
|
#define LCAMERA_DEV_CAMERA_SESSION_H
|
|
|
|
|
|
|
|
|
|
#include <cameraIdentity.h>
|
2026-06-13 20:56:33 -04:00
|
|
|
#include <cameraModeRequest.h>
|
2026-06-13 12:02:04 -04:00
|
|
|
#include <libcamera/camera.h>
|
|
|
|
|
#include <memory>
|
2026-06-13 20:56:33 -04:00
|
|
|
#include <optional>
|
|
|
|
|
#include <stdexcept>
|
2026-06-13 12:02:04 -04:00
|
|
|
#include <spinscale/co/coQutex.h>
|
2026-06-13 20:56:33 -04:00
|
|
|
#include <spinscale/co/invokers.h>
|
2026-06-13 12:02:04 -04:00
|
|
|
#include <spinscale/sharedResourceGroup.h>
|
|
|
|
|
|
|
|
|
|
namespace lcamera_dev {
|
|
|
|
|
|
|
|
|
|
struct CameraSessionResources
|
|
|
|
|
{
|
|
|
|
|
CameraSessionResources(
|
|
|
|
|
const CameraIdentityRecord& identity,
|
|
|
|
|
const std::shared_ptr<libcamera::Camera>& camera)
|
|
|
|
|
: identity(identity), camera(camera)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
int refcount = 0;
|
|
|
|
|
CameraIdentityRecord identity;
|
|
|
|
|
std::shared_ptr<libcamera::Camera> camera;
|
2026-06-13 20:56:33 -04:00
|
|
|
|
|
|
|
|
bool isStreaming = false;
|
|
|
|
|
LcameraDevCameraModeRequest configuredRequest;
|
|
|
|
|
std::optional<LcameraDevConfiguredCameraMode> configuredMode;
|
|
|
|
|
std::shared_ptr<libcamera::CameraConfiguration> heldConfiguration;
|
|
|
|
|
int libcameraConfigureCallCount = 0;
|
2026-06-13 12:02:04 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class CameraSession
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CameraSession(
|
|
|
|
|
const CameraIdentityRecord& identity,
|
|
|
|
|
const std::shared_ptr<libcamera::Camera>& camera);
|
|
|
|
|
|
|
|
|
|
const CameraIdentityRecord& getIdentityRecord() const
|
|
|
|
|
{ return s.rsrc.identity; }
|
|
|
|
|
|
|
|
|
|
const std::shared_ptr<libcamera::Camera>& getCamera() const
|
|
|
|
|
{ return s.rsrc.camera; }
|
|
|
|
|
|
2026-06-13 20:56:33 -04:00
|
|
|
bool isModeConfigured() const
|
|
|
|
|
{ return s.rsrc.configuredMode.has_value(); }
|
|
|
|
|
|
|
|
|
|
const LcameraDevConfiguredCameraMode& getConfiguredMode() const
|
|
|
|
|
{
|
|
|
|
|
if (!s.rsrc.configuredMode.has_value())
|
|
|
|
|
{
|
|
|
|
|
throw std::logic_error(
|
|
|
|
|
"lcameraDev: session mode is not configured");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *s.rsrc.configuredMode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int getLibcameraConfigureCallCount() const
|
|
|
|
|
{ return s.rsrc.libcameraConfigureCallCount; }
|
|
|
|
|
|
2026-06-13 12:02:04 -04:00
|
|
|
void incrementRefcount();
|
|
|
|
|
bool decrementRefcount();
|
|
|
|
|
|
2026-06-13 20:56:33 -04:00
|
|
|
sscl::co::ViralNonPostingInvoker<LcameraDevConfiguredCameraMode>
|
|
|
|
|
configureSessionModeCReq(const LcameraDevCameraModeRequest& request);
|
|
|
|
|
|
2026-06-13 12:02:04 -04:00
|
|
|
sscl::SharedResourceGroup<sscl::co::CoQutex, CameraSessionResources> s;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace lcamera_dev
|
|
|
|
|
|
|
|
|
|
#endif // LCAMERA_DEV_CAMERA_SESSION_H
|