lcameraDev: add resolve-only deviceSelector API and deduplicate resolve paths.
Export lcameraDev_resolveDeviceSelectorCReq for attach-identity consumers, factor live-camera snapshot helpers, and share resolveDeviceSelectorAgainstRecords with get-or-create session acquisition. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
|
||||
#include <cameraIdentity.h>
|
||||
#include <cameraManagerState.h>
|
||||
#include <selectorParse.h>
|
||||
#include <selectorResolve.h>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
@@ -49,6 +48,40 @@ std::shared_ptr<libcamera::Camera> findCameraById(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
struct LiveCameraSnapshot
|
||||
{
|
||||
std::vector<std::shared_ptr<libcamera::Camera>> cameras;
|
||||
std::vector<CameraIdentityRecord> identityRecords;
|
||||
};
|
||||
|
||||
LiveCameraSnapshot snapshotLiveCameras(CameraManagerResources& resources)
|
||||
{
|
||||
LiveCameraSnapshot snapshot;
|
||||
snapshot.cameras = resources.cameraManager->cameras();
|
||||
snapshot.identityRecords = buildIdentityRecords(snapshot.cameras);
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
CameraIdentityRecord resolveDeviceSelectorForLiveCameras(
|
||||
const std::string& deviceSelector,
|
||||
CameraManagerResources& resources)
|
||||
{
|
||||
const LiveCameraSnapshot snapshot = snapshotLiveCameras(resources);
|
||||
return resolveDeviceSelectorAgainstRecords(
|
||||
deviceSelector, snapshot.identityRecords);
|
||||
}
|
||||
|
||||
void requireNonEmptyDeviceSelector(
|
||||
const std::string& deviceSelector,
|
||||
const char *apiName)
|
||||
{
|
||||
if (deviceSelector.empty())
|
||||
{
|
||||
throw std::runtime_error(
|
||||
std::string(apiName) + ": deviceSelector is empty");
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
LcameraDevState& getLcameraDevState()
|
||||
@@ -110,29 +143,38 @@ void lcameraDevExit()
|
||||
state.isInitialized = false;
|
||||
}
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<LcameraDevGetOrCreateResult>
|
||||
getOrCreateDeviceSessionCReq(const std::string& deviceSelector)
|
||||
sscl::co::ViralNonPostingInvoker<CameraIdentityRecord>
|
||||
resolveDeviceSelectorCReq(const std::string& deviceSelector)
|
||||
{
|
||||
if (deviceSelector.empty())
|
||||
{
|
||||
throw std::runtime_error(
|
||||
"lcameraDev_getOrCreateDeviceCReq: deviceSelector is empty");
|
||||
}
|
||||
requireNonEmptyDeviceSelector(
|
||||
deviceSelector, "lcameraDev_resolveDeviceSelectorCReq");
|
||||
|
||||
LcameraDevState& state = getLcameraDevState();
|
||||
|
||||
sscl::co::CoQutex::ReleaseHandle managerGuard =
|
||||
co_await state.managerState.lock.getAcquireInvocationAndSuspensionPolicy();
|
||||
|
||||
const std::vector<SelectorCriterion> criteria =
|
||||
parseDeviceSelector(deviceSelector);
|
||||
const std::vector<std::shared_ptr<libcamera::Camera>> cameras =
|
||||
state.managerState.rsrc.cameraManager->cameras();
|
||||
const std::vector<CameraIdentityRecord> identityRecords =
|
||||
buildIdentityRecords(cameras);
|
||||
co_return resolveDeviceSelectorForLiveCameras(
|
||||
deviceSelector, state.managerState.rsrc);
|
||||
}
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<LcameraDevGetOrCreateResult>
|
||||
getOrCreateDeviceSessionCReq(const std::string& deviceSelector)
|
||||
{
|
||||
requireNonEmptyDeviceSelector(
|
||||
deviceSelector, "lcameraDev_getOrCreateDeviceCReq");
|
||||
|
||||
LcameraDevState& state = getLcameraDevState();
|
||||
|
||||
sscl::co::CoQutex::ReleaseHandle managerGuard =
|
||||
co_await state.managerState.lock.getAcquireInvocationAndSuspensionPolicy();
|
||||
|
||||
const LiveCameraSnapshot snapshot =
|
||||
snapshotLiveCameras(state.managerState.rsrc);
|
||||
|
||||
const CameraIdentityRecord resolvedRecord =
|
||||
resolveSelectorAgainstRecords(criteria, identityRecords);
|
||||
resolveDeviceSelectorAgainstRecords(
|
||||
deviceSelector, snapshot.identityRecords);
|
||||
const std::string& resolvedCameraId = resolvedRecord.id;
|
||||
|
||||
auto sessionIt =
|
||||
@@ -153,7 +195,7 @@ getOrCreateDeviceSessionCReq(const std::string& deviceSelector)
|
||||
}
|
||||
|
||||
std::shared_ptr<libcamera::Camera> camera =
|
||||
findCameraById(cameras, resolvedCameraId);
|
||||
findCameraById(snapshot.cameras, resolvedCameraId);
|
||||
if (!camera)
|
||||
{
|
||||
throw std::runtime_error(
|
||||
@@ -228,15 +270,13 @@ enumerateCamerasCReq()
|
||||
sscl::co::CoQutex::ReleaseHandle managerGuard =
|
||||
co_await state.managerState.lock.getAcquireInvocationAndSuspensionPolicy();
|
||||
|
||||
const std::vector<std::shared_ptr<libcamera::Camera>> cameras =
|
||||
state.managerState.rsrc.cameraManager->cameras();
|
||||
const std::vector<CameraIdentityRecord> identityRecords =
|
||||
buildIdentityRecords(cameras);
|
||||
const LiveCameraSnapshot snapshot =
|
||||
snapshotLiveCameras(state.managerState.rsrc);
|
||||
|
||||
std::vector<LcameraDevCameraInfo> cameraInfos;
|
||||
cameraInfos.reserve(identityRecords.size());
|
||||
cameraInfos.reserve(snapshot.identityRecords.size());
|
||||
|
||||
for (const CameraIdentityRecord& record : identityRecords)
|
||||
for (const CameraIdentityRecord& record : snapshot.identityRecords)
|
||||
{
|
||||
cameraInfos.push_back(LcameraDevCameraInfo{
|
||||
record.id,
|
||||
|
||||
Reference in New Issue
Block a user