From c7d8083a4c750e4b9fa1993d2acbbc1e9af4ee74 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 18 Jan 2022 11:51:52 +0100 Subject: [PATCH] rtptimedec: fix decoding error of 1ns during overflow --- pkg/rtptimedec/decoder.go | 4 ++-- pkg/rtptimedec/decoder_test.go | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/rtptimedec/decoder.go b/pkg/rtptimedec/decoder.go index 1220d338..89d91eae 100644 --- a/pkg/rtptimedec/decoder.go +++ b/pkg/rtptimedec/decoder.go @@ -28,10 +28,10 @@ func (d *Decoder) Decode(ts uint32) time.Duration { diff := ts64 - *d.tsPrev switch { case diff < -0xFFFFFF: // overflow - d.tsAdd += 0xFFFFFFFF + d.tsAdd += 0x100000000 case diff > 0xFFFFFF: // timestamp overflowed then went back - d.tsAdd -= 0xFFFFFFFF + d.tsAdd -= 0x100000000 } } diff --git a/pkg/rtptimedec/decoder_test.go b/pkg/rtptimedec/decoder_test.go index df174233..721ecc1e 100644 --- a/pkg/rtptimedec/decoder_test.go +++ b/pkg/rtptimedec/decoder_test.go @@ -10,11 +10,25 @@ import ( func TestOverflow(t *testing.T) { d := New(90000) - pts := d.Decode(4294877295) + i := uint32(4294877296) + pts := d.Decode(i) require.Equal(t, time.Duration(0), pts) - pts = d.Decode(90000) + // 1st overflow + i += 90000 * 2 + pts = d.Decode(i) require.Equal(t, 2*time.Second, pts) + + // reach 4294890000 slowly + for ; i < 4294890000; i += 90000 * 10 { + pts = d.Decode(i) + require.Equal(t, 2*time.Second+time.Second*time.Duration(i-90000)/90000, pts) + } + + // 2nd overflow + i += 90000 * 10 + pts = d.Decode(i) + require.Equal(t, 47732*time.Second, pts) } func TestOverflowAndBack(t *testing.T) { @@ -23,7 +37,7 @@ func TestOverflowAndBack(t *testing.T) { pts := d.Decode(4294877296) require.Equal(t, time.Duration(0), pts) - pts = d.Decode(90001) + pts = d.Decode(90000) require.Equal(t, 2*time.Second, pts) pts = d.Decode(4294877296) @@ -35,6 +49,6 @@ func TestOverflowAndBack(t *testing.T) { pts = d.Decode(4294877296) require.Equal(t, time.Duration(0), pts) - pts = d.Decode(90001) + pts = d.Decode(90000) require.Equal(t, 2*time.Second, pts) }