Skip to content

Commit 306dc37

Browse files
authored
Fix error handling in RTPReceiver.Receive
If we failed to startReceive we would still make the Receiver as ready to start reading. Fixes #2929
1 parent 1c45355 commit 306dc37

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

peerconnection_renegotiation_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,10 +1127,13 @@ func TestPeerConnection_Renegotiation_Simulcast(t *testing.T) {
11271127
defer trackMapLock.Unlock()
11281128

11291129
for _, track := range trackMap {
1130-
_, _, err := track.ReadRTP() // Ignore first Read, this is our peeked data
1131-
assert.Nil(t, err)
1130+
_, _, err := track.ReadRTP()
1131+
1132+
// Ignore first Read, this was our peeked data
1133+
if err == nil {
1134+
_, _, err = track.ReadRTP()
1135+
}
11321136

1133-
_, _, err = track.ReadRTP()
11341137
assert.Equal(t, err, io.EOF)
11351138
}
11361139
}

rtpreceiver.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ func (r *RTPReceiver) startReceive(parameters RTPReceiveParameters) error { //no
193193
return errRTPReceiverReceiveAlreadyCalled
194194
default:
195195
}
196-
defer close(r.received)
197196

198197
globalParams := r.getParameters()
199198
codec := RTPCodecCapability{}
@@ -257,6 +256,8 @@ func (r *RTPReceiver) startReceive(parameters RTPReceiveParameters) error { //no
257256
}
258257
}
259258

259+
close(r.received)
260+
260261
return nil
261262
}
262263

@@ -404,7 +405,12 @@ func (r *RTPReceiver) streamsForTrack(t *TrackRemote) *trackStreams {
404405

405406
// readRTP should only be called by a track, this only exists so we can keep state in one place.
406407
func (r *RTPReceiver) readRTP(b []byte, reader *TrackRemote) (n int, a interceptor.Attributes, err error) {
407-
<-r.received
408+
select {
409+
case <-r.received:
410+
case <-r.closed:
411+
return 0, nil, io.EOF
412+
}
413+
408414
if t := r.streamsForTrack(reader); t != nil {
409415
return t.rtpInterceptor.Read(b, a)
410416
}

rtpreceiver_go_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package webrtc
88

99
import (
1010
"context"
11+
"io"
1112
"testing"
1213
"time"
1314

@@ -74,3 +75,38 @@ func TestSetRTPParameters(t *testing.T) {
7475
assert.NoError(t, wan.Stop())
7576
closePairNow(t, sender, receiver)
7677
}
78+
79+
func TestReceiveError(t *testing.T) {
80+
api := NewAPI()
81+
82+
dtlsTransport, err := api.NewDTLSTransport(nil, nil)
83+
assert.NoError(t, err)
84+
85+
rtpReceiver, err := api.NewRTPReceiver(RTPCodecTypeVideo, dtlsTransport)
86+
assert.NoError(t, err)
87+
88+
rtpParameters := RTPReceiveParameters{
89+
Encodings: []RTPDecodingParameters{
90+
{
91+
RTPCodingParameters: RTPCodingParameters{
92+
SSRC: 1000,
93+
},
94+
},
95+
},
96+
}
97+
98+
assert.Error(t, rtpReceiver.Receive(rtpParameters))
99+
100+
chanErrs := make(chan error)
101+
go func() {
102+
_, _, chanErr := rtpReceiver.Read(nil)
103+
chanErrs <- chanErr
104+
105+
_, _, chanErr = rtpReceiver.Track().ReadRTP()
106+
chanErrs <- chanErr
107+
}()
108+
109+
assert.NoError(t, rtpReceiver.Stop())
110+
assert.Error(t, io.ErrClosedPipe, <-chanErrs)
111+
assert.Error(t, io.ErrClosedPipe, <-chanErrs)
112+
}

0 commit comments

Comments
 (0)