1
+ use std:: cmp:: Ordering ;
1
2
use std:: mem;
2
3
use std:: time:: { Duration , Instant } ;
3
4
@@ -6,6 +7,8 @@ use crate::rtp_::SeqNo;
6
7
use super :: AckedPacket ;
7
8
8
9
const BURST_TIME_INTERVAL : Duration = Duration :: from_millis ( 5 ) ;
10
+ const SEND_TIME_GROUP_LENGTH : Duration = Duration :: from_millis ( 5 ) ;
11
+ const MAX_BURST_DURATION : Duration = Duration :: from_millis ( 100 ) ;
9
12
10
13
#[ derive( Debug , Default ) ]
11
14
pub struct ArrivalGroup {
@@ -51,38 +54,47 @@ impl ArrivalGroup {
51
54
return Belongs :: Yes ;
52
55
} ;
53
56
54
- let Some ( send_diff ) = packet
57
+ let Some ( first_send_delta ) = packet
55
58
. local_send_time
56
59
. checked_duration_since ( first_local_send_time)
57
60
else {
58
61
// Out of order
59
62
return Belongs :: Skipped ;
60
63
} ;
61
64
62
- if send_diff < BURST_TIME_INTERVAL {
63
- // Sent within the same burst interval
64
- return Belongs :: Yes ;
65
- }
65
+ let inter_arrival_time = {
66
+ let last_remote_recv_time = self . remote_recv_time ( ) ;
66
67
67
- let inter_arrival_time = packet
68
- . remote_recv_time
69
- . checked_duration_since ( self . remote_recv_time ( ) ) ;
68
+ if packet. remote_recv_time >= last_remote_recv_time {
69
+ ( packet. remote_recv_time - last_remote_recv_time) . as_secs_f64 ( )
70
+ } else {
71
+ ( last_remote_recv_time - packet. remote_recv_time ) . as_secs_f64 ( ) * -1.0
72
+ }
73
+ } ;
70
74
71
- let Some ( inter_arrival_time) = inter_arrival_time else {
72
- info ! ( "TWCC: Out of order arrival" ) ;
73
- return Belongs :: Skipped ;
75
+ let last_send_delta = {
76
+ let last_send_time = self . local_send_time ( ) ;
77
+
78
+ match packet. local_send_time . cmp ( & last_send_time) {
79
+ Ordering :: Equal => {
80
+ return Belongs :: Yes ;
81
+ }
82
+ Ordering :: Greater => ( packet. local_send_time - last_send_time) . as_secs_f64 ( ) ,
83
+ Ordering :: Less => ( last_send_time - packet. local_send_time ) . as_secs_f64 ( ) * -1.0 ,
84
+ }
74
85
} ;
75
86
76
- let inter_group_delay_delta = inter_arrival_time. as_secs_f64 ( )
77
- - ( packet. local_send_time - self . local_send_time ( ) ) . as_secs_f64 ( ) ;
87
+ let inter_group_delay_delta = inter_arrival_time - last_send_delta;
78
88
79
89
if inter_group_delay_delta < 0.0
80
- && inter_arrival_time < BURST_TIME_INTERVAL
81
- && packet. remote_recv_time - first_remote_recv_time < Duration :: from_millis ( 100 )
90
+ && inter_arrival_time <= BURST_TIME_INTERVAL . as_secs_f64 ( )
91
+ && packet. remote_recv_time - first_remote_recv_time < MAX_BURST_DURATION
82
92
{
83
93
Belongs :: Yes
84
- } else {
94
+ } else if first_send_delta > SEND_TIME_GROUP_LENGTH {
85
95
Belongs :: NewGroup
96
+ } else {
97
+ Belongs :: Yes
86
98
}
87
99
}
88
100
@@ -344,7 +356,7 @@ mod test {
344
356
packets. push ( AckedPacket {
345
357
seq_no : 4 . into ( ) ,
346
358
size : DataSize :: ZERO ,
347
- local_send_time : now + duration_us ( 5001 ) ,
359
+ local_send_time : now - duration_us ( 100 ) ,
348
360
remote_recv_time : now + duration_us ( 5000 ) ,
349
361
local_recv_time : now + duration_us ( 5050 ) ,
350
362
} ) ;
0 commit comments