feat: update msdk, add logger option to PCMRemoteTrack (#891)

This commit is contained in:
Anunay Maheshwari
2026-04-24 15:39:49 +05:30
committed by GitHub
parent e80807faf2
commit a5b9c39dfc
4 changed files with 37 additions and 23 deletions

10
go.mod
View File

@@ -8,7 +8,7 @@ require (
github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22
github.com/livekit/protocol v1.45.5-0.20260423163244-347de5a2ef78
github.com/magefile/mage v1.17.0
@@ -18,8 +18,8 @@ require (
github.com/pion/interceptor v0.1.44
github.com/pion/rtcp v1.2.16
github.com/pion/rtp v1.10.1
github.com/pion/sdp/v3 v3.0.17
github.com/pion/webrtc/v4 v4.2.6
github.com/pion/sdp/v3 v3.0.18
github.com/pion/webrtc/v4 v4.2.11
github.com/stretchr/testify v1.11.1
github.com/twitchtv/twirp v8.1.3+incompatible
go.uber.org/atomic v1.11.0
@@ -98,11 +98,11 @@ require (
github.com/opencontainers/selinux v1.13.1 // indirect
github.com/ory/dockertest/v3 v3.12.0 // indirect
github.com/pion/datachannel v1.6.0 // indirect
github.com/pion/ice/v4 v4.2.0 // indirect
github.com/pion/ice/v4 v4.2.2 // indirect
github.com/pion/logging v0.2.4 // indirect
github.com/pion/mdns/v2 v2.1.0 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/sctp v1.9.2 // indirect
github.com/pion/sctp v1.9.4 // indirect
github.com/pion/srtp/v3 v3.0.10 // indirect
github.com/pion/stun/v3 v3.1.1 // indirect
github.com/pion/transport/v4 v4.0.1 // indirect

20
go.sum
View File

@@ -155,8 +155,8 @@ github.com/lithammer/shortuuid/v4 v4.2.0 h1:LMFOzVB3996a7b8aBuEXxqOBflbfPQAiVzkI
github.com/lithammer/shortuuid/v4 v4.2.0/go.mod h1:D5noHZ2oFw/YaKCfGy0YxyE7M0wMbezmMjPdhyEFe6Y=
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731 h1:9x+U2HGLrSw5ATTo469PQPkqzdoU7be46ryiCDO3boc=
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731/go.mod h1:Rs3MhFwutWhGwmY1VQsygw28z5bWcnEYmS1OG9OxjOQ=
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57 h1:Y0dZHH9gY70h+jPYEonvWUrPXxrp8YC+LWDaUUM/1mA=
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57/go.mod h1:7ssWiG+U4xnbvLih9WiZbhQP6zIKMjgXdUtIE1bm/E8=
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de h1:obfPAPRvdcmCAUZRm+UxDRri578dz1JodzG1elyBrVw=
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de/go.mod h1:7ssWiG+U4xnbvLih9WiZbhQP6zIKMjgXdUtIE1bm/E8=
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22 h1:dzCBxOGLLWVtQhL7OYK2EGN+5Q+23Mq/jfz4vQisirA=
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22/go.mod h1:mSNtYzSf6iY9xM3UX42VEI+STHvMgHmrYzEHPcdhB8A=
github.com/livekit/protocol v1.45.5-0.20260423163244-347de5a2ef78 h1:kT824Ziy89MSD2/UcvgGZWZ5iiEGepDAvu9phjYHiT0=
@@ -221,8 +221,8 @@ github.com/pion/datachannel v1.6.0 h1:XecBlj+cvsxhAMZWFfFcPyUaDZtd7IJvrXqlXD/53i
github.com/pion/datachannel v1.6.0/go.mod h1:ur+wzYF8mWdC+Mkis5Thosk+u/VOL287apDNEbFpsIk=
github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc=
github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo=
github.com/pion/ice/v4 v4.2.0 h1:jJC8S+CvXCCvIQUgx+oNZnoUpt6zwc34FhjWwCU4nlw=
github.com/pion/ice/v4 v4.2.0/go.mod h1:EgjBGxDgmd8xB0OkYEVFlzQuEI7kWSCFu+mULqaisy4=
github.com/pion/ice/v4 v4.2.2 h1:dQJzzcgTFHDYyV3BoCfjPeX+JEtr58BWPi4PGyo6Vjg=
github.com/pion/ice/v4 v4.2.2/go.mod h1:2quLV1S5v1tAx3VvAJaH//KGitRXvo4RKlX6D3tnN+c=
github.com/pion/interceptor v0.1.44 h1:sNlZwM8dWXU9JQAkJh8xrarC0Etn8Oolcniukmuy0/I=
github.com/pion/interceptor v0.1.44/go.mod h1:4atVlBkcgXuUP+ykQF0qOCGU2j7pQzX2ofvPRFsY5RY=
github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
@@ -235,10 +235,10 @@ github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo=
github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo=
github.com/pion/rtp v1.10.1 h1:xP1prZcCTUuhO2c83XtxyOHJteISg6o8iPsE2acaMtA=
github.com/pion/rtp v1.10.1/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM=
github.com/pion/sctp v1.9.2 h1:HxsOzEV9pWoeggv7T5kewVkstFNcGvhMPx0GvUOUQXo=
github.com/pion/sctp v1.9.2/go.mod h1:OTOlsQ5EDQ6mQ0z4MUGXt2CgQmKyafBEXhUVqLRB6G8=
github.com/pion/sdp/v3 v3.0.17 h1:9SfLAW/fF1XC8yRqQ3iWGzxkySxup4k4V7yN8Fs8nuo=
github.com/pion/sdp/v3 v3.0.17/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo=
github.com/pion/sctp v1.9.4 h1:cMxEu0F5tbP4qH07bKf1Zjf4rUih9LIo0qQt424e258=
github.com/pion/sctp v1.9.4/go.mod h1:N20Dq6LY+JvJDAh9VVh1JELngb2rQ8dPgds5yBWiPgw=
github.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI=
github.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8=
github.com/pion/srtp/v3 v3.0.10 h1:tFirkpBb3XccP5VEXLi50GqXhv5SKPxqrdlhDCJlZrQ=
github.com/pion/srtp/v3 v3.0.10/go.mod h1:3mOTIB0cq9qlbn59V4ozvv9ClW/BSEbRp4cY0VtaR7M=
github.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw=
@@ -249,8 +249,8 @@ github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k
github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM=
github.com/pion/turn/v4 v4.1.4 h1:EU11yMXKIsK43FhcUnjLlrhE4nboHZq+TXBIi3QpcxQ=
github.com/pion/turn/v4 v4.1.4/go.mod h1:ES1DXVFKnOhuDkqn9hn5VJlSWmZPaRJLyBXoOeO/BmQ=
github.com/pion/webrtc/v4 v4.2.6 h1:e9H/du7PbYA2qMJkqKp9Ou2z5Igb/6qbKSeEeUCVv0M=
github.com/pion/webrtc/v4 v4.2.6/go.mod h1:+GAy0jwidoZAHsgjsx77sH09spnV0YWjpB3ROAXmz5A=
github.com/pion/webrtc/v4 v4.2.11 h1:QUX1QZKlNIn4O7U5JxLPGP0sV5RTncZkzu9SPR3jVNU=
github.com/pion/webrtc/v4 v4.2.11/go.mod h1:s/rAiyy77GyRFrZMx+Ls6aua26dIBPudH8/ZHYbIRWY=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=

View File

@@ -46,7 +46,7 @@ func WithHWStats() PCMLocalTrackOption {
type PCMLocalTrack struct {
*webrtc.TrackLocalStaticSample
opusWriter media.WriteCloser[[]byte]
opusWriter media.WriteCloser[opus.Sample]
pcmWriter media.WriteCloser[media.PCM16Sample]
resampledPCMWriter media.WriteCloser[media.PCM16Sample]
@@ -114,12 +114,12 @@ func NewPCMLocalTrack(
}
// opusWriter writes opus payloads to the track
var opusWriter media.WriteCloser[[]byte]
var opusWriter media.WriteCloser[opus.Sample]
if params.Encryptor != nil {
encryptionHandler := newEncryptionHandler(track, params.Encryptor, sourceSampleRate)
opusWriter = media.FromSampleWriter[[]byte](encryptionHandler, sourceSampleRate, defaultPCMFrameDuration)
opusWriter = media.FromSampleWriter[opus.Sample](encryptionHandler, sourceSampleRate, defaultPCMFrameDuration)
} else {
opusWriter = media.FromSampleWriter[[]byte](track, DefaultOpusSampleRate, defaultPCMFrameDuration)
opusWriter = media.FromSampleWriter[opus.Sample](track, DefaultOpusSampleRate, defaultPCMFrameDuration)
}
// pcmWriter encodes opus samples from PCM16 samples and writes them to opusWriter
pcmWriter, err := opus.Encode(opusWriter, sourceChannels, logger)

View File

@@ -35,6 +35,7 @@ type PCMRemoteTrackParams struct {
TargetSampleRate int
TargetChannels int
Decryptor Decryptor
Logger protoLogger.Logger
}
type PCMRemoteTrackOption func(*PCMRemoteTrackParams)
@@ -63,13 +64,21 @@ func WithDecryptor(decryptor Decryptor) PCMRemoteTrackOption {
}
}
// WithLogger sets the logger used by the PCMRemoteTrack. If not set, the
// package-global logger from protoLogger.GetLogger() is used.
func WithLogger(logger protoLogger.Logger) PCMRemoteTrackOption {
return func(p *PCMRemoteTrackParams) {
p.Logger = logger
}
}
type PCMRemoteTrack struct {
trackRemote *webrtc.TrackRemote
channels int
sampleRate int
isResampled bool
opusWriter media.WriteCloser[[]byte]
opusWriter media.WriteCloser[opus.Sample]
pcmMWriter media.WriteCloser[media.PCM16Sample]
resampledPCMWriter media.WriteCloser[media.PCM16Sample]
logger protoLogger.Logger
@@ -98,6 +107,11 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
opt(options)
}
logger := options.Logger
if logger == nil {
logger = protoLogger.GetLogger()
}
targetChannels := options.TargetChannels
targetSampleRate := options.TargetSampleRate
if targetChannels <= 0 || targetChannels > 2 || targetSampleRate <= 0 {
@@ -122,7 +136,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
// opus writer takes opus samples, decodes them to PCM16 samples
// and writes them to the pcmMWriter
opusWriter, err := opus.Decode(resampledPCMWriter, targetChannels, protoLogger.GetLogger())
opusWriter, err := opus.Decode(resampledPCMWriter, targetChannels, logger)
if err != nil {
return nil, err
}
@@ -137,7 +151,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
resampledPCMWriter: resampledPCMWriter,
sampleRate: targetSampleRate,
channels: targetChannels,
logger: protoLogger.GetLogger(),
logger: logger,
isResampled: isResampled,
decryptor: options.Decryptor,
}
@@ -148,7 +162,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
func (t *PCMRemoteTrack) processSamples(handleJitter bool) {
// Handler takes RTP packets and writes the payload to opusWriter
var h rtp.Handler = rtp.NewMediaStreamIn(t.opusWriter)
var h rtp.Handler = rtp.NewMediaStreamIn[opus.Sample](t.opusWriter)
if t.decryptor != nil {
// Ideally, we should check if the track is encrypted with the