Skip to content

Commit ba90c6a

Browse files
committed
enable TWCC sender/receiver as default
1 parent dd901b2 commit ba90c6a

File tree

5 files changed

+69
-21
lines changed

5 files changed

+69
-21
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ srtp = { package = "webrtc-srtp", version = "0.8.3" }
2525
sctp = { package = "webrtc-sctp", version = "0.4.1" }
2626
data = { package = "webrtc-data", version = "0.3.1" }
2727
media = { package = "webrtc-media", version = "0.4.1" }
28-
interceptor = "0.6.4"
28+
interceptor = "0.7.0"
2929
tokio = { version = "1.12.0", features = ["full"] }
3030
log = "0.4.14"
3131
async-trait = "0.1.42"

src/api/interceptor_registry/mod.rs

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use crate::rtp_transceiver::{rtp_codec::RTPCodecType, RTCPFeedback, TYPE_RTCP_FB
99
use interceptor::nack::{generator::Generator, responder::Responder};
1010
use interceptor::registry::Registry;
1111
use interceptor::report::{receiver::ReceiverReport, sender::SenderReport};
12-
use interceptor::twcc::header_extension::HeaderExtension;
13-
use interceptor::twcc::sender::Sender;
12+
use interceptor::twcc::{receiver::Receiver, sender::Sender};
1413

1514
/// register_default_interceptors will register some useful interceptors.
1615
/// If you want to customize which interceptors are loaded, you should copy the
@@ -23,10 +22,7 @@ pub async fn register_default_interceptors(
2322

2423
registry = configure_rtcp_reports(registry);
2524

26-
//TODO: temporarily disable twcc until all reference cycle memory leak fixed
27-
// current when configure_twcc_sender, audio + video cause corrupted audio
28-
// https://github.com/webrtc-rs/webrtc/issues/129
29-
// registry = configure_twcc_sender(registry, media_engine).await?;
25+
registry = configure_twcc(registry, media_engine).await?;
3026

3127
Ok(registry)
3228
}
@@ -42,9 +38,6 @@ pub fn configure_rtcp_reports(mut registry: Registry) -> Registry {
4238

4339
/// configure_nack will setup everything necessary for handling generating/responding to nack messages.
4440
pub fn configure_nack(mut registry: Registry, media_engine: &mut MediaEngine) -> Registry {
45-
let generator = Box::new(Generator::builder());
46-
let responder = Box::new(Responder::builder());
47-
4841
media_engine.register_feedback(
4942
RTCPFeedback {
5043
typ: "nack".to_owned(),
@@ -60,17 +53,26 @@ pub fn configure_nack(mut registry: Registry, media_engine: &mut MediaEngine) ->
6053
RTPCodecType::Video,
6154
);
6255

56+
let generator = Box::new(Generator::builder());
57+
let responder = Box::new(Responder::builder());
6358
registry.add(responder);
6459
registry.add(generator);
6560
registry
6661
}
6762

68-
/// configure_twcc_header_extension_sender will setup everything necessary for adding
69-
/// a TWCC header extension to outgoing RTP packets. This will allow the remote peer to generate TWCC reports.
70-
pub async fn configure_twcc_header_extension_sender(
63+
/// configure_twcc will setup everything necessary for adding
64+
/// a TWCC header extension to outgoing RTP packets and generating TWCC reports.
65+
pub async fn configure_twcc(
7166
mut registry: Registry,
7267
media_engine: &mut MediaEngine,
7368
) -> Result<Registry> {
69+
media_engine.register_feedback(
70+
RTCPFeedback {
71+
typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
72+
..Default::default()
73+
},
74+
RTPCodecType::Video,
75+
);
7476
media_engine
7577
.register_header_extension(
7678
RTCRtpHeaderExtensionCapability {
@@ -81,6 +83,13 @@ pub async fn configure_twcc_header_extension_sender(
8183
)
8284
.await?;
8385

86+
media_engine.register_feedback(
87+
RTCPFeedback {
88+
typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
89+
..Default::default()
90+
},
91+
RTPCodecType::Audio,
92+
);
8493
media_engine
8594
.register_header_extension(
8695
RTCRtpHeaderExtensionCapability {
@@ -91,14 +100,46 @@ pub async fn configure_twcc_header_extension_sender(
91100
)
92101
.await?;
93102

94-
let header_extension = Box::new(HeaderExtension::builder());
103+
let sender = Box::new(Sender::builder());
104+
let receiver = Box::new(Receiver::builder());
105+
registry.add(sender);
106+
registry.add(receiver);
107+
Ok(registry)
108+
}
109+
110+
/// configure_twcc_sender will setup everything necessary for adding
111+
/// a TWCC header extension to outgoing RTP packets. This will allow the remote peer to generate TWCC reports.
112+
pub async fn configure_twcc_sender_only(
113+
mut registry: Registry,
114+
media_engine: &mut MediaEngine,
115+
) -> Result<Registry> {
116+
media_engine
117+
.register_header_extension(
118+
RTCRtpHeaderExtensionCapability {
119+
uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
120+
},
121+
RTPCodecType::Video,
122+
vec![],
123+
)
124+
.await?;
125+
126+
media_engine
127+
.register_header_extension(
128+
RTCRtpHeaderExtensionCapability {
129+
uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
130+
},
131+
RTPCodecType::Audio,
132+
vec![],
133+
)
134+
.await?;
95135

96-
registry.add(header_extension);
136+
let sender = Box::new(Sender::builder());
137+
registry.add(sender);
97138
Ok(registry)
98139
}
99140

100-
/// configure_twcc_sender will setup everything necessary for generating TWCC reports.
101-
pub async fn configure_twcc_sender(
141+
/// configure_twcc_receiver will setup everything necessary for generating TWCC reports.
142+
pub async fn configure_twcc_receiver_only(
102143
mut registry: Registry,
103144
media_engine: &mut MediaEngine,
104145
) -> Result<Registry> {
@@ -136,7 +177,7 @@ pub async fn configure_twcc_sender(
136177
)
137178
.await?;
138179

139-
let sender = Box::new(Sender::builder());
140-
registry.add(sender);
180+
let receiver = Box::new(Receiver::builder());
181+
registry.add(receiver);
141182
Ok(registry)
142183
}

src/rtp_transceiver/rtp_receiver/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,13 @@ impl RTPReceiverInternal {
136136

137137
//log::debug!("read_rtp enter tracks tid {}", tid);
138138
let mut rtp_interceptor = None;
139+
//let mut ssrc = 0;
139140
{
140141
let tracks = self.tracks.lock().await;
141142
for t in &*tracks {
142143
if t.track.tid() == tid {
143144
rtp_interceptor = t.stream.rtp_interceptor.clone();
145+
//ssrc = t.track.ssrc();
144146
break;
145147
}
146148
}
@@ -153,6 +155,10 @@ impl RTPReceiverInternal {
153155

154156
if let Some(rtp_interceptor) = rtp_interceptor {
155157
let a = Attributes::new();
158+
//println!(
159+
// "read_rtp rtp_interceptor.read enter with tid {} ssrc {}",
160+
// tid, ssrc
161+
//);
156162
tokio::select! {
157163
_ = self.closed_rx.notified() => {
158164
Err(Error::ErrClosedPipe)
@@ -609,6 +615,7 @@ impl RTCRtpReceiver {
609615
let mut b = vec![0u8; receive_mtu];
610616
while let Some(repair_rtp_interceptor) = &track.repair_stream.rtp_interceptor {
611617
//TODO: cancel repair_rtp_interceptor.read gracefully
618+
//println!("repair_rtp_interceptor read begin with ssrc={}", ssrc);
612619
if repair_rtp_interceptor.read(&mut b, &a).await.is_err() {
613620
break;
614621
}

0 commit comments

Comments
 (0)