@@ -7,11 +7,9 @@ import (
77 "io/ioutil"
88 "net/http"
99 "strconv"
10- "sync"
1110 "time"
1211
1312 "github.com/pions/rtcp"
14- "github.com/pions/rtp"
1513 "github.com/pions/webrtc"
1614
1715 "github.com/pions/webrtc/examples/internal/signal"
@@ -84,41 +82,38 @@ func main() {
8482 panic (err )
8583 }
8684
87- inboundSSRC := make (chan uint32 )
88- inboundPayloadType := make (chan uint8 )
89-
90- outboundRTP := []chan <- * rtp.Packet {}
91- var outboundRTPLock sync.RWMutex
85+ localTrackChan := make (chan * webrtc.Track )
9286 // Set a handler for when a new remote track starts, this just distributes all our packets
9387 // to connected peers
94- peerConnection .OnTrack (func (track * webrtc.Track ) {
88+ peerConnection .OnTrack (func (remoteTrack * webrtc.Track , receiver * webrtc. RTPReceiver ) {
9589 // Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
9690 // This can be less wasteful by processing incoming RTCP events, then we would emit a NACK/PLI when a viewer requests it
9791 go func () {
9892 ticker := time .NewTicker (rtcpPLIInterval )
9993 for range ticker .C {
100- if err := peerConnection .SendRTCP (& rtcp.PictureLossIndication {MediaSSRC : track .SSRC }); err != nil {
94+ if err := peerConnection .SendRTCP (& rtcp.PictureLossIndication {MediaSSRC : remoteTrack .SSRC () }); err != nil {
10195 fmt .Println (err )
10296 }
10397 }
10498 }()
10599
106- inboundSSRC <- track .SSRC
107- inboundPayloadType <- track .PayloadType
100+ // Create a local track, all our SFU clients will be fed via this track
101+ localTrack , err := peerConnection .NewTrack (remoteTrack .PayloadType (), remoteTrack .SSRC (), "video" , "pion" )
102+ if err != nil {
103+ panic (err )
104+ }
105+ localTrackChan <- localTrack
108106
107+ rtpBuf := make ([]byte , 1400 )
109108 for {
110- rtpPacket := <- track .Packets
111-
112- outboundRTPLock .RLock ()
113- for _ , outChan := range outboundRTP {
114- outPacket := rtpPacket
115- outPacket .Payload = append ([]byte {}, outPacket .Payload ... )
116- select {
117- case outChan <- outPacket :
118- default :
119- }
109+ i , err := remoteTrack .Read (rtpBuf )
110+ if err != nil {
111+ panic (err )
112+ }
113+
114+ if _ , err = localTrack .Write (rtpBuf [:i ]); err != nil {
115+ panic (err )
120116 }
121- outboundRTPLock .RUnlock ()
122117 }
123118 })
124119
@@ -143,8 +138,7 @@ func main() {
143138 // Get the LocalDescription and take it to base64 so we can paste in browser
144139 fmt .Println (signal .Encode (answer ))
145140
146- outboundSSRC := <- inboundSSRC
147- outboundPayloadType := <- inboundPayloadType
141+ localTrack := <- localTrackChan
148142 for {
149143 fmt .Println ("" )
150144 fmt .Println ("Curl an base64 SDP to start sendonly peer connection" )
@@ -158,21 +152,11 @@ func main() {
158152 panic (err )
159153 }
160154
161- // Create a single VP8 Track to send videa
162- vp8Track , err := peerConnection .NewRawRTPTrack (outboundPayloadType , outboundSSRC , "video" , "pion" )
163- if err != nil {
164- panic (err )
165- }
166-
167- _ , err = peerConnection .AddTrack (vp8Track )
155+ _ , err = peerConnection .AddTrack (localTrack )
168156 if err != nil {
169157 panic (err )
170158 }
171159
172- outboundRTPLock .Lock ()
173- outboundRTP = append (outboundRTP , vp8Track .RawRTP )
174- outboundRTPLock .Unlock ()
175-
176160 // Set the remote SessionDescription
177161 err = peerConnection .SetRemoteDescription (recvOnlyOffer )
178162 if err != nil {
0 commit comments