mirror of
https://github.com/aler9/gortsplib
synced 2025-10-08 00:20:05 +08:00
send receiver reports only after receiving a sender report
This commit is contained in:
@@ -465,8 +465,10 @@ func (c *Client) run() {
|
|||||||
now := time.Now()
|
now := time.Now()
|
||||||
for trackID, cct := range c.tracks {
|
for trackID, cct := range c.tracks {
|
||||||
rr := cct.rtcpReceiver.Report(now)
|
rr := cct.rtcpReceiver.Report(now)
|
||||||
|
if rr != nil {
|
||||||
c.WritePacketRTCP(trackID, rr)
|
c.WritePacketRTCP(trackID, rr)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.udpReportTimer = time.NewTimer(c.udpReceiverReportPeriod)
|
c.udpReportTimer = time.NewTimer(c.udpReceiverReportPeriod)
|
||||||
} else { // Record
|
} else { // Record
|
||||||
|
@@ -52,10 +52,16 @@ func New(receiverSSRC *uint32, clockRate int) *RTCPReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Report generates a RTCP receiver report.
|
// Report generates a RTCP receiver report.
|
||||||
|
// It returns nil if no RTCP sender reports have been passed to ProcessPacketRTCP yet.
|
||||||
func (rr *RTCPReceiver) Report(ts time.Time) []byte {
|
func (rr *RTCPReceiver) Report(ts time.Time) []byte {
|
||||||
rr.mutex.Lock()
|
rr.mutex.Lock()
|
||||||
defer rr.mutex.Unlock()
|
defer rr.mutex.Unlock()
|
||||||
|
|
||||||
|
var zero time.Time
|
||||||
|
if rr.lastSenderReportTime == zero {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
report := &rtcp.ReceiverReport{
|
report := &rtcp.ReceiverReport{
|
||||||
SSRC: rr.receiverSSRC,
|
SSRC: rr.receiverSSRC,
|
||||||
Reports: []rtcp.ReceptionReport{
|
Reports: []rtcp.ReceptionReport{
|
||||||
|
@@ -13,6 +13,8 @@ func TestRTCPReceiverBase(t *testing.T) {
|
|||||||
v := uint32(0x65f83afb)
|
v := uint32(0x65f83afb)
|
||||||
rr := New(&v, 90000)
|
rr := New(&v, 90000)
|
||||||
|
|
||||||
|
require.Equal(t, []byte(nil), rr.Report(time.Now()))
|
||||||
|
|
||||||
srPkt := rtcp.SenderReport{
|
srPkt := rtcp.SenderReport{
|
||||||
SSRC: 0xba9da416,
|
SSRC: 0xba9da416,
|
||||||
NTPTime: 0xe363887a17ced916,
|
NTPTime: 0xe363887a17ced916,
|
||||||
|
@@ -12,6 +12,8 @@ import (
|
|||||||
func TestRTCPSender(t *testing.T) {
|
func TestRTCPSender(t *testing.T) {
|
||||||
rs := New(90000)
|
rs := New(90000)
|
||||||
|
|
||||||
|
require.Equal(t, []byte(nil), rs.Report(time.Now()))
|
||||||
|
|
||||||
rtpPkt := rtp.Packet{
|
rtpPkt := rtp.Packet{
|
||||||
Header: rtp.Header{
|
Header: rtp.Header{
|
||||||
Version: 2,
|
Version: 2,
|
||||||
|
@@ -1167,6 +1167,19 @@ func TestServerPublishRTCPReport(t *testing.T) {
|
|||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
byts, _ = (&rtcp.SenderReport{
|
||||||
|
SSRC: 753621,
|
||||||
|
NTPTime: 0xcbddcc34999997ff,
|
||||||
|
RTPTime: 54352,
|
||||||
|
PacketCount: 1,
|
||||||
|
OctetCount: 4,
|
||||||
|
}).Marshal()
|
||||||
|
_, err = l2.WriteTo(byts, &net.UDPAddr{
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
Port: th.ServerPorts[1],
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
// skip firewall opening
|
// skip firewall opening
|
||||||
buf := make([]byte, 2048)
|
buf := make([]byte, 2048)
|
||||||
_, _, err = l2.ReadFrom(buf)
|
_, _, err = l2.ReadFrom(buf)
|
||||||
|
@@ -324,8 +324,10 @@ func (ss *ServerSession) run() {
|
|||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
||||||
for trackID, track := range ss.announcedTracks {
|
for trackID, track := range ss.announcedTracks {
|
||||||
r := track.rtcpReceiver.Report(now)
|
rr := track.rtcpReceiver.Report(now)
|
||||||
ss.WritePacketRTCP(trackID, r)
|
if rr != nil {
|
||||||
|
ss.WritePacketRTCP(trackID, rr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ss.udpReceiverReportTimer = time.NewTimer(ss.s.udpReceiverReportPeriod)
|
ss.udpReceiverReportTimer = time.NewTimer(ss.s.udpReceiverReportPeriod)
|
||||||
|
Reference in New Issue
Block a user