mirror of
				https://github.com/aler9/gortsplib
				synced 2025-10-31 02:26:57 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gortsplib
 | |
| 
 | |
| import (
 | |
| 	"sync/atomic"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/pion/rtcp"
 | |
| 	"github.com/pion/rtp"
 | |
| 
 | |
| 	"github.com/bluenviron/gortsplib/v4/internal/rtcpsender"
 | |
| 	"github.com/bluenviron/gortsplib/v4/pkg/format"
 | |
| )
 | |
| 
 | |
| type serverStreamFormat struct {
 | |
| 	sm     *serverStreamMedia
 | |
| 	format format.Format
 | |
| 
 | |
| 	rtcpSender     *rtcpsender.RTCPSender
 | |
| 	rtpPacketsSent *uint64
 | |
| }
 | |
| 
 | |
| func (sf *serverStreamFormat) initialize() {
 | |
| 	sf.rtpPacketsSent = new(uint64)
 | |
| 
 | |
| 	sf.rtcpSender = &rtcpsender.RTCPSender{
 | |
| 		ClockRate: sf.format.ClockRate(),
 | |
| 		Period:    sf.sm.st.s.senderReportPeriod,
 | |
| 		TimeNow:   sf.sm.st.s.timeNow,
 | |
| 		WritePacketRTCP: func(pkt rtcp.Packet) {
 | |
| 			if !sf.sm.st.s.DisableRTCPSenderReports {
 | |
| 				sf.sm.st.WritePacketRTCP(sf.sm.media, pkt) //nolint:errcheck
 | |
| 			}
 | |
| 		},
 | |
| 	}
 | |
| 	sf.rtcpSender.Initialize()
 | |
| }
 | |
| 
 | |
| func (sf *serverStreamFormat) writePacketRTP(byts []byte, pkt *rtp.Packet, ntp time.Time) error {
 | |
| 	sf.rtcpSender.ProcessPacketRTP(pkt, ntp, sf.format.PTSEqualsDTS(pkt))
 | |
| 
 | |
| 	le := uint64(len(byts))
 | |
| 
 | |
| 	// send unicast
 | |
| 	for r := range sf.sm.st.activeUnicastReaders {
 | |
| 		if _, ok := r.setuppedMedias[sf.sm.media]; ok {
 | |
| 			err := r.writePacketRTP(sf.sm.media, pkt.PayloadType, byts)
 | |
| 			if err != nil {
 | |
| 				r.onStreamWriteError(err)
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			atomic.AddUint64(sf.sm.bytesSent, le)
 | |
| 			atomic.AddUint64(sf.rtpPacketsSent, 1)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// send multicast
 | |
| 	if sf.sm.multicastWriter != nil {
 | |
| 		err := sf.sm.multicastWriter.writePacketRTP(byts)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		atomic.AddUint64(sf.sm.bytesSent, le)
 | |
| 		atomic.AddUint64(sf.rtpPacketsSent, 1)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
