mirror of
https://github.com/livekit/livekit.git
synced 2026-05-14 20:35:27 +00:00
Increment RTP timestamp on padding when using dummy start. (#3989)
* Increment RTP timestamp on padding when using dummy start. This allows things like egress to have proper sequence to start the pipeline. * test
This commit is contained in:
@@ -88,6 +88,7 @@ const (
|
||||
|
||||
waitBeforeSendPaddingOnMute = 100 * time.Millisecond
|
||||
maxPaddingOnMuteDuration = 5 * time.Second
|
||||
paddingOnMuteInterval = 100 * time.Millisecond
|
||||
)
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
@@ -1158,7 +1159,14 @@ func (d *DownTrack) WritePaddingRTP(bytesToSend int, paddingOnMute bool, forceMa
|
||||
return 0
|
||||
}
|
||||
|
||||
snts, err := d.forwarder.GetSnTsForPadding(num, forceMarker)
|
||||
frameRate := uint32(0)
|
||||
if paddingOnMute {
|
||||
// advance timestamps when sending dummy padding packets to start a stream
|
||||
// to ensure receiver sees proper timestamp and starts the stream
|
||||
frameRate = uint32(time.Second / paddingOnMuteInterval)
|
||||
}
|
||||
|
||||
snts, err := d.forwarder.GetSnTsForPadding(num, frameRate, forceMarker)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
@@ -2391,7 +2399,6 @@ func (d *DownTrack) sendPaddingOnMute() {
|
||||
// let uptrack have chance to send packet before we send padding
|
||||
time.Sleep(waitBeforeSendPaddingOnMute)
|
||||
|
||||
paddingOnMuteInterval := 100 * time.Millisecond
|
||||
numPackets := maxPaddingOnMuteDuration / paddingOnMuteInterval
|
||||
for i := 0; i < int(numPackets); i++ {
|
||||
if d.rtpStats.IsActive() || d.IsClosed() {
|
||||
|
||||
+15
-3
@@ -2153,7 +2153,7 @@ func (f *Forwarder) maybeStart() {
|
||||
)
|
||||
}
|
||||
|
||||
func (f *Forwarder) GetSnTsForPadding(num int, forceMarker bool) ([]SnTs, error) {
|
||||
func (f *Forwarder) GetSnTsForPadding(num int, frameRate uint32, forceMarker bool) ([]SnTs, error) {
|
||||
f.lock.Lock()
|
||||
defer f.lock.Unlock()
|
||||
|
||||
@@ -2167,7 +2167,13 @@ func (f *Forwarder) GetSnTsForPadding(num int, forceMarker bool) ([]SnTs, error)
|
||||
if !f.vls.GetTarget().IsValid() {
|
||||
forceMarker = true
|
||||
}
|
||||
return f.rtpMunger.UpdateAndGetPaddingSnTs(num, 0, 0, forceMarker, 0)
|
||||
return f.rtpMunger.UpdateAndGetPaddingSnTs(
|
||||
num,
|
||||
f.clockRate,
|
||||
frameRate,
|
||||
forceMarker,
|
||||
f.rtpMunger.GetState().ExtLastTimestamp,
|
||||
)
|
||||
}
|
||||
|
||||
func (f *Forwarder) GetSnTsForBlankFrames(frameRate uint32, numPackets int) ([]SnTs, bool, error) {
|
||||
@@ -2192,7 +2198,13 @@ func (f *Forwarder) GetSnTsForBlankFrames(frameRate uint32, numPackets int) ([]S
|
||||
if int64(extExpectedTS-extLastTS) <= 0 {
|
||||
extExpectedTS = extLastTS + 1
|
||||
}
|
||||
snts, err := f.rtpMunger.UpdateAndGetPaddingSnTs(numPackets, f.clockRate, frameRate, frameEndNeeded, extExpectedTS)
|
||||
snts, err := f.rtpMunger.UpdateAndGetPaddingSnTs(
|
||||
numPackets,
|
||||
f.clockRate,
|
||||
frameRate,
|
||||
frameEndNeeded,
|
||||
extExpectedTS,
|
||||
)
|
||||
return snts, frameEndNeeded, err
|
||||
}
|
||||
|
||||
|
||||
@@ -1943,7 +1943,7 @@ func TestForwarderGetSnTsForPadding(t *testing.T) {
|
||||
disable(f)
|
||||
|
||||
// should get back frame end needed as the last packet did not have RTP marker set
|
||||
snts, err := f.GetSnTsForPadding(5, false)
|
||||
snts, err := f.GetSnTsForPadding(5, 0, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
numPadding := 5
|
||||
@@ -1959,7 +1959,7 @@ func TestForwarderGetSnTsForPadding(t *testing.T) {
|
||||
require.Equal(t, sntsExpected, snts)
|
||||
|
||||
// now that there is a marker, timestamp should jump on first padding when asked again
|
||||
snts, err = f.GetSnTsForPadding(numPadding, false)
|
||||
snts, err = f.GetSnTsForPadding(numPadding, 0, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
for i := 0; i < numPadding; i++ {
|
||||
|
||||
@@ -269,7 +269,13 @@ func (r *RTPMunger) FilterRTX(nacks []uint16) []uint16 {
|
||||
return filtered
|
||||
}
|
||||
|
||||
func (r *RTPMunger) UpdateAndGetPaddingSnTs(num int, clockRate uint32, frameRate uint32, forceMarker bool, extRtpTimestamp uint64) ([]SnTs, error) {
|
||||
func (r *RTPMunger) UpdateAndGetPaddingSnTs(
|
||||
num int,
|
||||
clockRate uint32,
|
||||
frameRate uint32,
|
||||
forceMarker bool,
|
||||
extRtpTimestamp uint64,
|
||||
) ([]SnTs, error) {
|
||||
if num == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user