server: add ServerStreamStatsFormat.LocalSSRC (#804)

This commit is contained in:
Alessandro Ros
2025-06-28 16:56:44 +02:00
committed by GitHub
parent f4ef4ec23a
commit ff08b85700
6 changed files with 42 additions and 26 deletions

View File

@@ -46,7 +46,7 @@ var testRTPPacket = rtp.Packet{
CSRC: []uint32{}, CSRC: []uint32{},
SSRC: 0x38F27A2F, SSRC: 0x38F27A2F,
}, },
Payload: []byte{1, 2, 3, 4}, Payload: []byte{5, 2, 3, 4},
} }
var testRTPPacketMarshaled = mustMarshalPacketRTP(&testRTPPacket) var testRTPPacketMarshaled = mustMarshalPacketRTP(&testRTPPacket)

View File

@@ -2427,7 +2427,22 @@ func TestServerPlayStreamStats(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
st := stream.Stats() st := stream.Stats()
require.Equal(t, uint64(16*2), st.BytesSent) require.Equal(t, &ServerStreamStats{
BytesSent: 32,
RTPPacketsSent: 2,
Medias: map[*description.Media]ServerStreamStatsMedia{
stream.Description().Medias[0]: {
BytesSent: 32,
RTCPPacketsSent: 0,
Formats: map[format.Format]ServerStreamStatsFormat{
stream.Description().Medias[0].Formats[0]: {
RTPPacketsSent: 2,
LocalSSRC: 955415087,
},
},
},
},
}, st)
} }
func TestServerPlayBackChannel(t *testing.T) { func TestServerPlayBackChannel(t *testing.T) {

View File

@@ -1085,9 +1085,14 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
panic("stream cannot be different than the one returned in previous OnSetup call") panic("stream cannot be different than the one returned in previous OnSetup call")
} }
ssrc, ok := stream.localSSRC(medi) // Fill SSRC if there is a single SSRC only
if ok { // since the Transport header does not support multiple SSRCs.
th.SSRC = &ssrc if len(stream.medias[medi].formats) == 1 {
format := stream.medias[medi].formats[medi.Formats[0].PayloadType()]
ssrc, ok := format.localSSRC()
if ok {
th.SSRC = &ssrc
}
} }
} }

View File

@@ -152,6 +152,12 @@ func (st *ServerStream) Stats() *ServerStreamStats {
for _, fo := range sm.formats { for _, fo := range sm.formats {
ret[fo.format] = ServerStreamStatsFormat{ ret[fo.format] = ServerStreamStatsFormat{
RTPPacketsSent: atomic.LoadUint64(fo.rtpPacketsSent), RTPPacketsSent: atomic.LoadUint64(fo.rtpPacketsSent),
LocalSSRC: func() uint32 {
if v, ok := fo.localSSRC(); ok {
return v
}
return 0
}(),
} }
} }
@@ -165,27 +171,6 @@ func (st *ServerStream) Stats() *ServerStreamStats {
} }
} }
func (st *ServerStream) localSSRC(medi *description.Media) (uint32, bool) {
st.mutex.Lock()
defer st.mutex.Unlock()
sm := st.medias[medi]
// localSSRC() is used to fill SSRC inside the Transport header.
// if there are multiple formats inside a single media stream,
// do not return anything, since Transport headers don't support multiple SSRCs.
if len(sm.formats) > 1 {
return 0, false
}
stats := firstFormat(sm.formats).rtcpSender.Stats()
if stats == nil {
return 0, false
}
return stats.LocalSSRC, true
}
func (st *ServerStream) rtpInfoEntry(medi *description.Media, now time.Time) *headers.RTPInfoEntry { func (st *ServerStream) rtpInfoEntry(medi *description.Media, now time.Time) *headers.RTPInfoEntry {
st.mutex.Lock() st.mutex.Lock()
defer st.mutex.Unlock() defer st.mutex.Unlock()

View File

@@ -35,6 +35,15 @@ func (sf *serverStreamFormat) initialize() {
sf.rtcpSender.Initialize() sf.rtcpSender.Initialize()
} }
func (sf *serverStreamFormat) localSSRC() (uint32, bool) {
stats := sf.rtcpSender.Stats()
if stats != nil {
return stats.LocalSSRC, true
}
return 0, false
}
func (sf *serverStreamFormat) writePacketRTP(byts []byte, pkt *rtp.Packet, ntp time.Time) error { func (sf *serverStreamFormat) writePacketRTP(byts []byte, pkt *rtp.Packet, ntp time.Time) error {
sf.rtcpSender.ProcessPacket(pkt, ntp, sf.format.PTSEqualsDTS(pkt)) sf.rtcpSender.ProcessPacket(pkt, ntp, sf.format.PTSEqualsDTS(pkt))

View File

@@ -9,6 +9,8 @@ import (
type ServerStreamStatsFormat struct { type ServerStreamStatsFormat struct {
// number of sent RTP packets // number of sent RTP packets
RTPPacketsSent uint64 RTPPacketsSent uint64
// local SSRC
LocalSSRC uint32
} }
// ServerStreamStatsMedia are stream media statistics. // ServerStreamStatsMedia are stream media statistics.