1 /* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * Use of this source code is governed by a BSD-style license
4 * that can be found in the LICENSE file in the root of the source
5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree.
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webrtc/modules/video_coding/main/source/packet.h"
16 #include "webrtc/modules/video_coding/main/source/receiver.h"
17 #include "webrtc/modules/video_coding/main/source/test/stream_generator.h"
18 #include "webrtc/modules/video_coding/main/source/timing.h"
19 #include "webrtc/modules/video_coding/main/test/test_util.h"
20 #include "webrtc/system_wrappers/interface/clock.h"
21 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
25 class TestVCMReceiver : public ::testing::Test {
27 enum { kDataBufferSize = 10 };
28 enum { kWidth = 640 };
29 enum { kHeight = 480 };
32 : clock_(new SimulatedClock(0)),
33 timing_(clock_.get()),
34 receiver_(&timing_, clock_.get(), &event_factory_, true) {
35 stream_generator_.reset(new
36 StreamGenerator(0, 0, clock_->TimeInMilliseconds()));
37 memset(data_buffer_, 0, kDataBufferSize);
40 virtual void SetUp() {
44 int32_t InsertPacket(int index) {
46 packet.dataPtr = data_buffer_;
47 bool packet_available = stream_generator_->GetPacket(&packet, index);
48 EXPECT_TRUE(packet_available);
49 if (!packet_available)
50 return kGeneralError; // Return here to avoid crashes below.
51 // Arbitrary width and height.
52 return receiver_.InsertPacket(packet, 640, 480);
55 int32_t InsertPacketAndPop(int index) {
57 packet.dataPtr = data_buffer_;
58 bool packet_available = stream_generator_->PopPacket(&packet, index);
59 EXPECT_TRUE(packet_available);
60 if (!packet_available)
61 return kGeneralError; // Return here to avoid crashes below.
62 return receiver_.InsertPacket(packet, kWidth, kHeight);
65 int32_t InsertFrame(FrameType frame_type, bool complete) {
66 int num_of_packets = complete ? 1 : 2;
67 stream_generator_->GenerateFrame(
69 (frame_type != kFrameEmpty) ? num_of_packets : 0,
70 (frame_type == kFrameEmpty) ? 1 : 0,
71 clock_->TimeInMilliseconds());
72 int32_t ret = InsertPacketAndPop(0);
74 // Drop the second packet.
76 stream_generator_->PopPacket(&packet, 0);
78 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
82 bool DecodeNextFrame() {
83 int64_t render_time_ms = 0;
84 VCMEncodedFrame* frame = receiver_.FrameForDecoding(0, render_time_ms,
88 receiver_.ReleaseFrame(frame);
92 scoped_ptr<SimulatedClock> clock_;
94 NullEventFactory event_factory_;
95 VCMReceiver receiver_;
96 scoped_ptr<StreamGenerator> stream_generator_;
97 uint8_t data_buffer_[kDataBufferSize];
100 TEST_F(TestVCMReceiver, RenderBufferSize_AllComplete) {
101 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
102 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
103 int num_of_frames = 10;
104 for (int i = 0; i < num_of_frames; ++i) {
105 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
107 EXPECT_EQ(num_of_frames * kDefaultFramePeriodMs,
108 receiver_.RenderBufferSizeMs());
111 TEST_F(TestVCMReceiver, RenderBufferSize_SkipToKeyFrame) {
112 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
113 const int kNumOfNonDecodableFrames = 2;
114 for (int i = 0; i < kNumOfNonDecodableFrames; ++i) {
115 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
117 const int kNumOfFrames = 10;
118 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
119 for (int i = 0; i < kNumOfFrames - 1; ++i) {
120 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
122 EXPECT_EQ((kNumOfFrames - 1) * kDefaultFramePeriodMs,
123 receiver_.RenderBufferSizeMs());
126 TEST_F(TestVCMReceiver, RenderBufferSize_NotAllComplete) {
127 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
128 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
129 int num_of_frames = 10;
130 for (int i = 0; i < num_of_frames; ++i) {
131 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
134 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
135 for (int i = 0; i < num_of_frames; ++i) {
136 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
138 EXPECT_EQ((num_of_frames - 1) * kDefaultFramePeriodMs,
139 receiver_.RenderBufferSizeMs());
142 TEST_F(TestVCMReceiver, RenderBufferSize_NoKeyFrame) {
143 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
144 int num_of_frames = 10;
145 for (int i = 0; i < num_of_frames; ++i) {
146 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
148 int64_t next_render_time_ms = 0;
149 VCMEncodedFrame* frame = receiver_.FrameForDecoding(10, next_render_time_ms);
150 EXPECT_TRUE(frame == NULL);
151 receiver_.ReleaseFrame(frame);
152 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
153 for (int i = 0; i < num_of_frames; ++i) {
154 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
156 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
159 TEST_F(TestVCMReceiver, NonDecodableDuration_Empty) {
160 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
161 receiver_.SetNackMode(kNack, -1, -1);
162 const size_t kMaxNackListSize = 1000;
163 const int kMaxPacketAgeToNack = 1000;
164 const int kMaxNonDecodableDuration = 500;
165 const int kMinDelayMs = 500;
166 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
167 kMaxNonDecodableDuration);
168 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
169 // Advance time until it's time to decode the key frame.
170 clock_->AdvanceTimeMilliseconds(kMinDelayMs);
171 EXPECT_TRUE(DecodeNextFrame());
172 uint16_t nack_list[kMaxNackListSize];
173 uint16_t nack_list_length = 0;
174 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
176 EXPECT_EQ(kNackOk, ret);
179 TEST_F(TestVCMReceiver, NonDecodableDuration_NoKeyFrame) {
180 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
181 receiver_.SetNackMode(kNack, -1, -1);
182 const size_t kMaxNackListSize = 1000;
183 const int kMaxPacketAgeToNack = 1000;
184 const int kMaxNonDecodableDuration = 500;
185 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
186 kMaxNonDecodableDuration);
187 const int kNumFrames = kDefaultFrameRate * kMaxNonDecodableDuration / 1000;
188 for (int i = 0; i < kNumFrames; ++i) {
189 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
191 uint16_t nack_list[kMaxNackListSize];
192 uint16_t nack_list_length = 0;
193 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
195 EXPECT_EQ(kNackKeyFrameRequest, ret);
198 TEST_F(TestVCMReceiver, NonDecodableDuration_OneIncomplete) {
199 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
200 receiver_.SetNackMode(kNack, -1, -1);
201 const size_t kMaxNackListSize = 1000;
202 const int kMaxPacketAgeToNack = 1000;
203 const int kMaxNonDecodableDuration = 500;
204 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate *
205 kMaxNonDecodableDuration + 500) / 1000;
206 const int kMinDelayMs = 500;
207 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
208 kMaxNonDecodableDuration);
209 receiver_.SetMinReceiverDelay(kMinDelayMs);
210 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
211 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
212 // Insert an incomplete frame.
213 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
214 // Insert enough frames to have too long non-decodable sequence.
215 for (int i = 0; i < kMaxNonDecodableDurationFrames;
217 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
219 // Advance time until it's time to decode the key frame.
220 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
222 EXPECT_TRUE(DecodeNextFrame());
223 // Make sure we get a key frame request.
224 uint16_t nack_list[kMaxNackListSize];
225 uint16_t nack_list_length = 0;
226 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
228 EXPECT_EQ(kNackKeyFrameRequest, ret);
231 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) {
232 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
233 receiver_.SetNackMode(kNack, -1, -1);
234 const size_t kMaxNackListSize = 1000;
235 const int kMaxPacketAgeToNack = 1000;
236 const int kMaxNonDecodableDuration = 500;
237 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate *
238 kMaxNonDecodableDuration + 500) / 1000;
239 const int kMinDelayMs = 500;
240 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
241 kMaxNonDecodableDuration);
242 receiver_.SetMinReceiverDelay(kMinDelayMs);
243 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
244 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
245 // Insert an incomplete frame.
246 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
247 // Insert all but one frame to not trigger a key frame request due to
248 // too long duration of non-decodable frames.
249 for (int i = 0; i < kMaxNonDecodableDurationFrames - 1;
251 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
253 // Advance time until it's time to decode the key frame.
254 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
256 EXPECT_TRUE(DecodeNextFrame());
257 // Make sure we don't get a key frame request since we haven't generated
259 uint16_t nack_list[kMaxNackListSize];
260 uint16_t nack_list_length = 0;
261 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
263 EXPECT_EQ(kNackOk, ret);
266 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) {
267 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
268 receiver_.SetNackMode(kNack, -1, -1);
269 const size_t kMaxNackListSize = 1000;
270 const int kMaxPacketAgeToNack = 1000;
271 const int kMaxNonDecodableDuration = 500;
272 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate *
273 kMaxNonDecodableDuration + 500) / 1000;
274 const int kMinDelayMs = 500;
275 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
276 kMaxNonDecodableDuration);
277 receiver_.SetMinReceiverDelay(kMinDelayMs);
278 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
279 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
280 // Insert enough frames to have too long non-decodable sequence, except that
281 // we don't have any losses.
282 for (int i = 0; i < kMaxNonDecodableDurationFrames;
284 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
286 // Insert an incomplete frame.
287 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
288 // Advance time until it's time to decode the key frame.
289 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
291 EXPECT_TRUE(DecodeNextFrame());
292 // Make sure we don't get a key frame request since the non-decodable duration
293 // is only one frame.
294 uint16_t nack_list[kMaxNackListSize];
295 uint16_t nack_list_length = 0;
296 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
298 EXPECT_EQ(kNackOk, ret);
301 TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) {
302 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
303 receiver_.SetNackMode(kNack, -1, -1);
304 const size_t kMaxNackListSize = 1000;
305 const int kMaxPacketAgeToNack = 1000;
306 const int kMaxNonDecodableDuration = 500;
307 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate *
308 kMaxNonDecodableDuration + 500) / 1000;
309 const int kMinDelayMs = 500;
310 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
311 kMaxNonDecodableDuration);
312 receiver_.SetMinReceiverDelay(kMinDelayMs);
313 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
314 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
315 // Insert an incomplete frame.
316 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
317 // Insert enough frames to have too long non-decodable sequence.
318 for (int i = 0; i < kMaxNonDecodableDurationFrames;
320 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
322 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
323 // Advance time until it's time to decode the key frame.
324 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
326 EXPECT_TRUE(DecodeNextFrame());
327 // Make sure we don't get a key frame request since we have a key frame
329 uint16_t nack_list[kMaxNackListSize];
330 uint16_t nack_list_length = 0;
331 VCMNackStatus ret = receiver_.NackList(nack_list, kMaxNackListSize,
333 EXPECT_EQ(kNackOk, ret);
335 } // namespace webrtc