Skip to content

Commit a36ad99

Browse files
committed
disable twcc
1 parent d5186ac commit a36ad99

3 files changed

Lines changed: 48 additions & 29 deletions

File tree

media-video/h264/src/encoder/backends/openh264.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ impl OpenH264Encoder {
130130
openh264::encoder::FrameType::Invalid
131131
| openh264::encoder::FrameType::Skip
132132
| openh264::encoder::FrameType::IPMixed => {
133-
println!("Got invalid frame type: {:?}", bitstream.frame_type());
133+
log::warn!("Got invalid frame type: {:?}", bitstream.frame_type());
134134
return Ok(());
135135
}
136136
openh264::encoder::FrameType::IDR => {}

media/rtc/src/rtp_session/twcc.rs

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::{
2-
collections::VecDeque,
2+
collections::{BTreeMap, VecDeque},
33
time::{Duration, Instant},
44
};
55

@@ -28,7 +28,8 @@ pub(super) struct TwccTxState {
2828
next_sequence_number: u16,
2929

3030
/// List of all sent RTP packets with their planned send timestamp and payload size
31-
sent_packets: VecDeque<SentPacket>,
31+
// sent_packets: VecDeque<SentPacket>,
32+
sent_packets: BTreeMap<u16, SentPacket>,
3233
}
3334

3435
struct SentPacket {
@@ -50,20 +51,23 @@ impl TwccTxState {
5051
base_time: Instant::now(),
5152
last_feedback_count: None,
5253
next_sequence_number: 0,
53-
sent_packets: VecDeque::new(),
54+
sent_packets: BTreeMap::new(),
5455
}
5556
}
5657

5758
/// Add a packet which is about to be sent
5859
pub(super) fn send_packet(&mut self, now: Instant, packet: &mut RtpPacket) {
5960
packet.extensions.twcc_sequence_number = Some(self.next_sequence_number);
6061

61-
self.sent_packets.push_back(SentPacket {
62-
sequence_number: self.next_sequence_number,
63-
sent_at: now,
64-
size: packet.payload.len(),
65-
status: None,
66-
});
62+
self.sent_packets.insert(
63+
self.next_sequence_number,
64+
SentPacket {
65+
sequence_number: self.next_sequence_number,
66+
sent_at: now,
67+
size: packet.payload.len(),
68+
status: None,
69+
},
70+
);
6771

6872
self.next_sequence_number = self.next_sequence_number.wrapping_add(1);
6973
}
@@ -84,11 +88,7 @@ impl TwccTxState {
8488

8589
let mut reference_time = feedback.reference_time() as i64 * 64000;
8690
for (sequence_number, status) in feedback.packets() {
87-
let Some(sent_packet) = self
88-
.sent_packets
89-
.iter_mut()
90-
.find(|sent_packet| sent_packet.sequence_number == sequence_number)
91-
else {
91+
let Some(sent_packet) = self.sent_packets.get_mut(&sequence_number) else {
9292
continue;
9393
};
9494

@@ -108,7 +108,7 @@ impl TwccTxState {
108108
}
109109

110110
self.sent_packets
111-
.retain(|sent_packet| sent_packet.sent_at > now - SENT_PACKETS_MAX_SIZE);
111+
.retain(|_, sent_packet| sent_packet.sent_at > now - SENT_PACKETS_MAX_SIZE);
112112

113113
self.evaluate();
114114
}
@@ -121,13 +121,27 @@ impl TwccTxState {
121121

122122
let mut lost = 0;
123123

124-
for i in 1..self.sent_packets.len() {
125-
let lhs = &self.sent_packets[i];
126-
let rhs = &self.sent_packets[i - 1];
124+
let (min_seq, _) = self
125+
.sent_packets
126+
.iter()
127+
.min_by_key(|(_, x)| x.sent_at)
128+
.unwrap();
127129

128-
if rhs.sequence_number != lhs.sequence_number.wrapping_sub(1) {
129-
continue;
130-
}
130+
let (max_seq, _) = self
131+
.sent_packets
132+
.iter()
133+
.max_by_key(|(_, x)| x.sent_at)
134+
.unwrap();
135+
136+
let mut seq = *min_seq;
137+
138+
while seq != *max_seq {
139+
let next_seq = seq.wrapping_add(1);
140+
141+
let lhs = self.sent_packets.get(&seq).unwrap();
142+
let rhs = self.sent_packets.get(&next_seq).unwrap();
143+
144+
seq = next_seq;
131145

132146
let lhs_sent_at = lhs
133147
.sent_at
@@ -168,14 +182,18 @@ impl TwccTxState {
168182
let d = lhs_d - rhs_d;
169183

170184
{
185+
//TODO: doesn't really need a loop. The delta can be cached in SentPacket and the lowest delta can be stored globally with an index/seq and updated when needed?
171186
let d_min = self
172187
.sent_packets
173188
.iter()
174-
.take(i)
175-
.filter_map(|x| match x.status? {
189+
.filter(|(_, sent_packet)| sent_packet.sent_at < lhs.sent_at)
190+
.filter_map(|(_, sent_packet)| match sent_packet.status? {
176191
SentPacketStatus::Lost => None,
177192
SentPacketStatus::ReceivedAt(duration) => Some(
178-
x.sent_at.duration_since(self.base_time).as_micros() as i64
193+
sent_packet
194+
.sent_at
195+
.duration_since(self.base_time)
196+
.as_micros() as i64
179197
- duration.as_micros() as i64,
180198
),
181199
})
@@ -196,7 +214,7 @@ impl TwccTxState {
196214

197215
let Some(min) = self
198216
.sent_packets
199-
.iter()
217+
.values()
200218
.find(|x| x.status.is_some())
201219
.map(|x| x.sent_at)
202220
else {
@@ -205,7 +223,7 @@ impl TwccTxState {
205223

206224
let Some(max) = self
207225
.sent_packets
208-
.iter()
226+
.values()
209227
.rev()
210228
.find(|x| x.status.is_some())
211229
.map(|x| x.sent_at)
@@ -217,7 +235,7 @@ impl TwccTxState {
217235

218236
let recv_size: usize = self
219237
.sent_packets
220-
.iter()
238+
.values()
221239
.filter_map(|x| match x.status? {
222240
SentPacketStatus::Lost => None,
223241
SentPacketStatus::ReceivedAt(..) => Some(x.size),
@@ -226,7 +244,7 @@ impl TwccTxState {
226244

227245
let send_size: usize = self
228246
.sent_packets
229-
.iter()
247+
.values()
230248
.filter_map(|x| {
231249
x.status?;
232250
Some(x.size)

media/rtc/src/sdp/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,7 @@ impl SdpSession {
12401240
kind: RtcpFeedbackKind::CcmFir,
12411241
});
12421242

1243+
//TODO: transport-cc doesn't actually do anything yet, so disable for now
12431244
rtcp_fb.push(RtcpFeedback {
12441245
pt: RtcpFeedbackPt::Pt(pt),
12451246
kind: RtcpFeedbackKind::TransportCC,

0 commit comments

Comments
 (0)