@@ -7,11 +7,9 @@ import (
7
7
"io/ioutil"
8
8
"net/http"
9
9
"strconv"
10
- "sync"
11
10
"time"
12
11
13
12
"github.com/pions/rtcp"
14
- "github.com/pions/rtp"
15
13
"github.com/pions/webrtc"
16
14
17
15
"github.com/pions/webrtc/examples/internal/signal"
@@ -84,41 +82,38 @@ func main() {
84
82
panic (err )
85
83
}
86
84
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 )
92
86
// Set a handler for when a new remote track starts, this just distributes all our packets
93
87
// to connected peers
94
- peerConnection .OnTrack (func (track * webrtc.Track ) {
88
+ peerConnection .OnTrack (func (remoteTrack * webrtc.Track , receiver * webrtc. RTPReceiver ) {
95
89
// Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
96
90
// This can be less wasteful by processing incoming RTCP events, then we would emit a NACK/PLI when a viewer requests it
97
91
go func () {
98
92
ticker := time .NewTicker (rtcpPLIInterval )
99
93
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 {
101
95
fmt .Println (err )
102
96
}
103
97
}
104
98
}()
105
99
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
108
106
107
+ rtpBuf := make ([]byte , 1400 )
109
108
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 )
120
116
}
121
- outboundRTPLock .RUnlock ()
122
117
}
123
118
})
124
119
@@ -143,8 +138,7 @@ func main() {
143
138
// Get the LocalDescription and take it to base64 so we can paste in browser
144
139
fmt .Println (signal .Encode (answer ))
145
140
146
- outboundSSRC := <- inboundSSRC
147
- outboundPayloadType := <- inboundPayloadType
141
+ localTrack := <- localTrackChan
148
142
for {
149
143
fmt .Println ("" )
150
144
fmt .Println ("Curl an base64 SDP to start sendonly peer connection" )
@@ -158,21 +152,11 @@ func main() {
158
152
panic (err )
159
153
}
160
154
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 )
168
156
if err != nil {
169
157
panic (err )
170
158
}
171
159
172
- outboundRTPLock .Lock ()
173
- outboundRTP = append (outboundRTP , vp8Track .RawRTP )
174
- outboundRTPLock .Unlock ()
175
-
176
160
// Set the remote SessionDescription
177
161
err = peerConnection .SetRemoteDescription (recvOnlyOffer )
178
162
if err != nil {
0 commit comments