diff --git a/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp index b0d96a495..133d2dd8c 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 4f24ab1e9..b8b61769d 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) } } } +