@@ -9,12 +9,14 @@ package webrtc
99import (
1010 "context"
1111 "errors"
12+ "sync/atomic"
1213 "testing"
1314 "time"
1415
1516 "github.com/pion/rtp"
1617 "github.com/pion/transport/v3/test"
1718 "github.com/stretchr/testify/assert"
19+ "github.com/stretchr/testify/require"
1820)
1921
2022// If a remote doesn't support a Codec used by a `TrackLocalStatic`
@@ -336,3 +338,49 @@ func Test_TrackLocalStatic_RTX(t *testing.T) {
336338
337339 closePairNow (t , offerer , answerer )
338340}
341+
342+ type customCodecPayloader struct {
343+ invokeCount atomic.Int32
344+ }
345+
346+ func (c * customCodecPayloader ) Payload (_ uint16 , payload []byte ) [][]byte {
347+ c .invokeCount .Add (1 )
348+ return [][]byte {payload }
349+ }
350+
351+ func Test_TrackLocalStatic_Payloader (t * testing.T ) {
352+ const mimeTypeCustomCodec = "video/custom-codec"
353+
354+ mediaEngine := & MediaEngine {}
355+ assert .NoError (t , mediaEngine .RegisterCodec (RTPCodecParameters {
356+ RTPCodecCapability : RTPCodecCapability {MimeType : mimeTypeCustomCodec , ClockRate : 90000 , Channels : 0 , SDPFmtpLine : "" , RTCPFeedback : nil },
357+ PayloadType : 96 ,
358+ }, RTPCodecTypeVideo ))
359+
360+ offerer , err := NewAPI (WithMediaEngine (mediaEngine )).NewPeerConnection (Configuration {})
361+ assert .NoError (t , err )
362+
363+ answerer , err := NewAPI (WithMediaEngine (mediaEngine )).NewPeerConnection (Configuration {})
364+ assert .NoError (t , err )
365+
366+ customPayloader := & customCodecPayloader {}
367+ track , err := NewTrackLocalStaticSample (RTPCodecCapability {MimeType : mimeTypeCustomCodec }, "video" , "pion" , WithPayloader (func (c RTPCodecCapability ) (rtp.Payloader , error ) {
368+ require .Equal (t , c .MimeType , mimeTypeCustomCodec )
369+ return customPayloader , nil
370+ }))
371+ assert .NoError (t , err )
372+
373+ _ , err = offerer .AddTrack (track )
374+ assert .NoError (t , err )
375+
376+ assert .NoError (t , signalPair (offerer , answerer ))
377+
378+ onTrackFired , onTrackFiredFunc := context .WithCancel (context .Background ())
379+ answerer .OnTrack (func (* TrackRemote , * RTPReceiver ) {
380+ onTrackFiredFunc ()
381+ })
382+
383+ sendVideoUntilDone (onTrackFired .Done (), t , []* TrackLocalStaticSample {track })
384+
385+ closePairNow (t , offerer , answerer )
386+ }
0 commit comments