From 27bca60bb29d4cb7e8514d64937cd0e609ab4885 Mon Sep 17 00:00:00 2001 From: boks1971 Date: Sat, 16 Aug 2025 15:05:19 +0530 Subject: [PATCH] munges --- pkg/rtc/mediatracksubscriptions.go | 3 ++- pkg/rtc/participant.go | 4 ++- pkg/rtc/participant_sdp.go | 3 ++- pkg/rtc/transport.go | 40 ++++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/pkg/rtc/mediatracksubscriptions.go b/pkg/rtc/mediatracksubscriptions.go index 9026a5d84..9aef3c71a 100644 --- a/pkg/rtc/mediatracksubscriptions.go +++ b/pkg/rtc/mediatracksubscriptions.go @@ -16,6 +16,7 @@ package rtc import ( "errors" + "slices" "sync" "github.com/pion/rtcp" @@ -311,7 +312,7 @@ func (t *MediaTrackSubscriptions) AddSubscriber(sub types.LocalParticipant, wr * if transceiver == nil { info := t.params.MediaTrack.ToProto() addTrackParams := types.AddTrackParams{ - Stereo: info.Stereo, + Stereo: slices.Contains(info.AudioFeatures, livekit.AudioTrackFeature_TF_STEREO), Red: !info.DisableRed, } if addTrackParams.Red && (len(codecs) == 1 && mime.IsMimeTypeStringOpus(codecs[0].MimeType)) { diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index bff2c3879..98f4441f9 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -2713,6 +2713,8 @@ func (p *ParticipantImpl) addPendingTrackLocked(req *livekit.AddTrackRequest) *l track.(*MediaTrack).UpdateCodecInfo(req.SimulcastCodecs) return track.ToProto() + + // SINGLE-PEER-CONNECTION-TODO: AddRemoteTrack } backupCodecPolicy := req.BackupCodecPolicy @@ -3792,7 +3794,7 @@ func (p *ParticipantImpl) UpdateAudioTrack(update *livekit.UpdateLocalAudioTrack if ti.Sid == update.TrackSid { isPending = true - ti.AudioFeatures = update.Features + ti.AudioFeatures = sutils.DedupeSlice(update.Features) ti.Stereo = false ti.DisableDtx = false for _, feature := range update.Features { diff --git a/pkg/rtc/participant_sdp.go b/pkg/rtc/participant_sdp.go index d356ce7d8..3a0b9d027 100644 --- a/pkg/rtc/participant_sdp.go +++ b/pkg/rtc/participant_sdp.go @@ -16,6 +16,7 @@ package rtc import ( "fmt" + "slices" "strconv" "strings" @@ -467,7 +468,7 @@ func (p *ParticipantImpl) configurePublisherAnswer(answer webrtc.SessionDescript if !ti.DisableDtx { attr.Value += ";usedtx=1" } - if ti.Stereo { + if slices.Contains(ti.AudioFeatures, livekit.AudioTrackFeature_TF_STEREO) { attr.Value += ";stereo=1;maxaveragebitrate=510000" } m.Attributes[i] = attr diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index d9b3494a5..a3bf91e68 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -935,7 +935,6 @@ func (t *PCTransport) AddTrack(trackLocal webrtc.TrackLocal, params types.AddTra return } - // as there is no way to get transceiver from sender, search for _, tr := range t.pc.GetTransceivers() { if tr.Sender() == sender { transceiver = tr @@ -1021,7 +1020,7 @@ func (t *PCTransport) AddRemoteTrackAndNegotiate( } } if !disabled && !mime.IsMimeTypeStringRTX(c.RTPCodecCapability.MimeType) { - // SINGLE-PEER-CONNECTION-TOOD: remove `nack` for RED and add `nack` for Opus + // SINGLE-PEER-CONNECTION-TOOD: remove `nack` for RED? if rtpCodecType == webrtc.RTPCodecTypeVideo { c.RTPCodecCapability.RTCPFeedback = rtcpFeedbackConfig.Video } else { @@ -1082,9 +1081,40 @@ func (t *PCTransport) AddRemoteTrackAndNegotiate( leftCodecs = append(leftCodecs, enabledCodec) } } - transceiver.SetCodecPreferences(append(append([]webrtc.RTPCodecParameters{}, preferredCodecs...), leftCodecs...)) - // SINGLE-PEER-CONNECTION-TOOD: need to configure stereo for audio codecs - // SINGLE-PEER-CONNECTION-TODO: do setCodecPreferencesOpusRedForPublisher for audio + + enabledCodecs = append(append([]webrtc.RTPCodecParameters{}, preferredCodecs...), leftCodecs...) + + // enable dtx, stereo for Opus + opusPayload := webrtc.PayloadType(0) + for _, enabledCodec := range enabledCodecs { + if mime.IsMimeTypeStringOpus(enabledCodec.RTPCodecCapability.MimeType) { + opusPayload = enabledCodec.PayloadType + if !ti.DisableDtx { + enabledCodec.RTPCodecCapability.SDPFmtpLine += ";usedtx=1" + } + if slices.Contains(ti.AudioFeatures, livekit.AudioTrackFeature_TF_STEREO) { + enabledCodec.RTPCodecCapability.SDPFmtpLine += ";stereo=1;maxaveragebitrate=510000" + } + break + } + } + + // prioritize audio/red if not disabled and available + if opusPayload != 0 { + preferredCodecs = nil + leftCodecs = nil + for _, enabledCodec := range enabledCodecs { + if !ti.DisableRed && mime.IsMimeTypeStringRED(enabledCodec.RTPCodecCapability.MimeType) && strings.Contains(enabledCodec.RTPCodecCapability.SDPFmtpLine, strconv.FormatInt(int64(opusPayload), 10)) { + preferredCodecs = append(preferredCodecs, enabledCodec) + } else { + leftCodecs = append(leftCodecs, enabledCodec) + } + } + + enabledCodecs = append(append([]webrtc.RTPCodecParameters{}, preferredCodecs...), leftCodecs...) + } + + transceiver.SetCodecPreferences(enabledCodecs) t.Negotiate(true) return nil