mirror of
https://github.com/jech/galene.git
synced 2024-11-22 16:45:58 +01:00
Tweak SR sending policy.
Don't send SRs for tracks for which we have no time offset yet. Send an unscheduled SR when we get our first time offset.
This commit is contained in:
parent
ce7f3670bc
commit
8ba50bd2ca
1 changed files with 33 additions and 1 deletions
34
webclient.go
34
webclient.go
|
@ -547,6 +547,7 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
|
||||||
|
|
||||||
func rtcpUpListener(conn *upConnection, track *upTrack, r *webrtc.RTPReceiver) {
|
func rtcpUpListener(conn *upConnection, track *upTrack, r *webrtc.RTPReceiver) {
|
||||||
for {
|
for {
|
||||||
|
firstSR := false
|
||||||
ps, err := r.ReadRTCP()
|
ps, err := r.ReadRTCP()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != io.EOF {
|
if err != io.EOF {
|
||||||
|
@ -555,17 +556,37 @@ func rtcpUpListener(conn *upConnection, track *upTrack, r *webrtc.RTPReceiver) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
now := rtptime.Jiffies()
|
||||||
|
|
||||||
for _, p := range ps {
|
for _, p := range ps {
|
||||||
switch p := p.(type) {
|
switch p := p.(type) {
|
||||||
case *rtcp.SenderReport:
|
case *rtcp.SenderReport:
|
||||||
track.mu.Lock()
|
track.mu.Lock()
|
||||||
track.srTime = rtptime.Jiffies()
|
if track.srTime == 0 {
|
||||||
|
firstSR = true
|
||||||
|
}
|
||||||
|
track.srTime = now
|
||||||
track.srNTPTime = p.NTPTime
|
track.srNTPTime = p.NTPTime
|
||||||
track.srRTPTime = p.RTPTime
|
track.srRTPTime = p.RTPTime
|
||||||
track.mu.Unlock()
|
track.mu.Unlock()
|
||||||
case *rtcp.SourceDescription:
|
case *rtcp.SourceDescription:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(firstSR) {
|
||||||
|
// this is the first SR we got for at least one track,
|
||||||
|
// quickly propagate the time offsets downstream
|
||||||
|
local := conn.getLocal()
|
||||||
|
for _, l := range local {
|
||||||
|
l, ok := l.(*rtpDownConnection)
|
||||||
|
if ok {
|
||||||
|
err := sendSR(l)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("sendSR: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,11 +659,18 @@ func sendSR(conn *rtpDownConnection) error {
|
||||||
for _, t := range conn.tracks {
|
for _, t := range conn.tracks {
|
||||||
clockrate := t.track.Codec().ClockRate
|
clockrate := t.track.Codec().ClockRate
|
||||||
remote := t.remote
|
remote := t.remote
|
||||||
|
|
||||||
remote.mu.Lock()
|
remote.mu.Lock()
|
||||||
|
lastTime := remote.srTime
|
||||||
srNTPTime := remote.srNTPTime
|
srNTPTime := remote.srNTPTime
|
||||||
srRTPTime := remote.srRTPTime
|
srRTPTime := remote.srRTPTime
|
||||||
remote.mu.Unlock()
|
remote.mu.Unlock()
|
||||||
|
|
||||||
|
if lastTime == 0 {
|
||||||
|
// we never got a remote SR, skip this track
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
nowRTP := srRTPTime
|
nowRTP := srRTPTime
|
||||||
if srNTPTime != 0 {
|
if srNTPTime != 0 {
|
||||||
srTime := rtptime.NTPToTime(srNTPTime)
|
srTime := rtptime.NTPToTime(srNTPTime)
|
||||||
|
@ -666,6 +694,10 @@ func sendSR(conn *rtpDownConnection) error {
|
||||||
atomic.StoreUint64(&t.srNTPTime, nowNTP)
|
atomic.StoreUint64(&t.srNTPTime, nowNTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(packets) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
return conn.pc.WriteRTCP(packets)
|
return conn.pc.WriteRTCP(packets)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue