Skip to content

Commit 271ab55

Browse files
LeeTeng2001Sean-Der
authored andcommitted
Add WithPayloader to TrackLocalStatic
Allow custom payloader depending on the mime type Fixes #2928
1 parent 76634b1 commit 271ab55

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

track_local_static.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type TrackLocalStaticRTP struct {
3131
mu sync.RWMutex
3232
bindings []trackBinding
3333
codec RTPCodecCapability
34+
payloader func(RTPCodecCapability) (rtp.Payloader, error)
3435
id, rid, streamID string
3536
}
3637

@@ -57,6 +58,13 @@ func WithRTPStreamID(rid string) func(*TrackLocalStaticRTP) {
5758
}
5859
}
5960

61+
// WithPayloader allows the user to override the Payloader
62+
func WithPayloader(h func(RTPCodecCapability) (rtp.Payloader, error)) func(*TrackLocalStaticRTP) {
63+
return func(s *TrackLocalStaticRTP) {
64+
s.payloader = h
65+
}
66+
}
67+
6068
// Bind is called by the PeerConnection after negotiation is complete
6169
// This asserts that the code requested is supported by the remote peer.
6270
// If so it sets up all the state (SSRC and PayloadType) to have a call
@@ -250,7 +258,12 @@ func (s *TrackLocalStaticSample) Bind(t TrackLocalContext) (RTPCodecParameters,
250258
return codec, nil
251259
}
252260

253-
payloader, err := payloaderForCodec(codec.RTPCodecCapability)
261+
payloadHandler := s.rtpTrack.payloader
262+
if payloadHandler == nil {
263+
payloadHandler = payloaderForCodec
264+
}
265+
266+
payloader, err := payloadHandler(codec.RTPCodecCapability)
254267
if err != nil {
255268
return codec, err
256269
}

track_local_static_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ package webrtc
99
import (
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

Comments
 (0)