fix crash when reading tracks with zero clock rate (bluenviron/mediamtx#4476) (#772)

also prevents RTCP sender and RTCP reports from being emitted when
track has clock rate set to zero.
This commit is contained in:
Alessandro Ros
2025-05-01 18:08:13 +02:00
committed by GitHub
parent bfacd10d35
commit 3e555e2d18
6 changed files with 273 additions and 55 deletions

View File

@@ -107,6 +107,12 @@ func (rr *RTCPReceiver) Initialize() error {
return nil
}
// Close closes the RTCPReceiver.
func (rr *RTCPReceiver) Close() {
close(rr.terminate)
<-rr.done
}
func (rr *RTCPReceiver) run() {
defer close(rr.done)
@@ -131,7 +137,7 @@ func (rr *RTCPReceiver) report() rtcp.Packet {
rr.mutex.Lock()
defer rr.mutex.Unlock()
if !rr.firstRTPPacketReceived {
if !rr.firstRTPPacketReceived || rr.ClockRate == 0 {
return nil
}
@@ -168,12 +174,6 @@ func (rr *RTCPReceiver) report() rtcp.Packet {
return report
}
// Close closes the RTCPReceiver.
func (rr *RTCPReceiver) Close() {
close(rr.terminate)
<-rr.done
}
// ProcessPacket extracts the needed data from RTP packets.
func (rr *RTCPReceiver) ProcessPacket(pkt *rtp.Packet, system time.Time, ptsEqualsDTS bool) error {
rr.mutex.Lock()
@@ -223,7 +223,7 @@ func (rr *RTCPReceiver) ProcessPacket(pkt *rtp.Packet, system time.Time, ptsEqua
rr.lastSequenceNumber = pkt.SequenceNumber
if ptsEqualsDTS {
if rr.timeInitialized {
if rr.timeInitialized && rr.ClockRate != 0 {
// update jitter
// https://tools.ietf.org/html/rfc3550#page-39
D := system.Sub(rr.lastTimeSystem).Seconds()*float64(rr.ClockRate) -
@@ -255,7 +255,7 @@ func (rr *RTCPReceiver) ProcessSenderReport(sr *rtcp.SenderReport, system time.T
}
func (rr *RTCPReceiver) packetNTPUnsafe(ts uint32) (time.Time, bool) {
if !rr.firstSenderReportReceived {
if !rr.firstSenderReportReceived || rr.ClockRate == 0 {
return time.Time{}, false
}