mirror of
				https://github.com/aler9/gortsplib
				synced 2025-10-31 18:42:40 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gortsplib
 | |
| 
 | |
| import (
 | |
| 	"sync/atomic"
 | |
| 
 | |
| 	"github.com/bluenviron/gortsplib/v4/pkg/description"
 | |
| )
 | |
| 
 | |
| type serverStreamMedia struct {
 | |
| 	st      *ServerStream
 | |
| 	media   *description.Media
 | |
| 	trackID int
 | |
| 
 | |
| 	formats         map[uint8]*serverStreamFormat
 | |
| 	multicastWriter *serverMulticastWriter
 | |
| 	bytesSent       *uint64
 | |
| 	rtcpPacketsSent *uint64
 | |
| }
 | |
| 
 | |
| func (sm *serverStreamMedia) initialize() {
 | |
| 	sm.bytesSent = new(uint64)
 | |
| 	sm.rtcpPacketsSent = new(uint64)
 | |
| 
 | |
| 	sm.formats = make(map[uint8]*serverStreamFormat)
 | |
| 	for _, forma := range sm.media.Formats {
 | |
| 		sf := &serverStreamFormat{
 | |
| 			sm:     sm,
 | |
| 			format: forma,
 | |
| 		}
 | |
| 		sf.initialize()
 | |
| 		sm.formats[forma.PayloadType()] = sf
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (sm *serverStreamMedia) close() {
 | |
| 	for _, tr := range sm.formats {
 | |
| 		if tr.rtcpSender != nil {
 | |
| 			tr.rtcpSender.Close()
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if sm.multicastWriter != nil {
 | |
| 		sm.multicastWriter.close()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (sm *serverStreamMedia) writePacketRTCP(byts []byte) error {
 | |
| 	le := len(byts)
 | |
| 
 | |
| 	// send unicast
 | |
| 	for r := range sm.st.activeUnicastReaders {
 | |
| 		if _, ok := r.setuppedMedias[sm.media]; ok {
 | |
| 			err := r.writePacketRTCP(sm.media, byts)
 | |
| 			if err != nil {
 | |
| 				r.onStreamWriteError(err)
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			atomic.AddUint64(sm.bytesSent, uint64(le))
 | |
| 			atomic.AddUint64(sm.rtcpPacketsSent, 1)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// send multicast
 | |
| 	if sm.multicastWriter != nil {
 | |
| 		err := sm.multicastWriter.writePacketRTCP(byts)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		atomic.AddUint64(sm.bytesSent, uint64(le))
 | |
| 		atomic.AddUint64(sm.rtcpPacketsSent, 1)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
