Index: webrtc/modules/video_coding/video_packet_buffer_unittest.cc |
diff --git a/webrtc/modules/video_coding/video_packet_buffer_unittest.cc b/webrtc/modules/video_coding/video_packet_buffer_unittest.cc |
index 7905e855b4172900101ec6f903c8fac097ff7994..0ec5ff8a6fd6222b2d917aec10fd94b55aba4456 100644 |
--- a/webrtc/modules/video_coding/video_packet_buffer_unittest.cc |
+++ b/webrtc/modules/video_coding/video_packet_buffer_unittest.cc |
@@ -49,12 +49,12 @@ class TestPacketBuffer : public ::testing::Test, |
enum IsFirst { kFirst, kNotFirst }; |
enum IsLast { kLast, kNotLast }; |
- void InsertPacket(uint16_t seq_num, // packet sequence number |
- IsKeyFrame keyframe, // is keyframe |
- IsFirst first, // is first packet of frame |
- IsLast last, // is last packet of frame |
- int data_size = 0, // size of data |
- uint8_t* data = nullptr) { // data pointer |
+ bool Insert(uint16_t seq_num, // packet sequence number |
+ IsKeyFrame keyframe, // is keyframe |
+ IsFirst first, // is first packet of frame |
+ IsLast last, // is last packet of frame |
+ int data_size = 0, // size of data |
+ uint8_t* data = nullptr) { // data pointer |
VCMPacket packet; |
packet.codec = kVideoCodecGeneric; |
packet.seqNum = seq_num; |
@@ -64,7 +64,7 @@ class TestPacketBuffer : public ::testing::Test, |
packet.sizeBytes = data_size; |
packet.dataPtr = data; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
+ return packet_buffer_->InsertPacket(packet); |
} |
void CheckFrame(uint16_t first_seq_num) { |
@@ -84,26 +84,55 @@ class TestPacketBuffer : public ::testing::Test, |
}; |
TEST_F(TestPacketBuffer, InsertOnePacket) { |
- uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
+ const uint16_t seq_num = Rand(); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
} |
TEST_F(TestPacketBuffer, InsertMultiplePackets) { |
- uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 1, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 2, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 3, kKeyFrame, kFirst, kLast); |
+ const uint16_t seq_num = Rand(); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kLast)); |
} |
TEST_F(TestPacketBuffer, InsertDuplicatePacket) { |
- uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
+ const uint16_t seq_num = Rand(); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+} |
+ |
+TEST_F(TestPacketBuffer, SeqNumWrap) { |
+ EXPECT_TRUE(Insert(0xFFFF, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(0x0, kKeyFrame, kFirst, kLast)); |
+ |
+ CheckFrame(0xFFFF); |
+} |
+ |
+TEST_F(TestPacketBuffer, InsertOldPackets) { |
+ const uint16_t seq_num = Rand(); |
+ |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast)); |
+ ASSERT_EQ(2UL, frames_from_callback_.size()); |
+ |
+ frames_from_callback_.erase(seq_num + 2); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ ASSERT_EQ(1UL, frames_from_callback_.size()); |
+ |
+ frames_from_callback_.erase(frames_from_callback_.find(seq_num)); |
+ ASSERT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast)); |
+ |
+ packet_buffer_->ClearTo(seq_num + 2); |
+ EXPECT_FALSE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast)); |
+ ASSERT_EQ(2UL, frames_from_callback_.size()); |
} |
TEST_F(TestPacketBuffer, NackCount) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
VCMPacket packet; |
packet.codec = kVideoCodecGeneric; |
@@ -129,57 +158,64 @@ TEST_F(TestPacketBuffer, NackCount) { |
packet.timesNacked = 1; |
packet_buffer_->InsertPacket(packet); |
- |
ASSERT_EQ(1UL, frames_from_callback_.size()); |
RtpFrameObject* frame = frames_from_callback_.begin()->second.get(); |
EXPECT_EQ(3, frame->times_nacked()); |
} |
TEST_F(TestPacketBuffer, FrameSize) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
uint8_t data[] = {1, 2, 3, 4, 5}; |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast, 5, data); |
- InsertPacket(seq_num + 1, kKeyFrame, kNotFirst, kNotLast, 5, data); |
- InsertPacket(seq_num + 2, kKeyFrame, kNotFirst, kNotLast, 5, data); |
- InsertPacket(seq_num + 3, kKeyFrame, kNotFirst, kLast, 5, data); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast, 5, data)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast, 5, data)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kNotLast, 5, data)); |
+ EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kNotFirst, kLast, 5, data)); |
ASSERT_EQ(1UL, frames_from_callback_.size()); |
EXPECT_EQ(20UL, frames_from_callback_.begin()->second->size); |
} |
TEST_F(TestPacketBuffer, ExpandBuffer) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
for (int i = 0; i < kStartSize + 1; ++i) { |
- InsertPacket(seq_num + i, kKeyFrame, kFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast)); |
} |
} |
-TEST_F(TestPacketBuffer, ExpandBufferOverflow) { |
- uint16_t seq_num = Rand(); |
+TEST_F(TestPacketBuffer, SingleFrameExpandsBuffer) { |
+ const uint16_t seq_num = Rand(); |
- for (int i = 0; i < kMaxSize; ++i) { |
- InsertPacket(seq_num + i, kKeyFrame, kFirst, kLast); |
- } |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ for (int i = 1; i < kStartSize; ++i) |
+ EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kNotFirst, kLast)); |
- VCMPacket packet; |
- packet.seqNum = seq_num + kMaxSize + 1; |
- EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); |
+ ASSERT_EQ(1UL, frames_from_callback_.size()); |
+ CheckFrame(seq_num); |
+} |
+ |
+TEST_F(TestPacketBuffer, ExpandBufferOverflow) { |
+ const uint16_t seq_num = Rand(); |
+ |
+ for (int i = 0; i < kMaxSize; ++i) |
+ EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast)); |
+ EXPECT_FALSE(Insert(seq_num + kMaxSize + 1, kKeyFrame, kFirst, kLast)); |
} |
TEST_F(TestPacketBuffer, OnePacketOneFrame) { |
- uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
+ const uint16_t seq_num = Rand(); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
ASSERT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
} |
TEST_F(TestPacketBuffer, TwoPacketsTwoFrames) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 1, kKeyFrame, kFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast)); |
EXPECT_EQ(2UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
@@ -187,90 +223,80 @@ TEST_F(TestPacketBuffer, TwoPacketsTwoFrames) { |
} |
TEST_F(TestPacketBuffer, TwoPacketsOneFrames) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast); |
- InsertPacket(seq_num + 1, kKeyFrame, kNotFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast)); |
EXPECT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
} |
TEST_F(TestPacketBuffer, ThreePacketReorderingOneFrame) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast); |
- InsertPacket(seq_num + 2, kKeyFrame, kNotFirst, kLast); |
- InsertPacket(seq_num + 1, kKeyFrame, kNotFirst, kNotLast); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast)); |
EXPECT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
} |
-TEST_F(TestPacketBuffer, DiscardOldPacket) { |
- VCMPacket packet; |
- packet.seqNum = Rand(); |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- packet.seqNum += 2; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- |
- for (int i = 3; i < kMaxSize; ++i) { |
- ++packet.seqNum; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- } |
+TEST_F(TestPacketBuffer, Frames) { |
+ const uint16_t seq_num = Rand(); |
+ |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast)); |
- ++packet.seqNum; |
- EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); |
- packet_buffer_->ClearTo(packet.seqNum + 1); |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
+ ASSERT_EQ(4UL, frames_from_callback_.size()); |
+ CheckFrame(seq_num); |
+ CheckFrame(seq_num + 1); |
+ CheckFrame(seq_num + 2); |
+ CheckFrame(seq_num + 3); |
} |
-TEST_F(TestPacketBuffer, DiscardMultipleOldPackets) { |
- uint16_t seq_num = Rand(); |
- VCMPacket packet; |
- packet.seqNum = seq_num; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- packet.seqNum += 2; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
+TEST_F(TestPacketBuffer, ClearSinglePacket) { |
+ const uint16_t seq_num = Rand(); |
- for (int i = 3; i < kMaxSize; ++i) { |
- ++packet.seqNum; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- } |
+ for (int i = 0; i < kMaxSize; ++i) |
+ EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kFirst, kLast)); |
- packet_buffer_->ClearTo(seq_num + 15); |
- for (int i = 0; i < 15; ++i) { |
- ++packet.seqNum; |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
- } |
- for (int i = 15; i < kMaxSize; ++i) { |
- ++packet.seqNum; |
- EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); |
- } |
+ packet_buffer_->ClearTo(seq_num); |
+ EXPECT_TRUE(Insert(seq_num + kMaxSize, kDeltaFrame, kFirst, kLast)); |
} |
-TEST_F(TestPacketBuffer, Frames) { |
- uint16_t seq_num = Rand(); |
+TEST_F(TestPacketBuffer, OneIncompleteFrame) { |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 1, kDeltaFrame, kFirst, kLast); |
- InsertPacket(seq_num + 2, kDeltaFrame, kFirst, kLast); |
- InsertPacket(seq_num + 3, kDeltaFrame, kFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast)); |
- ASSERT_EQ(4UL, frames_from_callback_.size()); |
+ ASSERT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
- CheckFrame(seq_num + 1); |
- CheckFrame(seq_num + 2); |
- CheckFrame(seq_num + 3); |
+} |
+ |
+TEST_F(TestPacketBuffer, TwoIncompleteFramesFullBuffer) { |
+ const uint16_t seq_num = Rand(); |
+ |
+ for (int i = 1; i < kMaxSize - 1; ++i) |
+ EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast)); |
+ |
+ ASSERT_EQ(0UL, frames_from_callback_.size()); |
} |
TEST_F(TestPacketBuffer, FramesReordered) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num + 1, kDeltaFrame, kFirst, kLast); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kLast); |
- InsertPacket(seq_num + 3, kDeltaFrame, kFirst, kLast); |
- InsertPacket(seq_num + 2, kDeltaFrame, kFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast)); |
ASSERT_EQ(4UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
@@ -289,14 +315,15 @@ TEST_F(TestPacketBuffer, GetBitstreamFromFrame) { |
uint8_t |
result[sizeof(many) + sizeof(bitstream) + sizeof(such) + sizeof(data)]; |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast, sizeof(many), many); |
- InsertPacket(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast, sizeof(bitstream), |
- bitstream); |
- InsertPacket(seq_num + 2, kDeltaFrame, kNotFirst, kNotLast, sizeof(such), |
- such); |
- InsertPacket(seq_num + 3, kDeltaFrame, kNotFirst, kLast, sizeof(data), data); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast, sizeof(many), many)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast, |
+ sizeof(bitstream), bitstream)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kNotLast, |
+ sizeof(such), such)); |
+ EXPECT_TRUE( |
+ Insert(seq_num + 3, kDeltaFrame, kNotFirst, kLast, sizeof(data), data)); |
ASSERT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
@@ -305,50 +332,48 @@ TEST_F(TestPacketBuffer, GetBitstreamFromFrame) { |
} |
TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast); |
- InsertPacket(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast); |
- InsertPacket(seq_num + 2, kDeltaFrame, kNotFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast)); |
EXPECT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
frames_from_callback_.clear(); |
// Insert frame that fills the whole buffer. |
- InsertPacket(seq_num + 3, kKeyFrame, kFirst, kNotLast); |
+ EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kNotLast)); |
for (int i = 0; i < kMaxSize - 2; ++i) |
- InsertPacket(seq_num + i + 4, kDeltaFrame, kNotFirst, kNotLast); |
- InsertPacket(seq_num + kMaxSize + 2, kKeyFrame, kNotFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num + i + 4, kDeltaFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + kMaxSize + 2, kKeyFrame, kNotFirst, kLast)); |
EXPECT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num + 3); |
} |
TEST_F(TestPacketBuffer, Clear) { |
- uint16_t seq_num = Rand(); |
+ const uint16_t seq_num = Rand(); |
- InsertPacket(seq_num, kKeyFrame, kFirst, kNotLast); |
- InsertPacket(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast); |
- InsertPacket(seq_num + 2, kDeltaFrame, kNotFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast)); |
EXPECT_EQ(1UL, frames_from_callback_.size()); |
CheckFrame(seq_num); |
packet_buffer_->Clear(); |
- InsertPacket(seq_num + kStartSize, kKeyFrame, kFirst, kNotLast); |
- InsertPacket(seq_num + kStartSize + 1, kDeltaFrame, kNotFirst, kNotLast); |
- InsertPacket(seq_num + kStartSize + 2, kDeltaFrame, kNotFirst, kLast); |
+ EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kFirst, kNotLast)); |
+ EXPECT_TRUE( |
+ Insert(seq_num + kStartSize + 1, kDeltaFrame, kNotFirst, kNotLast)); |
+ EXPECT_TRUE(Insert(seq_num + kStartSize + 2, kDeltaFrame, kNotFirst, kLast)); |
EXPECT_EQ(2UL, frames_from_callback_.size()); |
CheckFrame(seq_num + kStartSize); |
} |
TEST_F(TestPacketBuffer, InvalidateFrameByClearing) { |
- VCMPacket packet; |
- packet.frameType = kVideoFrameKey; |
- packet.isFirstPacket = true; |
- packet.markerBit = true; |
- packet.seqNum = Rand(); |
- EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
+ const uint16_t seq_num = Rand(); |
+ |
+ EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast)); |
ASSERT_EQ(1UL, frames_from_callback_.size()); |
packet_buffer_->Clear(); |