Add SetReportBlocks to rtcp Sender/Receive Report classes.

BUG=None

Review-Url: https://codereview.webrtc.org/2991623002
Cr-Commit-Position: refs/heads/master@{#19136}
This commit is contained in:
danilchap 2017-07-25 08:07:13 -07:00 committed by Commit Bot
parent fb143127d7
commit 6209dcdeb1
6 changed files with 99 additions and 8 deletions

View File

@ -10,6 +10,8 @@
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
#include <utility>
#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
#include "webrtc/rtc_base/checks.h"
@ -18,6 +20,7 @@
namespace webrtc {
namespace rtcp {
constexpr uint8_t ReceiverReport::kPacketType;
constexpr size_t ReceiverReport::kMaxNumberOfReportBlocks;
// RTCP receiver report (RFC 3550).
//
// 0 1 2 3
@ -93,5 +96,15 @@ bool ReceiverReport::AddReportBlock(const ReportBlock& block) {
return true;
}
bool ReceiverReport::SetReportBlocks(std::vector<ReportBlock> blocks) {
if (blocks.size() > kMaxNumberOfReportBlocks) {
LOG(LS_WARNING) << "Too many report blocks (" << blocks.size()
<< ") for receiver report.";
return false;
}
report_blocks_ = std::move(blocks);
return true;
}
} // namespace rtcp
} // namespace webrtc

View File

@ -24,6 +24,8 @@ class CommonHeader;
class ReceiverReport : public RtcpPacket {
public:
static constexpr uint8_t kPacketType = 201;
static constexpr size_t kMaxNumberOfReportBlocks = 0x1f;
ReceiverReport();
~ReceiverReport() override;
@ -32,6 +34,7 @@ class ReceiverReport : public RtcpPacket {
void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
bool AddReportBlock(const ReportBlock& block);
bool SetReportBlocks(std::vector<ReportBlock> blocks);
uint32_t sender_ssrc() const { return sender_ssrc_; }
const std::vector<ReportBlock>& report_blocks() const {
@ -47,7 +50,6 @@ class ReceiverReport : public RtcpPacket {
private:
static const size_t kRrBaseLength = 4;
static const size_t kMaxNumberOfReportBlocks = 0x1F;
uint32_t sender_ssrc_;
std::vector<ReportBlock> report_blocks_;

View File

@ -10,6 +10,8 @@
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
#include <utility>
#include "webrtc/test/gmock.h"
#include "webrtc/test/gtest.h"
#include "webrtc/test/rtcp_packet_parser.h"
@ -117,14 +119,43 @@ TEST(RtcpPacketReceiverReportTest, CreateAndParseWithTwoReportBlocks) {
TEST(RtcpPacketReceiverReportTest, CreateWithTooManyReportBlocks) {
ReceiverReport rr;
rr.SetSenderSsrc(kSenderSsrc);
const size_t kMaxReportBlocks = (1 << 5) - 1;
ReportBlock rb;
for (size_t i = 0; i < kMaxReportBlocks; ++i) {
for (size_t i = 0; i < ReceiverReport::kMaxNumberOfReportBlocks; ++i) {
rb.SetMediaSsrc(kRemoteSsrc + i);
EXPECT_TRUE(rr.AddReportBlock(rb));
}
rb.SetMediaSsrc(kRemoteSsrc + kMaxReportBlocks);
rb.SetMediaSsrc(kRemoteSsrc + ReceiverReport::kMaxNumberOfReportBlocks);
EXPECT_FALSE(rr.AddReportBlock(rb));
}
TEST(RtcpPacketReceiverReportTest, SetReportBlocksOverwritesOldBlocks) {
ReceiverReport rr;
ReportBlock report_block;
// Use jitter field of the report blocks to distinguish them.
report_block.SetJitter(1001u);
rr.AddReportBlock(report_block);
ASSERT_EQ(rr.report_blocks().size(), 1u);
ASSERT_EQ(rr.report_blocks()[0].jitter(), 1001u);
std::vector<ReportBlock> blocks(3u);
blocks[0].SetJitter(2001u);
blocks[1].SetJitter(3001u);
blocks[2].SetJitter(4001u);
EXPECT_TRUE(rr.SetReportBlocks(blocks));
ASSERT_EQ(rr.report_blocks().size(), 3u);
EXPECT_EQ(rr.report_blocks()[0].jitter(), 2001u);
EXPECT_EQ(rr.report_blocks()[1].jitter(), 3001u);
EXPECT_EQ(rr.report_blocks()[2].jitter(), 4001u);
}
TEST(RtcpPacketReceiverReportTest, SetReportBlocksMaxLimit) {
ReceiverReport rr;
std::vector<ReportBlock> max_blocks(ReceiverReport::kMaxNumberOfReportBlocks);
EXPECT_TRUE(rr.SetReportBlocks(std::move(max_blocks)));
std::vector<ReportBlock> one_too_many_blocks(
ReceiverReport::kMaxNumberOfReportBlocks + 1);
EXPECT_FALSE(rr.SetReportBlocks(std::move(one_too_many_blocks)));
}
} // namespace webrtc

View File

@ -10,6 +10,8 @@
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
#include <utility>
#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
#include "webrtc/rtc_base/checks.h"
@ -18,6 +20,7 @@
namespace webrtc {
namespace rtcp {
constexpr uint8_t SenderReport::kPacketType;
constexpr size_t SenderReport::kMaxNumberOfReportBlocks;
// Sender report (SR) (RFC 3550).
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@ -122,5 +125,15 @@ bool SenderReport::AddReportBlock(const ReportBlock& block) {
return true;
}
bool SenderReport::SetReportBlocks(std::vector<ReportBlock> blocks) {
if (blocks.size() > kMaxNumberOfReportBlocks) {
LOG(LS_WARNING) << "Too many report blocks (" << blocks.size()
<< ") for sender report.";
return false;
}
report_blocks_ = std::move(blocks);
return true;
}
} // namespace rtcp
} // namespace webrtc

View File

@ -24,6 +24,7 @@ class CommonHeader;
class SenderReport : public RtcpPacket {
public:
static constexpr uint8_t kPacketType = 200;
static constexpr size_t kMaxNumberOfReportBlocks = 0x1f;
SenderReport();
~SenderReport() override;
@ -43,6 +44,7 @@ class SenderReport : public RtcpPacket {
sender_octet_count_ = octet_count;
}
bool AddReportBlock(const ReportBlock& block);
bool SetReportBlocks(std::vector<ReportBlock> blocks);
void ClearReportBlocks() { report_blocks_.clear(); }
uint32_t sender_ssrc() const { return sender_ssrc_; }
@ -63,7 +65,6 @@ class SenderReport : public RtcpPacket {
RtcpPacket::PacketReadyCallback* callback) const override;
private:
static const size_t kMaxNumberOfReportBlocks = 0x1f;
const size_t kSenderBaseLength = 24;
uint32_t sender_ssrc_;

View File

@ -10,6 +10,8 @@
#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
#include <utility>
#include "webrtc/test/gmock.h"
#include "webrtc/test/gtest.h"
#include "webrtc/test/rtcp_packet_parser.h"
@ -101,14 +103,43 @@ TEST(RtcpPacketSenderReportTest, CreateAndParseWithTwoReportBlocks) {
TEST(RtcpPacketSenderReportTest, CreateWithTooManyReportBlocks) {
SenderReport sr;
sr.SetSenderSsrc(kSenderSsrc);
const size_t kMaxReportBlocks = (1 << 5) - 1;
ReportBlock rb;
for (size_t i = 0; i < kMaxReportBlocks; ++i) {
for (size_t i = 0; i < SenderReport::kMaxNumberOfReportBlocks; ++i) {
rb.SetMediaSsrc(kRemoteSsrc + i);
EXPECT_TRUE(sr.AddReportBlock(rb));
}
rb.SetMediaSsrc(kRemoteSsrc + kMaxReportBlocks);
rb.SetMediaSsrc(kRemoteSsrc + SenderReport::kMaxNumberOfReportBlocks);
EXPECT_FALSE(sr.AddReportBlock(rb));
}
TEST(RtcpPacketSenderReportTest, SetReportBlocksOverwritesOldBlocks) {
SenderReport sr;
ReportBlock report_block;
// Use jitter field of the report blocks to distinguish them.
report_block.SetJitter(1001u);
sr.AddReportBlock(report_block);
ASSERT_EQ(sr.report_blocks().size(), 1u);
ASSERT_EQ(sr.report_blocks()[0].jitter(), 1001u);
std::vector<ReportBlock> blocks(3u);
blocks[0].SetJitter(2001u);
blocks[1].SetJitter(3001u);
blocks[2].SetJitter(4001u);
EXPECT_TRUE(sr.SetReportBlocks(blocks));
ASSERT_EQ(sr.report_blocks().size(), 3u);
EXPECT_EQ(sr.report_blocks()[0].jitter(), 2001u);
EXPECT_EQ(sr.report_blocks()[1].jitter(), 3001u);
EXPECT_EQ(sr.report_blocks()[2].jitter(), 4001u);
}
TEST(RtcpPacketSenderReportTest, SetReportBlocksMaxLimit) {
SenderReport sr;
std::vector<ReportBlock> max_blocks(SenderReport::kMaxNumberOfReportBlocks);
EXPECT_TRUE(sr.SetReportBlocks(std::move(max_blocks)));
std::vector<ReportBlock> one_too_many_blocks(
SenderReport::kMaxNumberOfReportBlocks + 1);
EXPECT_FALSE(sr.SetReportBlocks(std::move(one_too_many_blocks)));
}
} // namespace webrtc