diff --git a/pkg/sfu/rtpmunger.go b/pkg/sfu/rtpmunger.go index ef3b5434b..d8b672a9d 100644 --- a/pkg/sfu/rtpmunger.go +++ b/pkg/sfu/rtpmunger.go @@ -297,9 +297,7 @@ func (r *RTPMunger) UpdateAndGetPaddingSnTs(num int, clockRate uint32, frameRate r.extSecondLastSN = extLastSN - 1 r.extLastSN = extLastSN - if err := r.snRangeMap.CloseRangeAndDecValue(r.extHighestIncomingSN, uint64(num)); err != nil { - r.logger.Errorw("could not close range", err, "sn", r.extHighestIncomingSN) - } + r.snRangeMap.DecValue(r.extHighestIncomingSN, uint64(num)) r.updateSnOffset("pad") r.tsOffset -= extLastTS - r.extLastTS diff --git a/pkg/sfu/utils/rangemap.go b/pkg/sfu/utils/rangemap.go index 22a9b03d1..036c24494 100644 --- a/pkg/sfu/utils/rangemap.go +++ b/pkg/sfu/utils/rangemap.go @@ -16,6 +16,7 @@ package utils import ( "errors" + "fmt" "math" "unsafe" ) @@ -66,13 +67,15 @@ func (r *RangeMap[RT, VT]) ClearAndResetValue(val VT) { r.initRanges(val) } -func (r *RangeMap[RT, VT]) CloseRangeAndDecValue(end RT, dec VT) error { - // close open range +func (r *RangeMap[RT, VT]) DecValue(end RT, dec VT) { lr := &r.ranges[len(r.ranges)-1] if lr.start > end { - // start of open range is after given end - return errReversedOrder + // modify existing value if end is in open range + lr.value -= dec + return } + + // close open range lr.end = end // start a new open one with decremented value @@ -82,7 +85,6 @@ func (r *RangeMap[RT, VT]) CloseRangeAndDecValue(end RT, dec VT) error { value: lr.value - dec, }) r.prune() - return nil } func (r *RangeMap[RT, VT]) initRanges(val VT) { @@ -97,13 +99,13 @@ func (r *RangeMap[RT, VT]) initRanges(val VT) { func (r *RangeMap[RT, VT]) ExcludeRange(startInclusive RT, endExclusive RT) error { if endExclusive == startInclusive || endExclusive-startInclusive > r.halfRange { - return errReversedOrder + return fmt.Errorf("%w, start %d, end %d", errReversedOrder, startInclusive, endExclusive) } lr := &r.ranges[len(r.ranges)-1] if lr.start > startInclusive { // start of open range is after start of exclusion range, cannot close the open range - return errReversedOrder + return fmt.Errorf("%w, existingStart %d, newStart %d", errReversedOrder, lr.start, startInclusive) } newValue := lr.value + VT(endExclusive-startInclusive) diff --git a/pkg/sfu/utils/rangemap_test.go b/pkg/sfu/utils/rangemap_test.go index 95a61132b..36a9daa97 100644 --- a/pkg/sfu/utils/rangemap_test.go +++ b/pkg/sfu/utils/rangemap_test.go @@ -234,8 +234,7 @@ func TestRangeMapUint32(t *testing.T) { require.Equal(t, uint32(23), value) // decrement value and ensure that any key returns that value - err = r.CloseRangeAndDecValue(34, 12) - require.NoError(t, err) + r.DecValue(34, 12) expectedRanges = []rangeVal[uint32, uint32]{ { @@ -293,8 +292,7 @@ func TestRangeMapUint32(t *testing.T) { require.NoError(t, err) require.Equal(t, uint32(16), value) - err = r.CloseRangeAndDecValue(66, 6) - require.NoError(t, err) + r.DecValue(66, 6) expectedRanges = []rangeVal[uint32, uint32]{ { @@ -315,9 +313,6 @@ func TestRangeMapUint32(t *testing.T) { } require.Equal(t, expectedRanges, r.ranges) - err = r.CloseRangeAndDecValue(66, 6) - require.ErrorIs(t, err, errReversedOrder) - // aged out range access value, err = r.GetValue(5) require.ErrorIs(t, err, errKeyTooOld) @@ -331,4 +326,31 @@ func TestRangeMapUint32(t *testing.T) { value, err = r.GetValue(67) require.NoError(t, err) require.Equal(t, uint32(10), value) + + // decrement with old end and check that open range gets decremented + r.DecValue(66, 6) + + expectedRanges = []rangeVal[uint32, uint32]{ + { + start: 35, + end: 39, + value: 11, + }, + { + start: 45, + end: 66, + value: 16, + }, + { + start: 67, + end: 0, + value: 4, + }, + } + require.Equal(t, expectedRanges, r.ranges) + + // open range access should get decremented value + value, err = r.GetValue(67) + require.NoError(t, err) + require.Equal(t, uint32(4), value) }