From 15bf920f2cc5356e6b76d03d4387d8492d3f846e Mon Sep 17 00:00:00 2001 From: cnderrauber Date: Mon, 19 Aug 2024 16:35:38 +0800 Subject: [PATCH] fix framenumber test (#2942) --- pkg/sfu/videolayerselector/framenumberwrapper.go | 2 +- .../videolayerselector/framenumberwrapper_test.go | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/pkg/sfu/videolayerselector/framenumberwrapper.go b/pkg/sfu/videolayerselector/framenumberwrapper.go index 1820d6c41..f0997fc35 100644 --- a/pkg/sfu/videolayerselector/framenumberwrapper.go +++ b/pkg/sfu/videolayerselector/framenumberwrapper.go @@ -41,7 +41,7 @@ func (f *FrameNumberWrapper) UpdateAndGet(new uint64, updateOffset bool) uint64 new16 := uint16(new + f.offset) last16 := uint16(f.last + f.offset) // if new frame number wraps around and is considered as earlier by client, increase offset to make it later - if diff := new16 - last16; diff > 0x8000 || (diff == 0x8000 && new16 <= last16) { + if diff := new16 - last16; diff > 0x8000 || (diff == 0x8000 && new16 < last16) { // increase offset by 6000, nearly 10 seconds for 30fps video with 3 spatial layers prevOffset := f.offset f.offset += uint64(65535 - diff + 6000) diff --git a/pkg/sfu/videolayerselector/framenumberwrapper_test.go b/pkg/sfu/videolayerselector/framenumberwrapper_test.go index 6fa3a724c..b18f509db 100644 --- a/pkg/sfu/videolayerselector/framenumberwrapper_test.go +++ b/pkg/sfu/videolayerselector/framenumberwrapper_test.go @@ -65,6 +65,12 @@ func TestFrameNumberWrapper(t *testing.T) { // frame out of order firstF = secondF secondF = getFrame(firstF, false) + // it is possile that an out of order non-keyframe has been converted to in order frame number if the diff is 32768 + // that is ok because the client can't decode in such case and always need to wait for the key frame. + // so it is just a failure of test case and increase the frame number here. + if secondF-firstF == 0x8000 { + secondF++ + } testFrameOrder(firstF, false, secondF, false, false) // key frame in order @@ -92,5 +98,11 @@ func getFrame(base uint16, inorder bool) uint16 { if inorder { return base + uint16(rand.Intn(0x8000)) } - return base + uint16(rand.Intn(0x8000)) + 0x8000 + + for { + ret := base + uint16(rand.Intn(0x8000)) + 0x8000 + if !inOrder(ret, base) { + return ret + } + } }