@@ -18,6 +18,7 @@ import (
1818 "time"
1919
2020 "sfu/estimator"
21+ "sfu/jitter"
2122 "sfu/mono"
2223 "sfu/packetcache"
2324
@@ -294,6 +295,7 @@ func addUpConn(c *client, id string) (*upConnection, error) {
294295 track : remote ,
295296 cache : packetcache .New (96 ),
296297 rate : estimator .New (time .Second ),
298+ jitter : jitter .New (remote .Codec ().ClockRate ),
297299 maxBitrate : ^ uint64 (0 ),
298300 }
299301 u .tracks = append (u .tracks , track )
@@ -323,7 +325,7 @@ func upLoop(conn *upConnection, track *upTrack) {
323325 var localTime uint64
324326 for {
325327 now := mono .Microseconds ()
326- if now < localTime || now > localTime + 500000 {
328+ if now < localTime || now > localTime + 500000 {
327329 local = track .getLocal ()
328330 localTime = now
329331 }
@@ -343,6 +345,8 @@ func upLoop(conn *upConnection, track *upTrack) {
343345 continue
344346 }
345347
348+ track .jitter .Accumulate (packet .Timestamp )
349+
346350 first := track .cache .Store (packet .SequenceNumber , buf [:bytes ])
347351 if packet .SequenceNumber - first > 24 {
348352 first , bitmap := track .cache .BitmapGet ()
@@ -379,6 +383,8 @@ func rtcpUpListener(conn *upConnection, track *upTrack, r *webrtc.RTPReceiver) {
379383 case * rtcp.SenderReport :
380384 atomic .StoreUint32 (& track .lastSenderReport ,
381385 uint32 (p .NTPTime >> 16 ))
386+ atomic .StoreUint32 (& track .lastSenderReportTime ,
387+ uint32 (mono .Now (0x10000 )))
382388 case * rtcp.SourceDescription :
383389 }
384390 }
@@ -392,7 +398,7 @@ func sendRR(c *client, conn *upConnection) error {
392398 return nil
393399 }
394400
395- ssrc := conn . tracks [ 0 ]. track . SSRC ( )
401+ now := uint32 ( mono . Now ( 0x10000 ) )
396402
397403 reports := make ([]rtcp.ReceptionReport , 0 , len (conn .tracks ))
398404 for _ , t := range conn .tracks {
@@ -403,19 +409,24 @@ func sendRR(c *client, conn *upConnection) error {
403409 if lost >= expected {
404410 lost = expected - 1
405411 }
412+ lastSR := atomic .LoadUint32 (& t .lastSenderReport )
413+ delay := now - atomic .LoadUint32 (& t .lastSenderReportTime )
414+
406415 reports = append (reports , rtcp.ReceptionReport {
407416 SSRC : t .track .SSRC (),
408- LastSenderReport : atomic .LoadUint32 (& t .lastSenderReport ),
409417 FractionLost : uint8 ((lost * 256 ) / expected ),
410418 TotalLost : totalLost ,
411419 LastSequenceNumber : eseqno ,
420+ Jitter : t .jitter .Jitter (),
421+ LastSenderReport : lastSR ,
422+ Delay : delay ,
412423 })
413424 }
414425 c .mu .Unlock ()
415426
416427 return conn .pc .WriteRTCP ([]rtcp.Packet {
417428 & rtcp.ReceiverReport {
418- SSRC : ssrc ,
429+ SSRC : 1 ,
419430 Reports : reports ,
420431 },
421432 })
@@ -609,6 +620,9 @@ func rtcpDownListener(g *group, conn *downConnection, track *downTrack, s *webrt
609620 & track .loss ,
610621 uint32 (r .FractionLost ),
611622 )
623+ atomic .StoreUint32 (
624+ & track .jitter ,
625+ r .Jitter )
612626 }
613627 }
614628 case * rtcp.TransportLayerNack :
0 commit comments