Skip to content

Commit 0e47155

Browse files
authored
EndPoint field update for WebRTCProvider cluster commands (#38016)
* Add EndpointID field in SolicitOffer and ProvideOffer commands WebRTCProvider cluster XML. XML change for Spec update. Allows for asynchronous WebRTC commands from Camera to controller. * Zap-regen changes.
1 parent 09dd3ac commit 0e47155

26 files changed

+350
-156
lines changed

examples/camera-app/camera-common/camera-app.matter

+17-14
Original file line numberDiff line numberDiff line change
@@ -2444,10 +2444,11 @@ provisional cluster WebRTCTransportProvider = 1363 {
24442444
fabric_scoped struct WebRTCSessionStruct {
24452445
int16u id = 1;
24462446
node_id peerNodeID = 2;
2447-
StreamUsageEnum streamUsage = 3;
2448-
nullable int16u videoStreamID = 4;
2449-
nullable int16u audioStreamID = 5;
2450-
WebRTCMetadataOptionsBitmap metadataOptions = 6;
2447+
endpoint_no peerEndpointID = 3;
2448+
StreamUsageEnum streamUsage = 4;
2449+
nullable int16u videoStreamID = 5;
2450+
nullable int16u audioStreamID = 6;
2451+
WebRTCMetadataOptionsBitmap metadataOptions = 7;
24512452
fabric_idx fabricIndex = 254;
24522453
}
24532454

@@ -2461,11 +2462,12 @@ provisional cluster WebRTCTransportProvider = 1363 {
24612462

24622463
request struct SolicitOfferRequest {
24632464
StreamUsageEnum streamUsage = 0;
2464-
optional nullable int16u videoStreamID = 1;
2465-
optional nullable int16u audioStreamID = 2;
2466-
optional ICEServerStruct ICEServers[] = 3;
2467-
optional char_string ICETransportPolicy = 4;
2468-
optional WebRTCMetadataOptionsBitmap metadataOptions = 5;
2465+
endpoint_no originatingEndpointID = 1;
2466+
optional nullable int16u videoStreamID = 2;
2467+
optional nullable int16u audioStreamID = 3;
2468+
optional ICEServerStruct ICEServers[] = 4;
2469+
optional char_string ICETransportPolicy = 5;
2470+
optional WebRTCMetadataOptionsBitmap metadataOptions = 6;
24692471
}
24702472

24712473
response struct SolicitOfferResponse = 2 {
@@ -2479,11 +2481,12 @@ provisional cluster WebRTCTransportProvider = 1363 {
24792481
nullable int16u webRTCSessionID = 0;
24802482
char_string sdp = 1;
24812483
StreamUsageEnum streamUsage = 2;
2482-
optional nullable int16u videoStreamID = 3;
2483-
optional nullable int16u audioStreamID = 4;
2484-
optional ICEServerStruct ICEServers[] = 5;
2485-
optional char_string ICETransportPolicy = 6;
2486-
optional WebRTCMetadataOptionsBitmap metadataOptions = 7;
2484+
endpoint_no originatingEndpointID = 3;
2485+
optional nullable int16u videoStreamID = 4;
2486+
optional nullable int16u audioStreamID = 5;
2487+
optional ICEServerStruct ICEServers[] = 6;
2488+
optional char_string ICETransportPolicy = 7;
2489+
optional WebRTCMetadataOptionsBitmap metadataOptions = 8;
24872490
}
24882491

24892492
response struct ProvideOfferResponse = 4 {

src/app/zap-templates/zcl/data-model/chip/webrtc-provider-cluster.xml

+18-15
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ limitations under the License.
1818
XML generated by Alchemy; DO NOT EDIT.
1919
Source: src/app_clusters/WebRTC_Provider.adoc
2020
Parameters: in-progress
21-
Git: 0.7-summer-2025-285-g2a2bd1961
21+
Git: 0.7-summer-2025-557-g3a1482e70
2222
-->
2323
<configurator xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../zcl.xsd">
2424
<domain name="Cameras"/>
@@ -59,10 +59,11 @@ Git: 0.7-summer-2025-285-g2a2bd1961
5959
<cluster code="0x0554"/>
6060
<item fieldId="1" name="ID" type="int16u"/>
6161
<item fieldId="2" name="PeerNodeID" type="node_id"/>
62-
<item fieldId="3" name="StreamUsage" type="StreamUsageEnum" min="0x00" max="0x03"/>
63-
<item fieldId="4" name="VideoStreamID" type="int16u" isNullable="true"/>
64-
<item fieldId="5" name="AudioStreamID" type="int16u" isNullable="true"/>
65-
<item fieldId="6" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" default="0x00" min="0x00" max="0x01"/>
62+
<item fieldId="3" name="PeerEndpointID" type="endpoint_no"/>
63+
<item fieldId="4" name="StreamUsage" type="StreamUsageEnum" min="0x00" max="0x03"/>
64+
<item fieldId="5" name="VideoStreamID" type="int16u" isNullable="true"/>
65+
<item fieldId="6" name="AudioStreamID" type="int16u" isNullable="true"/>
66+
<item fieldId="7" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" default="0x00" min="0x00" max="0x01"/>
6667
</struct>
6768

6869
<cluster apiMaturity="provisional">
@@ -82,11 +83,12 @@ Git: 0.7-summer-2025-285-g2a2bd1961
8283
<description>Requests that the Provider initiates a new session with the Offer / Answer flow in a way that allows for options to be passed and work with devices needing the standby flow.</description>
8384
<quality largeMessage="true"/>
8485
<arg id="1" name="StreamUsage" type="StreamUsageEnum" min="0x00" max="0x03"/>
85-
<arg id="2" name="VideoStreamID" type="int16u" optional="true" isNullable="true"/>
86-
<arg id="3" name="AudioStreamID" type="int16u" optional="true" isNullable="true"/>
87-
<arg id="4" name="ICEServers" array="true" type="ICEServerStruct" optional="true"/>
88-
<arg id="5" name="ICETransportPolicy" type="char_string" optional="true"/>
89-
<arg id="6" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" optional="true" min="0x00" max="0x01"/>
86+
<arg id="2" name="OriginatingEndpointID" type="endpoint_no"/>
87+
<arg id="3" name="VideoStreamID" type="int16u" optional="true" isNullable="true"/>
88+
<arg id="4" name="AudioStreamID" type="int16u" optional="true" isNullable="true"/>
89+
<arg id="5" name="ICEServers" type="ICEServerStruct" optional="true" array="true"/>
90+
<arg id="6" name="ICETransportPolicy" type="char_string" optional="true"/>
91+
<arg id="7" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" optional="true" min="0x00" max="0x01"/>
9092
</command>
9193

9294
<command code="0x02" source="server" name="SolicitOfferResponse" optional="false" disableDefaultResponse="true">
@@ -104,11 +106,12 @@ Git: 0.7-summer-2025-285-g2a2bd1961
104106
<arg id="1" name="WebRTCSessionID" type="int16u" isNullable="true"/>
105107
<arg id="2" name="SDP" type="char_string"/>
106108
<arg id="3" name="StreamUsage" type="StreamUsageEnum" min="0x00" max="0x03"/>
107-
<arg id="4" name="VideoStreamID" type="int16u" optional="true" isNullable="true"/>
108-
<arg id="5" name="AudioStreamID" type="int16u" optional="true" isNullable="true"/>
109-
<arg id="6" name="ICEServers" array="true" type="ICEServerStruct" optional="true"/>
110-
<arg id="7" name="ICETransportPolicy" type="char_string" optional="true"/>
111-
<arg id="8" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" optional="true" min="0x00" max="0x01"/>
109+
<arg id="4" name="OriginatingEndpointID" type="endpoint_no"/>
110+
<arg id="5" name="VideoStreamID" type="int16u" optional="true" isNullable="true"/>
111+
<arg id="6" name="AudioStreamID" type="int16u" optional="true" isNullable="true"/>
112+
<arg id="7" name="ICEServers" type="ICEServerStruct" optional="true" array="true"/>
113+
<arg id="8" name="ICETransportPolicy" type="char_string" optional="true"/>
114+
<arg id="9" name="MetadataOptions" type="WebRTCMetadataOptionsBitmap" optional="true" min="0x00" max="0x01"/>
112115
</command>
113116

114117
<command code="0x04" source="server" name="ProvideOfferResponse" optional="false" disableDefaultResponse="true">

src/controller/data_model/controller-clusters.matter

+22-18
Original file line numberDiff line numberDiff line change
@@ -10117,10 +10117,11 @@ provisional cluster WebRTCTransportProvider = 1363 {
1011710117
fabric_scoped struct WebRTCSessionStruct {
1011810118
int16u id = 1;
1011910119
node_id peerNodeID = 2;
10120-
StreamUsageEnum streamUsage = 3;
10121-
nullable int16u videoStreamID = 4;
10122-
nullable int16u audioStreamID = 5;
10123-
WebRTCMetadataOptionsBitmap metadataOptions = 6;
10120+
endpoint_no peerEndpointID = 3;
10121+
StreamUsageEnum streamUsage = 4;
10122+
nullable int16u videoStreamID = 5;
10123+
nullable int16u audioStreamID = 6;
10124+
WebRTCMetadataOptionsBitmap metadataOptions = 7;
1012410125
fabric_idx fabricIndex = 254;
1012510126
}
1012610127

@@ -10134,11 +10135,12 @@ provisional cluster WebRTCTransportProvider = 1363 {
1013410135

1013510136
request struct SolicitOfferRequest {
1013610137
StreamUsageEnum streamUsage = 0;
10137-
optional nullable int16u videoStreamID = 1;
10138-
optional nullable int16u audioStreamID = 2;
10139-
optional ICEServerStruct ICEServers[] = 3;
10140-
optional char_string ICETransportPolicy = 4;
10141-
optional WebRTCMetadataOptionsBitmap metadataOptions = 5;
10138+
endpoint_no originatingEndpointID = 1;
10139+
optional nullable int16u videoStreamID = 2;
10140+
optional nullable int16u audioStreamID = 3;
10141+
optional ICEServerStruct ICEServers[] = 4;
10142+
optional char_string ICETransportPolicy = 5;
10143+
optional WebRTCMetadataOptionsBitmap metadataOptions = 6;
1014210144
}
1014310145

1014410146
response struct SolicitOfferResponse = 2 {
@@ -10152,11 +10154,12 @@ provisional cluster WebRTCTransportProvider = 1363 {
1015210154
nullable int16u webRTCSessionID = 0;
1015310155
char_string sdp = 1;
1015410156
StreamUsageEnum streamUsage = 2;
10155-
optional nullable int16u videoStreamID = 3;
10156-
optional nullable int16u audioStreamID = 4;
10157-
optional ICEServerStruct ICEServers[] = 5;
10158-
optional char_string ICETransportPolicy = 6;
10159-
optional WebRTCMetadataOptionsBitmap metadataOptions = 7;
10157+
endpoint_no originatingEndpointID = 3;
10158+
optional nullable int16u videoStreamID = 4;
10159+
optional nullable int16u audioStreamID = 5;
10160+
optional ICEServerStruct ICEServers[] = 6;
10161+
optional char_string ICETransportPolicy = 7;
10162+
optional WebRTCMetadataOptionsBitmap metadataOptions = 8;
1016010163
}
1016110164

1016210165
response struct ProvideOfferResponse = 4 {
@@ -10232,10 +10235,11 @@ provisional cluster WebRTCTransportRequestor = 1364 {
1023210235
fabric_scoped struct WebRTCSessionStruct {
1023310236
int16u id = 1;
1023410237
node_id peerNodeID = 2;
10235-
StreamUsageEnum streamUsage = 3;
10236-
nullable int16u videoStreamID = 4;
10237-
nullable int16u audioStreamID = 5;
10238-
WebRTCMetadataOptionsBitmap metadataOptions = 6;
10238+
endpoint_no peerEndpointID = 3;
10239+
StreamUsageEnum streamUsage = 4;
10240+
nullable int16u videoStreamID = 5;
10241+
nullable int16u audioStreamID = 6;
10242+
WebRTCMetadataOptionsBitmap metadataOptions = 7;
1023910243
fabric_idx fabricIndex = 254;
1024010244
}
1024110245

src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java

+24-16
Original file line numberDiff line numberDiff line change
@@ -62929,35 +62929,39 @@ public long initWithDevice(long devicePtr, int endpointId) {
6292962929
return 0L;
6293062930
}
6293162931

62932-
public void solicitOffer(SolicitOfferResponseCallback callback, Integer streamUsage, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions) {
62933-
solicitOffer(callback, streamUsage, videoStreamID, audioStreamID, ICEServers, ICETransportPolicy, metadataOptions, 0);
62932+
public void solicitOffer(SolicitOfferResponseCallback callback, Integer streamUsage, Integer originatingEndpointID, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions) {
62933+
solicitOffer(callback, streamUsage, originatingEndpointID, videoStreamID, audioStreamID, ICEServers, ICETransportPolicy, metadataOptions, 0);
6293462934
}
6293562935

62936-
public void solicitOffer(SolicitOfferResponseCallback callback, Integer streamUsage, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions, int timedInvokeTimeoutMs) {
62936+
public void solicitOffer(SolicitOfferResponseCallback callback, Integer streamUsage, Integer originatingEndpointID, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions, int timedInvokeTimeoutMs) {
6293762937
final long commandId = 1L;
6293862938

6293962939
ArrayList<StructElement> elements = new ArrayList<>();
6294062940
final long streamUsageFieldID = 0L;
6294162941
BaseTLVType streamUsagetlvValue = new UIntType(streamUsage);
6294262942
elements.add(new StructElement(streamUsageFieldID, streamUsagetlvValue));
6294362943

62944-
final long videoStreamIDFieldID = 1L;
62944+
final long originatingEndpointIDFieldID = 1L;
62945+
BaseTLVType originatingEndpointIDtlvValue = new UIntType(originatingEndpointID);
62946+
elements.add(new StructElement(originatingEndpointIDFieldID, originatingEndpointIDtlvValue));
62947+
62948+
final long videoStreamIDFieldID = 2L;
6294562949
BaseTLVType videoStreamIDtlvValue = videoStreamID != null ? videoStreamID.<BaseTLVType>map((nonOptionalvideoStreamID) -> new UIntType(nonOptionalvideoStreamID)).orElse(new EmptyType()) : new NullType();
6294662950
elements.add(new StructElement(videoStreamIDFieldID, videoStreamIDtlvValue));
6294762951

62948-
final long audioStreamIDFieldID = 2L;
62952+
final long audioStreamIDFieldID = 3L;
6294962953
BaseTLVType audioStreamIDtlvValue = audioStreamID != null ? audioStreamID.<BaseTLVType>map((nonOptionalaudioStreamID) -> new UIntType(nonOptionalaudioStreamID)).orElse(new EmptyType()) : new NullType();
6295062954
elements.add(new StructElement(audioStreamIDFieldID, audioStreamIDtlvValue));
6295162955

62952-
final long ICEServersFieldID = 3L;
62956+
final long ICEServersFieldID = 4L;
6295362957
BaseTLVType ICEServerstlvValue = ICEServers.<BaseTLVType>map((nonOptionalICEServers) -> ArrayType.generateArrayType(nonOptionalICEServers, (elementnonOptionalICEServers) -> elementnonOptionalICEServers.encodeTlv())).orElse(new EmptyType());
6295462958
elements.add(new StructElement(ICEServersFieldID, ICEServerstlvValue));
6295562959

62956-
final long ICETransportPolicyFieldID = 4L;
62960+
final long ICETransportPolicyFieldID = 5L;
6295762961
BaseTLVType ICETransportPolicytlvValue = ICETransportPolicy.<BaseTLVType>map((nonOptionalICETransportPolicy) -> new StringType(nonOptionalICETransportPolicy)).orElse(new EmptyType());
6295862962
elements.add(new StructElement(ICETransportPolicyFieldID, ICETransportPolicytlvValue));
6295962963

62960-
final long metadataOptionsFieldID = 5L;
62964+
final long metadataOptionsFieldID = 6L;
6296162965
BaseTLVType metadataOptionstlvValue = metadataOptions.<BaseTLVType>map((nonOptionalmetadataOptions) -> new UIntType(nonOptionalmetadataOptions)).orElse(new EmptyType());
6296262966
elements.add(new StructElement(metadataOptionsFieldID, metadataOptionstlvValue));
6296362967

@@ -63000,11 +63004,11 @@ public void onResponse(StructType invokeStructValue) {
6300063004
}}, commandId, commandArgs, timedInvokeTimeoutMs);
6300163005
}
6300263006

63003-
public void provideOffer(ProvideOfferResponseCallback callback, @Nullable Integer webRTCSessionID, String sdp, Integer streamUsage, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions) {
63004-
provideOffer(callback, webRTCSessionID, sdp, streamUsage, videoStreamID, audioStreamID, ICEServers, ICETransportPolicy, metadataOptions, 0);
63007+
public void provideOffer(ProvideOfferResponseCallback callback, @Nullable Integer webRTCSessionID, String sdp, Integer streamUsage, Integer originatingEndpointID, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions) {
63008+
provideOffer(callback, webRTCSessionID, sdp, streamUsage, originatingEndpointID, videoStreamID, audioStreamID, ICEServers, ICETransportPolicy, metadataOptions, 0);
6300563009
}
6300663010

63007-
public void provideOffer(ProvideOfferResponseCallback callback, @Nullable Integer webRTCSessionID, String sdp, Integer streamUsage, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions, int timedInvokeTimeoutMs) {
63011+
public void provideOffer(ProvideOfferResponseCallback callback, @Nullable Integer webRTCSessionID, String sdp, Integer streamUsage, Integer originatingEndpointID, @Nullable Optional<Integer> videoStreamID, @Nullable Optional<Integer> audioStreamID, Optional<ArrayList<ChipStructs.WebRTCTransportProviderClusterICEServerStruct>> ICEServers, Optional<String> ICETransportPolicy, Optional<Integer> metadataOptions, int timedInvokeTimeoutMs) {
6300863012
final long commandId = 3L;
6300963013

6301063014
ArrayList<StructElement> elements = new ArrayList<>();
@@ -63020,23 +63024,27 @@ public void provideOffer(ProvideOfferResponseCallback callback, @Nullable Intege
6302063024
BaseTLVType streamUsagetlvValue = new UIntType(streamUsage);
6302163025
elements.add(new StructElement(streamUsageFieldID, streamUsagetlvValue));
6302263026

63023-
final long videoStreamIDFieldID = 3L;
63027+
final long originatingEndpointIDFieldID = 3L;
63028+
BaseTLVType originatingEndpointIDtlvValue = new UIntType(originatingEndpointID);
63029+
elements.add(new StructElement(originatingEndpointIDFieldID, originatingEndpointIDtlvValue));
63030+
63031+
final long videoStreamIDFieldID = 4L;
6302463032
BaseTLVType videoStreamIDtlvValue = videoStreamID != null ? videoStreamID.<BaseTLVType>map((nonOptionalvideoStreamID) -> new UIntType(nonOptionalvideoStreamID)).orElse(new EmptyType()) : new NullType();
6302563033
elements.add(new StructElement(videoStreamIDFieldID, videoStreamIDtlvValue));
6302663034

63027-
final long audioStreamIDFieldID = 4L;
63035+
final long audioStreamIDFieldID = 5L;
6302863036
BaseTLVType audioStreamIDtlvValue = audioStreamID != null ? audioStreamID.<BaseTLVType>map((nonOptionalaudioStreamID) -> new UIntType(nonOptionalaudioStreamID)).orElse(new EmptyType()) : new NullType();
6302963037
elements.add(new StructElement(audioStreamIDFieldID, audioStreamIDtlvValue));
6303063038

63031-
final long ICEServersFieldID = 5L;
63039+
final long ICEServersFieldID = 6L;
6303263040
BaseTLVType ICEServerstlvValue = ICEServers.<BaseTLVType>map((nonOptionalICEServers) -> ArrayType.generateArrayType(nonOptionalICEServers, (elementnonOptionalICEServers) -> elementnonOptionalICEServers.encodeTlv())).orElse(new EmptyType());
6303363041
elements.add(new StructElement(ICEServersFieldID, ICEServerstlvValue));
6303463042

63035-
final long ICETransportPolicyFieldID = 6L;
63043+
final long ICETransportPolicyFieldID = 7L;
6303663044
BaseTLVType ICETransportPolicytlvValue = ICETransportPolicy.<BaseTLVType>map((nonOptionalICETransportPolicy) -> new StringType(nonOptionalICETransportPolicy)).orElse(new EmptyType());
6303763045
elements.add(new StructElement(ICETransportPolicyFieldID, ICETransportPolicytlvValue));
6303863046

63039-
final long metadataOptionsFieldID = 7L;
63047+
final long metadataOptionsFieldID = 8L;
6304063048
BaseTLVType metadataOptionstlvValue = metadataOptions.<BaseTLVType>map((nonOptionalmetadataOptions) -> new UIntType(nonOptionalmetadataOptions)).orElse(new EmptyType());
6304163049
elements.add(new StructElement(metadataOptionsFieldID, metadataOptionstlvValue));
6304263050

0 commit comments

Comments
 (0)