Commit efb298f0 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Use sendonly transceiver for down tracks, embed receiver in track.

parent 63cfce9e
...@@ -353,12 +353,13 @@ func (down *rtpDownConnection) flushICECandidates() error { ...@@ -353,12 +353,13 @@ func (down *rtpDownConnection) flushICECandidates() error {
} }
type rtpUpTrack struct { type rtpUpTrack struct {
track *webrtc.TrackRemote track *webrtc.TrackRemote
conn *rtpUpConnection receiver *webrtc.RTPReceiver
rate *estimator.Estimator conn *rtpUpConnection
cache *packetcache.Cache rate *estimator.Estimator
jitter *jitter.Estimator cache *packetcache.Cache
cname atomic.Value jitter *jitter.Estimator
cname atomic.Value
actionCh chan struct{} actionCh chan struct{}
readerDone chan struct{} readerDone chan struct{}
...@@ -630,6 +631,7 @@ func newUpConn(c group.Client, id string, label string, offer string) (*rtpUpCon ...@@ -630,6 +631,7 @@ func newUpConn(c group.Client, id string, label string, offer string) (*rtpUpCon
track := &rtpUpTrack{ track := &rtpUpTrack{
track: remote, track: remote,
receiver: receiver,
conn: up, conn: up,
cache: packetcache.New(minPacketCache(remote)), cache: packetcache.New(minPacketCache(remote)),
rate: estimator.New(time.Second), rate: estimator.New(time.Second),
...@@ -642,7 +644,7 @@ func newUpConn(c group.Client, id string, label string, offer string) (*rtpUpCon ...@@ -642,7 +644,7 @@ func newUpConn(c group.Client, id string, label string, offer string) (*rtpUpCon
go readLoop(track) go readLoop(track)
go rtcpUpListener(up, track, receiver) go rtcpUpListener(track)
up.mu.Unlock() up.mu.Unlock()
...@@ -769,12 +771,12 @@ func (track *rtpUpTrack) GetPacket(seqno uint16, result []byte, nack bool) uint1 ...@@ -769,12 +771,12 @@ func (track *rtpUpTrack) GetPacket(seqno uint16, result []byte, nack bool) uint1
return 0 return 0
} }
func rtcpUpListener(conn *rtpUpConnection, track *rtpUpTrack, r *webrtc.RTPReceiver) { func rtcpUpListener(track *rtpUpTrack) {
buf := make([]byte, 1500) buf := make([]byte, 1500)
for { for {
firstSR := false firstSR := false
n, _, err := r.ReadSimulcast(buf, track.track.RID()) n, _, err := track.receiver.ReadSimulcast(buf, track.track.RID())
if err != nil { if err != nil {
if err != io.EOF && err != io.ErrClosedPipe { if err != io.EOF && err != io.ErrClosedPipe {
log.Printf("Read RTCP: %v", err) log.Printf("Read RTCP: %v", err)
...@@ -825,7 +827,7 @@ func rtcpUpListener(conn *rtpUpConnection, track *rtpUpTrack, r *webrtc.RTPRecei ...@@ -825,7 +827,7 @@ func rtcpUpListener(conn *rtpUpConnection, track *rtpUpTrack, r *webrtc.RTPRecei
if firstSR { if firstSR {
// this is the first SR we got for at least one track, // this is the first SR we got for at least one track,
// quickly propagate the time offsets downstream // quickly propagate the time offsets downstream
local := conn.getLocal() local := track.conn.getLocal()
for _, l := range local { for _, l := range local {
l, ok := l.(*rtpDownConnection) l, ok := l.(*rtpDownConnection)
if ok { if ok {
...@@ -1093,13 +1095,13 @@ func (track *rtpDownTrack) updateRate(loss uint8, now uint64) { ...@@ -1093,13 +1095,13 @@ func (track *rtpDownTrack) updateRate(loss uint8, now uint64) {
track.maxBitrate.Set(rate, now) track.maxBitrate.Set(rate, now)
} }
func rtcpDownListener(track *rtpDownTrack, s *webrtc.RTPSender) { func rtcpDownListener(track *rtpDownTrack) {
lastFirSeqno := uint8(0) lastFirSeqno := uint8(0)
buf := make([]byte, 1500) buf := make([]byte, 1500)
for { for {
n, _, err := s.Read(buf) n, _, err := track.sender.Read(buf)
if err != nil { if err != nil {
if err != io.EOF && err != io.ErrClosedPipe { if err != io.EOF && err != io.ErrClosedPipe {
log.Printf("Read RTCP: %v", err) log.Printf("Read RTCP: %v", err)
......
...@@ -380,19 +380,23 @@ func addDownTrackUnlocked(conn *rtpDownConnection, remoteTrack *rtpUpTrack, remo ...@@ -380,19 +380,23 @@ func addDownTrackUnlocked(conn *rtpDownConnection, remoteTrack *rtpUpTrack, remo
return err return err
} }
sender, err := conn.pc.AddTrack(local) transceiver, err := conn.pc.AddTransceiverFromTrack(local,
webrtc.RTPTransceiverInit{
Direction: webrtc.RTPTransceiverDirectionSendonly,
},
)
if err != nil { if err != nil {
return err return err
} }
parms := sender.GetParameters() parms := transceiver.Sender().GetParameters()
if len(parms.Encodings) != 1 { if len(parms.Encodings) != 1 {
return errors.New("got multiple encodings") return errors.New("got multiple encodings")
} }
track := &rtpDownTrack{ track := &rtpDownTrack{
track: local, track: local,
sender: sender, sender: transceiver.Sender(),
ssrc: parms.Encodings[0].SSRC, ssrc: parms.Encodings[0].SSRC,
conn: conn, conn: conn,
remote: remoteTrack, remote: remoteTrack,
...@@ -405,7 +409,7 @@ func addDownTrackUnlocked(conn *rtpDownConnection, remoteTrack *rtpUpTrack, remo ...@@ -405,7 +409,7 @@ func addDownTrackUnlocked(conn *rtpDownConnection, remoteTrack *rtpUpTrack, remo
conn.tracks = append(conn.tracks, track) conn.tracks = append(conn.tracks, track)
go rtcpDownListener(track, sender) go rtcpDownListener(track)
return nil return nil
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment