mirror of
https://github.com/aler9/gortsplib
synced 2025-09-27 11:32:08 +08:00
93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
package gortsplib
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/pion/rtcp"
|
|
"github.com/pion/rtp"
|
|
|
|
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/liberrors"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/rtcpreceiver"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/rtplossdetector"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/rtpreorderer"
|
|
)
|
|
|
|
type serverSessionFormat struct {
|
|
sm *serverSessionMedia
|
|
format format.Format
|
|
onPacketRTP OnPacketRTPFunc
|
|
|
|
udpReorderer *rtpreorderer.Reorderer
|
|
tcpLossDetector *rtplossdetector.LossDetector
|
|
rtcpReceiver *rtcpreceiver.RTCPReceiver
|
|
}
|
|
|
|
func (sf *serverSessionFormat) start() {
|
|
if sf.sm.ss.state != ServerSessionStatePlay {
|
|
if *sf.sm.ss.setuppedTransport == TransportUDP || *sf.sm.ss.setuppedTransport == TransportUDPMulticast {
|
|
sf.udpReorderer = rtpreorderer.New()
|
|
} else {
|
|
sf.tcpLossDetector = rtplossdetector.New()
|
|
}
|
|
|
|
var err error
|
|
sf.rtcpReceiver, err = rtcpreceiver.New(
|
|
sf.format.ClockRate(),
|
|
nil,
|
|
sf.sm.ss.s.receiverReportPeriod,
|
|
sf.sm.ss.s.timeNow,
|
|
func(pkt rtcp.Packet) {
|
|
if *sf.sm.ss.setuppedTransport == TransportUDP || *sf.sm.ss.setuppedTransport == TransportUDPMulticast {
|
|
sf.sm.ss.WritePacketRTCP(sf.sm.media, pkt) //nolint:errcheck
|
|
}
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (sf *serverSessionFormat) stop() {
|
|
if sf.rtcpReceiver != nil {
|
|
sf.rtcpReceiver.Close()
|
|
sf.rtcpReceiver = nil
|
|
}
|
|
}
|
|
|
|
func (sf *serverSessionFormat) readRTPUDP(pkt *rtp.Packet, now time.Time) {
|
|
packets, lost := sf.udpReorderer.Process(pkt)
|
|
if lost != 0 {
|
|
sf.sm.ss.onPacketLost(liberrors.ErrServerRTPPacketsLost{Lost: lost})
|
|
// do not return
|
|
}
|
|
|
|
for _, pkt := range packets {
|
|
err := sf.rtcpReceiver.ProcessPacket(pkt, now, sf.format.PTSEqualsDTS(pkt))
|
|
if err != nil {
|
|
sf.sm.ss.onDecodeError(err)
|
|
continue
|
|
}
|
|
|
|
sf.onPacketRTP(pkt)
|
|
}
|
|
}
|
|
|
|
func (sf *serverSessionFormat) readRTPTCP(pkt *rtp.Packet) {
|
|
lost := sf.tcpLossDetector.Process(pkt)
|
|
if lost != 0 {
|
|
sf.sm.ss.onPacketLost(liberrors.ErrServerRTPPacketsLost{Lost: lost})
|
|
// do not return
|
|
}
|
|
|
|
now := sf.sm.ss.s.timeNow()
|
|
|
|
err := sf.rtcpReceiver.ProcessPacket(pkt, now, sf.format.PTSEqualsDTS(pkt))
|
|
if err != nil {
|
|
sf.sm.ss.onDecodeError(err)
|
|
return
|
|
}
|
|
|
|
sf.onPacketRTP(pkt)
|
|
}
|