rtcp::Nack packet moved into own file and got Parse function

Review URL: https://codereview.webrtc.org/1461623003

Cr-Commit-Position: refs/heads/master@{#11111}
This commit is contained in:
danilchap
2015-12-22 03:43:04 -08:00
committed by Commit bot
parent 53c317c4b9
commit a8890a57a5
13 changed files with 520 additions and 223 deletions

View File

@ -26,7 +26,6 @@ using webrtc::rtcp::Bye;
using webrtc::rtcp::Dlrr;
using webrtc::rtcp::Empty;
using webrtc::rtcp::Fir;
using webrtc::rtcp::Nack;
using webrtc::rtcp::RawPacket;
using webrtc::rtcp::ReceiverReport;
using webrtc::rtcp::Remb;
@ -243,104 +242,6 @@ TEST(RtcpPacketTest, Sli) {
EXPECT_EQ(kPictureId, parser.sli_item()->PictureId());
}
TEST(RtcpPacketTest, Nack) {
Nack nack;
const uint16_t kList[] = {0, 1, 3, 8, 16};
const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
nack.From(kSenderSsrc);
nack.To(kRemoteSsrc);
nack.WithList(kList, kListLength);
rtc::scoped_ptr<RawPacket> packet(nack.Build());
RtcpPacketParser parser;
parser.Parse(packet->Buffer(), packet->Length());
EXPECT_EQ(1, parser.nack()->num_packets());
EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
EXPECT_EQ(1, parser.nack_item()->num_packets());
std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
EXPECT_EQ(kListLength, seqs.size());
for (size_t i = 0; i < kListLength; ++i) {
EXPECT_EQ(kList[i], seqs[i]);
}
}
TEST(RtcpPacketTest, NackWithWrap) {
Nack nack;
const uint16_t kList[] = {65500, 65516, 65534, 65535, 0, 1, 3, 20, 100};
const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
nack.From(kSenderSsrc);
nack.To(kRemoteSsrc);
nack.WithList(kList, kListLength);
rtc::scoped_ptr<RawPacket> packet(nack.Build());
RtcpPacketParser parser;
parser.Parse(packet->Buffer(), packet->Length());
EXPECT_EQ(1, parser.nack()->num_packets());
EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
EXPECT_EQ(4, parser.nack_item()->num_packets());
std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
EXPECT_EQ(kListLength, seqs.size());
for (size_t i = 0; i < kListLength; ++i) {
EXPECT_EQ(kList[i], seqs[i]);
}
}
TEST(RtcpPacketTest, NackFragmented) {
Nack nack;
const uint16_t kList[] = {1, 100, 200, 300, 400};
const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
nack.From(kSenderSsrc);
nack.To(kRemoteSsrc);
nack.WithList(kList, kListLength);
class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
public:
void OnPacketReady(uint8_t* data, size_t length) override {
++packets_created_;
RtcpPacketParser parser;
parser.Parse(data, length);
EXPECT_EQ(1, parser.nack()->num_packets());
EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
switch (packets_created_) {
case 1:
EXPECT_THAT(parser.nack_item()->last_nack_list(),
ElementsAre(1, 100, 200));
break;
case 2:
EXPECT_THAT(parser.nack_item()->last_nack_list(),
ElementsAre(300, 400));
break;
default:
ADD_FAILURE() << "Unexpected packet count: " << packets_created_;
}
}
int packets_created_ = 0;
} verifier;
const size_t kBufferSize = 12 + (3 * 4); // Fits common header + 3 nack items
uint8_t buffer[kBufferSize];
EXPECT_TRUE(nack.BuildExternalBuffer(buffer, kBufferSize, &verifier));
EXPECT_EQ(2, verifier.packets_created_);
}
TEST(RtcpPacketTest, NackWithTooSmallBuffer) {
const uint16_t kList[] = {1};
const size_t kMinNackBlockSize = 16;
Nack nack;
nack.From(kSenderSsrc);
nack.To(kRemoteSsrc);
nack.WithList(kList, 1);
class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
public:
void OnPacketReady(uint8_t* data, size_t length) override {
ADD_FAILURE() << "Buffer should be too small.";
}
} verifier;
uint8_t buffer[kMinNackBlockSize - 1];
EXPECT_FALSE(
nack.BuildExternalBuffer(buffer, kMinNackBlockSize - 1, &verifier));
}
TEST(RtcpPacketTest, Rpsi) {
Rpsi rpsi;
// 1000001 (7 bits = 1 byte in native string).