From ab81696102f0685a93f47472cd615220d42fb3ce Mon Sep 17 00:00:00 2001 From: ChenGH Date: Tue, 15 Mar 2022 08:40:06 +0800 Subject: [PATCH] Bugfix: Fix rtcp nack blp encode bug (#2966). v4.0.248 Co-authored-by: Winlin --- trunk/doc/CHANGELOG.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/kernel/srs_kernel_rtc_rtcp.cpp | 6 +++-- trunk/src/utest/srs_utest_rtc.cpp | 31 ++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 9af5fc13c..92357b9b3 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2022-03-15, Merge [#2966](https://github.com/ossrs/srs/pull/2966): Bugfix: Fix rtcp nack blp encode bug (#2966). v4.0.248 * v4.0, 2022-03-07, RTC: Identify the WebRTC publisher in param for hooks. v4.0.247 * v4.0, 2022-03-07, SRT: Append vhost to stream, not app. v4.0.246 * v4.0, 2022-02-15, Fix warnings for uuid. v4.0.245 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 7211b6a03..da4e606a8 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 247 +#define VERSION_REVISION 248 #endif diff --git a/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp index 6ea71a821..e6cdd39a1 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp @@ -1346,9 +1346,11 @@ srs_error_t SrsRtcpNack::encode(SrsBuffer *buffer) if((sn - pid) < 1) { srs_info("skip seq %d", sn); } else if( (sn - pid) > 16) { - // add new chunk + // append full chunk chunks.push_back(chunk); - chunk.pid = sn; + + // start new chunk + chunk.pid = sn; chunk.blp = 0; chunk.in_use = true; pid = sn; diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 0d7ea30e9..c243ad695 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -1169,6 +1169,36 @@ VOID TEST(KernelRTCTest, SyncTimestampBySenderReportConsecutive) } } +VOID TEST(KernelRTCTest, SrsRtcpNack) +{ + uint32_t sender_ssrc = 0x0A; + uint32_t media_ssrc = 0x0B; + + SrsRtcpNack nack_encoder(sender_ssrc); + nack_encoder.set_media_ssrc(media_ssrc); + + for (uint16_t seq = 15; seq < 45; seq++) { + nack_encoder.add_lost_sn(seq); + } + EXPECT_FALSE(nack_encoder.empty()); + + char buf[kRtcpPacketSize]; + SrsBuffer stream(buf, sizeof(buf)); + + srs_error_t err = srs_success; + err = nack_encoder.encode(&stream); + EXPECT_EQ(srs_error_code(err), srs_success); + + SrsRtcpNack nack_decoder; + stream.skip(-stream.pos()); + err = nack_decoder.decode(&stream); + EXPECT_EQ(srs_error_code(err), srs_success); + + vector actual_lost_sn = nack_encoder.get_lost_sns(); + vector req_lost_sns = nack_decoder.get_lost_sns(); + EXPECT_EQ(actual_lost_sn.size(), req_lost_sns.size()); +} + VOID TEST(KernelRTCTest, SyncTimestampBySenderReportDuplicated) { SrsRtcConnection s(NULL, SrsContextId()); @@ -1243,3 +1273,4 @@ VOID TEST(KernelRTCTest, SyncTimestampBySenderReportDuplicated) } } } +