| Index: webrtc/video/end_to_end_tests.cc
|
| diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
|
| index 99f951df5b67ec43f7efe0b340bc446cedd7742a..5c16ef2b006ed5483992595f0f7f63a2408159be 100644
|
| --- a/webrtc/video/end_to_end_tests.cc
|
| +++ b/webrtc/video/end_to_end_tests.cc
|
| @@ -19,6 +19,7 @@
|
| #include "webrtc/base/event.h"
|
| #include "webrtc/base/file.h"
|
| #include "webrtc/base/optional.h"
|
| +#include "webrtc/base/random.h"
|
| #include "webrtc/base/rate_limiter.h"
|
| #include "webrtc/call/call.h"
|
| #include "webrtc/common_video/include/frame_callback.h"
|
| @@ -708,7 +709,7 @@ TEST_P(EndToEndTest, CanReceiveFlexfec) {
|
| public rtc::VideoSinkInterface<VideoFrame> {
|
| public:
|
| FlexfecRenderObserver()
|
| - : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {}
|
| + : EndToEndTest(kDefaultTimeoutMs), random_(0xcafef00d1) {}
|
|
|
| size_t GetNumFlexfecStreams() const override { return 1; }
|
|
|
| @@ -723,36 +724,30 @@ TEST_P(EndToEndTest, CanReceiveFlexfec) {
|
| EXPECT_EQ(kFlexfecPayloadType, payload_type);
|
| }
|
|
|
| - auto seq_num_it = protected_sequence_numbers_.find(header.sequenceNumber);
|
| - if (seq_num_it != protected_sequence_numbers_.end()) {
|
| - // Retransmitted packet, should not count.
|
| - protected_sequence_numbers_.erase(seq_num_it);
|
| - auto ts_it = protected_timestamps_.find(header.timestamp);
|
| - EXPECT_NE(ts_it, protected_timestamps_.end());
|
| - protected_timestamps_.erase(ts_it);
|
| - return SEND_PACKET;
|
| + // Is this a retransmitted media packet? From the perspective of FEC, this
|
| + // packet is then no longer dropped, so remove it from the list of
|
| + // dropped packets.
|
| + if (payload_type == kFakeVideoSendPayloadType) {
|
| + auto seq_num_it = dropped_sequence_numbers_.find(header.sequenceNumber);
|
| + if (seq_num_it != dropped_sequence_numbers_.end()) {
|
| + dropped_sequence_numbers_.erase(seq_num_it);
|
| + auto ts_it = dropped_timestamps_.find(header.timestamp);
|
| + EXPECT_NE(ts_it, dropped_timestamps_.end());
|
| + dropped_timestamps_.erase(ts_it);
|
| +
|
| + return SEND_PACKET;
|
| + }
|
| }
|
|
|
| - switch (state_) {
|
| - case kFirstPacket:
|
| - state_ = kDropEveryOtherPacketUntilFlexfec;
|
| - break;
|
| - case kDropEveryOtherPacketUntilFlexfec:
|
| - if (payload_type == kFlexfecPayloadType) {
|
| - state_ = kDropNextMediaPacket;
|
| - return SEND_PACKET;
|
| - }
|
| - if (header.sequenceNumber % 2 == 0)
|
| - return DROP_PACKET;
|
| - break;
|
| - case kDropNextMediaPacket:
|
| - if (payload_type == kFakeVideoSendPayloadType) {
|
| - protected_sequence_numbers_.insert(header.sequenceNumber);
|
| - protected_timestamps_.insert(header.timestamp);
|
| - state_ = kDropEveryOtherPacketUntilFlexfec;
|
| - return DROP_PACKET;
|
| - }
|
| - break;
|
| + // Simulate 5% packet loss. Record what media packets, and corresponding
|
| + // timestamps, that were dropped.
|
| + if (random_.Rand(1, 100) <= 5) {
|
| + if (payload_type == kFakeVideoSendPayloadType) {
|
| + dropped_sequence_numbers_.insert(header.sequenceNumber);
|
| + dropped_timestamps_.insert(header.timestamp);
|
| + }
|
| +
|
| + return DROP_PACKET;
|
| }
|
|
|
| return SEND_PACKET;
|
| @@ -762,17 +757,11 @@ TEST_P(EndToEndTest, CanReceiveFlexfec) {
|
| rtc::CritScope lock(&crit_);
|
| // Rendering frame with timestamp of packet that was dropped -> FEC
|
| // protection worked.
|
| - auto it = protected_timestamps_.find(video_frame.timestamp());
|
| - if (it != protected_timestamps_.end())
|
| + auto it = dropped_timestamps_.find(video_frame.timestamp());
|
| + if (it != dropped_timestamps_.end())
|
| observation_complete_.Set();
|
| }
|
|
|
| - enum {
|
| - kFirstPacket,
|
| - kDropEveryOtherPacketUntilFlexfec,
|
| - kDropNextMediaPacket,
|
| - } state_;
|
| -
|
| void ModifyVideoConfigs(
|
| VideoSendStream::Config* send_config,
|
| std::vector<VideoReceiveStream::Config>* receive_configs,
|
| @@ -786,10 +775,11 @@ TEST_P(EndToEndTest, CanReceiveFlexfec) {
|
| }
|
|
|
| rtc::CriticalSection crit_;
|
| - std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_);
|
| + std::set<uint32_t> dropped_sequence_numbers_ GUARDED_BY(crit_);
|
| // Since several packets can have the same timestamp a multiset is used
|
| // instead of a set.
|
| - std::multiset<uint32_t> protected_timestamps_ GUARDED_BY(crit_);
|
| + std::multiset<uint32_t> dropped_timestamps_ GUARDED_BY(crit_);
|
| + Random random_;
|
| } test;
|
|
|
| RunBaseTest(&test);
|
|
|