From d603b1580e5d667d356e577d081e397a2d8f3365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=98=E7=AF=B1?= Date: Sun, 17 May 2020 09:03:40 +0800 Subject: [PATCH] RTC: Merge srs_rtp_seq_distance with srs_seq_is_newer --- trunk/src/app/srs_app_rtc_queue.hpp | 11 --- trunk/src/kernel/srs_kernel_rtc_rtcp.hpp | 2 +- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 54 ++++---------- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 21 ++++-- trunk/src/utest/srs_utest_rtc.cpp | 91 +++++++++++++++--------- 5 files changed, 85 insertions(+), 94 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_queue.hpp b/trunk/src/app/srs_app_rtc_queue.hpp index 420db6338..f3a2a25a6 100644 --- a/trunk/src/app/srs_app_rtc_queue.hpp +++ b/trunk/src/app/srs_app_rtc_queue.hpp @@ -34,17 +34,6 @@ class SrsRtpPacket2; class SrsRtpQueue; class SrsRtpRingBuffer; -// The "distance" between two uint16 number, for example: -// distance(prev_value=3, value=5) === (int16_t)(uint16_t)((uint16_t)3-(uint16_t)5) === -2 -// distance(prev_value=3, value=65534) === (int16_t)(uint16_t)((uint16_t)3-(uint16_t)65534) === 5 -// distance(prev_value=65532, value=65534) === (int16_t)(uint16_t)((uint16_t)65532-(uint16_t)65534) === -2 -// For RTP sequence, it's only uint16 and may flip back, so 3 maybe 3+0xffff. -// @see https://mp.weixin.qq.com/s/JZTInmlB9FUWXBQw_7NYqg -inline int16_t srs_rtp_seq_distance(const uint16_t& prev_value, const uint16_t& value) -{ - return (int16_t)(value - prev_value); -} - // For UDP, the packets sequence may present as bellow: // [seq1(done)|seq2|seq3 ... seq10|seq11(lost)|seq12|seq13] // \___(head_sequence_) \ \___(highest_sequence_) diff --git a/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp index 4f69e23d7..bd995dbd4 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp @@ -61,7 +61,7 @@ struct SrsRtcpHeader struct SrsSeqCompareLess { bool operator()(const uint16_t &lhs, const uint16_t &rhs) const { - return SrsSeqIsNewer(rhs, lhs); + return srs_seq_is_newer(rhs, lhs); } }; diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 5a1a6ebbd..15f943fa8 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -33,54 +33,24 @@ using namespace std; #include #include -//sn comparison,if current_sn is more(newer) than last_sn,return true,else return false -bool SrsSeqIsNewer(uint16_t current_sn, uint16_t last_sn) { - if(current_sn > last_sn) { - //current_sn 65533 last_sn 5 - if(current_sn - last_sn > 0x8000) { - return false; - } else { - return true; - } - } else { - //current_sn 2 last_sn 65535 - if(current_sn - last_sn < -0x8000) { - return true; - } else { - return false; - } - } -} - -bool SrsSeqIsRoolback(uint16_t current_sn, uint16_t last_sn) -{ - if(SrsSeqIsNewer(current_sn, last_sn)) { - if((last_sn > current_sn)) { +// If value is newer than pre_value,return true; otherwise false +bool srs_seq_is_newer(uint16_t value, uint16_t pre_value) { + return srs_rtp_seq_distance(pre_value, value) > 0; +} + +bool srs_seq_is_roolback(uint16_t value, uint16_t pre_value) +{ + if(srs_seq_is_newer(value, pre_value)) { + if((pre_value > value)) { return true; } } return false; } -// caculate the difference between sn. If current_sn is more then last_sn, return positive difference, else return negative difference. -int32_t SrsSeqDistance(uint16_t current_sn, uint16_t last_sn) { - if(current_sn > last_sn) { - //current_sn 65535 last_sn 0 - if(current_sn - last_sn > 0x8000) { - return (current_sn - last_sn - 1 - 65535); - } else { - return (current_sn - last_sn); - } - } else { - //current_sn 0 last_sn 65535 - if(current_sn - last_sn < -0x8000) { - return (current_sn - last_sn + 65535 + 1); - } else { - return (current_sn - last_sn); - // current_sn 15039 last_sn 15042 - //return last_sn - current_sn; - } - } +// If value is newer then pre_value, return positive, otherwise negative. +int32_t srs_seq_distance(uint16_t value, uint16_t pre_value) { + return srs_rtp_seq_distance(pre_value, value); } SrsRtpHeader::SrsRtpHeader() diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index ec17cd6b1..2b09fad5a 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -58,11 +58,22 @@ class SrsRtpRawPayload; class SrsRtpFUAPayload2; class SrsSharedPtrMessage; -// TODO: FIXME: Merge with srs_rtp_seq_distance -// @see https://mp.weixin.qq.com/s/JZTInmlB9FUWXBQw_7NYqg -bool SrsSeqIsNewer(uint16_t current_sn, uint16_t last_sn); -bool SrsSeqIsRoolback(uint16_t current_sn, uint16_t last_sn); -int32_t SrsSeqDistance(uint16_t current_sn, uint16_t last_sn); +// The "distance" between two uint16 number, for example: +// distance(prev_value=3, value=5) === (int16_t)(uint16_t)((uint16_t)3-(uint16_t)5) === -2 +// distance(prev_value=3, value=65534) === (int16_t)(uint16_t)((uint16_t)3-(uint16_t)65534) === 5 +// distance(prev_value=65532, value=65534) === (int16_t)(uint16_t)((uint16_t)65532-(uint16_t)65534) === -2 +// For RTP sequence, it's only uint16 and may flip back, so 3 maybe 3+0xffff. +// @remark Note that srs_rtp_seq_distance(0, 32768)>0 is TRUE by https://mp.weixin.qq.com/s/JZTInmlB9FUWXBQw_7NYqg +// but for WebRTC jitter buffer it's FALSE and we follow it. +// @remark For srs_rtp_seq_distance(32768, 0)>0, it's FALSE definitely. +inline int16_t srs_rtp_seq_distance(const uint16_t& prev_value, const uint16_t& value) +{ + return (int16_t)(value - prev_value); +} + +bool srs_seq_is_newer(uint16_t value, uint16_t pre_value); +bool srs_seq_is_roolback(uint16_t value, uint16_t pre_value); +int32_t srs_seq_distance(uint16_t value, uint16_t pre_value); class SrsRtpHeader { diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 872c9ddb5..dceccec1e 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -55,50 +55,71 @@ VOID TEST(KernelRTCTest, SequenceCompare) EXPECT_FALSE(srs_rtp_seq_distance(255, 65535) > 0); EXPECT_FALSE(srs_rtp_seq_distance(255, 65280) > 0); - // Note that it's TRUE at https://mp.weixin.qq.com/s/JZTInmlB9FUWXBQw_7NYqg + // Note that srs_rtp_seq_distance(0, 32768)>0 is TRUE by https://mp.weixin.qq.com/s/JZTInmlB9FUWXBQw_7NYqg + // but for WebRTC jitter buffer it's FALSE and we follow it. EXPECT_FALSE(srs_rtp_seq_distance(0, 32768) > 0); // It's FALSE definitely. EXPECT_FALSE(srs_rtp_seq_distance(32768, 0) > 0); } if (true) { - EXPECT_FALSE(SrsSeqIsNewer(1, 1)); - EXPECT_TRUE(SrsSeqIsNewer(65535, 65534)); - EXPECT_TRUE(SrsSeqIsNewer(1, 0)); - EXPECT_TRUE(SrsSeqIsNewer(256, 255)); - - EXPECT_TRUE(SrsSeqIsNewer(0, 65535)); - EXPECT_TRUE(SrsSeqIsNewer(0, 65280)); - EXPECT_TRUE(SrsSeqIsNewer(255, 65535)); - EXPECT_TRUE(SrsSeqIsNewer(255, 65280)); - - EXPECT_FALSE(SrsSeqIsNewer(65535, 0)); - EXPECT_FALSE(SrsSeqIsNewer(65280, 0)); - EXPECT_FALSE(SrsSeqIsNewer(65535, 255)); - EXPECT_FALSE(SrsSeqIsNewer(65280, 255)); - - EXPECT_TRUE(SrsSeqIsNewer(32768, 0)); - EXPECT_FALSE(SrsSeqIsNewer(0, 32768)); + EXPECT_FALSE(srs_seq_is_newer(1, 1)); + EXPECT_TRUE(srs_seq_is_newer(65535, 65534)); + EXPECT_TRUE(srs_seq_is_newer(1, 0)); + EXPECT_TRUE(srs_seq_is_newer(256, 255)); + + EXPECT_TRUE(srs_seq_is_newer(0, 65535)); + EXPECT_TRUE(srs_seq_is_newer(0, 65280)); + EXPECT_TRUE(srs_seq_is_newer(255, 65535)); + EXPECT_TRUE(srs_seq_is_newer(255, 65280)); + + EXPECT_FALSE(srs_seq_is_newer(65535, 0)); + EXPECT_FALSE(srs_seq_is_newer(65280, 0)); + EXPECT_FALSE(srs_seq_is_newer(65535, 255)); + EXPECT_FALSE(srs_seq_is_newer(65280, 255)); + + EXPECT_FALSE(srs_seq_is_newer(32768, 0)); + EXPECT_FALSE(srs_seq_is_newer(0, 32768)); } if (true) { - EXPECT_FALSE(SrsSeqDistance(1, 1) > 0); - EXPECT_TRUE(SrsSeqDistance(65535, 65534) > 0); - EXPECT_TRUE(SrsSeqDistance(1, 0) > 0); - EXPECT_TRUE(SrsSeqDistance(256, 255) > 0); - - EXPECT_TRUE(SrsSeqDistance(0, 65535) > 0); - EXPECT_TRUE(SrsSeqDistance(0, 65280) > 0); - EXPECT_TRUE(SrsSeqDistance(255, 65535) > 0); - EXPECT_TRUE(SrsSeqDistance(255, 65280) > 0); - - EXPECT_FALSE(SrsSeqDistance(65535, 0) > 0); - EXPECT_FALSE(SrsSeqDistance(65280, 0) > 0); - EXPECT_FALSE(SrsSeqDistance(65535, 255) > 0); - EXPECT_FALSE(SrsSeqDistance(65280, 255) > 0); - - EXPECT_TRUE(SrsSeqDistance(32768, 0) > 0); - EXPECT_FALSE(SrsSeqDistance(0, 32768) > 0); + EXPECT_FALSE(srs_seq_distance(1, 1) > 0); + EXPECT_TRUE(srs_seq_distance(65535, 65534) > 0); + EXPECT_TRUE(srs_seq_distance(1, 0) > 0); + EXPECT_TRUE(srs_seq_distance(256, 255) > 0); + + EXPECT_TRUE(srs_seq_distance(0, 65535) > 0); + EXPECT_TRUE(srs_seq_distance(0, 65280) > 0); + EXPECT_TRUE(srs_seq_distance(255, 65535) > 0); + EXPECT_TRUE(srs_seq_distance(255, 65280) > 0); + + EXPECT_FALSE(srs_seq_distance(65535, 0) > 0); + EXPECT_FALSE(srs_seq_distance(65280, 0) > 0); + EXPECT_FALSE(srs_seq_distance(65535, 255) > 0); + EXPECT_FALSE(srs_seq_distance(65280, 255) > 0); + + EXPECT_FALSE(srs_seq_distance(32768, 0) > 0); + EXPECT_FALSE(srs_seq_distance(0, 32768) > 0); + } + + if (true) { + EXPECT_FALSE(srs_seq_is_roolback(1, 1)); + EXPECT_FALSE(srs_seq_is_roolback(65535, 65534)); + EXPECT_FALSE(srs_seq_is_roolback(1, 0)); + EXPECT_FALSE(srs_seq_is_roolback(256, 255)); + + EXPECT_TRUE(srs_seq_is_roolback(0, 65535)); + EXPECT_TRUE(srs_seq_is_roolback(0, 65280)); + EXPECT_TRUE(srs_seq_is_roolback(255, 65535)); + EXPECT_TRUE(srs_seq_is_roolback(255, 65280)); + + EXPECT_FALSE(srs_seq_is_roolback(65535, 0)); + EXPECT_FALSE(srs_seq_is_roolback(65280, 0)); + EXPECT_FALSE(srs_seq_is_roolback(65535, 255)); + EXPECT_FALSE(srs_seq_is_roolback(65280, 255)); + + EXPECT_FALSE(srs_seq_is_roolback(32768, 0)); + EXPECT_FALSE(srs_seq_is_roolback(0, 32768)); } }