golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.4 KiB
78 lines
1.4 KiB
package rtcpsenderset |
|
|
|
import ( |
|
"time" |
|
|
|
"github.com/aler9/gortsplib" |
|
"github.com/aler9/gortsplib/pkg/rtcpsender" |
|
) |
|
|
|
// RTCPSenderSet is a set of RTCP senders. |
|
type RTCPSenderSet struct { |
|
onFrame func(int, gortsplib.StreamType, []byte) |
|
senders []*rtcpsender.RTCPSender |
|
|
|
// in |
|
terminate chan struct{} |
|
|
|
// out |
|
done chan struct{} |
|
} |
|
|
|
// New allocates a RTCPSenderSet. |
|
func New( |
|
tracks gortsplib.Tracks, |
|
onFrame func(int, gortsplib.StreamType, []byte), |
|
) *RTCPSenderSet { |
|
|
|
s := &RTCPSenderSet{ |
|
onFrame: onFrame, |
|
terminate: make(chan struct{}), |
|
done: make(chan struct{}), |
|
} |
|
|
|
s.senders = make([]*rtcpsender.RTCPSender, len(tracks)) |
|
for i, t := range tracks { |
|
clockRate, _ := t.ClockRate() |
|
s.senders[i] = rtcpsender.New(clockRate) |
|
} |
|
|
|
go s.run() |
|
|
|
return s |
|
} |
|
|
|
// Close closes a RTCPSenderSet. |
|
func (s *RTCPSenderSet) Close() { |
|
close(s.terminate) |
|
<-s.done |
|
} |
|
|
|
func (s *RTCPSenderSet) run() { |
|
defer close(s.done) |
|
|
|
t := time.NewTicker(10 * time.Second) |
|
defer t.Stop() |
|
|
|
for { |
|
select { |
|
case <-t.C: |
|
now := time.Now() |
|
|
|
for i, sender := range s.senders { |
|
r := sender.Report(now) |
|
if r != nil { |
|
s.onFrame(i, gortsplib.StreamTypeRTCP, r) |
|
} |
|
} |
|
|
|
case <-s.terminate: |
|
return |
|
} |
|
} |
|
} |
|
|
|
// OnFrame sends a frame to the senders. |
|
func (s *RTCPSenderSet) OnFrame(trackID int, streamType gortsplib.StreamType, f []byte) { |
|
s.senders[trackID].ProcessFrame(time.Now(), streamType, f) |
|
}
|
|
|