Skip to content

Commit 8d59b30

Browse files
committed
add RestartIce, RemoveTrack, GetSctp methods for RTCPeerConnection
1 parent 81319f0 commit 8d59b30

4 files changed

Lines changed: 88 additions & 13 deletions

File tree

python-webrtc/cpp/src/interfaces/rtc_peer_connection.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ namespace python_webrtc {
8181
.def("getTransceivers", &RTCPeerConnection::GetTransceivers)
8282
.def("getSenders", &RTCPeerConnection::GetSenders)
8383
.def("getReceivers", &RTCPeerConnection::GetReceivers)
84+
.def_property_readonly("sctp", &RTCPeerConnection::GetSctp)
85+
.def("restartIce", &RTCPeerConnection::RestartIce)
86+
.def("removeTrack", &RTCPeerConnection::RemoveTrack)
8487
.def("close", &RTCPeerConnection::Close);
8588
}
8689

@@ -285,6 +288,35 @@ namespace python_webrtc {
285288
return receivers;
286289
}
287290

291+
std::optional<RTCSctpTransport *> RTCPeerConnection::GetSctp() {
292+
if (_jinglePeerConnection && _jinglePeerConnection->GetSctpTransport()) {
293+
return RTCSctpTransport::holder()->GetOrCreate(_factory, _jinglePeerConnection->GetSctpTransport());
294+
}
295+
296+
return {};
297+
}
298+
299+
void RTCPeerConnection::RestartIce() {
300+
if (_jinglePeerConnection) {
301+
_jinglePeerConnection->RestartIce();
302+
}
303+
}
304+
305+
void RTCPeerConnection::RemoveTrack(RTCRtpSender &sender) {
306+
if (!_jinglePeerConnection) {
307+
throw PythonWebRTCException("Cannot remove track; RTCPeerConnection is closed");
308+
}
309+
310+
auto senders = _jinglePeerConnection->GetSenders();
311+
if (std::find(senders.begin(), senders.end(), sender.sender()) == senders.end()) {
312+
throw PythonWebRTCException("Cannot remove track because sender not found in senders of PeerConnection");
313+
}
314+
315+
if (!_jinglePeerConnection->RemoveTrack(sender.sender())) {
316+
throw PythonWebRTCException("Cannot remove track");
317+
}
318+
}
319+
288320
void RTCPeerConnection::Close() {
289321
if (_jinglePeerConnection) {
290322
_jinglePeerConnection->Close();

python-webrtc/cpp/src/interfaces/rtc_peer_connection.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "media_stream.h"
2121
#include "rtc_rtp_sender.h"
2222
#include "rtc_rtp_transceiver.h"
23+
#include "rtc_sctp_transport.h"
2324

2425
namespace webrtc {
2526
struct PeerConnectionDependencies;
@@ -65,6 +66,12 @@ namespace python_webrtc {
6566

6667
std::vector<RTCRtpReceiver *> GetReceivers();
6768

69+
std::optional<RTCSctpTransport *> GetSctp();
70+
71+
void RestartIce();
72+
73+
void RemoveTrack(RTCRtpSender &);
74+
6875
void SaveLastSdp(const RTCSessionDescriptionInit &lastSdp);
6976

7077
void Close();

python-webrtc/python/test.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,30 @@ async def main():
5959
# transport = sender.transport
6060
# transceivers = pc.get_transceivers()
6161

62-
params = webrtc.RtpEncodingParameters(
63-
max_bitrate=1234, max_framerate=20, rid="lolkek", scale_resolution_down_by=2.0
64-
)
65-
init = webrtc.RtpTransceiverInit(
66-
direction=webrtc.TransceiverDirection.recvonly, send_encodings=[params], streams=[stream]
67-
)
62+
# params = webrtc.RtpEncodingParameters(
63+
# max_bitrate=1234, max_framerate=20, rid="lolkek", scale_resolution_down_by=2.0
64+
# )
65+
# init = webrtc.RtpTransceiverInit(
66+
# direction=webrtc.TransceiverDirection.recvonly, send_encodings=[params], streams=[stream]
67+
# )
68+
#
69+
# transceiver = pc.add_transceiver(webrtc.MediaType.audio)
70+
# transceiver_with_params = pc.add_transceiver(webrtc.MediaType.audio, init)
71+
#
72+
# transceiver_by_track = pc.add_transceiver(stream.get_tracks()[0])
73+
# transceiver_by_track_with_params = pc.add_transceiver(stream.get_tracks()[0], init)
74+
#
75+
# local_sdp = await pc.create_offer()
76+
# await pc.set_local_description(local_sdp)
6877

69-
transceiver = pc.add_transceiver(webrtc.MediaType.audio)
70-
transceiver_with_params = pc.add_transceiver(webrtc.MediaType.audio, init)
78+
transceivers = pc.get_transceivers()
7179

72-
transceiver_by_track = pc.add_transceiver(stream.get_tracks()[0])
73-
transceiver_by_track_with_params = pc.add_transceiver(stream.get_tracks()[0], init)
80+
pc.restart_ice()
7481

75-
local_sdp = await pc.create_offer()
76-
await pc.set_local_description(local_sdp)
82+
sender = pc.add_track(stream.get_tracks()[0], stream)
83+
pc.remove_track(sender)
7784

78-
transceivers = pc.get_transceivers()
85+
print(pc.sctp)
7986

8087
idle()
8188

python-webrtc/python/webrtc/interfaces/rtc_peer_connection.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,35 @@ def get_receivers(self) -> List['webrtc.RTCRtpReceiver']:
185185

186186
return RTCRtpReceiver._wrap_many(self._native_obj.getReceivers())
187187

188+
def remove_track(self, sender: 'webrtc.RTCRtpSender') -> None:
189+
"""Tells the local end of the connection to stop sending media from the specified track, without
190+
actually removing the corresponding :obj:`webrtc.RTCRtpSender` from the list of senders as reported
191+
by :attr:`get_senders``. If the track is already stopped, or is not in the connection's senders list,
192+
this method has no effect."""
193+
return self._native_obj.removeTrack(sender._native_obj)
194+
195+
def restart_ice(self) -> None:
196+
"""Allows to easily request that ICE candidate gathering be redone on both ends of the connection.
197+
This simplifies the process by allowing the same method to be used by either the caller or the receiver
198+
to trigger an ICE restart."""
199+
return self._native_obj.restartIce()
200+
188201
def close(self):
189202
"""Closes the current peer connection."""
190203
return self._native_obj.close()
191204

205+
@property
206+
def sctp(self) -> Optional['webrtc.RTCSctpTransport']:
207+
""":obj:`webrtc.RTCSctpTransport`, optional: An object describing the SCTP transport layer over which SCTP
208+
data is being sent and received. If SCTP hasn't been negotiated, this value is :obj:`None`"""
209+
from webrtc import RTCSctpTransport
210+
211+
sctp = self._native_obj.sctp
212+
if sctp:
213+
return RTCSctpTransport._wrap(sctp)
214+
215+
return None
216+
192217
#: Alias for :attr:`create_offer`
193218
createOffer = create_offer
194219
#: Alias for :attr:`create_answer`
@@ -207,3 +232,7 @@ def close(self):
207232
getSenders = get_senders
208233
#: Alias for :attr:`get_receivers`
209234
getReceivers = get_receivers
235+
#: Alias for :attr:`remove_track`
236+
removeTrack = remove_track
237+
#: Alias for :attr:`restart_ice`
238+
restartIce = restart_ice

0 commit comments

Comments
 (0)