Skip to content

Commit 76634b1

Browse files
committed
Add SetFireOnTrackBeforeFirstRTP
1 parent 8fbf821 commit 76634b1

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

peerconnection.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,10 @@ func (pc *PeerConnection) startReceiver(incoming trackDetails, receiver *RTPRece
12451245
return
12461246
}
12471247

1248+
if pc.api.settingEngine.fireOnTrackBeforeFirstRTP {
1249+
pc.onTrack(t, receiver)
1250+
return
1251+
}
12481252
go func(track *TrackRemote) {
12491253
b := make([]byte, pc.api.settingEngine.getReceiveMTU())
12501254
n, _, err := track.peek(b)

settingengine.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ type SettingEngine struct {
101101
srtpProtectionProfiles []dtls.SRTPProtectionProfile
102102
receiveMTU uint
103103
iceMaxBindingRequests *uint16
104+
fireOnTrackBeforeFirstRTP bool
104105
}
105106

106107
// getReceiveMTU returns the configured MTU. If SettingEngine's MTU is configured to 0 it returns the default
@@ -491,3 +492,12 @@ func (e *SettingEngine) SetSCTPRTOMax(rtoMax time.Duration) {
491492
func (e *SettingEngine) SetICEBindingRequestHandler(bindingRequestHandler func(m *stun.Message, local, remote ice.Candidate, pair *ice.CandidatePair) bool) {
492493
e.iceBindingRequestHandler = bindingRequestHandler
493494
}
495+
496+
// SetFireOnTrackBeforeFirstRTP sets if firing the OnTrack event should happen
497+
// before any RTP packets are received. Setting this to true will
498+
// have the Track's Codec and PayloadTypes be initially set to their
499+
// zero values in the OnTrack handler.
500+
// Note: This does not yet affect simulcast tracks.
501+
func (e *SettingEngine) SetFireOnTrackBeforeFirstRTP(fireOnTrackBeforeFirstRTP bool) {
502+
e.fireOnTrackBeforeFirstRTP = fireOnTrackBeforeFirstRTP
503+
}

settingengine_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,3 +340,57 @@ func TestSetHooks(t *testing.T) {
340340
t.Errorf("Failed to set DTLS Certificate Request Hook")
341341
}
342342
}
343+
344+
func TestSetFireOnTrackBeforeFirstRTP(t *testing.T) {
345+
lim := test.TimeOut(time.Second * 30)
346+
defer lim.Stop()
347+
348+
report := test.CheckRoutines(t)
349+
defer report()
350+
351+
s := SettingEngine{}
352+
s.SetFireOnTrackBeforeFirstRTP(true)
353+
354+
mediaEngineOne := &MediaEngine{}
355+
assert.NoError(t, mediaEngineOne.RegisterCodec(RTPCodecParameters{
356+
RTPCodecCapability: RTPCodecCapability{MimeType: "video/VP8", ClockRate: 90000, Channels: 0, SDPFmtpLine: "", RTCPFeedback: nil},
357+
PayloadType: 100,
358+
}, RTPCodecTypeVideo))
359+
360+
mediaEngineTwo := &MediaEngine{}
361+
assert.NoError(t, mediaEngineTwo.RegisterCodec(RTPCodecParameters{
362+
RTPCodecCapability: RTPCodecCapability{MimeType: "video/VP8", ClockRate: 90000, Channels: 0, SDPFmtpLine: "", RTCPFeedback: nil},
363+
PayloadType: 200,
364+
}, RTPCodecTypeVideo))
365+
366+
offerer, err := NewAPI(WithMediaEngine(mediaEngineOne), WithSettingEngine(s)).NewPeerConnection(Configuration{})
367+
assert.NoError(t, err)
368+
369+
answerer, err := NewAPI(WithMediaEngine(mediaEngineTwo)).NewPeerConnection(Configuration{})
370+
assert.NoError(t, err)
371+
372+
track, err := NewTrackLocalStaticSample(RTPCodecCapability{MimeType: MimeTypeVP8}, "video", "pion")
373+
assert.NoError(t, err)
374+
375+
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
376+
assert.NoError(t, err)
377+
378+
_, err = answerer.AddTrack(track)
379+
assert.NoError(t, err)
380+
381+
onTrackFired, onTrackFiredFunc := context.WithCancel(context.Background())
382+
offerer.OnTrack(func(track *TrackRemote, _ *RTPReceiver) {
383+
_, _, err = track.Read(make([]byte, 1500))
384+
assert.NoError(t, err)
385+
assert.Equal(t, track.PayloadType(), PayloadType(100))
386+
assert.Equal(t, track.Codec().RTPCodecCapability.MimeType, "video/VP8")
387+
388+
onTrackFiredFunc()
389+
})
390+
391+
assert.NoError(t, signalPair(offerer, answerer))
392+
393+
sendVideoUntilDone(onTrackFired.Done(), t, []*TrackLocalStaticSample{track})
394+
395+
closePairNow(t, offerer, answerer)
396+
}

0 commit comments

Comments
 (0)