mirror of
https://github.com/bluenviron/mediamtx
synced 2025-02-15 11:07:28 +00:00
Fixes #1103 gortsplib/v2 supports multiple formats inside a single track (media). This allows to apply the resizing algorithm to single formats inside medias. For instance, if a media contains a a proprietary format and an H264 format, and the latter has oversized packets, they can now be resized.
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package core
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
|
|
"github.com/aler9/gortsplib/v2/pkg/format"
|
|
"github.com/aler9/gortsplib/v2/pkg/media"
|
|
)
|
|
|
|
type streamFormat struct {
|
|
proc formatProcessor
|
|
mutex sync.RWMutex
|
|
nonRTSPReaders map[reader]func(data)
|
|
}
|
|
|
|
func newStreamFormat(forma format.Format, generateRTPPackets bool) (*streamFormat, error) {
|
|
proc, err := newFormatProcessor(forma, generateRTPPackets)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sf := &streamFormat{
|
|
proc: proc,
|
|
nonRTSPReaders: make(map[reader]func(data)),
|
|
}
|
|
|
|
return sf, nil
|
|
}
|
|
|
|
func (sf *streamFormat) readerAdd(r reader, cb func(data)) {
|
|
sf.mutex.Lock()
|
|
defer sf.mutex.Unlock()
|
|
sf.nonRTSPReaders[r] = cb
|
|
}
|
|
|
|
func (sf *streamFormat) readerRemove(r reader) {
|
|
sf.mutex.Lock()
|
|
defer sf.mutex.Unlock()
|
|
delete(sf.nonRTSPReaders, r)
|
|
}
|
|
|
|
func (sf *streamFormat) writeData(s *stream, medi *media.Media, data data) error {
|
|
sf.mutex.RLock()
|
|
defer sf.mutex.RUnlock()
|
|
|
|
hasNonRTSPReaders := len(sf.nonRTSPReaders) > 0
|
|
|
|
err := sf.proc.process(data, hasNonRTSPReaders)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// forward RTP packets to RTSP readers
|
|
for _, pkt := range data.getRTPPackets() {
|
|
atomic.AddUint64(s.bytesReceived, uint64(pkt.MarshalSize()))
|
|
s.rtspStream.WritePacketRTPWithNTP(medi, pkt, data.getNTP())
|
|
}
|
|
|
|
// forward data to non-RTSP readers
|
|
for _, cb := range sf.nonRTSPReaders {
|
|
cb(data)
|
|
}
|
|
|
|
return nil
|
|
}
|