generate RTCP receiver reports even before receiving RTCP sender reports (#318)

(https://github.com/bluenviron/mediamtx/issues/1739)
This commit is contained in:
Alessandro Ros
2023-06-26 10:58:02 +02:00
committed by GitHub
parent bf33316d0f
commit 22c2c72ef1

View File

@@ -27,7 +27,7 @@ type RTCPReceiver struct {
mutex sync.Mutex
// data from RTP packets
initialized bool
firstRTPPacketReceived bool
timeInitialized bool
sequenceNumberCycles uint16
lastSSRC uint32
@@ -40,7 +40,7 @@ type RTCPReceiver struct {
jitter float64
// data from RTCP packets
senderInitialized bool
firstSenderReportReceived bool
lastSenderReportNTP uint32
lastSenderReportTime time.Time
@@ -104,7 +104,7 @@ func (rr *RTCPReceiver) report(ts time.Time) rtcp.Packet {
rr.mutex.Lock()
defer rr.mutex.Unlock()
if !rr.senderInitialized || !rr.initialized || rr.clockRate == 0 {
if !rr.firstRTPPacketReceived || rr.clockRate == 0 {
return nil
}
@@ -114,21 +114,25 @@ func (rr *RTCPReceiver) report(ts time.Time) rtcp.Packet {
{
SSRC: rr.lastSSRC,
LastSequenceNumber: uint32(rr.sequenceNumberCycles)<<16 | uint32(rr.lastSequenceNumber),
// middle 32 bits out of 64 in the NTP timestamp of last sender report
LastSenderReport: rr.lastSenderReportNTP,
// equivalent to taking the integer part after multiplying the
// loss fraction by 256
FractionLost: uint8(float64(rr.totalLostSinceReport*256) / float64(rr.totalSinceReport)),
TotalLost: rr.totalLost,
// delay, expressed in units of 1/65536 seconds, between
// receiving the last SR packet from source SSRC_n and sending this
// reception report block
Delay: uint32(ts.Sub(rr.lastSenderReportTime).Seconds() * 65536),
Jitter: uint32(rr.jitter),
},
},
}
if rr.firstSenderReportReceived {
// middle 32 bits out of 64 in the NTP timestamp of last sender report
report.Reports[0].LastSenderReport = rr.lastSenderReportNTP
// delay, expressed in units of 1/65536 seconds, between
// receiving the last SR packet from source SSRC_n and sending this
// reception report block
report.Reports[0].Delay = uint32(ts.Sub(rr.lastSenderReportTime).Seconds() * 65536)
}
rr.totalLostSinceReport = 0
rr.totalSinceReport = 0
@@ -141,8 +145,8 @@ func (rr *RTCPReceiver) ProcessPacket(pkt *rtp.Packet, ntp time.Time, ptsEqualsD
defer rr.mutex.Unlock()
// first packet
if !rr.initialized {
rr.initialized = true
if !rr.firstRTPPacketReceived {
rr.firstRTPPacketReceived = true
rr.totalSinceReport = 1
rr.lastSSRC = pkt.SSRC
rr.lastSequenceNumber = pkt.SequenceNumber
@@ -205,7 +209,7 @@ func (rr *RTCPReceiver) ProcessSenderReport(sr *rtcp.SenderReport, ts time.Time)
rr.mutex.Lock()
defer rr.mutex.Unlock()
rr.senderInitialized = true
rr.firstSenderReportReceived = true
rr.lastSenderReportNTP = uint32(sr.NTPTime >> 16)
rr.lastSenderReportTime = ts
}
@@ -214,5 +218,5 @@ func (rr *RTCPReceiver) ProcessSenderReport(sr *rtcp.SenderReport, ts time.Time)
func (rr *RTCPReceiver) LastSSRC() (uint32, bool) {
rr.mutex.Lock()
defer rr.mutex.Unlock()
return rr.lastSSRC, rr.initialized
return rr.lastSSRC, rr.firstRTPPacketReceived
}