mirror of
https://github.com/jech/galene.git
synced 2024-11-26 02:25:58 +01:00
Make downTrack and downConnection into interfaces.
This commit is contained in:
parent
d9f2a93615
commit
e7f9a8f3dc
3 changed files with 42 additions and 40 deletions
24
client.go
24
client.go
|
@ -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 {
|
||||||
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
|
||||||
})
|
})
|
||||||
|
|
||||||
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 {
|
||||||
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
|
||||||
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 (
|
||||||
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) {
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
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) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
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) {
|
||||||
|
|
56
conn.go
56
conn.go
|
@ -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() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
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 {
|
||||||
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 {
|
||||||
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) {
|
||||||
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 {
|
||||||
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) {
|
||||||
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 {
|
||||||
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 {
|
||||||
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)
|
||||||
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
|
||||||
|
|
2
group.go
2
group.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue