mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 23:26:54 +08:00
server: add ServerStreamStatsFormat.LocalSSRC (#804)
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
@@ -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))
|
||||||
|
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user