Commit e7f9a8f3 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Make downTrack and downConnection into interfaces.

parent d9f2a936
...@@ -618,7 +618,7 @@ func delUpConn(c *client, id string) bool { ...@@ -618,7 +618,7 @@ func delUpConn(c *client, id string) bool {
return true return true
} }
func getDownConn(c *client, id string) *downConnection { func getDownConn(c *client, id string) *rtpDownConnection {
if c.down == nil { if c.down == nil {
return nil return nil
} }
...@@ -644,7 +644,7 @@ func getConn(c *client, id string) iceConnection { ...@@ -644,7 +644,7 @@ func getConn(c *client, id string) iceConnection {
return nil return nil
} }
func addDownConn(c *client, id string, remote *upConnection) (*downConnection, error) { func addDownConn(c *client, id string, remote *upConnection) (*rtpDownConnection, error) {
pc, err := groups.api.NewPeerConnection(iceConfiguration()) pc, err := groups.api.NewPeerConnection(iceConfiguration())
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -659,9 +659,9 @@ func addDownConn(c *client, id string, remote *upConnection) (*downConnection, e ...@@ -659,9 +659,9 @@ func addDownConn(c *client, id string, remote *upConnection) (*downConnection, e
}) })
if c.down == nil { if c.down == nil {
c.down = make(map[string]*downConnection) c.down = make(map[string]*rtpDownConnection)
} }
conn := &downConnection{ conn := &rtpDownConnection{
id: id, id: id,
client: c, client: c,
pc: pc, pc: pc,
...@@ -705,7 +705,7 @@ func delDownConn(c *client, id string) bool { ...@@ -705,7 +705,7 @@ func delDownConn(c *client, id string) bool {
return true return true
} }
func addDownTrack(c *client, conn *downConnection, remoteTrack *upTrack, remoteConn *upConnection) (*webrtc.RTPSender, error) { func addDownTrack(c *client, conn *rtpDownConnection, remoteTrack *upTrack, remoteConn *upConnection) (*webrtc.RTPSender, error) {
local, err := conn.pc.NewTrack( local, err := conn.pc.NewTrack(
remoteTrack.track.PayloadType(), remoteTrack.track.PayloadType(),
remoteTrack.track.SSRC(), remoteTrack.track.SSRC(),
...@@ -721,7 +721,7 @@ func addDownTrack(c *client, conn *downConnection, remoteTrack *upTrack, remoteC ...@@ -721,7 +721,7 @@ func addDownTrack(c *client, conn *downConnection, remoteTrack *upTrack, remoteC
return nil, err return nil, err
} }
track := &downTrack{ track := &rtpDownTrack{
track: local, track: local,
remote: remoteTrack, remote: remoteTrack,
maxLossBitrate: new(bitrate), maxLossBitrate: new(bitrate),
...@@ -742,7 +742,7 @@ const ( ...@@ -742,7 +742,7 @@ const (
maxLossRate = 1 << 30 maxLossRate = 1 << 30
) )
func (track *downTrack) updateRate(loss uint8, now uint64) { func (track *rtpDownTrack) updateRate(loss uint8, now uint64) {
rate := track.maxLossBitrate.Get(now) rate := track.maxLossBitrate.Get(now)
if rate > maxLossRate { if rate > maxLossRate {
// no recent feedback, reset // no recent feedback, reset
...@@ -771,7 +771,7 @@ func (track *downTrack) updateRate(loss uint8, now uint64) { ...@@ -771,7 +771,7 @@ func (track *downTrack) updateRate(loss uint8, now uint64) {
track.maxLossBitrate.Set(rate, now) track.maxLossBitrate.Set(rate, now)
} }
func rtcpDownListener(conn *downConnection, track *downTrack, s *webrtc.RTPSender) { func rtcpDownListener(conn *rtpDownConnection, track *rtpDownTrack, s *webrtc.RTPSender) {
for { for {
ps, err := s.ReadRTCP() ps, err := s.ReadRTCP()
if err != nil { if err != nil {
...@@ -820,7 +820,7 @@ func rtcpDownListener(conn *downConnection, track *downTrack, s *webrtc.RTPSende ...@@ -820,7 +820,7 @@ func rtcpDownListener(conn *downConnection, track *downTrack, s *webrtc.RTPSende
} }
} }
func trackKinds(down *downConnection) (audio bool, video bool) { func trackKinds(down *rtpDownConnection) (audio bool, video bool) {
if down.pc == nil { if down.pc == nil {
return return
} }
...@@ -926,7 +926,7 @@ func sendNACK(pc *webrtc.PeerConnection, ssrc uint32, first uint16, bitmap uint1 ...@@ -926,7 +926,7 @@ func sendNACK(pc *webrtc.PeerConnection, ssrc uint32, first uint16, bitmap uint1
return pc.WriteRTCP([]rtcp.Packet{packet}) return pc.WriteRTCP([]rtcp.Packet{packet})
} }
func sendRecovery(p *rtcp.TransportLayerNack, track *downTrack) { func sendRecovery(p *rtcp.TransportLayerNack, track *rtpDownTrack) {
var packet rtp.Packet var packet rtp.Packet
buf := make([]byte, packetcache.BufSize) buf := make([]byte, packetcache.BufSize)
for _, nack := range p.Nacks { for _, nack := range p.Nacks {
...@@ -949,7 +949,7 @@ func sendRecovery(p *rtcp.TransportLayerNack, track *downTrack) { ...@@ -949,7 +949,7 @@ func sendRecovery(p *rtcp.TransportLayerNack, track *downTrack) {
} }
} }
func negotiate(c *client, down *downConnection) error { func negotiate(c *client, down *rtpDownConnection) error {
offer, err := down.pc.CreateOffer(nil) offer, err := down.pc.CreateOffer(nil)
if err != nil { if err != nil {
return err return err
...@@ -1094,7 +1094,7 @@ func (c *client) isRequested(label string) bool { ...@@ -1094,7 +1094,7 @@ func (c *client) isRequested(label string) bool {
return c.requested[label] != 0 return c.requested[label] != 0
} }
func addDownConnTracks(c *client, remote *upConnection, tracks []*upTrack) (*downConnection, error) { func addDownConnTracks(c *client, remote *upConnection, tracks []*upTrack) (*rtpDownConnection, error) {
requested := false requested := false
for _, t := range tracks { for _, t := range tracks {
if c.isRequested(t.label) { if c.isRequested(t.label) {
......
...@@ -33,7 +33,7 @@ type upTrack struct { ...@@ -33,7 +33,7 @@ type upTrack struct {
writerDone chan struct{} // closed when the loop dies writerDone chan struct{} // closed when the loop dies
mu sync.Mutex mu sync.Mutex
local []*downTrack local []downTrack
} }
func (up *upTrack) notifyLocal() { func (up *upTrack) notifyLocal() {
...@@ -44,7 +44,7 @@ func (up *upTrack) notifyLocal() { ...@@ -44,7 +44,7 @@ func (up *upTrack) notifyLocal() {
} }
} }
func (up *upTrack) addLocal(local *downTrack) { func (up *upTrack) addLocal(local downTrack) {
up.mu.Lock() up.mu.Lock()
for _, t := range up.local { for _, t := range up.local {
if t == local { if t == local {
...@@ -57,7 +57,7 @@ func (up *upTrack) addLocal(local *downTrack) { ...@@ -57,7 +57,7 @@ func (up *upTrack) addLocal(local *downTrack) {
up.notifyLocal() up.notifyLocal()
} }
func (up *upTrack) delLocal(local *downTrack) bool { func (up *upTrack) delLocal(local downTrack) bool {
up.mu.Lock() up.mu.Lock()
for i, l := range up.local { for i, l := range up.local {
if l == local { if l == local {
...@@ -71,10 +71,10 @@ func (up *upTrack) delLocal(local *downTrack) bool { ...@@ -71,10 +71,10 @@ func (up *upTrack) delLocal(local *downTrack) bool {
return false return false
} }
func (up *upTrack) getLocal() []*downTrack { func (up *upTrack) getLocal() []downTrack {
up.mu.Lock() up.mu.Lock()
defer up.mu.Unlock() defer up.mu.Unlock()
local := make([]*downTrack, len(up.local)) local := make([]downTrack, len(up.local))
copy(local, up.local) copy(local, up.local)
return local return local
} }
...@@ -102,14 +102,10 @@ type upConnection struct { ...@@ -102,14 +102,10 @@ type upConnection struct {
iceCandidates []*webrtc.ICECandidateInit iceCandidates []*webrtc.ICECandidateInit
mu sync.Mutex mu sync.Mutex
local []*downConnection local []downConnection
} }
func (up *upConnection) getPC() *webrtc.PeerConnection { func (up *upConnection) addLocal(local downConnection) {
return up.pc
}
func (up *upConnection) addLocal(local *downConnection) {
up.mu.Lock() up.mu.Lock()
defer up.mu.Unlock() defer up.mu.Unlock()
for _, t := range up.local { for _, t := range up.local {
...@@ -121,7 +117,7 @@ func (up *upConnection) addLocal(local *downConnection) { ...@@ -121,7 +117,7 @@ func (up *upConnection) addLocal(local *downConnection) {
up.local = append(up.local, local) up.local = append(up.local, local)
} }
func (up *upConnection) delLocal(local *downConnection) bool { func (up *upConnection) delLocal(local downConnection) bool {
up.mu.Lock() up.mu.Lock()
defer up.mu.Unlock() defer up.mu.Unlock()
for i, l := range up.local { for i, l := range up.local {
...@@ -133,10 +129,10 @@ func (up *upConnection) delLocal(local *downConnection) bool { ...@@ -133,10 +129,10 @@ func (up *upConnection) delLocal(local *downConnection) bool {
return false return false
} }
func (up *upConnection) getLocal() []*downConnection { func (up *upConnection) getLocal() []downConnection {
up.mu.Lock() up.mu.Lock()
defer up.mu.Unlock() defer up.mu.Unlock()
local := make([]*downConnection, len(up.local)) local := make([]downConnection, len(up.local))
copy(local, up.local) copy(local, up.local)
return local return local
} }
...@@ -239,7 +235,13 @@ func (s *receiverStats) Get(now uint64) (uint8, uint32) { ...@@ -239,7 +235,13 @@ func (s *receiverStats) Get(now uint64) (uint8, uint32) {
return uint8(atomic.LoadUint32(&s.loss)), atomic.LoadUint32(&s.jitter) return uint8(atomic.LoadUint32(&s.loss)), atomic.LoadUint32(&s.jitter)
} }
type downTrack struct { type downTrack interface {
WriteRTP(packat *rtp.Packet) error
Accumulate(bytes uint32)
GetMaxBitrate(now uint64) uint64
}
type rtpDownTrack struct {
track *webrtc.Track track *webrtc.Track
remote *upTrack remote *upTrack
maxLossBitrate *bitrate maxLossBitrate *bitrate
...@@ -248,15 +250,15 @@ type downTrack struct { ...@@ -248,15 +250,15 @@ type downTrack struct {
stats *receiverStats stats *receiverStats
} }
func (down *downTrack) WriteRTP(packet *rtp.Packet) error { func (down *rtpDownTrack) WriteRTP(packet *rtp.Packet) error {
return down.track.WriteRTP(packet) return down.track.WriteRTP(packet)
} }
func (down *downTrack) Accumulate(bytes uint32) { func (down *rtpDownTrack) Accumulate(bytes uint32) {
down.rate.Add(bytes) down.rate.Add(bytes)
} }
func (down *downTrack) GetMaxBitrate(now uint64) uint64 { func (down *rtpDownTrack) GetMaxBitrate(now uint64) uint64 {
br1 := down.maxLossBitrate.Get(now) br1 := down.maxLossBitrate.Get(now)
br2 := down.maxREMBBitrate.Get(now) br2 := down.maxREMBBitrate.Get(now)
if br1 < br2 { if br1 < br2 {
...@@ -265,24 +267,24 @@ func (down *downTrack) GetMaxBitrate(now uint64) uint64 { ...@@ -265,24 +267,24 @@ func (down *downTrack) GetMaxBitrate(now uint64) uint64 {
return br2 return br2
} }
type downConnection struct { type downConnection interface {
Close() error
}
type rtpDownConnection struct {
id string id string
client *client client *client
pc *webrtc.PeerConnection pc *webrtc.PeerConnection
remote *upConnection remote *upConnection
tracks []*downTrack tracks []*rtpDownTrack
iceCandidates []*webrtc.ICECandidateInit iceCandidates []*webrtc.ICECandidateInit
} }
func (down *downConnection) Close() error { func (down *rtpDownConnection) Close() error {
return down.client.action(delConnAction{down.id}) return down.client.action(delConnAction{down.id})
} }
func (down *downConnection) getPC() *webrtc.PeerConnection { func (down *rtpDownConnection) addICECandidate(candidate *webrtc.ICECandidateInit) error {
return down.pc
}
func (down *downConnection) addICECandidate(candidate *webrtc.ICECandidateInit) error {
if down.pc.RemoteDescription() != nil { if down.pc.RemoteDescription() != nil {
return down.pc.AddICECandidate(*candidate) return down.pc.AddICECandidate(*candidate)
} }
...@@ -290,7 +292,7 @@ func (down *downConnection) addICECandidate(candidate *webrtc.ICECandidateInit) ...@@ -290,7 +292,7 @@ func (down *downConnection) addICECandidate(candidate *webrtc.ICECandidateInit)
return nil return nil
} }
func (down *downConnection) flushICECandidates() error { func (down *rtpDownConnection) flushICECandidates() error {
err := flushICECandidates(down.pc, down.iceCandidates) err := flushICECandidates(down.pc, down.iceCandidates)
down.iceCandidates = nil down.iceCandidates = nil
return err return err
......
...@@ -33,7 +33,7 @@ type client struct { ...@@ -33,7 +33,7 @@ type client struct {
actionCh chan interface{} actionCh chan interface{}
mu sync.Mutex mu sync.Mutex
down map[string]*downConnection down map[string]*rtpDownConnection
up map[string]*upConnection up map[string]*upConnection
} }
......
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