From 4ea4f5c14a1257085b2d5483ad998eb94457d8fd Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 2 Apr 2024 15:36:52 -0400 Subject: [PATCH 01/50] Define new ListRecordingSegments API --- wsdl/ver10/search.wsdl | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index c995be557..18da9114f 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -115,6 +115,52 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + Gets results from a particular recording listingession. + + + + + + The start to end time of the query. + + + + + The recording job token. + + + + + + + + + + + + + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + As defined in RFC 6381 including section 3 Codecs. + + + + + Gets results from a particular recording listingession. From f77c1f73fcb640abb7cd3afd2e8e2e1e300513dd Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 23 Apr 2024 15:19:45 -0400 Subject: [PATCH 02/50] Add export segment API --- wsdl/ver10/recording.wsdl | 134 +++++++++++++++++++++++++++++++ wsdl/ver10/search.wsdl | 4 +- wsdl/ver20/media/wsdl/media.wsdl | 2 +- 3 files changed, 137 insertions(+), 3 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 68e8dd453..7ba3fe2eb 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -646,6 +646,140 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + + The start to end time of the query. + + + + + The recording job token. + + + + + The type of the track to be exported. + + + + + + + + + + + Unique operation token for client to associate the relevant events. + + + + + + + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + As defined in RFC 6381 including section 3 Codecs. + + + + + List of exported file names. The device can also use AsyncronousOperationStatus event to publish this list. + + + + + + + + + + Unique ExportRecordedData operation token + + + + + + + + + + + + + + + + + + + + + + + Unique ExportRecordedData operation token + + + + + See trc:UploadStatus for allowed values. + + + + + + + + + + + + + + + + + + + Unique ExportRecordedData operation token + + + + + + + + + + + Progress percentage of ExportRecordedData operation. + + + + + + + + + + + + diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index 18da9114f..081649eb6 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -117,7 +117,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Gets results from a particular recording listingession. + Gets segments available within a time range. @@ -163,7 +163,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Gets results from a particular recording listingession. + Gets results from a particular recording listing session. diff --git a/wsdl/ver20/media/wsdl/media.wsdl b/wsdl/ver20/media/wsdl/media.wsdl index 06af8571e..e8d571005 100644 --- a/wsdl/ver20/media/wsdl/media.wsdl +++ b/wsdl/ver20/media/wsdl/media.wsdl @@ -745,7 +745,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types. + Video Media Subtype for the video format. For definitions see tt:VideoEncodingMimeNames and IANA Media Types. From 93373a3b79f2178005884d9deed22860be89b837 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 25 Apr 2024 14:58:23 -0400 Subject: [PATCH 03/50] Update wsdl --- wsdl/ver10/recording.wsdl | 54 +++++++++++++++++++++++++++++++-------- wsdl/ver10/search.wsdl | 14 +++++++++- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 7ba3fe2eb..3fdc4e8b7 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -676,7 +676,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Unique operation token for client to associate the relevant events. - + @@ -751,26 +751,21 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + - Unique ExportRecordedData operation token + Unique ExportRecordedSegment operation token - + - - - Progress percentage of ExportRecordedData operation. - - - + @@ -961,18 +956,36 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + + + + + + + + + + + + + @@ -1121,6 +1134,27 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + Exports the selected recordings (from existing recorded data) to the given storage target based on the requested file format. + + + + + + + Stops the selected ExportRecordedData operation. + + + + + + + Retrieves the status of selected ExportRecordedData operation. + + + + Exports the selected recordings (from existing recorded data) to the given storage target based on the requested file format. diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index 081649eb6..3ae290d3a 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -137,7 +137,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + @@ -554,6 +554,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + @@ -648,6 +654,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + FindEvents starts a search session, looking for recording events (in the scope that matches the search filter defined in the request. Results from the search are From 7cf26eb44cb13910979437a49c3b200cb2b492b7 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 23 May 2024 14:46:04 -0400 Subject: [PATCH 04/50] Update doc and add storage strategy --- doc/RecordingControl.xml | 79 +++++++++++++++++++++++++++++++++++++ doc/RecordingSearch.xml | 27 +++++++++++++ wsdl/ver10/recording.wsdl | 30 ++++++++------ wsdl/ver10/schema/onvif.xsd | 32 ++++++++++++++- wsdl/ver10/search.wsdl | 28 +++++++------ 5 files changed, 171 insertions(+), 25 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index e29b3d6f0..9ab9b425d 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1673,6 +1673,85 @@ Change Request 2061, 2063, 2065, 2109 +
+ ExportRecordedSegments + Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. + The StoragePath shall be the path as defined in the Object Storage annex appended to the StorageUri from the StorageConfiguration. + + + request + + Time [tt:DateTimeRange] + JobToken [tt:RecordingJobReference] + Track [tt:TrackType] + An optional field if specified indicates which track is to be exported. + + + + response + + OperationToken [tt:ReferenceToken] + Segment [trc:UploadSegmentResult] + + + + access class + + READ_MEDIA + + + +
+
+ GetExportRecordedSegmentState + Retrieves the status of selected ExportRecordedSegments operation. + + + request + + OperationToken [tt:ReferenceToken] + + + + response + + StoragePath [tt:ReferenceToken] + Status [trc:UploadStatus] + + + + access class + + READ_MEDIA + + + +
+
+ StopExportRecordedSegments + Stops the selected ExportRecordedSegments operation. + + + request + + OperationToken [tt:ReferenceToken] + + + + response + + StoragePath [tt:ReferenceToken] + Status [trc:UploadStatus] + + + + access class + + READ_MEDIA + + + +
Events Some of these events are similar to the automatically generated events that can be searched for by the FindEvents method in the search service. See ONVIF Recording Search Service Specification. diff --git a/doc/RecordingSearch.xml b/doc/RecordingSearch.xml index e6840df9a..96dd49c61 100644 --- a/doc/RecordingSearch.xml +++ b/doc/RecordingSearch.xml @@ -1389,6 +1389,33 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace
+
+ ListRecordedSegments + Lists available recorded segments related to the specified JobToken. + The listed segments shall have a stable start and end time as defined in Annex Stable Recordings. + + + request + + Time [tt:DateTimeRange] + JobToken [tt:RecordingJobReference] + + + + response + + Segment [tse:ListRecordedSegmentsResultList] + Contains a collection of segments with some basic metadata associated with the recording. + + + + access class + + READ_MEDIA + + + +
Recording Event Descriptions A device shall generate the following events with the corresponding event message descriptions. A device supporting the recording search service shall record these notification messages so that clients can use FindEvents to search for these messages. All recording events that are generated by the device and inserted into the recording history shall have a root topic of tns1:RecordingHistory. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 3fdc4e8b7..597fb8639 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -662,7 +662,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - The type of the track to be exported. + The optional track type to be exported. @@ -673,10 +673,14 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Unique operation token for client to associate the relevant events. + Unique operation token for client to query the status of the export. + + + + + Information about the segment(s) to be exported. - @@ -699,7 +703,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - List of exported file names. The device can also use AsyncronousOperationStatus event to publish this list. + + The URI which combines the storage configuration StoragePath and the segment object path. + @@ -709,7 +715,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Unique ExportRecordedData operation token + Unique ExportRecordedSegments operation token @@ -718,9 +724,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + - + Information about the exported segments. @@ -732,7 +738,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Unique ExportRecordedData operation token + The URI which combines the storage configuration StoragePath and the segment object path. @@ -767,7 +773,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + Information about the exported segments. @@ -1136,21 +1142,21 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Exports the selected recordings (from existing recorded data) to the given storage target based on the requested file format. + Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. - Stops the selected ExportRecordedData operation. + Stops the selected ExportRecordedSegments operation. - Retrieves the status of selected ExportRecordedData operation. + Retrieves the status of selected ExportRecordedSegments operation. diff --git a/wsdl/ver10/schema/onvif.xsd b/wsdl/ver10/schema/onvif.xsd index c2a285338..a744ab979 100755 --- a/wsdl/ver10/schema/onvif.xsd +++ b/wsdl/ver10/schema/onvif.xsd @@ -7726,6 +7726,11 @@ and sample rate. Token of a storage configuration. + + + Strategy to be used on how to store recordings, see tt:StorageStrategy for allowed values. If undefined, defaults to External. + + @@ -7787,6 +7792,31 @@ and sample rate. + + + + + Indicates that device must record to the storage defined by the StorageConfiguration token. + + + + + + Indicates that device must record on its local storage and can export recorded data to the external + storage using ExportRecordedSegments. + + + + + + + Indicates that device must record on both local storage and external storage and locally recorded data can + be exported if connectivity issue prevented export to external storage during normal operation. + + + + + @@ -8014,7 +8044,7 @@ and sample rate. - Sspecifies the maximum time that data in any track within the + Specifies the maximum time that data in any track within the recording shall be stored. The device shall delete any data older than the maximum retention time. Such data shall not be accessible anymore. If the MaximumRetentionPeriod is set to 0, the device shall not limit the retention time of stored data, except by resource constraints. diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index 3ae290d3a..debe09f1a 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -115,7 +115,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + Gets segments available within a time range. @@ -134,14 +134,18 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + - + + + Information about an exportable segment. + + - + @@ -554,11 +558,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - + + - - + + @@ -654,10 +658,10 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - + + Lists available recorded segments related to the specified JobToken. + + From fe536eef3e65d9b48c1cfd0d7a8517a120e59609 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 5 Jun 2024 04:10:04 -0400 Subject: [PATCH 05/50] Add annex --- doc/RecordingSearch.xml | 103 +++++++++++++++++- .../segmentExportStabilityExample 1.svg | 1 + 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 doc/media/RecordingSearch/segmentExportStabilityExample 1.svg diff --git a/doc/RecordingSearch.xml b/doc/RecordingSearch.xml index 96dd49c61..e5e84ea3b 100644 --- a/doc/RecordingSearch.xml +++ b/doc/RecordingSearch.xml @@ -1503,7 +1503,7 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace Deprecated Interfaces
- A.1 Method for returning search status + Method for returning search status The definition and interface for the returning search status have been deprecated with release 16.06. The following interfaces have been removed from the specification: @@ -1513,6 +1513,107 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace The definition is available via the link <https://www.onvif.org/specs/srv/rsrch/ONVIF-RecordingSearch-Service-Spec-v1606.pdf>.
+ + Segment export (Normative) +
+ Overview + + This annex describes the requirements for recording and exporting media streams in a cloud-friendly format. + Device will need to record on their local storage when a RecordingTargetConfiguration has its strategy set to "Local" or "Both". + While the device can record locally using any format, segments can be queried at any time and the resulting list of segments MUST be stable. + "Stable" here is defined in the sense that each frame will always be part of the same segment and the available segments are immutable. + + + Specific recorded segments can then be exported to the cloud on request and each exported segment MUST yield the same result (a CMAF or MP4 file + containing all its frames) on a successful export operation. + + + The deterministic properties of the segments (when queried or exported) facilitate features like HLS or MPEG-DASH playback from the device, + and also a simple way to implement on-demand video tricking from the local storage for a device to the cloud. + +
+
+ Recording segments + + There are three possible recording strategies as defined for RecordingTargetConfiguration: + + + Cloud (default) + + + The device will automatically upload each recorded segment to the Cloud location as soon as possible. After completion or on error the data won't be kept locally on the device. + + + + + Local + + + The device will record the segments on its local storage and keep it there for as long as possible. + + + + + Both + + + The device will record the segments on its local storage and keep it there for as long as possible. It will also attempt to automatically upload each segment to the Cloud location as they become available. + + + + + + + When recording on its local storage, the device may need to delete the oldest recording segments if storage space is insufficient. + + + When uploading to the configured Cloud location, if an error occurs the device can retry but should abandon if the operation took too long and the next segment is ready to be uploaded. + Only whole segments should be uploaded and committed to the cloud storage (no incomplete segment should be made available on failure). + +
+
+ Segment export commands + + The ListRecordedSegments command lists the segments currently available for export from the device local storage. + For a given time range, this command should always return the same segments with two exceptions: the newly recorded segments are added as they become + available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). + + + The ExportRecordedSegments command starts an export operation for all segment (partially or entirely) contained in the + specified time range. Multiple operations at the same time can be queued and processed sequentially. While the operation is being executed + the segments must not be deleted until they are uploaded (but the following ones can be). Segments should be uploaded in chronological order. + Progression can be tracked with GetExportRecordedSegmentState. Operations can be cancelled at any time with StopExportRecordedSegments. + The segment names use should follow Cloud Recording Segment Objects format, with counter starting at zero for the first segment of each export operation. + + + Note: it is possible that the segments listed with ListRecordedSegments are not exactly the ones exported with ExportRecordedSegments + as some segments could be deleted/added in-between the two commands being executed. + +
+
+ Segment stability + + Segment stability is essential for this feature: each frame must be part of exactly one segment and each segment must always be immutable in time. + Additionnally, each segment must start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary + format, so the segments won't exist until exported to the cloud storage. Since the device must be able to list them beforehand, we suggest a simple + algorithm to determin how many segments will be in each time range and which frames will be part of them. + + + The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot + or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges is + adjusted to match the time of the next keyframe. The result is the list of segment boundaries that overlap with the original time range of the query. + Care should be taken not to return the most recent segment if it is incomplete (when more frames may be appended to it later, i.e.: it overlaps with the current time). + +
+ Example of possible algorithm to ensure segment stability + + + + + +
+
+
Revision History diff --git a/doc/media/RecordingSearch/segmentExportStabilityExample 1.svg b/doc/media/RecordingSearch/segmentExportStabilityExample 1.svg new file mode 100644 index 000000000..b079395e4 --- /dev/null +++ b/doc/media/RecordingSearch/segmentExportStabilityExample 1.svg @@ -0,0 +1 @@ +Time modulo target durationAlign segment start with next KFFrame timesKFKFKFKFKFReturn segments in search range(Ignore empty/incomplete segments)KFPPPPPPPPPPPPP \ No newline at end of file From c1175a8e5a76dad7f8af7fa912a40264b25dfbbf Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 9 Jul 2024 13:58:21 -0400 Subject: [PATCH 06/50] Change segments API to use RecordingToken instead of RecordingJobToken --- wsdl/ver10/recording.wsdl | 4 ++-- wsdl/ver10/search.wsdl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 597fb8639..242f1cee2 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -655,9 +655,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The start to end time of the query.
- + - The recording job token. + The recording configuration token. diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index debe09f1a..b0ca09934 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -126,9 +126,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The start to end time of the query. - + - The recording job token. + The recording configuration token.
From 5855d975a242e258841b647071b4bb6e6f35a2c4 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 9 Jul 2024 13:58:36 -0400 Subject: [PATCH 07/50] Add video source token to the RecordingSourceInformation --- wsdl/ver10/schema/onvif.xsd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wsdl/ver10/schema/onvif.xsd b/wsdl/ver10/schema/onvif.xsd index a744ab979..e6b6d96b5 100755 --- a/wsdl/ver10/schema/onvif.xsd +++ b/wsdl/ver10/schema/onvif.xsd @@ -7639,6 +7639,11 @@ and sample rate. URI provided by the service supplying data to be recorded. A device shall support at least 128 characters.
+ + + The video source token of all recordings that will use this configuration. + + From 786e45f0055551a34cfefa34cc256e40dbaee64b Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 9 Jul 2024 14:36:33 -0400 Subject: [PATCH 08/50] Update search API to have paging for ListRecordedSegments --- doc/RecordingSearch.xml | 38 ++++++++++++++++++++-- wsdl/ver10/search.wsdl | 70 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 101 insertions(+), 7 deletions(-) diff --git a/doc/RecordingSearch.xml b/doc/RecordingSearch.xml index e5e84ea3b..fb7048599 100644 --- a/doc/RecordingSearch.xml +++ b/doc/RecordingSearch.xml @@ -1389,6 +1389,35 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace
+
+ FindRecordedSegments + Creates a search operation to list available recorded segments related to the specified recording configuration. + The JobToken can then be used with ListRecordedSegments to obtain the available recorded segments. + + + request + + Time [tt:DateTimeRange] + RecordingToken [tt:RecordingReference] + MaxMatches [xs:int] + KeepAliveTime [xs:duration] + + + + response + + SearchToken [tt:JobToken] + The token used in ListRecordedSegments to get the segments. + + + + access class + + READ_MEDIA + + + +
ListRecordedSegments Lists available recorded segments related to the specified JobToken. @@ -1397,13 +1426,18 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace request - Time [tt:DateTimeRange] - JobToken [tt:RecordingJobReference] + SearchToken [tt:JobToken] + MinResults [xs:int] + MaxResults [xs:int] + WaitTime [xs:duration] response + SearchState [tt:SearchState] + The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. +
- enum { 'Queued', 'Searching', 'Completed', 'Unknown' }
Segment [tse:ListRecordedSegmentsResultList] Contains a collection of segments with some basic metadata associated with the recording.
diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index b0ca09934..d4103a8f1 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -115,10 +115,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - Gets segments available within a time range. - + @@ -131,12 +128,64 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The recording configuration token. + + + The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. + + + + + The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. + + + + + + + + + + + + + + + + Gets segments available within a time range. + + + + + + The search session to get results from. + + + + + The minimum number of results to return in one response. + + + + + The maximum number of results to return in one response. + + + + + The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. + + + + + The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. + + Information about an exportable segment. @@ -558,6 +607,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + @@ -658,8 +713,13 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + Creates a search operation to list available recorded segments related to the specified recording configuration. + + + - Lists available recorded segments related to the specified JobToken. + Lists available recorded segments related to the specified RecordingToken. From e06ee90125e863885d7da3549731464f3150b538 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 9 Jul 2024 15:13:32 -0400 Subject: [PATCH 09/50] Update ExportRecordedSegments API to have paging --- doc/RecordingControl.xml | 16 +++++++----- wsdl/ver10/recording.wsdl | 54 +++++++++++++++++---------------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 9ab9b425d..52257c502 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1682,16 +1682,18 @@ Change Request 2061, 2063, 2065, 2109 request Time [tt:DateTimeRange] - JobToken [tt:RecordingJobReference] + RecordingToken [tt:RecordingReference] Track [tt:TrackType] An optional field if specified indicates which track is to be exported. + OmitSequenceNumber [xs:boolean] + An optional flag indicating whether the device includes the sequence number in the storage path for each segment.
response OperationToken [tt:ReferenceToken] - Segment [trc:UploadSegmentResult] + NumberOfSegments [xs:int] @@ -1710,13 +1712,16 @@ Change Request 2061, 2063, 2065, 2109 request OperationToken [tt:ReferenceToken] + Start [xs:int] + The start index for the segment results. + Count [xs:int] + The number of segment results to be provided in the response. response - StoragePath [tt:ReferenceToken] - Status [trc:UploadStatus] + Segment [tt:UploadSegmentResult] @@ -1740,8 +1745,7 @@ Change Request 2061, 2063, 2065, 2109 response - StoragePath [tt:ReferenceToken] - Status [trc:UploadStatus] + This is an empty message. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 242f1cee2..ddc87e585 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -665,6 +665,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The optional track type to be exported. + + + An optional flag indicating whether the device includes the sequence number in the storage path for each segment. + + @@ -676,9 +681,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Unique operation token for client to query the status of the export. - + - Information about the segment(s) to be exported. + Number of segments to be exported by this operation. @@ -708,6 +713,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + See trc:UploadStatus for allowed values. + + + @@ -721,29 +732,13 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - - Information about the exported segments. - - - - - - + - - - The URI which combines the storage configuration StoragePath and the segment object path. - - - + - See trc:UploadStatus for allowed values. + Information about the segment(s) to be exported. @@ -765,21 +760,20 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Unique ExportRecordedSegment operation token - - - - - - - + - Information about the exported segments. + The start index for the segment results. + + + + + The number of segment results to be provided in the response. - + From 62ee7ba8ee691373600192652f00f65314beb333 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 11 Sep 2024 03:23:56 -0400 Subject: [PATCH 10/50] Add optional override storage configuration for export segments --- wsdl/ver10/recording.wsdl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index ddc87e585..5673beb34 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -10,8 +10,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO --> - + + @@ -660,6 +661,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The recording configuration token. + + + If provided, overrides the Target's storage configuration. + + The optional track type to be exported. From a9c3b027209f9f3c8cd6f75bd2579009a76b8e4a Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 11 Sep 2024 04:23:37 -0400 Subject: [PATCH 11/50] Remove dependency on Device Mgmt by using StorageToken --- wsdl/ver10/recording.wsdl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 5673beb34..cd9e1228c 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -10,9 +10,8 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO --> - + - @@ -661,7 +660,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The recording configuration token. - + If provided, overrides the Target's storage configuration. From a97698b4982a874c94130e82c7b2345e19916152 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 12 Sep 2024 05:25:07 -0400 Subject: [PATCH 12/50] Apply F2F suggestions for export --- wsdl/ver10/recording.wsdl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index cd9e1228c..99a138907 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -667,7 +667,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - The optional track type to be exported. + An optional track filter for segments to export when in CMAF. @@ -686,11 +686,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Unique operation token for client to query the status of the export. - - - Number of segments to be exported by this operation. - - @@ -747,6 +742,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + A value indicating that the export has reached the maximum cound and a new request must be sent to query the export state of further segments. + + @@ -765,14 +765,14 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Unique ExportRecordedSegment operation token - + The start index for the segment results. - + - The number of segment results to be provided in the response. + The maximum number of segment results to be provided in the response. From b5acbfbe1f41f7294b727cae36630e8ad38123cb Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 12 Sep 2024 05:25:34 -0400 Subject: [PATCH 13/50] Apply suggestion for Search API from F2F --- wsdl/ver10/search.wsdl | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index d4103a8f1..f3d0906d5 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -155,14 +155,14 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + - The search session to get results from. + The start to end time of the query. - + - The minimum number of results to return in one response. + The recording configuration token. @@ -170,28 +170,23 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The maximum number of results to return in one response. - - - The maximum time before responding to the request, even if the MinResults parameter is not fulfilled. - - - - - The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. - - Information about an exportable segment. + + + A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. + + From 7f39c1c98ac458127b2414a50a035f259d7363dc Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 3 Oct 2024 15:24:59 -0400 Subject: [PATCH 14/50] Move ListRecordedSegments from RecordingSearch to RecordingControl --- doc/RecordingControl.xml | 142 +++++++++++++++ doc/RecordingSearch.xml | 162 ------------------ .../segmentExportStabilityExample 1.svg | 0 wsdl/ver10/recording.wsdl | 74 +++++++- wsdl/ver10/search.wsdl | 117 ------------- 5 files changed, 213 insertions(+), 282 deletions(-) rename doc/media/{RecordingSearch => RecordingControl}/segmentExportStabilityExample 1.svg (100%) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 52257c502..74e6f3504 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1673,6 +1673,46 @@ Change Request 2061, 2063, 2065, 2109
+
+ ListRecordedSegments + Lists available recorded segments related to the specified RecordingToken. + + The device shall provide results in StartTime ascending order. + The device can decide to send less results if it needs to. + The device shall indicate if there are more segments available in the time range by having the HasMoreResults field set to True. + + + When the HasMoreResults field is set to True in the response, the client shall adapt its next query by changing the From field + to the last EndTime received from the previous request. The client should continue until the HasMoreResults field is set to False. + + The listed segments shall have a stable start and end time as defined in Annex Stable Recordings. + + + request + + Time [tt:DateTimeRange] + RecordingToken [tt:RecordingReference] + MaxResults [xs:int] + The maximum number of results to return in one response. + + + + response + + HasMoreResults [xs:boolean] + A flag indicating that more segments are available in the specified time range. + Segment + Contains a collection of segments with some basic metadata associated with the recording. + + + + access class + + READ_MEDIA + + + +
ExportRecordedSegments Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. @@ -2447,6 +2487,108 @@ secfrac = "." 1*6DIGIT site-2/2022-11-08/camera-5/16/34-11.871Z.1020.m4m_end
+ + Segment export (Normative) +
+ Overview + + This annex describes the requirements for recording and exporting media streams in a cloud-friendly format. + Device will need to record on their local storage when a RecordingTargetConfiguration has its strategy set to "Local" or "Both". + While the device can record locally using any format, segments can be queried at any time and the resulting list of segments MUST be stable. + "Stable" here is defined in the sense that each frame will always be part of the same segment and the available segments are immutable. + + + Specific recorded segments can then be exported to the cloud on request and each exported segment MUST yield the same result (a CMAF or MP4 file + containing all its frames) on a successful export operation. + + + The deterministic properties of the segments (when queried or exported) facilitate features like HLS or MPEG-DASH playback from the device, + and also a simple way to implement on-demand video trickling from the local storage for a device to the cloud. + +
+
+ Recording segments + + There are three possible recording strategies as defined for RecordingTargetConfiguration: + + + Cloud (default) + + + The device will automatically upload each recorded segment to the Cloud location as soon as possible. After completion or on error the data won't be kept locally on the device. + + + + + Local + + + The device will record the segments on its local storage and respect the MaximumRetentionTime of the RecordingConfiguration. + + + + + Both + + + The device will record the segments on its local storage and respect the MaximumRetentionTime of the RecordingConfiguration. It will also attempt to automatically upload each segment to the Cloud location as they become available. + + + + + + + When recording on its local storage, the device may need to delete the oldest recording segments if storage space is insufficient. + + + When uploading to the configured Cloud location, if an error occurs the device can retry but should abandon if the operation took too long and the next segment is ready to be uploaded. + Only whole segments should be uploaded and committed to the cloud storage (no incomplete segment should be made available on failure). + +
+
+ Segment export commands + + The ListRecordedSegments command lists the segments currently available for export from the device local storage. + For a given time range, this command should always return the same segments with two exceptions: the newly recorded segments are added as they become + available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). + + + The ExportRecordedSegments command starts an export operation for all segment (partially or entirely) contained in the + specified time range. Multiple operations at the same time can be queued and processed sequentially. While the operation is being executed + the segments must not be deleted until they are uploaded (but the following ones can be). Segments should be uploaded in chronological order. + Progression can be tracked with GetExportRecordedSegmentState. Operations can be cancelled at any time with StopExportRecordedSegments. + The segment names used shall follow Cloud Recording Segment Objects format, with counter starting + at zero for the first segment of each export operation, unless the OmitSequenceNumber is set to True. + + + Note: it is possible that the segments listed with ListRecordedSegments are not exactly the ones exported with ExportRecordedSegments + as some segments could be deleted/added in-between the two commands being executed. + +
+
+ Segment stability + + Segment stability is essential for this feature: each frame must be part of exactly one segment and each segment must always be immutable in time. + Additionnally, each segment must start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary + format, so the segments won't exist until exported to the cloud storage. Since the device must be able to list them beforehand, we suggest a simple + algorithm to determin how many segments will be in each time range and which frames will be part of them. + + + The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot + or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges is + adjusted to match the time of the next keyframe. The result is the list of segment boundaries that overlap with the original time range of the query. + Care should be taken not to return the most recent segment if it is incomplete (when more frames may be appended to it later, i.e.: it overlaps with the current time). + +
+ Example of possible algorithm to ensure segment stability + + + + + +
+
+
Revision History diff --git a/doc/RecordingSearch.xml b/doc/RecordingSearch.xml index fb7048599..1a3988c50 100644 --- a/doc/RecordingSearch.xml +++ b/doc/RecordingSearch.xml @@ -1389,67 +1389,6 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace -
- FindRecordedSegments - Creates a search operation to list available recorded segments related to the specified recording configuration. - The JobToken can then be used with ListRecordedSegments to obtain the available recorded segments. - - - request - - Time [tt:DateTimeRange] - RecordingToken [tt:RecordingReference] - MaxMatches [xs:int] - KeepAliveTime [xs:duration] - - - - response - - SearchToken [tt:JobToken] - The token used in ListRecordedSegments to get the segments. - - - - access class - - READ_MEDIA - - - -
-
- ListRecordedSegments - Lists available recorded segments related to the specified JobToken. - The listed segments shall have a stable start and end time as defined in Annex Stable Recordings. - - - request - - SearchToken [tt:JobToken] - MinResults [xs:int] - MaxResults [xs:int] - WaitTime [xs:duration] - - - - response - - SearchState [tt:SearchState] - The state of the search when the result is returned. Indicates if there can be more results, or if the search is completed. -
- enum { 'Queued', 'Searching', 'Completed', 'Unknown' }
- Segment [tse:ListRecordedSegmentsResultList] - Contains a collection of segments with some basic metadata associated with the recording. -
-
- - access class - - READ_MEDIA - - -
-
Recording Event Descriptions A device shall generate the following events with the corresponding event message descriptions. A device supporting the recording search service shall record these notification messages so that clients can use FindEvents to search for these messages. All recording events that are generated by the device and inserted into the recording history shall have a root topic of tns1:RecordingHistory. @@ -1547,107 +1486,6 @@ http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace The definition is available via the link <https://www.onvif.org/specs/srv/rsrch/ONVIF-RecordingSearch-Service-Spec-v1606.pdf>.
- - Segment export (Normative) -
- Overview - - This annex describes the requirements for recording and exporting media streams in a cloud-friendly format. - Device will need to record on their local storage when a RecordingTargetConfiguration has its strategy set to "Local" or "Both". - While the device can record locally using any format, segments can be queried at any time and the resulting list of segments MUST be stable. - "Stable" here is defined in the sense that each frame will always be part of the same segment and the available segments are immutable. - - - Specific recorded segments can then be exported to the cloud on request and each exported segment MUST yield the same result (a CMAF or MP4 file - containing all its frames) on a successful export operation. - - - The deterministic properties of the segments (when queried or exported) facilitate features like HLS or MPEG-DASH playback from the device, - and also a simple way to implement on-demand video tricking from the local storage for a device to the cloud. - -
-
- Recording segments - - There are three possible recording strategies as defined for RecordingTargetConfiguration: - - - Cloud (default) - - - The device will automatically upload each recorded segment to the Cloud location as soon as possible. After completion or on error the data won't be kept locally on the device. - - - - - Local - - - The device will record the segments on its local storage and keep it there for as long as possible. - - - - - Both - - - The device will record the segments on its local storage and keep it there for as long as possible. It will also attempt to automatically upload each segment to the Cloud location as they become available. - - - - - - - When recording on its local storage, the device may need to delete the oldest recording segments if storage space is insufficient. - - - When uploading to the configured Cloud location, if an error occurs the device can retry but should abandon if the operation took too long and the next segment is ready to be uploaded. - Only whole segments should be uploaded and committed to the cloud storage (no incomplete segment should be made available on failure). - -
-
- Segment export commands - - The ListRecordedSegments command lists the segments currently available for export from the device local storage. - For a given time range, this command should always return the same segments with two exceptions: the newly recorded segments are added as they become - available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). - - - The ExportRecordedSegments command starts an export operation for all segment (partially or entirely) contained in the - specified time range. Multiple operations at the same time can be queued and processed sequentially. While the operation is being executed - the segments must not be deleted until they are uploaded (but the following ones can be). Segments should be uploaded in chronological order. - Progression can be tracked with GetExportRecordedSegmentState. Operations can be cancelled at any time with StopExportRecordedSegments. - The segment names use should follow Cloud Recording Segment Objects format, with counter starting at zero for the first segment of each export operation. - - - Note: it is possible that the segments listed with ListRecordedSegments are not exactly the ones exported with ExportRecordedSegments - as some segments could be deleted/added in-between the two commands being executed. - -
-
- Segment stability - - Segment stability is essential for this feature: each frame must be part of exactly one segment and each segment must always be immutable in time. - Additionnally, each segment must start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary - format, so the segments won't exist until exported to the cloud storage. Since the device must be able to list them beforehand, we suggest a simple - algorithm to determin how many segments will be in each time range and which frames will be part of them. - - - The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot - or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges is - adjusted to match the time of the next keyframe. The result is the list of segment boundaries that overlap with the original time range of the query. - Care should be taken not to return the most recent segment if it is incomplete (when more frames may be appended to it later, i.e.: it overlaps with the current time). - -
- Example of possible algorithm to ensure segment stability - - - - - -
-
-
Revision History diff --git a/doc/media/RecordingSearch/segmentExportStabilityExample 1.svg b/doc/media/RecordingControl/segmentExportStabilityExample 1.svg similarity index 100% rename from doc/media/RecordingSearch/segmentExportStabilityExample 1.svg rename to doc/media/RecordingControl/segmentExportStabilityExample 1.svg diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 99a138907..f4cdb0fcb 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -587,7 +587,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
- @@ -616,7 +615,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - @@ -647,6 +645,65 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + Gets segments available within a time range. + + + + + + The start to end time of the query. + + + + + The recording configuration token. + + + + + The maximum number of results to return in one response. + + + + + + + + + + + Information about an exportable segment. + + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + As defined in RFC 6381 including section 3 Codecs. + + + + + + + + + A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. + + + + @@ -960,7 +1017,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + + + + + + @@ -1139,6 +1201,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + Lists available recorded segments related to the specified RecordingToken. + + + Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. diff --git a/wsdl/ver10/search.wsdl b/wsdl/ver10/search.wsdl index f3d0906d5..93087b9d6 100644 --- a/wsdl/ver10/search.wsdl +++ b/wsdl/ver10/search.wsdl @@ -115,100 +115,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - - The start to end time of the query. - - - - - The recording configuration token. - - - - - The search will be completed after this many matches. If not specified, the search will continue until reaching the endpoint or until the session expires. - - - - - The time the search session will be kept alive after responding to this and subsequent requests. A device shall support at least values up to ten seconds. - - - - - - - - - - - - - - - - Gets segments available within a time range. - - - - - - The start to end time of the query. - - - - - The recording configuration token. - - - - - The maximum number of results to return in one response. - - - - - - - - - - - Information about an exportable segment. - - - - - - A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. - - - - - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - As defined in RFC 6381 including section 3 Codecs. - - - - - Gets results from a particular recording listing session. @@ -602,18 +508,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - - - - - - - - @@ -708,17 +602,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - Creates a search operation to list available recorded segments related to the specified recording configuration. - - - - - Lists available recorded segments related to the specified RecordingToken. - - - - FindEvents starts a search session, looking for recording events (in the scope that matches the search filter defined in the request. Results from the search are From 8d6e74ce018359bb5fa83cc08fdf7b271e8bc7af Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Mon, 7 Oct 2024 08:52:11 -0400 Subject: [PATCH 15/50] Changed should to shall in export annex --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 74e6f3504..67956e145 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2549,7 +2549,7 @@ secfrac = "." 1*6DIGIT Segment export commands The ListRecordedSegments command lists the segments currently available for export from the device local storage. - For a given time range, this command should always return the same segments with two exceptions: the newly recorded segments are added as they become + For a given time range, this command shall always return the same segments with two exceptions: the newly recorded segments are added as they become available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). From 14fd86de64be2c4f7ba7838e23a54dbb6545e59c Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 22 Oct 2024 14:10:51 -0400 Subject: [PATCH 16/50] Add missing param in the specification --- doc/RecordingControl.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 67956e145..9b32627a6 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1723,9 +1723,11 @@ Change Request 2061, 2063, 2065, 2109 Time [tt:DateTimeRange] RecordingToken [tt:RecordingReference] - Track [tt:TrackType] + StorageToken - optional [tt:ReferenceToken] + If provided, overrides the Target's storage configuration. + Track - optional [tt:TrackType] An optional field if specified indicates which track is to be exported. - OmitSequenceNumber [xs:boolean] + OmitSequenceNumber - optional [xs:boolean] An optional flag indicating whether the device includes the sequence number in the storage path for each segment. From f4aa907ece86c7a0c94ab1820ccc85bd28427380 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 22 Oct 2024 14:26:27 -0400 Subject: [PATCH 17/50] Rename OmitSeqNumber to ForceZeroCounter --- doc/RecordingControl.xml | 4 ++-- wsdl/ver10/recording.wsdl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 9b32627a6..96f7771bc 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1727,8 +1727,8 @@ Change Request 2061, 2063, 2065, 2109 If provided, overrides the Target's storage configuration. Track - optional [tt:TrackType] An optional field if specified indicates which track is to be exported. - OmitSequenceNumber - optional [xs:boolean] - An optional flag indicating whether the device includes the sequence number in the storage path for each segment. + ForceZeroCounter - optional [xs:boolean] + An optional flag indicating whether the segment counter number shall always be set to 0 in the storage path for each segment. See diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index f4cdb0fcb..12439154a 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -727,9 +727,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO An optional track filter for segments to export when in CMAF. - + - An optional flag indicating whether the device includes the sequence number in the storage path for each segment. + An optional flag indicating whether the segment counter number shall always be set to 0 in the storage path for each segment.
From 891e81d1f6183c853c5531b664f214bf730f4b30 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 12 Nov 2024 14:35:31 -0500 Subject: [PATCH 18/50] Fix a typo --- wsdl/ver10/recording.wsdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 12439154a..87f3edcbe 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -801,7 +801,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO
- A value indicating that the export has reached the maximum cound and a new request must be sent to query the export state of further segments. + A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments.
From ae2d752c81e321961d0851dd04471d5307ea9acf Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 14 Nov 2024 18:21:25 -0500 Subject: [PATCH 19/50] Fix namespaces from move from search service --- wsdl/ver10/recording.wsdl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 87f3edcbe..84fa0957c 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -1018,10 +1018,10 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + - + @@ -1204,8 +1204,8 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Lists available recorded segments related to the specified RecordingToken. - - + + From e8e971b42a317e13059ea15826d182f410f41e35 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 20 Nov 2024 09:38:57 -0500 Subject: [PATCH 20/50] Minor updates based on San Diego F2F and prototyping --- doc/RecordingControl.xml | 15 +++++++-------- wsdl/ver10/recording.wsdl | 27 +++++++++++---------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 96f7771bc..6980da939 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1699,10 +1699,10 @@ Change Request 2061, 2063, 2065, 2109 response - HasMoreResults [xs:boolean] - A flag indicating that more segments are available in the specified time range. Segment Contains a collection of segments with some basic metadata associated with the recording. + HasMoreResults [xs:boolean] + A flag indicating that more segments are available in the specified time range. @@ -1727,15 +1727,12 @@ Change Request 2061, 2063, 2065, 2109 If provided, overrides the Target's storage configuration. Track - optional [tt:TrackType] An optional field if specified indicates which track is to be exported. - ForceZeroCounter - optional [xs:boolean] - An optional flag indicating whether the segment counter number shall always be set to 0 in the storage path for each segment. See response OperationToken [tt:ReferenceToken] - NumberOfSegments [xs:int] @@ -1754,16 +1751,18 @@ Change Request 2061, 2063, 2065, 2109 request OperationToken [tt:ReferenceToken] - Start [xs:int] + StartTime [xs:dateTime] The start index for the segment results. - Count [xs:int] - The number of segment results to be provided in the response. + MaxCount [xs:int] + The maximum number of segment results to be provided in the response. response Segment [tt:UploadSegmentResult] + HasMoreSegments [xs:boolean] + A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 84fa0957c..0634c4de8 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -696,12 +696,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. + + - - - A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. - - @@ -727,11 +727,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO An optional track filter for segments to export when in CMAF. - - - An optional flag indicating whether the segment counter number shall always be set to 0 in the storage path for each segment. - - @@ -798,12 +793,12 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Information about the segment(s) to be exported. + + + A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. + + - - - A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. - - @@ -1209,7 +1204,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. + Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording configuration. From f8cbb244a2c45469773de20d7f10b08173a79954 Mon Sep 17 00:00:00 2001 From: jflevesque-genetec <39772820+jflevesque-genetec@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:35:15 -0500 Subject: [PATCH 21/50] Update doc/RecordingControl.xml Co-authored-by: Kieran McCartan <70752937+kieran242@users.noreply.github.com> --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 6980da939..350bc99ae 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2572,7 +2572,7 @@ secfrac = "." 1*6DIGIT Segment stability is essential for this feature: each frame must be part of exactly one segment and each segment must always be immutable in time. Additionnally, each segment must start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary format, so the segments won't exist until exported to the cloud storage. Since the device must be able to list them beforehand, we suggest a simple - algorithm to determin how many segments will be in each time range and which frames will be part of them. + algorithm to determine how many segments will be in each time range and which frames will be part of them. The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot From 3453071722aba1831ed61874bfa7fe99cc236d7a Mon Sep 17 00:00:00 2001 From: jflevesque-genetec <39772820+jflevesque-genetec@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:35:25 -0500 Subject: [PATCH 22/50] Update doc/RecordingControl.xml Co-authored-by: Kieran McCartan <70752937+kieran242@users.noreply.github.com> --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 350bc99ae..8e5cf173f 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2576,7 +2576,7 @@ secfrac = "." 1*6DIGIT The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot - or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges is + or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges are adjusted to match the time of the next keyframe. The result is the list of segment boundaries that overlap with the original time range of the query. Care should be taken not to return the most recent segment if it is incomplete (when more frames may be appended to it later, i.e.: it overlaps with the current time). From c5c9483e5ced325397442813ac3d3817579fee36 Mon Sep 17 00:00:00 2001 From: jflevesque-genetec <39772820+jflevesque-genetec@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:35:36 -0500 Subject: [PATCH 23/50] Update doc/RecordingControl.xml Co-authored-by: Kieran McCartan <70752937+kieran242@users.noreply.github.com> --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 8e5cf173f..1a9dde22c 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2575,7 +2575,7 @@ secfrac = "." 1*6DIGIT algorithm to determine how many segments will be in each time range and which frames will be part of them. - The figure illustrate how a global real time clock timestamp (that doesn't reset on device reboot + The figure illustrates how a global real time clock timestamp (that doesn't reset on device reboot or resync on NTP) could be segmented in time ranges for the target segment duration with a modulus operation. Then each boundary of these ranges are adjusted to match the time of the next keyframe. The result is the list of segment boundaries that overlap with the original time range of the query. Care should be taken not to return the most recent segment if it is incomplete (when more frames may be appended to it later, i.e.: it overlaps with the current time). From 0110c68b2bb67de8a8f65a889ea43b81337155f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M=C3=A9lan=C3=A7on?= Date: Tue, 4 Mar 2025 14:48:36 -0500 Subject: [PATCH 24/50] Merge with override. Move StorageStrategy before the ##any --- wsdl/ver10/schema/onvif.xsd | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wsdl/ver10/schema/onvif.xsd b/wsdl/ver10/schema/onvif.xsd index e6b6d96b5..ee830d617 100755 --- a/wsdl/ver10/schema/onvif.xsd +++ b/wsdl/ver10/schema/onvif.xsd @@ -7731,11 +7731,6 @@ and sample rate. Token of a storage configuration. - - - Strategy to be used on how to store recordings, see tt:StorageStrategy for allowed values. If undefined, defaults to External. - - @@ -7793,6 +7788,11 @@ and sample rate. + + + Strategy to be used on how to store recordings, see tt:StorageStrategy for allowed values. If undefined, defaults to External. + + From a3576f8969ddbeb85c59b545a3f87a061a3fcbbf Mon Sep 17 00:00:00 2001 From: HansBusch <47081128+HansBusch@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:43:15 +0100 Subject: [PATCH 25/50] Unify maximum number of results request parameter and make it everywhere optional. --- doc/RecordingControl.xml | 4 ++-- wsdl/ver10/recording.wsdl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 1a9dde22c..96fd2928c 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1692,7 +1692,7 @@ Change Request 2061, 2063, 2065, 2109 Time [tt:DateTimeRange] RecordingToken [tt:RecordingReference] - MaxResults [xs:int] + MaxResults - optional [xs:int] The maximum number of results to return in one response. @@ -1753,7 +1753,7 @@ Change Request 2061, 2063, 2065, 2109 OperationToken [tt:ReferenceToken] StartTime [xs:dateTime] The start index for the segment results. - MaxCount [xs:int] + MaxResults - optional [xs:int] The maximum number of segment results to be provided in the response. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 0634c4de8..2a213d0bf 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -822,7 +822,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The start index for the segment results. - + The maximum number of segment results to be provided in the response. From 217dbe34becdf4ea1d95cc85b8abc6651b58cb0b Mon Sep 17 00:00:00 2001 From: Hans Busch <47081128+HansBusch@users.noreply.github.com> Date: Wed, 2 Apr 2025 09:37:49 +0200 Subject: [PATCH 26/50] Segment Playback XML syntax fixes (#540) * Fix xref syntax error. * Add extension points and soap binding. * Fix syntactical errors resulting in wrong or missing stubs with Visual Studio: --- doc/RecordingControl.xml | 2 +- wsdl/ver10/recording.wsdl | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 96fd2928c..0f9e6031e 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2558,7 +2558,7 @@ secfrac = "." 1*6DIGIT specified time range. Multiple operations at the same time can be queued and processed sequentially. While the operation is being executed the segments must not be deleted until they are uploaded (but the following ones can be). Segments should be uploaded in chronological order. Progression can be tracked with GetExportRecordedSegmentState. Operations can be cancelled at any time with StopExportRecordedSegments. - The segment names used shall follow Cloud Recording Segment Objects format, with counter starting + The segment names used shall follow , with counter starting at zero for the first segment of each export operation, unless the OmitSequenceNumber is set to True. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 2a213d0bf..f7475037f 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -693,7 +693,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO As defined in RFC 6381 including section 3 Codecs. + + @@ -772,6 +774,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + @@ -1454,6 +1457,42 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4b0beb7102a5ca4655bedd7e50b8bfe5a13636f2 Mon Sep 17 00:00:00 2001 From: HansBusch <47081128+HansBusch@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:31:03 +0200 Subject: [PATCH 27/50] Fix StopExportRecordedSegments response. VisualStudio needs empty sequence to build stubs. --- wsdl/ver10/recording.wsdl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index f7475037f..05014cf64 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -787,7 +787,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + + + + + From fe0dc83a1e350f36053515b39a74259706099dbe Mon Sep 17 00:00:00 2001 From: Hans Busch <47081128+HansBusch@users.noreply.github.com> Date: Thu, 3 Apr 2025 16:33:31 +0200 Subject: [PATCH 28/50] Combine encapsulate response parameters. (#550) Unify boolean name HasMoreResults. --- wsdl/ver10/recording.wsdl | 77 ++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 05014cf64..efa1fb493 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -672,40 +672,45 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - Information about an exportable segment. - - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - As defined in RFC 6381 including section 3 Codecs. - - - - - - - - - - A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. - - + + + + + + Information about an exportable segment. + + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + Same precision as defined in the Recording Control specification for segment objects. + + + + + As defined in RFC 6381 including section 3 Codecs. + + + + + + + + + + A value indicating that the search has reached the maximum count and a new request must be sent to continue the search. + + + + @@ -800,7 +805,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO Information about the segment(s) to be exported. - + A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. @@ -837,7 +842,13 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - + + + + + + + From 7e2ee398d131a28e940a0c034b21c0aad911ce7f Mon Sep 17 00:00:00 2001 From: HansBusch <47081128+HansBusch@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:04:28 +0200 Subject: [PATCH 29/50] Use xs:string for passing tt:TrackType to workaround Visual Studio optional parameter limitation. --- wsdl/ver10/recording.wsdl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index efa1fb493..124bae3d4 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -729,9 +729,9 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO If provided, overrides the Target's storage configuration. - + - An optional track filter for segments to export when in CMAF. + An optional track filter for segments to export when in CMAF. For valid definitions see tt:TrackType. From b8b9f281cddff4c1c17f9b8fd3643cd095758a97 Mon Sep 17 00:00:00 2001 From: Hans Busch <47081128+HansBusch@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:10:55 +0200 Subject: [PATCH 30/50] Improve export specification requirements (#541) * Add capability for segment export. * Detail requirements on segment export functions. * Add faults. * Clarify getting export state information shortly after completion. --- doc/RecordingControl.xml | 60 +++++++++++++++++++++++++++++++++++---- wsdl/ver10/recording.wsdl | 7 +++++ 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 0f9e6031e..a7957a489 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1671,11 +1671,18 @@ Change Request 2061, 2063, 2065, 2109 Indicates that the device supports the OverrideSegmentDuration command. + + SegmentExport + + Indicates support for exporting recorded segments. + +
ListRecordedSegments - Lists available recorded segments related to the specified RecordingToken. + Lists available recorded segments related to the specified RecordingToken. A device + signaling support for SegmentExport shall support this function. The device shall provide results in StartTime ascending order. The device can decide to send less results if it needs to. @@ -1715,8 +1722,20 @@ Change Request 2061, 2063, 2065, 2109
ExportRecordedSegments - Exports the selected recorded segments (from existing recorded data) to the storage attached to the given recording job. - The StoragePath shall be the path as defined in the Object Storage annex appended to the StorageUri from the StorageConfiguration. + Request an export of the selected time range from existing locally recorded data. As + such an operation could take longer, this method immediately returns an operation token. The + device shall emit events as defined in section 8.9.7 Asynchronous Operation Status of the + ONVIF Core specification. The Initialized event shall be emitted when returning the + operation token. Progress updates shall be sent to inform clients about the progress of the + export. Finally a Deleted event shall be emitted to signal completion or aborting of the + operation when e.g. StopExportRecordedSegments has been executed. A device signaling support + for SegmentExport shall support this function. + The StoragePath shall be the path as defined in the Object Storage annex appended to the + StorageUri from the StorageConfiguration. By default the segments are exported to the storage that is + configured for the recording. When the parameter StorageToken is provided this target will + be used. + Note that a client may subsribe to tns1:Monitoring/AsynchronousOperationStatus for + enumeration and monitoring of active and queued exports. request @@ -1735,6 +1754,17 @@ Change Request 2061, 2063, 2065, 2109 OperationToken [tt:ReferenceToken] + + faults + + env:Sender - ter:InvalidArgVal - ter:NoRecording + The referenced recording does not exist. + env:Sender - ter:InvalidArgVal - ter:InvalidStorage + The referenced storage configuration does not exist or cannot be used. + env:Sender - ter:InvalidArgVal - ter:BadDuration + The value of the time parameter is invalid. + + access class @@ -1745,7 +1775,10 @@ Change Request 2061, 2063, 2065, 2109
GetExportRecordedSegmentState - Retrieves the status of selected ExportRecordedSegments operation. + Lists individual segments of an ongoing ExportRecordedSegments operation. A device + signaling support for SegmentExport shall support this function. + A device shall support retrieving information while an export is progressing or within + 10 seconds after its regular completion. request @@ -1765,6 +1798,15 @@ Change Request 2061, 2063, 2065, 2109 A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. + + faults + + env:Sender - ter:InvalidArgVal - ter:NoOperation + The referenced operation does not exist. + env:Sender - ter:InvalidArgVal - ter:BadDuration + The value of the time parameter is invalid. + + access class @@ -1775,7 +1817,8 @@ Change Request 2061, 2063, 2065, 2109
StopExportRecordedSegments - Stops the selected ExportRecordedSegments operation. + Stops the selected ExportRecordedSegments operation. A device signaling support for + SegmentExport shall support this function. request @@ -1789,6 +1832,13 @@ Change Request 2061, 2063, 2065, 2109 This is an empty message. + + faults + + env:Sender - ter:InvalidArgVal - ter:NoOperation + The referenced operation does not exist. + + access class diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 124bae3d4..72df33690 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -139,6 +139,13 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO + + + + Indicates support for ExportRecordedSegments. + + + From 26b47851104f24031542a6e49b2781a4ed3d8c9a Mon Sep 17 00:00:00 2001 From: Hans Busch <47081128+HansBusch@users.noreply.github.com> Date: Thu, 8 May 2025 15:46:31 +0200 Subject: [PATCH 31/50] =?UTF-8?q?Document=20storage=20strategy=20and=20add?= =?UTF-8?q?=20configuration=20faults=20in=20case=20of=20mis=E2=80=A6=20(#5?= =?UTF-8?q?59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Document storage strategy and add configuration faults in case of missing or malfunction of local storage. * Use standard fault code. --- doc/RecordingControl.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index a7957a489..441d37b23 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -495,8 +495,15 @@ Change Request 2061, 2063, 2065, 2109 Optional encryption configuration. + + StorageStrategy + + Strategy whether to directly record to external storage or to local storage or both in parallel. + + See for ONVIF defined recording formats. + A device signaling support for SegmentExport shall support StorageStrategy modes Local and Both.
TrackConfiguration @@ -616,6 +623,8 @@ Change Request 2061, 2063, 2065, 2109 The RecordConfiguration is invalid. env:Receiver - ter:ActionNotSupported - ter:NotImplemented This optional method is not implemented. + env:Receiver - ter:Action - ter:NoLocalRecording + Local recording not possible due to e.g. missing medium. @@ -769,6 +778,8 @@ Change Request 2061, 2063, 2065, 2109 The configuration is invalid. env:Sender - ter:InvalidArgVal - ter:NoRecording The RecordingToken does not reference an existing recording. + env:Receiver - ter:Action - ter:NoLocalRecording + Local recording not possible due to e.g. missing medium. From 8442815c7d1c9f5490ba30078e613abfcea73b29 Mon Sep 17 00:00:00 2001 From: HansBusch <47081128+HansBusch@users.noreply.github.com> Date: Wed, 14 May 2025 14:38:58 +0200 Subject: [PATCH 32/50] Remove requirement for StoragePath. Improve readability on handling multiple export requests. Require chronological upload order to ensure incrementing counter. --- doc/RecordingControl.xml | 21 +++++++++++---------- wsdl/ver10/recording.wsdl | 7 ------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 441d37b23..9fd92aab0 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1717,7 +1717,7 @@ Change Request 2061, 2063, 2065, 2109 response - Segment + Segment optional, unbounded [trc:Segment] Contains a collection of segments with some basic metadata associated with the recording. HasMoreResults [xs:boolean] A flag indicating that more segments are available in the specified time range. @@ -1804,7 +1804,7 @@ Change Request 2061, 2063, 2065, 2109 response - Segment [tt:UploadSegmentResult] + Segment - optional, unbounded [trc:UploadSegmentResult] HasMoreSegments [xs:boolean] A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. @@ -2614,14 +2614,15 @@ secfrac = "." 1*6DIGIT For a given time range, this command shall always return the same segments with two exceptions: the newly recorded segments are added as they become available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). - - The ExportRecordedSegments command starts an export operation for all segment (partially or entirely) contained in the - specified time range. Multiple operations at the same time can be queued and processed sequentially. While the operation is being executed - the segments must not be deleted until they are uploaded (but the following ones can be). Segments should be uploaded in chronological order. - Progression can be tracked with GetExportRecordedSegmentState. Operations can be cancelled at any time with StopExportRecordedSegments. - The segment names used shall follow , with counter starting - at zero for the first segment of each export operation, unless the OmitSequenceNumber is set to True. - + The ExportRecordedSegments command requests an export operation for + a time-range of segments. A device shall accept multiple request but may queue and process + them sequentially. Segments shall be uploaded in chronological order. Progress can be + tracked via the AsynchronousOperationStatus event and the method + GetExportRecordedSegmentState. Operations can be cancelled at any time + with StopExportRecordedSegments. The segment names shall follow , with counter starting at + zero for the first segment of each export operation, unless the OmitSequenceNumber is set to + True. Note: it is possible that the segments listed with ListRecordedSegments are not exactly the ones exported with ExportRecordedSegments as some segments could be deleted/added in-between the two commands being executed. diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 72df33690..9932a473b 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -772,13 +772,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO As defined in RFC 6381 including section 3 Codecs. - - - - The URI which combines the storage configuration StoragePath and the segment object path. - - - See trc:UploadStatus for allowed values. From 45f15f72cace950cf3b86479ca3e7507ca39f3ee Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 28 May 2025 15:25:44 -0400 Subject: [PATCH 33/50] Add fault section for ListRecordedSegments --- doc/RecordingControl.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 9fd92aab0..fbda77304 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1723,6 +1723,13 @@ Change Request 2061, 2063, 2065, 2109 A flag indicating that more segments are available in the specified time range. + + faults + + env:Sender - ter:InvalidArgVal - ter:NoRecording + The RecordingToken does not reference an existing recording + + access class From 1bea111e774c0667bec098819f6791654df029f8 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 28 May 2025 16:02:29 -0400 Subject: [PATCH 34/50] Add another fault code --- doc/RecordingControl.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index fbda77304..0c4657e9c 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1727,7 +1727,9 @@ Change Request 2061, 2063, 2065, 2109 faults env:Sender - ter:InvalidArgVal - ter:NoRecording - The RecordingToken does not reference an existing recording + The RecordingToken does not reference an existing recording. + env:Sender - ter:InvalidArgVal - ter:NoStorage + The TargetConfiguration does not reference an existing storage configuration. From 7c7328d32f860ed474bd365915a9beb428bd67e2 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 29 May 2025 10:52:53 -0400 Subject: [PATCH 35/50] Fix typo --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 0c4657e9c..78dbab13a 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1754,7 +1754,7 @@ Change Request 2061, 2063, 2065, 2109 StorageUri from the StorageConfiguration. By default the segments are exported to the storage that is configured for the recording. When the parameter StorageToken is provided this target will be used. - Note that a client may subsribe to tns1:Monitoring/AsynchronousOperationStatus for + Note that a client may subscribe to tns1:Monitoring/AsynchronousOperationStatus for enumeration and monitoring of active and queued exports. From 17fe7ed29c0564603617e9b0c1202b7ee666ab8a Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 5 Jun 2025 05:12:06 -0400 Subject: [PATCH 36/50] Include optional alias when exporting segments --- doc/Core.xml | 13 +++++++------ doc/RecordingControl.xml | 17 +++++++++++------ wsdl/ver10/recording.wsdl | 5 +++++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/doc/Core.xml b/doc/Core.xml index 83800102a..7dba3a777 100644 --- a/doc/Core.xml +++ b/doc/Core.xml @@ -6587,14 +6587,15 @@ onvif://www.onvif.org/name/ARV-453 - - - + + + - - - + + + + ]]> diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 78dbab13a..7a2658bdc 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1745,15 +1745,18 @@ Change Request 2061, 2063, 2065, 2109 Request an export of the selected time range from existing locally recorded data. As such an operation could take longer, this method immediately returns an operation token. The device shall emit events as defined in section 8.9.7 Asynchronous Operation Status of the - ONVIF Core specification. The Initialized event shall be emitted when returning the - operation token. Progress updates shall be sent to inform clients about the progress of the + ONVIF Core specification. The device shall include the Alias parameter in the event if provided in the request. + The Initialized event shall be emitted when returning the operation token. + Progress updates shall be sent to inform clients about the progress of the export. Finally a Deleted event shall be emitted to signal completion or aborting of the operation when e.g. StopExportRecordedSegments has been executed. A device signaling support for SegmentExport shall support this function. - The StoragePath shall be the path as defined in the Object Storage annex appended to the - StorageUri from the StorageConfiguration. By default the segments are exported to the storage that is - configured for the recording. When the parameter StorageToken is provided this target will - be used. + An event shall be raised for each segment being uploaded to the Object Storage, which means the + ArrayOfFileProgress shall have only a single element each time. The FileProgress element shall have the FileName + element be the path as defined in the Object Storage annex appended to the + StorageUri from the StorageConfiguration. + By default the segments are exported to the storage that is configured for the recording. + When the parameter StorageToken is provided this target will be used. Note that a client may subscribe to tns1:Monitoring/AsynchronousOperationStatus for enumeration and monitoring of active and queued exports. @@ -1762,6 +1765,8 @@ Change Request 2061, 2063, 2065, 2109 Time [tt:DateTimeRange] RecordingToken [tt:RecordingReference] + Alias - optional [xs:string] + If provided, shall be included in the Monitoring/AsynchronousOperationStatus event. StorageToken - optional [tt:ReferenceToken] If provided, overrides the Target's storage configuration. Track - optional [tt:TrackType] diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 9932a473b..7e104da60 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -731,6 +731,11 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO The recording configuration token. + + + An optional alias that shall be included in the Monitoring/AsynchronousOperationStatus event. + + If provided, overrides the Target's storage configuration. From 834126af7f032e318c3169e090dfd11b93d57120 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 5 Jun 2025 05:21:34 -0400 Subject: [PATCH 37/50] Remove GetExportRecordedSegmentsState --- doc/RecordingControl.xml | 42 --------------------- wsdl/ver10/recording.wsdl | 79 +-------------------------------------- 2 files changed, 1 insertion(+), 120 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 78dbab13a..b0ff18f48 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1793,48 +1793,6 @@ Change Request 2061, 2063, 2065, 2109
-
- GetExportRecordedSegmentState - Lists individual segments of an ongoing ExportRecordedSegments operation. A device - signaling support for SegmentExport shall support this function. - A device shall support retrieving information while an export is progressing or within - 10 seconds after its regular completion. - - - request - - OperationToken [tt:ReferenceToken] - StartTime [xs:dateTime] - The start index for the segment results. - MaxResults - optional [xs:int] - The maximum number of segment results to be provided in the response. - - - - response - - Segment - optional, unbounded [trc:UploadSegmentResult] - HasMoreSegments [xs:boolean] - A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. - - - - faults - - env:Sender - ter:InvalidArgVal - ter:NoOperation - The referenced operation does not exist. - env:Sender - ter:InvalidArgVal - ter:BadDuration - The value of the time parameter is invalid. - - - - access class - - READ_MEDIA - - - -
StopExportRecordedSegments Stops the selected ExportRecordedSegments operation. A device signaling support for diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 9932a473b..11ee1c874 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -755,32 +755,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - Same precision as defined in the Recording Control specification for segment objects. - - - - - As defined in RFC 6381 including section 3 Codecs. - - - - - See trc:UploadStatus for allowed values. - - - - - - + @@ -798,58 +773,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - Information about the segment(s) to be exported. - - - - - A value indicating that the export has reached the maximum count and a new request must be sent to query the export state of further segments. - - - - - - - - - - - - - - - - - - - Unique ExportRecordedSegment operation token - - - - - The start index for the segment results. - - - - - The maximum number of segment results to be provided in the response. - - - - - - - - - - - - - From a37357c0226999ae5479f98f24699c93a8662191 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 5 Jun 2025 05:24:45 -0400 Subject: [PATCH 38/50] Reword when the event is being raised --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 7a2658bdc..940758e90 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1751,7 +1751,7 @@ Change Request 2061, 2063, 2065, 2109 export. Finally a Deleted event shall be emitted to signal completion or aborting of the operation when e.g. StopExportRecordedSegments has been executed. A device signaling support for SegmentExport shall support this function. - An event shall be raised for each segment being uploaded to the Object Storage, which means the + An event shall be raised after each segment is uploaded to the Object Storage, which means the ArrayOfFileProgress shall have only a single element each time. The FileProgress element shall have the FileName element be the path as defined in the Object Storage annex appended to the StorageUri from the StorageConfiguration. From e78d3cb4e9edbc49be55756c15d059bf6116a0fb Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 5 Jun 2025 05:30:33 -0400 Subject: [PATCH 39/50] Add any element --- wsdl/ver10/recording.wsdl | 1 + 1 file changed, 1 insertion(+) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 9932a473b..71fd4f71f 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -741,6 +741,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO An optional track filter for segments to export when in CMAF. For valid definitions see tt:TrackType. + From af89896ad0cbdd05a1307e9b12c9ab8c8de926cb Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 5 Jun 2025 05:31:14 -0400 Subject: [PATCH 40/50] Fix typo --- wsdl/ver10/recording.wsdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index 7e104da60..b40c67135 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -733,7 +733,7 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - An optional alias that shall be included in the Monitoring/AsynchronousOperationStatus event. + An optional alias that shall be included in the Monitoring/AsynchronousOperationStatus events. From f7bd8cb65bba887392d253496546a023ad4c13b7 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Fri, 13 Jun 2025 16:18:36 -0400 Subject: [PATCH 41/50] Change Alias to SimpleItem --- doc/Core.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Core.xml b/doc/Core.xml index 7dba3a777..ade08a2ac 100644 --- a/doc/Core.xml +++ b/doc/Core.xml @@ -6595,7 +6595,7 @@ onvif://www.onvif.org/name/ARV-453 - + ]]> From 0ec54a6e5db5c8db593b1e5a2bfe122e06e2dd25 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Tue, 12 Aug 2025 15:28:13 -0400 Subject: [PATCH 42/50] Clarify wording for ExportRecordedSegments --- doc/RecordingControl.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 65db4f44a..24cd8e5cb 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -1742,18 +1742,19 @@ Change Request 2061, 2063, 2065, 2109
ExportRecordedSegments - Request an export of the selected time range from existing locally recorded data. As - such an operation could take longer, this method immediately returns an operation token. The + Request an export for the specified time range from existing locally recorded data. As + such an operation can take long time, this method immediately returns an operation token. The device shall emit events as defined in section 8.9.7 Asynchronous Operation Status of the - ONVIF Core specification. The device shall include the Alias parameter in the event if provided in the request. + ONVIF Core specification. The device shall include the Alias parameter in the event if + provided in the request. The Initialized event shall be emitted when returning the operation token. Progress updates shall be sent to inform clients about the progress of the export. Finally a Deleted event shall be emitted to signal completion or aborting of the - operation when e.g. StopExportRecordedSegments has been executed. A device signaling support - for SegmentExport shall support this function. + operation when StopExportRecordedSegments has been executed. + A device signaling support for SegmentExport shall support this function. An event shall be raised after each segment is uploaded to the Object Storage, which means the - ArrayOfFileProgress shall have only a single element each time. The FileProgress element shall have the FileName - element be the path as defined in the Object Storage annex appended to the + ArrayOfFileProgress shall have only a single element each time. The FileProgress element shall + have the FileName element be the path as defined in the Object Storage annex appended to the StorageUri from the StorageConfiguration. By default the segments are exported to the storage that is configured for the recording. When the parameter StorageToken is provided this target will be used. From f92f02a115ff5271481551952297c09d444097ff Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Wed, 24 Sep 2025 10:21:04 -0400 Subject: [PATCH 43/50] Finish clean up of wsdl for stuff related to GetExportRecordedSegmentState --- wsdl/ver10/recording.wsdl | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/wsdl/ver10/recording.wsdl b/wsdl/ver10/recording.wsdl index f9790c84f..614d470c3 100644 --- a/wsdl/ver10/recording.wsdl +++ b/wsdl/ver10/recording.wsdl @@ -989,12 +989,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - - @@ -1163,13 +1157,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - Retrieves the status of selected ExportRecordedSegments operation. - - - - Exports the selected recordings (from existing recorded data) to the given storage target based on the requested file format. @@ -1428,15 +1415,6 @@ IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FO - - - - - - - - - From 97d6d8279d46f6f495af3f9ae8d88669b8436c53 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 12:31:13 -0400 Subject: [PATCH 44/50] Update revision history --- doc/RecordingControl.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 24cd8e5cb..adef910c8 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -179,6 +179,15 @@ Change Request 2061, 2063, 2065, 2109 Clarify delete interfaces for object storage. + + 25.12 + Dec-2025 + + Jean-Francois Levesque + Jose Melancon + + Add support for listing and export of segments to an Object Storage. + From eff0940ead54a47b9015cd2b86531391a12cd683 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 13:34:37 -0400 Subject: [PATCH 45/50] Add Fault if StorageStrategy is not supported --- doc/RecordingControl.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index adef910c8..72f6aa58a 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -789,6 +789,8 @@ Change Request 2061, 2063, 2065, 2109 The RecordingToken does not reference an existing recording. env:Receiver - ter:Action - ter:NoLocalRecording Local recording not possible due to e.g. missing medium. + env:Receiver - ter:Action - ter:UnsupportedStorageStrategy + Storage strategy not supported. From 5cb71afe0eb14f3a8769abbc964b81040ccde5d2 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 13:35:00 -0400 Subject: [PATCH 46/50] Clarified StorageStrategy usage --- doc/RecordingControl.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 72f6aa58a..29c91c577 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2539,7 +2539,7 @@ secfrac = "." 1*6DIGIT Overview This annex describes the requirements for recording and exporting media streams in a cloud-friendly format. - Device will need to record on their local storage when a RecordingTargetConfiguration has its strategy set to "Local" or "Both". + Device will need to record on their local storage when a StorageStrategy has been set to "Local" or "Both". While the device can record locally using any format, segments can be queried at any time and the resulting list of segments MUST be stable. "Stable" here is defined in the sense that each frame will always be part of the same segment and the available segments are immutable. @@ -2555,13 +2555,15 @@ secfrac = "." 1*6DIGIT
Recording segments - There are three possible recording strategies as defined for RecordingTargetConfiguration: + There are three possible recording StorageStrategy defined for RecordingTargetConfiguration: - Cloud (default) + External - The device will automatically upload each recorded segment to the Cloud location as soon as possible. After completion or on error the data won't be kept locally on the device. + The device will automatically upload each recorded segment to the Cloud location as soon as possible. + After completion or on error the data won't be kept locally on the device. + This is the default value if none has been set. From e3a3e752ac69a313949987adf031e34621e99d84 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 13:35:16 -0400 Subject: [PATCH 47/50] Add clarification for segment inclusion based on time range --- doc/RecordingControl.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 29c91c577..cc31ee34f 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2599,6 +2599,7 @@ secfrac = "." 1*6DIGIT The ListRecordedSegments command lists the segments currently available for export from the device local storage. For a given time range, this command shall always return the same segments with two exceptions: the newly recorded segments are added as they become available, and the deleted segments are removed from it (for example if the device had to delete them to make room for the new ones). + The results shall include segments that cover the requested time range entirely, even if they start before or end after the requested time range. The ExportRecordedSegments command requests an export operation for a time-range of segments. A device shall accept multiple request but may queue and process From 49f72ab390b4020bbe6d5f48cf895dd616c569b3 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 13:35:46 -0400 Subject: [PATCH 48/50] Clean up leftover mentions for stuff that were dropped --- doc/RecordingControl.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index cc31ee34f..9611404d7 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2604,12 +2604,9 @@ secfrac = "." 1*6DIGIT The ExportRecordedSegments command requests an export operation for a time-range of segments. A device shall accept multiple request but may queue and process them sequentially. Segments shall be uploaded in chronological order. Progress can be - tracked via the AsynchronousOperationStatus event and the method - GetExportRecordedSegmentState. Operations can be cancelled at any time + tracked via the AsynchronousOperationStatus event. Operations can be cancelled at any time with StopExportRecordedSegments. The segment names shall follow , with counter starting at - zero for the first segment of each export operation, unless the OmitSequenceNumber is set to - True. + linkend="_refCloudRecordingSegmentObjects"/>. Note: it is possible that the segments listed with ListRecordedSegments are not exactly the ones exported with ExportRecordedSegments as some segments could be deleted/added in-between the two commands being executed. From 3fe8f7d951a10a929a655764caeaf1388f691157 Mon Sep 17 00:00:00 2001 From: Jean-Francois Levesque Date: Thu, 2 Oct 2025 13:39:48 -0400 Subject: [PATCH 49/50] Replace must by shall --- doc/RecordingControl.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 9611404d7..ab707d31d 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -560,7 +560,7 @@ Change Request 2061, 2063, 2065, 2109 SourceTag: If the received RTSP stream contains multiple tracks of the same type, the SourceTag differentiates between those Tracks. - Destination: The destination is the track token of the track to which the device shall store the received data. All tracks must belong to the recording identified by the RecordingToken. + Destination: The destination is the track token of the track to which the device shall store the received data. All tracks shall belong to the recording identified by the RecordingToken. The TrackInformation field for a Track holds a single Source. In case multiple RecordingJobs with differing Source are recording to the same Track it is undefined which of them is reported in the corresponding TrackInformation of the the RecordingSearch API.
@@ -2123,7 +2123,7 @@ SetRecordingJobMode(JobToken, Active) the open segment of this span and open a new segment for this span. When closing the open segment of a span and opening a new segment for this span, there shall be no time gap between the two segments. Note that the actual segment duration may vary and can be plus or - minus one GOP size from the configured duration because a segment must start with an I-Frame. + minus one GOP size from the configured duration because a segment shall start with an I-Frame. The device shall generate each segment as a fragmented MP4 file according to ISO/IEC 14496-12, the ISO base media file format. A segment shall contain recorded media for the time it was open. @@ -2540,11 +2540,11 @@ secfrac = "." 1*6DIGIT This annex describes the requirements for recording and exporting media streams in a cloud-friendly format. Device will need to record on their local storage when a StorageStrategy has been set to "Local" or "Both". - While the device can record locally using any format, segments can be queried at any time and the resulting list of segments MUST be stable. + While the device can record locally using any format, segments can be queried at any time and the resulting list of segments shall be stable. "Stable" here is defined in the sense that each frame will always be part of the same segment and the available segments are immutable. - Specific recorded segments can then be exported to the cloud on request and each exported segment MUST yield the same result (a CMAF or MP4 file + Specific recorded segments can then be exported to the cloud on request and each exported segment shall yield the same result (a CMAF or MP4 file containing all its frames) on a successful export operation. @@ -2615,9 +2615,9 @@ secfrac = "." 1*6DIGIT
Segment stability - Segment stability is essential for this feature: each frame must be part of exactly one segment and each segment must always be immutable in time. - Additionnally, each segment must start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary - format, so the segments won't exist until exported to the cloud storage. Since the device must be able to list them beforehand, we suggest a simple + Segment stability is essential for this feature: each frame shall be part of exactly one segment and each segment shall always be immutable in time. + Additionally, each segment shall start with a keyframe to make it independent from the previous one. Some devices may record frames in a proprietary + format, so the segments won't exist until exported to the cloud storage. Since the device shall be able to list them beforehand, we suggest a simple algorithm to determine how many segments will be in each time range and which frames will be part of them. From 4fdd4217b236e7b1dbc32dfe1c3757185f8e98ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M=C3=A9lan=C3=A7on?= Date: Tue, 21 Oct 2025 16:37:36 -0400 Subject: [PATCH 50/50] Fix document --- doc/RecordingControl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RecordingControl.xml b/doc/RecordingControl.xml index 8aed49539..e3e10304a 100644 --- a/doc/RecordingControl.xml +++ b/doc/RecordingControl.xml @@ -2135,7 +2135,7 @@ SetRecordingJobMode(JobToken, Active) the open segment of this span and open a new segment for this span. When closing the open segment of a span and opening a new segment for this span, there shall be no time gap between the two segments. Note that the actual segment duration may vary and can be plus or - minus one GOP size from the configured duration because a segment must start with an I-Frame. + minus one GOP size from the configured duration because a segment shall start with an I-Frame. Depending on resource constraints, the device may close the segment earlier than the configured SegmentDuration if the requested length cannot be achieved. This might happen, for example, if the device runs out of available memory to generate