SmartSpectra C++ SDK
Measure human vitals from video with SmartSpectra C++ SDK.
Loading...
Searching...
No Matches
settings.hpp
1// settings.hpp
2// Created by Greg on 1/10/2024.
3// Copyright (C) 2025 Presage Security, Inc.
4//
5// SPDX-License-Identifier: LGPL-3.0-or-later
6
7#pragma once
8// === configuration header ===
9#include "configuration.hpp"
10// === standard library includes (if any) ===
11#include <optional>
12// === third-party includes (if any) ===
13// === local includes (if any) ===
14#include <smartspectra/video_source/camera/camera.hpp>
15#include <smartspectra/video_source/settings.hpp>
16
17namespace presage::smartspectra::container::settings {
18
19//TODO: find a better way to structure, in terms of module/namespace, where to place these enum classes
20// (OperationMode, IntegrationMode) and corresponding Abseil parse/unparse ops + context classes.
21// Perhaps, in their own separate sub-module, e.g. container::contexts?
22// Currently, scattered between container::settings and container.
23enum class OperationMode : int {
24 Spot,
25 Continuous,
26 Unknown_EnumEnd
27};
28
29enum class IntegrationMode : int{
30 Rest,
31 Grpc,
32 Unknown_EnumEnd
33};
34
35template<IntegrationMode TIntegrationMode>
37
38template<>
39struct IntegrationModeTraits<IntegrationMode::Rest> {
40 static constexpr char kPreprocessingDataFormat[] = "json";
41};
42
43template<>
44struct IntegrationModeTraits<IntegrationMode::Grpc> {
45 static constexpr char kPreprocessingDataFormat[] = "pb";
46};
47
48bool AbslParseFlag(absl::string_view text, OperationMode* mode, std::string* error);
49std::string AbslUnparseFlag(OperationMode mode);
50std::vector<std::string> GetOperationModeNames();
51bool AbslParseFlag(absl::string_view text, IntegrationMode* mode, std::string* error);
52std::string AbslUnparseFlag(IntegrationMode mode);
53std::vector<std::string> GetIntegrationModeNames();
54
55// region ================================ Operation Settings ==========================================================
56template<OperationMode>
58
59template<>
60struct OperationSettings<OperationMode::Spot> {
61 double spot_duration_s/* = 30.0*/;
62};
63
64template<>
65struct OperationSettings<OperationMode::Continuous> {
66 double preprocessed_data_buffer_duration_s/* = 0.2*/;
67};
68
69typedef OperationSettings<OperationMode::Spot> SpotSettings;
70typedef OperationSettings<OperationMode::Continuous> ContinuousSettings;
71// endregion ===========================================================================================================
72
73// region ============================== Integration Settings ==========================================================
74template<IntegrationMode>
76
77template<>
78struct IntegrationSettings<IntegrationMode::Grpc> {
79 uint16_t port_number = 50051;
80};
81
82template<>
83struct IntegrationSettings<IntegrationMode::Rest> {
84 std::string api_key;
85#ifdef ENABLE_CUSTOM_SERVER
86 std::optional<std::string> continuous_server_url;
87#endif
88};
89
90typedef IntegrationSettings<IntegrationMode::Grpc> GrpcSettings;
91typedef IntegrationSettings<IntegrationMode::Rest> RestSettings;
92// endregion ===========================================================================================================
93// region =============================== Video Output Settings ========================================================
94enum class VideoSinkMode : int {
95 MJPG,
96 GSTREAMER_TEMPLATED,
97 Unknown_EnumEnd
98};
99std::vector<std::string> GetVideoSinkModeNames();
100bool AbslParseFlag(absl::string_view text, VideoSinkMode* mode, std::string* error);
101std::string AbslUnparseFlag(VideoSinkMode mode);
102
104 std::string destination;
105 VideoSinkMode mode;
106 bool passthrough;
107};
108// endregion ===========================================================================================================
109// region ------------------------------- General Settings -------------------------------------------------------------
112 VideoSinkSettings video_sink; // foreground-container only
113 bool headless = false; // foreground-container only
114 int interframe_delay_ms = 20; // foreground-container only
115 bool start_with_recording_on = false; // foreground-container only
116 int start_time_offset_ms = 0; // foreground-container only
117 // graph internal settings
118 bool scale_input = true;
119 bool binary_graph = true;
120 std::optional<bool> enable_phasic_bp;
121 std::optional<bool> enable_eda;
122 bool enable_dense_facemesh_points = false;
123 std::optional<bool> use_full_range_face_detection;
124 std::optional<bool> use_full_pose_landmarks;
125 std::optional<bool> enable_pose_landmark_segmentation;
126 std::optional<bool> enable_micromotion;
127 // WARNING: enable_edge_metrics doesn't currently apply to spot mode
128 bool enable_edge_metrics = false;
129 bool print_graph_contents = false;
130 bool log_transfer_timing_info = false;
131 std::optional<std::string> video_output_directory;
132 int verbosity_level = 0;
133};
134// endregion ===========================================================================================================
135template<OperationMode, IntegrationMode>
136struct Settings;
137
138// Note on design: yes, breaking this down like this instead of just using the following fields would be much simpler.
139// OperationSettings<OperationMode::Spot> operation;
140// IntegrationSettings<IntegrationMode::JsonFileOnDisk> integration;
141// However, it may be easier to use the settings if the field names themselves conveyed the semantic meanings of
142// the setting categories,
143// e.g. "settings.spot.<whatever>", "setting.continuous.<whatever>", "settings.grpc.<whatever>", etc.
144// Since C++ doesn't have reflection, we would need to resort to preprocessor macros to generate the field names
145// dynamically. Instead, to avoid bloat and preprocessor use, it makes sense to just write out the specializations
146// with different fields for the scenarios for which we anticipate greater usage.
147
148// region ================================ SPOT + OTHER SETTINGS =======================================================
149template<IntegrationMode TIntegrationMode>
150struct Settings<OperationMode::Spot, TIntegrationMode> : GeneralSettings {
151 union{SpotSettings spot; SpotSettings operation;};
153};
154
155template<>
156struct Settings<OperationMode::Spot, IntegrationMode::Rest> : GeneralSettings {
157 union{SpotSettings spot; SpotSettings operation;};
158 RestSettings integration;
159 //have to use function to provide an alias, because API key is not trivially-copiable
160 RestSettings& rest() { return integration; }
161};
162
163template<>
164struct Settings<OperationMode::Spot, IntegrationMode::Grpc> : GeneralSettings {
165 union{SpotSettings spot; SpotSettings operation;};
166 union{GrpcSettings grpc; GrpcSettings integration;};
167};
168// endregion ===========================================================================================================
169// region ================================ CONTINUOUS + OTHER SETTINGS =================================================
170template<IntegrationMode TIntegrationMode>
171struct Settings<OperationMode::Continuous, TIntegrationMode> : GeneralSettings {
172 union{ContinuousSettings continuous; ContinuousSettings operation;};
174};
175
176template<>
177struct Settings<OperationMode::Continuous, IntegrationMode::Rest> : GeneralSettings {
178 union{ContinuousSettings continuous; ContinuousSettings operation;};
179 RestSettings integration;
180 //have to use function to provide an alias, because API key is not trivially-copiable
181 RestSettings& rest() { return integration; }
182};
183
184template<>
185struct Settings<OperationMode::Continuous, IntegrationMode::Grpc> : GeneralSettings {
186 union{ContinuousSettings continuous; ContinuousSettings operation;};
187 union{GrpcSettings grpc; GrpcSettings integration;};
188};
189// endregion ===========================================================================================================
190
191} // namespace presage::smartspectra::container::settings
Configuration options for constructing a VideoSource.
Definition settings.hpp:23