diff --git a/pkg/rtc/mediatrackreceiver.go b/pkg/rtc/mediatrackreceiver.go index c45f809b2..28d820477 100644 --- a/pkg/rtc/mediatrackreceiver.go +++ b/pkg/rtc/mediatrackreceiver.go @@ -518,8 +518,8 @@ func (t *MediaTrackReceiver) IsEncrypted() bool { return t.TrackInfo().Encryption != livekit.Encryption_NONE } -func (t *MediaTrackReceiver) HasUserTimestamp() bool { - return t.TrackInfo().GetHasUserTimestamp() +func (t *MediaTrackReceiver) HasRTPTrailerFeature(feature livekit.RTPTrailerFeature) bool { + return slices.Contains(t.TrackInfo().GetRtpTrailerFeatures(), feature) } func (t *MediaTrackReceiver) AddOnClose(f func(isExpectedToResume bool)) { diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index b50568d72..aa749c5ce 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -2832,20 +2832,21 @@ func (p *ParticipantImpl) addPendingTrackLocked(req *livekit.AddTrackRequest) *l } ti := &livekit.TrackInfo{ - Type: req.Type, - Name: req.Name, - Width: req.Width, - Height: req.Height, - Muted: req.Muted, - DisableDtx: req.DisableDtx, - Source: req.Source, - Layers: cloneLayers(req.Layers), - DisableRed: req.DisableRed, - Stereo: req.Stereo, - Encryption: req.Encryption, - Stream: req.Stream, - BackupCodecPolicy: backupCodecPolicy, - AudioFeatures: sutils.DedupeSlice(req.AudioFeatures), + Type: req.Type, + Name: req.Name, + Width: req.Width, + Height: req.Height, + Muted: req.Muted, + DisableDtx: req.DisableDtx, + Source: req.Source, + Layers: cloneLayers(req.Layers), + DisableRed: req.DisableRed, + Stereo: req.Stereo, + Encryption: req.Encryption, + Stream: req.Stream, + BackupCodecPolicy: backupCodecPolicy, + AudioFeatures: sutils.DedupeSlice(req.AudioFeatures), + RtpTrailerFeatures: sutils.DedupeSlice(req.RtpTrailerFeatures), } if req.Stereo && !slices.Contains(ti.AudioFeatures, livekit.AudioTrackFeature_TF_STEREO) { ti.AudioFeatures = append(ti.AudioFeatures, livekit.AudioTrackFeature_TF_STEREO) diff --git a/pkg/rtc/subscribedtrack.go b/pkg/rtc/subscribedtrack.go index c1f59a18a..f213a3307 100644 --- a/pkg/rtc/subscribedtrack.go +++ b/pkg/rtc/subscribedtrack.go @@ -129,7 +129,7 @@ func NewSubscribedTrack(params SubscribedTrackParams) (*SubscribedTrack, error) if isEncrypted { trailer = params.Subscriber.GetTrailer() } - stripUserTimestamp := params.MediaTrack.HasUserTimestamp() && + stripUserTimestamp := params.MediaTrack.HasRTPTrailerFeature(livekit.RTPTrailerFeature_USER_TIMESTAMP) && !params.Subscriber.ProtocolVersion().SupportsUserTimestamp() downTrack, err := sfu.NewDownTrack(sfu.DownTrackParams{ Codecs: codecs, diff --git a/pkg/rtc/types/interfaces.go b/pkg/rtc/types/interfaces.go index 6de873ed6..566af58ba 100644 --- a/pkg/rtc/types/interfaces.go +++ b/pkg/rtc/types/interfaces.go @@ -761,7 +761,7 @@ type MediaTrack interface { ClearAllReceivers(isExpectedToResume bool) IsEncrypted() bool - HasUserTimestamp() bool + HasRTPTrailerFeature(livekit.RTPTrailerFeature) bool } //counterfeiter:generate . LocalMediaTrack diff --git a/pkg/rtc/types/typesfakes/fake_local_media_track.go b/pkg/rtc/types/typesfakes/fake_local_media_track.go index 81eeebd11..0c0826939 100644 --- a/pkg/rtc/types/typesfakes/fake_local_media_track.go +++ b/pkg/rtc/types/typesfakes/fake_local_media_track.go @@ -124,6 +124,17 @@ type FakeLocalMediaTrack struct { getTrackStatsReturnsOnCall map[int]struct { result1 *livekit.RTPStats } + HasRTPTrailerFeatureStub func(livekit.RTPTrailerFeature) bool + hasRTPTrailerFeatureMutex sync.RWMutex + hasRTPTrailerFeatureArgsForCall []struct { + arg1 livekit.RTPTrailerFeature + } + hasRTPTrailerFeatureReturns struct { + result1 bool + } + hasRTPTrailerFeatureReturnsOnCall map[int]struct { + result1 bool + } HasSdpCidStub func(string) bool hasSdpCidMutex sync.RWMutex hasSdpCidArgsForCall []struct { @@ -146,16 +157,6 @@ type FakeLocalMediaTrack struct { hasSignalCidReturnsOnCall map[int]struct { result1 bool } - HasUserTimestampStub func() bool - hasUserTimestampMutex sync.RWMutex - hasUserTimestampArgsForCall []struct { - } - hasUserTimestampReturns struct { - result1 bool - } - hasUserTimestampReturnsOnCall map[int]struct { - result1 bool - } IDStub func() livekit.TrackID iDMutex sync.RWMutex iDArgsForCall []struct { @@ -960,6 +961,67 @@ func (fake *FakeLocalMediaTrack) GetTrackStatsReturnsOnCall(i int, result1 *live }{result1} } +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeature(arg1 livekit.RTPTrailerFeature) bool { + fake.hasRTPTrailerFeatureMutex.Lock() + ret, specificReturn := fake.hasRTPTrailerFeatureReturnsOnCall[len(fake.hasRTPTrailerFeatureArgsForCall)] + fake.hasRTPTrailerFeatureArgsForCall = append(fake.hasRTPTrailerFeatureArgsForCall, struct { + arg1 livekit.RTPTrailerFeature + }{arg1}) + stub := fake.HasRTPTrailerFeatureStub + fakeReturns := fake.hasRTPTrailerFeatureReturns + fake.recordInvocation("HasRTPTrailerFeature", []interface{}{arg1}) + fake.hasRTPTrailerFeatureMutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1 + } + return fakeReturns.result1 +} + +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeatureCallCount() int { + fake.hasRTPTrailerFeatureMutex.RLock() + defer fake.hasRTPTrailerFeatureMutex.RUnlock() + return len(fake.hasRTPTrailerFeatureArgsForCall) +} + +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeatureCalls(stub func(livekit.RTPTrailerFeature) bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = stub +} + +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeatureArgsForCall(i int) livekit.RTPTrailerFeature { + fake.hasRTPTrailerFeatureMutex.RLock() + defer fake.hasRTPTrailerFeatureMutex.RUnlock() + argsForCall := fake.hasRTPTrailerFeatureArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeatureReturns(result1 bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = nil + fake.hasRTPTrailerFeatureReturns = struct { + result1 bool + }{result1} +} + +func (fake *FakeLocalMediaTrack) HasRTPTrailerFeatureReturnsOnCall(i int, result1 bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = nil + if fake.hasRTPTrailerFeatureReturnsOnCall == nil { + fake.hasRTPTrailerFeatureReturnsOnCall = make(map[int]struct { + result1 bool + }) + } + fake.hasRTPTrailerFeatureReturnsOnCall[i] = struct { + result1 bool + }{result1} +} + func (fake *FakeLocalMediaTrack) HasSdpCid(arg1 string) bool { fake.hasSdpCidMutex.Lock() ret, specificReturn := fake.hasSdpCidReturnsOnCall[len(fake.hasSdpCidArgsForCall)] @@ -1082,59 +1144,6 @@ func (fake *FakeLocalMediaTrack) HasSignalCidReturnsOnCall(i int, result1 bool) }{result1} } -func (fake *FakeLocalMediaTrack) HasUserTimestamp() bool { - fake.hasUserTimestampMutex.Lock() - ret, specificReturn := fake.hasUserTimestampReturnsOnCall[len(fake.hasUserTimestampArgsForCall)] - fake.hasUserTimestampArgsForCall = append(fake.hasUserTimestampArgsForCall, struct { - }{}) - stub := fake.HasUserTimestampStub - fakeReturns := fake.hasUserTimestampReturns - fake.recordInvocation("HasUserTimestamp", []interface{}{}) - fake.hasUserTimestampMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *FakeLocalMediaTrack) HasUserTimestampCallCount() int { - fake.hasUserTimestampMutex.RLock() - defer fake.hasUserTimestampMutex.RUnlock() - return len(fake.hasUserTimestampArgsForCall) -} - -func (fake *FakeLocalMediaTrack) HasUserTimestampCalls(stub func() bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = stub -} - -func (fake *FakeLocalMediaTrack) HasUserTimestampReturns(result1 bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = nil - fake.hasUserTimestampReturns = struct { - result1 bool - }{result1} -} - -func (fake *FakeLocalMediaTrack) HasUserTimestampReturnsOnCall(i int, result1 bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = nil - if fake.hasUserTimestampReturnsOnCall == nil { - fake.hasUserTimestampReturnsOnCall = make(map[int]struct { - result1 bool - }) - } - fake.hasUserTimestampReturnsOnCall[i] = struct { - result1 bool - }{result1} -} - func (fake *FakeLocalMediaTrack) ID() livekit.TrackID { fake.iDMutex.Lock() ret, specificReturn := fake.iDReturnsOnCall[len(fake.iDArgsForCall)] diff --git a/pkg/rtc/types/typesfakes/fake_media_track.go b/pkg/rtc/types/typesfakes/fake_media_track.go index c815a5dfe..e9ab26c58 100644 --- a/pkg/rtc/types/typesfakes/fake_media_track.go +++ b/pkg/rtc/types/typesfakes/fake_media_track.go @@ -98,14 +98,15 @@ type FakeMediaTrack struct { getTemporalLayerForSpatialFpsReturnsOnCall map[int]struct { result1 int32 } - HasUserTimestampStub func() bool - hasUserTimestampMutex sync.RWMutex - hasUserTimestampArgsForCall []struct { + HasRTPTrailerFeatureStub func(livekit.RTPTrailerFeature) bool + hasRTPTrailerFeatureMutex sync.RWMutex + hasRTPTrailerFeatureArgsForCall []struct { + arg1 livekit.RTPTrailerFeature } - hasUserTimestampReturns struct { + hasRTPTrailerFeatureReturns struct { result1 bool } - hasUserTimestampReturnsOnCall map[int]struct { + hasRTPTrailerFeatureReturnsOnCall map[int]struct { result1 bool } IDStub func() livekit.TrackID @@ -752,17 +753,18 @@ func (fake *FakeMediaTrack) GetTemporalLayerForSpatialFpsReturnsOnCall(i int, re }{result1} } -func (fake *FakeMediaTrack) HasUserTimestamp() bool { - fake.hasUserTimestampMutex.Lock() - ret, specificReturn := fake.hasUserTimestampReturnsOnCall[len(fake.hasUserTimestampArgsForCall)] - fake.hasUserTimestampArgsForCall = append(fake.hasUserTimestampArgsForCall, struct { - }{}) - stub := fake.HasUserTimestampStub - fakeReturns := fake.hasUserTimestampReturns - fake.recordInvocation("HasUserTimestamp", []interface{}{}) - fake.hasUserTimestampMutex.Unlock() +func (fake *FakeMediaTrack) HasRTPTrailerFeature(arg1 livekit.RTPTrailerFeature) bool { + fake.hasRTPTrailerFeatureMutex.Lock() + ret, specificReturn := fake.hasRTPTrailerFeatureReturnsOnCall[len(fake.hasRTPTrailerFeatureArgsForCall)] + fake.hasRTPTrailerFeatureArgsForCall = append(fake.hasRTPTrailerFeatureArgsForCall, struct { + arg1 livekit.RTPTrailerFeature + }{arg1}) + stub := fake.HasRTPTrailerFeatureStub + fakeReturns := fake.hasRTPTrailerFeatureReturns + fake.recordInvocation("HasRTPTrailerFeature", []interface{}{arg1}) + fake.hasRTPTrailerFeatureMutex.Unlock() if stub != nil { - return stub() + return stub(arg1) } if specificReturn { return ret.result1 @@ -770,37 +772,44 @@ func (fake *FakeMediaTrack) HasUserTimestamp() bool { return fakeReturns.result1 } -func (fake *FakeMediaTrack) HasUserTimestampCallCount() int { - fake.hasUserTimestampMutex.RLock() - defer fake.hasUserTimestampMutex.RUnlock() - return len(fake.hasUserTimestampArgsForCall) +func (fake *FakeMediaTrack) HasRTPTrailerFeatureCallCount() int { + fake.hasRTPTrailerFeatureMutex.RLock() + defer fake.hasRTPTrailerFeatureMutex.RUnlock() + return len(fake.hasRTPTrailerFeatureArgsForCall) } -func (fake *FakeMediaTrack) HasUserTimestampCalls(stub func() bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = stub +func (fake *FakeMediaTrack) HasRTPTrailerFeatureCalls(stub func(livekit.RTPTrailerFeature) bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = stub } -func (fake *FakeMediaTrack) HasUserTimestampReturns(result1 bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = nil - fake.hasUserTimestampReturns = struct { +func (fake *FakeMediaTrack) HasRTPTrailerFeatureArgsForCall(i int) livekit.RTPTrailerFeature { + fake.hasRTPTrailerFeatureMutex.RLock() + defer fake.hasRTPTrailerFeatureMutex.RUnlock() + argsForCall := fake.hasRTPTrailerFeatureArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeMediaTrack) HasRTPTrailerFeatureReturns(result1 bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = nil + fake.hasRTPTrailerFeatureReturns = struct { result1 bool }{result1} } -func (fake *FakeMediaTrack) HasUserTimestampReturnsOnCall(i int, result1 bool) { - fake.hasUserTimestampMutex.Lock() - defer fake.hasUserTimestampMutex.Unlock() - fake.HasUserTimestampStub = nil - if fake.hasUserTimestampReturnsOnCall == nil { - fake.hasUserTimestampReturnsOnCall = make(map[int]struct { +func (fake *FakeMediaTrack) HasRTPTrailerFeatureReturnsOnCall(i int, result1 bool) { + fake.hasRTPTrailerFeatureMutex.Lock() + defer fake.hasRTPTrailerFeatureMutex.Unlock() + fake.HasRTPTrailerFeatureStub = nil + if fake.hasRTPTrailerFeatureReturnsOnCall == nil { + fake.hasRTPTrailerFeatureReturnsOnCall = make(map[int]struct { result1 bool }) } - fake.hasUserTimestampReturnsOnCall[i] = struct { + fake.hasRTPTrailerFeatureReturnsOnCall[i] = struct { result1 bool }{result1} }