mirror of
https://github.com/aler9/gortsplib
synced 2025-10-06 23:52:46 +08:00
replace events with channels
This commit is contained in:
@@ -7,53 +7,47 @@ import (
|
|||||||
"github.com/pion/rtcp"
|
"github.com/pion/rtcp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type rtcpReceiverEvent interface {
|
type frameRtpReq struct {
|
||||||
isRtpReceiverEvent()
|
|
||||||
}
|
|
||||||
|
|
||||||
type rtcpReceiverEventFrameRtp struct {
|
|
||||||
sequenceNumber uint16
|
sequenceNumber uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rtcpReceiverEventFrameRtp) isRtpReceiverEvent() {}
|
type frameRtcpReq struct {
|
||||||
|
|
||||||
type rtcpReceiverEventFrameRtcp struct {
|
|
||||||
ssrc uint32
|
ssrc uint32
|
||||||
ntpTimeMiddle uint32
|
ntpTimeMiddle uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rtcpReceiverEventFrameRtcp) isRtpReceiverEvent() {}
|
type lastFrameTimeReq struct {
|
||||||
|
|
||||||
type rtcpReceiverEventLastFrameTime struct {
|
|
||||||
res chan time.Time
|
res chan time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rtcpReceiverEventLastFrameTime) isRtpReceiverEvent() {}
|
type reportReq struct {
|
||||||
|
|
||||||
type rtcpReceiverEventReport struct {
|
|
||||||
res chan []byte
|
res chan []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rtcpReceiverEventReport) isRtpReceiverEvent() {}
|
|
||||||
|
|
||||||
type rtcpReceiverEventTerminate struct{}
|
|
||||||
|
|
||||||
func (rtcpReceiverEventTerminate) isRtpReceiverEvent() {}
|
|
||||||
|
|
||||||
// RtcpReceiver is an object that helps building RTCP receiver reports, by parsing
|
// RtcpReceiver is an object that helps building RTCP receiver reports, by parsing
|
||||||
// incoming frames.
|
// incoming frames.
|
||||||
type RtcpReceiver struct {
|
type RtcpReceiver struct {
|
||||||
events chan rtcpReceiverEvent
|
frameRtp chan frameRtpReq
|
||||||
done chan struct{}
|
frameRtcp chan frameRtcpReq
|
||||||
|
lastFrameTime chan lastFrameTimeReq
|
||||||
|
report chan reportReq
|
||||||
|
terminate chan struct{}
|
||||||
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRtcpReceiver allocates a RtcpReceiver.
|
// NewRtcpReceiver allocates a RtcpReceiver.
|
||||||
func NewRtcpReceiver() *RtcpReceiver {
|
func NewRtcpReceiver() *RtcpReceiver {
|
||||||
rr := &RtcpReceiver{
|
rr := &RtcpReceiver{
|
||||||
events: make(chan rtcpReceiverEvent),
|
frameRtp: make(chan frameRtpReq),
|
||||||
done: make(chan struct{}),
|
frameRtcp: make(chan frameRtcpReq),
|
||||||
|
lastFrameTime: make(chan lastFrameTimeReq),
|
||||||
|
report: make(chan reportReq),
|
||||||
|
terminate: make(chan struct{}),
|
||||||
|
done: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
go rr.run()
|
go rr.run()
|
||||||
|
|
||||||
return rr
|
return rr
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,23 +60,23 @@ func (rr *RtcpReceiver) run() {
|
|||||||
lastSenderReport := uint32(0)
|
lastSenderReport := uint32(0)
|
||||||
|
|
||||||
outer:
|
outer:
|
||||||
for rawEvt := range rr.events {
|
for {
|
||||||
switch evt := rawEvt.(type) {
|
select {
|
||||||
case rtcpReceiverEventFrameRtp:
|
case req := <-rr.frameRtp:
|
||||||
if evt.sequenceNumber < lastSequenceNumber {
|
if req.sequenceNumber < lastSequenceNumber {
|
||||||
sequenceNumberCycles += 1
|
sequenceNumberCycles += 1
|
||||||
}
|
}
|
||||||
lastSequenceNumber = evt.sequenceNumber
|
lastSequenceNumber = req.sequenceNumber
|
||||||
lastFrameTime = time.Now()
|
lastFrameTime = time.Now()
|
||||||
|
|
||||||
case rtcpReceiverEventFrameRtcp:
|
case req := <-rr.frameRtcp:
|
||||||
publisherSSRC = evt.ssrc
|
publisherSSRC = req.ssrc
|
||||||
lastSenderReport = evt.ntpTimeMiddle
|
lastSenderReport = req.ntpTimeMiddle
|
||||||
|
|
||||||
case rtcpReceiverEventLastFrameTime:
|
case req := <-rr.lastFrameTime:
|
||||||
evt.res <- lastFrameTime
|
req.res <- lastFrameTime
|
||||||
|
|
||||||
case rtcpReceiverEventReport:
|
case req := <-rr.report:
|
||||||
rr := &rtcp.ReceiverReport{
|
rr := &rtcp.ReceiverReport{
|
||||||
SSRC: receiverSSRC,
|
SSRC: receiverSSRC,
|
||||||
Reports: []rtcp.ReceptionReport{
|
Reports: []rtcp.ReceptionReport{
|
||||||
@@ -94,21 +88,23 @@ outer:
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
frame, _ := rr.Marshal()
|
frame, _ := rr.Marshal()
|
||||||
evt.res <- frame
|
req.res <- frame
|
||||||
|
|
||||||
case rtcpReceiverEventTerminate:
|
case <-rr.terminate:
|
||||||
break outer
|
break outer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close(rr.events)
|
close(rr.frameRtp)
|
||||||
|
close(rr.frameRtcp)
|
||||||
|
close(rr.lastFrameTime)
|
||||||
|
close(rr.report)
|
||||||
close(rr.done)
|
close(rr.done)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes a RtcpReceiver.
|
// Close closes a RtcpReceiver.
|
||||||
func (rr *RtcpReceiver) Close() {
|
func (rr *RtcpReceiver) Close() {
|
||||||
rr.events <- rtcpReceiverEventTerminate{}
|
close(rr.terminate)
|
||||||
<-rr.done
|
<-rr.done
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +114,7 @@ func (rr *RtcpReceiver) OnFrame(streamType StreamType, buf []byte) {
|
|||||||
// extract sequence number of first frame
|
// extract sequence number of first frame
|
||||||
if len(buf) >= 3 {
|
if len(buf) >= 3 {
|
||||||
sequenceNumber := uint16(uint16(buf[2])<<8 | uint16(buf[1]))
|
sequenceNumber := uint16(uint16(buf[2])<<8 | uint16(buf[1]))
|
||||||
rr.events <- rtcpReceiverEventFrameRtp{sequenceNumber}
|
rr.frameRtp <- frameRtpReq{sequenceNumber}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -126,7 +122,7 @@ func (rr *RtcpReceiver) OnFrame(streamType StreamType, buf []byte) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
for _, frame := range frames {
|
for _, frame := range frames {
|
||||||
if senderReport, ok := (frame).(*rtcp.SenderReport); ok {
|
if senderReport, ok := (frame).(*rtcp.SenderReport); ok {
|
||||||
rr.events <- rtcpReceiverEventFrameRtcp{
|
rr.frameRtcp <- frameRtcpReq{
|
||||||
senderReport.SSRC,
|
senderReport.SSRC,
|
||||||
uint32(senderReport.NTPTime >> 16),
|
uint32(senderReport.NTPTime >> 16),
|
||||||
}
|
}
|
||||||
@@ -139,13 +135,13 @@ func (rr *RtcpReceiver) OnFrame(streamType StreamType, buf []byte) {
|
|||||||
// LastFrameTime returns the time the last frame was received.
|
// LastFrameTime returns the time the last frame was received.
|
||||||
func (rr *RtcpReceiver) LastFrameTime() time.Time {
|
func (rr *RtcpReceiver) LastFrameTime() time.Time {
|
||||||
res := make(chan time.Time)
|
res := make(chan time.Time)
|
||||||
rr.events <- rtcpReceiverEventLastFrameTime{res}
|
rr.lastFrameTime <- lastFrameTimeReq{res}
|
||||||
return <-res
|
return <-res
|
||||||
}
|
}
|
||||||
|
|
||||||
// Report generates a RTCP receiver report.
|
// Report generates a RTCP receiver report.
|
||||||
func (rr *RtcpReceiver) Report() []byte {
|
func (rr *RtcpReceiver) Report() []byte {
|
||||||
res := make(chan []byte)
|
res := make(chan []byte)
|
||||||
rr.events <- rtcpReceiverEventReport{res}
|
rr.report <- reportReq{res}
|
||||||
return <-res
|
return <-res
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user