| Index: webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| diff --git a/webrtc/modules/video_coding/jitter_buffer_unittest.cc b/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| index c5384681b354e05478fcc0fbd2d650f4baa4ca4d..df70ea98261c40b26c79ed4a44f9f8ee0fe25bb5 100644
|
| --- a/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| +++ b/webrtc/modules/video_coding/jitter_buffer_unittest.cc
|
| @@ -8,12 +8,13 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -#include <string.h>
|
| +#include <string>
|
|
|
| #include <list>
|
| #include <memory>
|
|
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "webrtc/modules/video_coding/frame_buffer.h"
|
| #include "webrtc/modules/video_coding/jitter_buffer.h"
|
| #include "webrtc/modules/video_coding/media_opt_util.h"
|
| @@ -21,7 +22,9 @@
|
| #include "webrtc/modules/video_coding/test/stream_generator.h"
|
| #include "webrtc/modules/video_coding/test/test_util.h"
|
| #include "webrtc/system_wrappers/include/clock.h"
|
| +#include "webrtc/system_wrappers/include/field_trial.h"
|
| #include "webrtc/system_wrappers/include/metrics.h"
|
| +#include "webrtc/test/field_trial.h"
|
| #include "webrtc/test/histogram.h"
|
|
|
| namespace webrtc {
|
| @@ -185,13 +188,40 @@ TEST_F(Vp9SsMapTest, UpdatePacket) {
|
| EXPECT_EQ(2, packet_.codecSpecificHeader.codecHeader.VP9.pid_diff[1]);
|
| }
|
|
|
| -class TestBasicJitterBuffer : public ::testing::Test {
|
| +class ProcessThreadMock : public ProcessThread {
|
| + public:
|
| + MOCK_METHOD0(Start, void());
|
| + MOCK_METHOD0(Stop, void());
|
| + MOCK_METHOD1(WakeUp, void(Module* module));
|
| + MOCK_METHOD1(RegisterModule, void(Module* module));
|
| + MOCK_METHOD1(DeRegisterModule, void(Module* module));
|
| + void PostTask(rtc::scoped_ptr<ProcessTask> task) {}
|
| +};
|
| +
|
| +class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
|
| + public NackSender,
|
| + public KeyFrameRequestSender {
|
| + public:
|
| + void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
|
| + nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
|
| + sequence_numbers.end());
|
| + }
|
| +
|
| + void RequestKeyFrame() override { ++keyframe_requests_; }
|
| +
|
| + ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
|
| + std::vector<uint16_t> nack_sent_;
|
| + int keyframe_requests_;
|
| +
|
| protected:
|
| + TestBasicJitterBuffer() : scoped_field_trial_(GetParam()) {}
|
| virtual void SetUp() {
|
| clock_.reset(new SimulatedClock(0));
|
| jitter_buffer_.reset(new VCMJitterBuffer(
|
| clock_.get(),
|
| - std::unique_ptr<EventWrapper>(event_factory_.CreateEvent())));
|
| + std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
|
| + this,
|
| + this));
|
| jitter_buffer_->Start();
|
| seq_num_ = 1234;
|
| timestamp_ = 0;
|
| @@ -278,9 +308,30 @@ class TestBasicJitterBuffer : public ::testing::Test {
|
| std::unique_ptr<SimulatedClock> clock_;
|
| NullEventFactory event_factory_;
|
| std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
|
| + test::ScopedFieldTrials scoped_field_trial_;
|
| };
|
|
|
| -class TestRunningJitterBuffer : public ::testing::Test {
|
| +INSTANTIATE_TEST_CASE_P(
|
| + TestWithNackModule,
|
| + TestBasicJitterBuffer,
|
| + ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
|
| + "WebRTC-NewVideoJitterBuffer/Disabled/"));
|
| +
|
| +class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
|
| + public NackSender,
|
| + public KeyFrameRequestSender {
|
| + public:
|
| + void SendNack(const std::vector<uint16_t>& sequence_numbers) {
|
| + nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
|
| + sequence_numbers.end());
|
| + }
|
| +
|
| + void RequestKeyFrame() { ++keyframe_requests_; }
|
| +
|
| + ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
|
| + std::vector<uint16_t> nack_sent_;
|
| + int keyframe_requests_;
|
| +
|
| protected:
|
| enum { kDataBufferSize = 10 };
|
|
|
| @@ -290,7 +341,8 @@ class TestRunningJitterBuffer : public ::testing::Test {
|
| oldest_packet_to_nack_ = 250;
|
| jitter_buffer_ = new VCMJitterBuffer(
|
| clock_.get(),
|
| - std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()));
|
| + std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
|
| + this, this);
|
| stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
|
| jitter_buffer_->Start();
|
| jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
|
| @@ -390,15 +442,24 @@ class TestRunningJitterBuffer : public ::testing::Test {
|
|
|
| class TestJitterBufferNack : public TestRunningJitterBuffer {
|
| protected:
|
| + TestJitterBufferNack() : scoped_field_trial_(GetParam()) {}
|
| virtual void SetUp() {
|
| TestRunningJitterBuffer::SetUp();
|
| jitter_buffer_->SetNackMode(kNack, -1, -1);
|
| }
|
|
|
| virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
|
| +
|
| + test::ScopedFieldTrials scoped_field_trial_;
|
| };
|
|
|
| -TEST_F(TestBasicJitterBuffer, StopRunning) {
|
| +INSTANTIATE_TEST_CASE_P(
|
| + TestWithNackModule,
|
| + TestJitterBufferNack,
|
| + ::testing::Values("WebRTC-NewVideoJitterBuffer/Enabled/",
|
| + "WebRTC-NewVideoJitterBuffer/Disabled/"));
|
| +
|
| +TEST_P(TestBasicJitterBuffer, StopRunning) {
|
| jitter_buffer_->Stop();
|
| EXPECT_TRUE(NULL == DecodeCompleteFrame());
|
| EXPECT_TRUE(NULL == DecodeIncompleteFrame());
|
| @@ -418,7 +479,7 @@ TEST_F(TestBasicJitterBuffer, StopRunning) {
|
| EXPECT_TRUE(NULL == DecodeIncompleteFrame());
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
|
| +TEST_P(TestBasicJitterBuffer, SinglePacketFrame) {
|
| // Always start with a complete key frame when not allowing errors.
|
| jitter_buffer_->SetDecodeErrorMode(kNoErrors);
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -436,7 +497,7 @@ TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
|
| +TEST_P(TestBasicJitterBuffer, VerifyHistogramStats) {
|
| test::ClearHistograms();
|
| // Always start with a complete key frame when not allowing errors.
|
| jitter_buffer_->SetDecodeErrorMode(kNoErrors);
|
| @@ -478,7 +539,7 @@ TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
|
| 1, test::NumHistogramSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
|
| +TEST_P(TestBasicJitterBuffer, DualPacketFrame) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = false;
|
| @@ -505,7 +566,7 @@ TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
|
| +TEST_P(TestBasicJitterBuffer, 100PacketKeyFrame) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = false;
|
| @@ -548,7 +609,7 @@ TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
|
| +TEST_P(TestBasicJitterBuffer, 100PacketDeltaFrame) {
|
| // Always start with a complete key frame.
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| @@ -604,7 +665,7 @@ TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
|
| +TEST_P(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
|
| // Insert the "first" packet last.
|
| seq_num_ += 100;
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -651,7 +712,7 @@ TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
|
| +TEST_P(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
|
| packet_->frameType = kVideoFrameDelta;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = false;
|
| @@ -711,7 +772,7 @@ TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
|
| +TEST_P(TestBasicJitterBuffer, TestReorderingWithPadding) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = true;
|
| @@ -768,7 +829,7 @@ TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
|
| +TEST_P(TestBasicJitterBuffer, DuplicatePackets) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = false;
|
| @@ -811,7 +872,7 @@ TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
|
| +TEST_P(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = true;
|
| @@ -863,7 +924,7 @@ TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
|
| }
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
|
| +TEST_P(TestBasicJitterBuffer, TestSkipForwardVp9) {
|
| // Verify that JB skips forward to next base layer frame.
|
| // -------------------------------------------------
|
| // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
|
| @@ -916,7 +977,7 @@ TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
|
| +TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
|
| // Verify that frames are updated with SS data when SS packet is reordered.
|
| // --------------------------------
|
| // | 65486 | 65487 | 65485 |...
|
| @@ -990,7 +1051,7 @@ TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
|
| +TEST_P(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
|
| // Verify that frames are updated with SS data when SS packet is reordered.
|
| // -----------------------------------------
|
| // | 65486 | 65487 | 65485 | 65484 |...
|
| @@ -1074,7 +1135,7 @@ TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
|
| +TEST_P(TestBasicJitterBuffer, H264InsertStartCode) {
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| packet_->markerBit = false;
|
| @@ -1106,7 +1167,7 @@ TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
|
| }
|
|
|
| // Test threshold conditions of decodable state.
|
| -TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
|
| +TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
|
| jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
|
| // Always start with a key frame. Use 10 packets to test Decodable State
|
| // boundaries.
|
| @@ -1192,7 +1253,7 @@ TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
|
| }
|
|
|
| // Make sure first packet is present before a frame can be decoded.
|
| -TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
|
| +TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
|
| jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
|
| // Always start with a key frame.
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -1256,7 +1317,7 @@ TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
|
| }
|
|
|
| // Make sure first packet is present before a frame can be decoded.
|
| -TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
|
| +TEST_P(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
|
| jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
|
| // Always start with a key frame.
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -1318,7 +1379,7 @@ TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
|
| +TEST_P(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
|
| // Will use one packet per frame.
|
| jitter_buffer_->SetDecodeErrorMode(kWithErrors);
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -1361,7 +1422,7 @@ TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
|
| EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, PacketLoss) {
|
| +TEST_P(TestBasicJitterBuffer, PacketLoss) {
|
| // Verify missing packets statistics and not decodable packets statistics.
|
| // Insert 10 frames consisting of 4 packets and remove one from all of them.
|
| // The last packet is an empty (non-media) packet.
|
| @@ -1462,7 +1523,7 @@ TEST_F(TestBasicJitterBuffer, PacketLoss) {
|
| EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
|
| +TEST_P(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
|
| seq_num_ = 0xfff0;
|
| packet_->frameType = kVideoFrameKey;
|
| packet_->isFirstPacket = true;
|
| @@ -1511,7 +1572,7 @@ TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
|
| +TEST_P(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
|
| // Insert "first" packet last seqnum.
|
| seq_num_ = 10;
|
| packet_->frameType = kVideoFrameKey;
|
| @@ -1560,7 +1621,7 @@ TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
|
| +TEST_P(TestBasicJitterBuffer, TestInsertOldFrame) {
|
| // ------- -------
|
| // | 2 | | 1 |
|
| // ------- -------
|
| @@ -1594,7 +1655,7 @@ TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
|
| EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
|
| +TEST_P(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
|
| // ------- -------
|
| // | 2 | | 1 |
|
| // ------- -------
|
| @@ -1633,7 +1694,7 @@ TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
|
| EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, TimestampWrap) {
|
| +TEST_P(TestBasicJitterBuffer, TimestampWrap) {
|
| // --------------- ---------------
|
| // | 1 | 2 | | 3 | 4 |
|
| // --------------- ---------------
|
| @@ -1693,7 +1754,7 @@ TEST_F(TestBasicJitterBuffer, TimestampWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
|
| +TEST_P(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
|
| // ------- -------
|
| // | 1 | | 2 |
|
| // ------- -------
|
| @@ -1735,7 +1796,7 @@ TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out2);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
|
| +TEST_P(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
|
| // ------- -------
|
| // | 2 | | 1 |
|
| // ------- -------
|
| @@ -1778,7 +1839,7 @@ TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out2);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
|
| +TEST_P(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
|
| int loop = 0;
|
| bool firstPacket = true;
|
| bool retransmitted = false;
|
| @@ -1813,7 +1874,7 @@ TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
|
| EXPECT_TRUE(NULL == DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
|
| +TEST_P(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
|
| // TEST fill JB with more than max number of frame (50 delta frames +
|
| // 51 key frames) with wrap in seq_num_
|
| //
|
| @@ -1873,7 +1934,7 @@ TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
|
| +TEST_P(TestBasicJitterBuffer, EmptyLastFrame) {
|
| jitter_buffer_->SetDecodeErrorMode(kWithErrors);
|
| seq_num_ = 3;
|
| // Insert one empty packet per frame, should never return the last timestamp
|
| @@ -1899,7 +1960,7 @@ TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
|
| }
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
|
| +TEST_P(TestBasicJitterBuffer, H264IncompleteNalu) {
|
| jitter_buffer_->SetNackMode(kNoNack, -1, -1);
|
| jitter_buffer_->SetDecodeErrorMode(kWithErrors);
|
| ++seq_num_;
|
| @@ -2080,7 +2141,7 @@ TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
|
| jitter_buffer_->ReleaseFrame(frame_out);
|
| }
|
|
|
| -TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
|
| +TEST_P(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
|
| // Test that a we cannot get incomplete frames from the JB if we haven't
|
| // received the marker bit, unless we have received a packet from a later
|
| // timestamp.
|
| @@ -2257,7 +2318,7 @@ TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, EmptyPackets) {
|
| +TEST_P(TestJitterBufferNack, EmptyPackets) {
|
| // Make sure empty packets doesn't clog the jitter buffer.
|
| jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
|
| EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
|
| @@ -2265,7 +2326,7 @@ TEST_F(TestJitterBufferNack, EmptyPackets) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NackTooOldPackets) {
|
| +TEST_P(TestJitterBufferNack, NackTooOldPackets) {
|
| // Insert a key frame and decode it.
|
| EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| @@ -2298,7 +2359,7 @@ TEST_F(TestJitterBufferNack, NackTooOldPackets) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
|
| +TEST_P(TestJitterBufferNack, NackLargeJitterBuffer) {
|
| // Insert a key frame and decode it.
|
| EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| @@ -2317,7 +2378,7 @@ TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NackListFull) {
|
| +TEST_P(TestJitterBufferNack, NackListFull) {
|
| // Insert a key frame and decode it.
|
| EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| @@ -2350,7 +2411,7 @@ TEST_F(TestJitterBufferNack, NackListFull) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
|
| +TEST_P(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
|
| DropFrame(10);
|
| // Insert a frame and try to generate a NACK list. Shouldn't get one.
|
| EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
|
| @@ -2362,7 +2423,7 @@ TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
|
| EXPECT_TRUE(request_key_frame);
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
|
| +TEST_P(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
|
| stream_generator_->Init(0, clock_->TimeInMilliseconds());
|
| InsertFrame(kVideoFrameKey);
|
| stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
|
| @@ -2372,10 +2433,13 @@ TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| bool extended = false;
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| - EXPECT_EQ(1u, nack_list.size());
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
|
| + EXPECT_EQ(1u, nack_sent_.size());
|
| + else
|
| + EXPECT_EQ(1u, nack_list.size());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
|
| +TEST_P(TestJitterBufferNack, VerifyRetransmittedFlag) {
|
| stream_generator_->Init(0, clock_->TimeInMilliseconds());
|
| stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
|
| clock_->TimeInMilliseconds());
|
| @@ -2391,16 +2455,23 @@ TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
|
| EXPECT_FALSE(DecodeCompleteFrame());
|
| bool extended = false;
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| - EXPECT_EQ(1u, nack_list.size());
|
| + uint16_t seq_num;
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + EXPECT_EQ(1u, nack_sent_.size());
|
| + seq_num = nack_sent_[0];
|
| + } else {
|
| + EXPECT_EQ(1u, nack_list.size());
|
| + seq_num = nack_list[0];
|
| + }
|
| stream_generator_->PopPacket(&packet, 0);
|
| - EXPECT_EQ(packet.seqNum, nack_list[0]);
|
| + EXPECT_EQ(packet.seqNum, seq_num);
|
| EXPECT_EQ(kCompleteSession,
|
| jitter_buffer_->InsertPacket(packet, &retransmitted));
|
| EXPECT_TRUE(retransmitted);
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
|
| +TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
|
| stream_generator_->Init(0, clock_->TimeInMilliseconds());
|
| stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
|
| clock_->TimeInMilliseconds());
|
| @@ -2410,13 +2481,20 @@ TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
|
| EXPECT_FALSE(DecodeCompleteFrame());
|
| bool extended = false;
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| - EXPECT_EQ(1u, nack_list.size());
|
| + uint16_t seq_num;
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + ASSERT_EQ(1u, nack_sent_.size());
|
| + seq_num = nack_sent_[0];
|
| + } else {
|
| + ASSERT_EQ(1u, nack_list.size());
|
| + seq_num = nack_list[0];
|
| + }
|
| VCMPacket packet;
|
| stream_generator_->GetPacket(&packet, 0);
|
| - EXPECT_EQ(packet.seqNum, nack_list[0]);
|
| + EXPECT_EQ(packet.seqNum, seq_num);
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
|
| +TEST_P(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
|
| VCMPacket packet;
|
| stream_generator_->Init(0, clock_->TimeInMilliseconds());
|
| // First frame is delta.
|
| @@ -2435,12 +2513,19 @@ TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
|
| EXPECT_FALSE(DecodeCompleteFrame());
|
| bool extended = false;
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| - EXPECT_EQ(1u, nack_list.size());
|
| + uint16_t seq_num;
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + ASSERT_EQ(2u, nack_sent_.size());
|
| + seq_num = nack_sent_[1];
|
| + } else {
|
| + ASSERT_EQ(1u, nack_list.size());
|
| + seq_num = nack_list[0];
|
| + }
|
| stream_generator_->GetPacket(&packet, 0);
|
| - EXPECT_EQ(packet.seqNum, nack_list[0]);
|
| + EXPECT_EQ(packet.seqNum, seq_num);
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NormalOperation) {
|
| +TEST_P(TestJitterBufferNack, NormalOperation) {
|
| EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
|
| jitter_buffer_->SetDecodeErrorMode(kWithErrors);
|
|
|
| @@ -2468,16 +2553,20 @@ TEST_F(TestJitterBufferNack, NormalOperation) {
|
| EXPECT_FALSE(DecodeCompleteFrame());
|
| EXPECT_FALSE(DecodeIncompleteFrame());
|
| bool request_key_frame = false;
|
| +
|
| + // Verify the NACK list.
|
| std::vector<uint16_t> nack_list =
|
| jitter_buffer_->GetNackList(&request_key_frame);
|
| - // Verify the NACK list.
|
| const size_t kExpectedNackSize = 9;
|
| - ASSERT_EQ(kExpectedNackSize, nack_list.size());
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled")
|
| + ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
|
| + else
|
| + ASSERT_EQ(kExpectedNackSize, nack_list.size());
|
| for (size_t i = 0; i < nack_list.size(); ++i)
|
| EXPECT_EQ((1 + i) * 10, nack_list[i]);
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NormalOperationWrap) {
|
| +TEST_P(TestJitterBufferNack, NormalOperationWrap) {
|
| bool request_key_frame = false;
|
| // ------- ------------------------------------------------------------
|
| // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
|
| @@ -2506,12 +2595,18 @@ TEST_F(TestJitterBufferNack, NormalOperationWrap) {
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| // Verify the NACK list.
|
| const size_t kExpectedNackSize = 10;
|
| - ASSERT_EQ(kExpectedNackSize, nack_list.size());
|
| - for (size_t i = 0; i < nack_list.size(); ++i)
|
| - EXPECT_EQ(i * 10, nack_list[i]);
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + ASSERT_EQ(kExpectedNackSize, nack_sent_.size());
|
| + for (size_t i = 0; i < nack_sent_.size(); ++i)
|
| + EXPECT_EQ(i * 10, nack_sent_[i]);
|
| + } else {
|
| + ASSERT_EQ(kExpectedNackSize, nack_list.size());
|
| + for (size_t i = 0; i < nack_list.size(); ++i)
|
| + EXPECT_EQ(i * 10, nack_list[i]);
|
| + }
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
|
| +TEST_P(TestJitterBufferNack, NormalOperationWrap2) {
|
| bool request_key_frame = false;
|
| // -----------------------------------
|
| // | 65532 | 65533 | 65534 | x | 0 | 1 |
|
| @@ -2539,11 +2634,16 @@ TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
|
| bool extended = false;
|
| std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
|
| // Verify the NACK list.
|
| - ASSERT_EQ(1u, nack_list.size());
|
| - EXPECT_EQ(65535, nack_list[0]);
|
| + if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") {
|
| + ASSERT_EQ(1u, nack_sent_.size());
|
| + EXPECT_EQ(65535, nack_sent_[0]);
|
| + } else {
|
| + ASSERT_EQ(1u, nack_list.size());
|
| + EXPECT_EQ(65535, nack_list[0]);
|
| + }
|
| }
|
|
|
| -TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
|
| +TEST_P(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
|
| stream_generator_->Init(0, clock_->TimeInMilliseconds());
|
| InsertFrame(kVideoFrameKey);
|
| EXPECT_TRUE(DecodeCompleteFrame());
|
|
|