From 4d09e5b564a717a33dcfe57cf30b05e38d469b5f Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 30 Jun 2025 09:21:44 +0530 Subject: [PATCH] Log SDP rids to understand the mapping better. (#3770) * Log SDP rids to understand the mapping better. * return early when layer is invalid --- pkg/rtc/mediatrack.go | 34 ++++++++++++++++++---------------- pkg/rtc/participant.go | 30 +++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/pkg/rtc/mediatrack.go b/pkg/rtc/mediatrack.go index 1bdf69e47..b5b7f3d8e 100644 --- a/pkg/rtc/mediatrack.go +++ b/pkg/rtc/mediatrack.go @@ -212,13 +212,14 @@ func (t *MediaTrack) UpdateCodecCid(codecs []*livekit.SimulcastCodec) { } // AddReceiver adds a new RTP receiver to the track, returns true when receiver represents a new codec -func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRemote, mid string) bool { +// and if a receiver was added successfully +func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRemote, mid string) (bool, bool) { var newCodec bool ssrc := uint32(track.SSRC()) buff, rtcpReader := t.params.BufferFactory.GetBufferPair(ssrc) if buff == nil || rtcpReader == nil { t.params.Logger.Errorw("could not retrieve buffer pair", nil) - return newCodec + return newCodec, false } var lastRR uint32 @@ -264,6 +265,18 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe var regressCodec bool mimeType := mime.NormalizeMimeType(track.Codec().MimeType) layer := buffer.GetSpatialLayerForRid(track.RID(), ti) + if layer < 0 { + t.params.Logger.Warnw( + "AddReceiver failed due to negative layer", nil, + "rid", track.RID(), + "layer", layer, + "ssrc", track.SSRC(), + "codec", track.Codec(), + "trackInfo", logger.Proto(ti), + ) + return newCodec, false + } + t.params.Logger.Debugw( "AddReceiver", "rid", track.RID(), @@ -272,17 +285,6 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe "codec", track.Codec(), "trackInfo", logger.Proto(ti), ) - // TODO-REMOVE-AFTER-DEBUG - if layer < 0 { - t.params.Logger.Infow( - "negative layer AddReceiver", - "rid", track.RID(), - "layer", layer, - "ssrc", track.SSRC(), - "codec", track.Codec(), - "trackInfo", logger.Proto(ti), - ) - } wr := t.MediaTrackReceiver.Receiver(mimeType) if wr == nil { priority := -1 @@ -307,7 +309,7 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe if priority < 0 { t.params.Logger.Warnw("could not find codec for webrtc receiver", nil, "webrtcCodec", mimeType, "track", logger.Proto(ti)) t.lock.Unlock() - return false + return newCodec, false } newWR := sfu.NewWebRTCReceiver( @@ -428,7 +430,7 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe "newCodec", newCodec, ) buff.Close() - return false + return newCodec, false } // LK-TODO: can remove this completely when VideoLayers protocol becomes the default as it has info from client or if we decide to use TrackInfo.Simulcast @@ -476,7 +478,7 @@ func (t *MediaTrack) AddReceiver(receiver *webrtc.RTPReceiver, track sfu.TrackRe stats, ) }) - return newCodec + return newCodec, true } func (t *MediaTrack) GetConnectionScoreAndQuality() (float32, livekit.ConnectionQuality) { diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index 10445fe53..82e133361 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -2061,15 +2061,17 @@ func (p *ParticipantImpl) onMediaTrack(rtcTrack *webrtc.TrackRemote, rtpReceiver ) var track sfu.TrackRemote = sfu.NewTrackRemoteFromSdp(rtcTrack, codec) - publishedTrack, isNewTrack := p.mediaTrackReceived(track, rtpReceiver) + publishedTrack, isNewTrack, isReceiverAdded, sdpRids := p.mediaTrackReceived(track, rtpReceiver) if publishedTrack == nil { p.pubLogger.Debugw( - "webrtc Track published but can't find MediaTrack, add to pendingTracks", + "webrtc Track published but can't find MediaTrack in pendingTracks", "kind", track.Kind().String(), "webrtcTrackID", track.ID(), "rid", track.RID(), "SSRC", track.SSRC(), "mime", mime.NormalizeMimeType(codec.MimeType), + "isReceiverAdded", isReceiverAdded, + "sdpRids", logger.StringSlice(sdpRids[:]), ) return } @@ -2085,7 +2087,8 @@ func (p *ParticipantImpl) onMediaTrack(rtcTrack *webrtc.TrackRemote, rtpReceiver p.setIsPublisher(true) p.dirty.Store(true) - p.pubLogger.Infow("mediaTrack published", + p.pubLogger.Infow( + "mediaTrack published", "kind", track.Kind().String(), "trackID", publishedTrack.ID(), "webrtcTrackID", track.ID(), @@ -2094,6 +2097,8 @@ func (p *ParticipantImpl) onMediaTrack(rtcTrack *webrtc.TrackRemote, rtpReceiver "mime", mime.NormalizeMimeType(codec.MimeType), "trackInfo", logger.Proto(publishedTrack.ToProto()), "fromSdp", fromSdp, + "isReceiverAdded", isReceiverAdded, + "sdpRids", logger.StringSlice(sdpRids[:]), ) if !isNewTrack && !publishedTrack.HasPendingCodec() && p.IsReady() { @@ -2757,7 +2762,12 @@ func (p *ParticipantImpl) setTrackMuted(trackID livekit.TrackID, muted bool) *li return trackInfo } -func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver *webrtc.RTPReceiver) (*MediaTrack, bool) { +func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver *webrtc.RTPReceiver) ( + *MediaTrack, + bool, + bool, + buffer.VideoLayersRid, +) { p.pendingTracksLock.Lock() newTrack := false @@ -2778,22 +2788,24 @@ func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver ) p.pendingTracksLock.Unlock() p.pubLogger.Warnw("could not get mid for track", nil, "trackID", track.ID()) - return nil, false + return nil, false, false, buffer.VideoLayersRid{} } // use existing media track to handle simulcast var pubTime time.Duration var isMigrated bool + var ridsFromSdp buffer.VideoLayersRid mt, ok := p.getPublishedTrackBySdpCid(track.ID()).(*MediaTrack) if !ok { signalCid, ti, sdpRids, migrated, createdAt := p.getPendingTrack(track.ID(), ToProtoTrackKind(track.Kind()), true) + ridsFromSdp = sdpRids if ti == nil { p.pendingRemoteTracks = append( p.pendingRemoteTracks, &pendingRemoteTrack{track: track.RTCTrack(), receiver: rtpReceiver}, ) p.pendingTracksLock.Unlock() - return nil, false + return nil, false, false, ridsFromSdp } isMigrated = migrated @@ -2813,7 +2825,7 @@ func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver p.pubLogger.Warnw("migrated track codec mismatched", nil, "track", logger.Proto(ti), "webrtcCodec", parameters) p.pendingTracksLock.Unlock() p.IssueFullReconnect(types.ParticipantCloseReasonMigrateCodecMismatch) - return nil, false + return nil, false, false, ridsFromSdp } } @@ -2858,7 +2870,7 @@ func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver p.pendingTracksLock.Unlock() - mt.AddReceiver(rtpReceiver, track, mid) + _, isReceiverAdded := mt.AddReceiver(rtpReceiver, track, mid) if newTrack { go func() { @@ -2888,7 +2900,7 @@ func (p *ParticipantImpl) mediaTrackReceived(track sfu.TrackRemote, rtpReceiver }() } - return mt, newTrack + return mt, newTrack, isReceiverAdded, ridsFromSdp } func (p *ParticipantImpl) addMigratedTrack(cid string, ti *livekit.TrackInfo) *MediaTrack {