@@ -132,7 +132,8 @@ uint64_t add_stream_config(const stream_config_t *stream) {
132132 "ptz_enabled = ?, ptz_max_x = ?, ptz_max_y = ?, ptz_max_z = ?, ptz_has_home = ?, "
133133 "onvif_username = ?, onvif_password = ?, onvif_profile = ?, onvif_port = ?, "
134134 "record_on_schedule = ?, recording_schedule = ?, tags = ?, admin_url = ?, "
135- "privacy_mode = ?, motion_trigger_source = ?, go2rtc_source_override = ? "
135+ "privacy_mode = ?, motion_trigger_source = ?, go2rtc_source_override = ?, "
136+ "sub_stream_url = ? "
136137 "WHERE id = ?;" ;
137138
138139 rc = sqlite3_prepare_v2 (db , update_sql , -1 , & stmt , NULL );
@@ -215,9 +216,10 @@ uint64_t add_stream_config(const stream_config_t *stream) {
215216 sqlite3_bind_int (stmt , 44 , stream -> privacy_mode ? 1 : 0 );
216217 sqlite3_bind_text (stmt , 45 , stream -> motion_trigger_source , -1 , SQLITE_STATIC );
217218 sqlite3_bind_text (stmt , 46 , stream -> go2rtc_source_override , -1 , SQLITE_STATIC );
219+ sqlite3_bind_text (stmt , 47 , stream -> sub_stream_url , -1 , SQLITE_STATIC );
218220
219221 // Bind ID parameter
220- sqlite3_bind_int64 (stmt , 47 , (sqlite3_int64 )existing_id );
222+ sqlite3_bind_int64 (stmt , 48 , (sqlite3_int64 )existing_id );
221223
222224 // Execute statement
223225 rc = sqlite3_step (stmt );
@@ -265,8 +267,9 @@ uint64_t add_stream_config(const stream_config_t *stream) {
265267 "tier_critical_multiplier, tier_important_multiplier, tier_ephemeral_multiplier, storage_priority, "
266268 "ptz_enabled, ptz_max_x, ptz_max_y, ptz_max_z, ptz_has_home, "
267269 "onvif_username, onvif_password, onvif_profile, onvif_port, "
268- "record_on_schedule, recording_schedule, tags, admin_url, privacy_mode, motion_trigger_source, go2rtc_source_override) "
269- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" ;
270+ "record_on_schedule, recording_schedule, tags, admin_url, privacy_mode, motion_trigger_source, "
271+ "go2rtc_source_override, sub_stream_url) "
272+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" ;
270273
271274 rc = sqlite3_prepare_v2 (db , sql , -1 , & stmt , NULL );
272275 if (rc != SQLITE_OK ) {
@@ -343,12 +346,13 @@ uint64_t add_stream_config(const stream_config_t *stream) {
343346 serialize_recording_schedule (stream -> recording_schedule , insert_schedule_buf , sizeof (insert_schedule_buf ));
344347 sqlite3_bind_text (stmt , 42 , insert_schedule_buf , -1 , SQLITE_TRANSIENT );
345348
346- // Bind tags, admin URL, privacy_mode, motion_trigger_source, and go2rtc override parameters
349+ // Bind tags, admin URL, privacy_mode, motion_trigger_source, go2rtc override, and sub-stream parameters
347350 sqlite3_bind_text (stmt , 43 , stream -> tags , -1 , SQLITE_STATIC );
348351 sqlite3_bind_text (stmt , 44 , stream -> admin_url , -1 , SQLITE_STATIC );
349352 sqlite3_bind_int (stmt , 45 , stream -> privacy_mode ? 1 : 0 );
350353 sqlite3_bind_text (stmt , 46 , stream -> motion_trigger_source , -1 , SQLITE_STATIC );
351354 sqlite3_bind_text (stmt , 47 , stream -> go2rtc_source_override , -1 , SQLITE_STATIC );
355+ sqlite3_bind_text (stmt , 48 , stream -> sub_stream_url , -1 , SQLITE_STATIC );
352356
353357 // Execute statement
354358 rc = sqlite3_step (stmt );
@@ -419,7 +423,8 @@ int update_stream_config(const char *name, const stream_config_t *stream) {
419423 "ptz_enabled = ?, ptz_max_x = ?, ptz_max_y = ?, ptz_max_z = ?, ptz_has_home = ?, "
420424 "onvif_username = ?, onvif_password = ?, onvif_profile = ?, onvif_port = ?, "
421425 "record_on_schedule = ?, recording_schedule = ?, tags = ?, admin_url = ?, privacy_mode = ?, "
422- "motion_trigger_source = ?, go2rtc_source_override = ? "
426+ "motion_trigger_source = ?, go2rtc_source_override = ?, "
427+ "sub_stream_url = ? "
423428 "WHERE name = ?;" ;
424429
425430 rc = sqlite3_prepare_v2 (db , sql , -1 , & stmt , NULL );
@@ -497,15 +502,16 @@ int update_stream_config(const char *name, const stream_config_t *stream) {
497502 serialize_recording_schedule (stream -> recording_schedule , update_schedule_buf , sizeof (update_schedule_buf ));
498503 sqlite3_bind_text (stmt , 42 , update_schedule_buf , -1 , SQLITE_TRANSIENT );
499504
500- // Bind tags, admin URL, privacy_mode, motion_trigger_source, and go2rtc override parameters
505+ // Bind tags, admin URL, privacy_mode, motion_trigger_source, go2rtc override, and sub-stream parameters
501506 sqlite3_bind_text (stmt , 43 , stream -> tags , -1 , SQLITE_STATIC );
502507 sqlite3_bind_text (stmt , 44 , stream -> admin_url , -1 , SQLITE_STATIC );
503508 sqlite3_bind_int (stmt , 45 , stream -> privacy_mode ? 1 : 0 );
504509 sqlite3_bind_text (stmt , 46 , stream -> motion_trigger_source , -1 , SQLITE_STATIC );
505510 sqlite3_bind_text (stmt , 47 , stream -> go2rtc_source_override , -1 , SQLITE_STATIC );
511+ sqlite3_bind_text (stmt , 48 , stream -> sub_stream_url , -1 , SQLITE_STATIC );
506512
507513 // Bind the WHERE clause parameter
508- sqlite3_bind_text (stmt , 48 , name , -1 , SQLITE_STATIC );
514+ sqlite3_bind_text (stmt , 49 , name , -1 , SQLITE_STATIC );
509515
510516 // Execute statement
511517 rc = sqlite3_step (stmt );
@@ -778,7 +784,7 @@ int get_stream_config_by_name(const char *name, stream_config_t *stream) {
778784 "ptz_enabled, ptz_max_x, ptz_max_y, ptz_max_z, ptz_has_home, "
779785 "onvif_username, onvif_password, onvif_profile, onvif_port, "
780786 "record_on_schedule, recording_schedule, tags, admin_url, privacy_mode, motion_trigger_source, "
781- "go2rtc_source_override "
787+ "go2rtc_source_override, sub_stream_url "
782788 "FROM streams WHERE name = ?;" ;
783789
784790 // Column index constants for readability
@@ -794,7 +800,7 @@ int get_stream_config_by_name(const char *name, stream_config_t *stream) {
794800 COL_PTZ_ENABLED , COL_PTZ_MAX_X , COL_PTZ_MAX_Y , COL_PTZ_MAX_Z , COL_PTZ_HAS_HOME ,
795801 COL_ONVIF_USERNAME , COL_ONVIF_PASSWORD , COL_ONVIF_PROFILE , COL_ONVIF_PORT ,
796802 COL_RECORD_ON_SCHEDULE , COL_RECORDING_SCHEDULE , COL_TAGS , COL_ADMIN_URL , COL_PRIVACY_MODE ,
797- COL_MOTION_TRIGGER_SOURCE , COL_GO2RTC_SOURCE_OVERRIDE
803+ COL_MOTION_TRIGGER_SOURCE , COL_GO2RTC_SOURCE_OVERRIDE , COL_SUB_STREAM_URL
798804 };
799805
800806 rc = sqlite3_prepare_v2 (db , sql , -1 , & stmt , NULL );
@@ -963,6 +969,14 @@ int get_stream_config_by_name(const char *name, stream_config_t *stream) {
963969 stream -> go2rtc_source_override [0 ] = '\0' ;
964970 }
965971
972+ // Sub-stream URL
973+ const char * sub_stream_url_val = (const char * )sqlite3_column_text (stmt , COL_SUB_STREAM_URL );
974+ if (sub_stream_url_val ) {
975+ safe_strcpy (stream -> sub_stream_url , sub_stream_url_val , sizeof (stream -> sub_stream_url ), 0 );
976+ } else {
977+ stream -> sub_stream_url [0 ] = '\0' ;
978+ }
979+
966980 result = 0 ;
967981 }
968982
@@ -1015,7 +1029,7 @@ int get_all_stream_configs(stream_config_t *streams, int max_count) {
10151029 "ptz_enabled, ptz_max_x, ptz_max_y, ptz_max_z, ptz_has_home, "
10161030 "onvif_username, onvif_password, onvif_profile, onvif_port, "
10171031 "record_on_schedule, recording_schedule, tags, admin_url, privacy_mode, motion_trigger_source, "
1018- "go2rtc_source_override "
1032+ "go2rtc_source_override, sub_stream_url "
10191033 "FROM streams ORDER BY name;" ;
10201034
10211035 // Column index constants (same as get_stream_config_by_name)
@@ -1031,7 +1045,7 @@ int get_all_stream_configs(stream_config_t *streams, int max_count) {
10311045 COL_PTZ_ENABLED , COL_PTZ_MAX_X , COL_PTZ_MAX_Y , COL_PTZ_MAX_Z , COL_PTZ_HAS_HOME ,
10321046 COL_ONVIF_USERNAME , COL_ONVIF_PASSWORD , COL_ONVIF_PROFILE , COL_ONVIF_PORT ,
10331047 COL_RECORD_ON_SCHEDULE , COL_RECORDING_SCHEDULE , COL_TAGS , COL_ADMIN_URL , COL_PRIVACY_MODE ,
1034- COL_MOTION_TRIGGER_SOURCE , COL_GO2RTC_SOURCE_OVERRIDE
1048+ COL_MOTION_TRIGGER_SOURCE , COL_GO2RTC_SOURCE_OVERRIDE , COL_SUB_STREAM_URL
10351049 };
10361050
10371051 rc = sqlite3_prepare_v2 (db , sql , -1 , & stmt , NULL );
@@ -1199,6 +1213,14 @@ int get_all_stream_configs(stream_config_t *streams, int max_count) {
11991213 s -> go2rtc_source_override [0 ] = '\0' ;
12001214 }
12011215
1216+ // Sub-stream URL
1217+ const char * sub_url = (const char * )sqlite3_column_text (stmt , COL_SUB_STREAM_URL );
1218+ if (sub_url ) {
1219+ safe_strcpy (s -> sub_stream_url , sub_url , sizeof (s -> sub_stream_url ), 0 );
1220+ } else {
1221+ s -> sub_stream_url [0 ] = '\0' ;
1222+ }
1223+
12021224 count ++ ;
12031225 }
12041226
0 commit comments