Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: webrtc/modules/video_coding/receiver_unittest.cc

Issue 1528503003: Lint enabled for webrtc/modules/video_coding folder. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 1 /* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
2 * 2 *
3 * Use of this source code is governed by a BSD-style license 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 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 5 * tree. An additional intellectual property rights grant can be found
6 * in the file PATENTS. All contributing project authors may 6 * in the file PATENTS. All contributing project authors may
7 * be found in the AUTHORS file in the root of the source tree. 7 * be found in the AUTHORS file in the root of the source tree.
8 */ 8 */
9 9
10 #include <string.h> 10 #include <string.h>
11 11
12 #include <list> 12 #include <list>
13 #include <queue> 13 #include <queue>
14 #include <vector>
14 15
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 #include "webrtc/base/checks.h" 17 #include "webrtc/base/checks.h"
17 #include "webrtc/modules/video_coding/encoded_frame.h" 18 #include "webrtc/modules/video_coding/encoded_frame.h"
18 #include "webrtc/modules/video_coding/packet.h" 19 #include "webrtc/modules/video_coding/packet.h"
19 #include "webrtc/modules/video_coding/receiver.h" 20 #include "webrtc/modules/video_coding/receiver.h"
20 #include "webrtc/modules/video_coding/test/stream_generator.h" 21 #include "webrtc/modules/video_coding/test/stream_generator.h"
21 #include "webrtc/modules/video_coding/timing.h" 22 #include "webrtc/modules/video_coding/timing.h"
22 #include "webrtc/modules/video_coding/test/test_util.h" 23 #include "webrtc/modules/video_coding/test/test_util.h"
23 #include "webrtc/system_wrappers/include/clock.h" 24 #include "webrtc/system_wrappers/include/clock.h"
24 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
25 26
26 namespace webrtc { 27 namespace webrtc {
27 28
28 class TestVCMReceiver : public ::testing::Test { 29 class TestVCMReceiver : public ::testing::Test {
29 protected: 30 protected:
30 enum { kWidth = 640 }; 31 enum { kWidth = 640 };
31 enum { kHeight = 480 }; 32 enum { kHeight = 480 };
32 33
33 TestVCMReceiver() 34 TestVCMReceiver()
34 : clock_(new SimulatedClock(0)), 35 : clock_(new SimulatedClock(0)),
35 timing_(clock_.get()), 36 timing_(clock_.get()),
36 receiver_(&timing_, clock_.get(), &event_factory_) { 37 receiver_(&timing_, clock_.get(), &event_factory_) {
37 38 stream_generator_.reset(
38 stream_generator_.reset(new 39 new StreamGenerator(0, clock_->TimeInMilliseconds()));
39 StreamGenerator(0, clock_->TimeInMilliseconds()));
40 } 40 }
41 41
42 virtual void SetUp() { 42 virtual void SetUp() { receiver_.Reset(); }
43 receiver_.Reset();
44 }
45 43
46 int32_t InsertPacket(int index) { 44 int32_t InsertPacket(int index) {
47 VCMPacket packet; 45 VCMPacket packet;
48 bool packet_available = stream_generator_->GetPacket(&packet, index); 46 bool packet_available = stream_generator_->GetPacket(&packet, index);
49 EXPECT_TRUE(packet_available); 47 EXPECT_TRUE(packet_available);
50 if (!packet_available) 48 if (!packet_available)
51 return kGeneralError; // Return here to avoid crashes below. 49 return kGeneralError; // Return here to avoid crashes below.
52 return receiver_.InsertPacket(packet, kWidth, kHeight); 50 return receiver_.InsertPacket(packet, kWidth, kHeight);
53 } 51 }
54 52
(...skipping 17 matching lines...) Expand all
72 VCMPacket packet; 70 VCMPacket packet;
73 stream_generator_->PopPacket(&packet, 0); 71 stream_generator_->PopPacket(&packet, 0);
74 } 72 }
75 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs); 73 clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
76 return ret; 74 return ret;
77 } 75 }
78 76
79 bool DecodeNextFrame() { 77 bool DecodeNextFrame() {
80 int64_t render_time_ms = 0; 78 int64_t render_time_ms = 0;
81 VCMEncodedFrame* frame = 79 VCMEncodedFrame* frame =
82 receiver_.FrameForDecoding(0, render_time_ms, false); 80 receiver_.FrameForDecoding(0, &render_time_ms, false);
83 if (!frame) 81 if (!frame)
84 return false; 82 return false;
85 receiver_.ReleaseFrame(frame); 83 receiver_.ReleaseFrame(frame);
86 return true; 84 return true;
87 } 85 }
88 86
89 rtc::scoped_ptr<SimulatedClock> clock_; 87 rtc::scoped_ptr<SimulatedClock> clock_;
90 VCMTiming timing_; 88 VCMTiming timing_;
91 NullEventFactory event_factory_; 89 NullEventFactory event_factory_;
92 VCMReceiver receiver_; 90 VCMReceiver receiver_;
(...skipping 16 matching lines...) Expand all
109 const int kNumOfNonDecodableFrames = 2; 107 const int kNumOfNonDecodableFrames = 2;
110 for (int i = 0; i < kNumOfNonDecodableFrames; ++i) { 108 for (int i = 0; i < kNumOfNonDecodableFrames; ++i) {
111 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 109 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
112 } 110 }
113 const int kNumOfFrames = 10; 111 const int kNumOfFrames = 10;
114 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 112 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
115 for (int i = 0; i < kNumOfFrames - 1; ++i) { 113 for (int i = 0; i < kNumOfFrames - 1; ++i) {
116 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 114 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
117 } 115 }
118 EXPECT_EQ((kNumOfFrames - 1) * kDefaultFramePeriodMs, 116 EXPECT_EQ((kNumOfFrames - 1) * kDefaultFramePeriodMs,
119 receiver_.RenderBufferSizeMs()); 117 receiver_.RenderBufferSizeMs());
120 } 118 }
121 119
122 TEST_F(TestVCMReceiver, RenderBufferSize_NotAllComplete) { 120 TEST_F(TestVCMReceiver, RenderBufferSize_NotAllComplete) {
123 EXPECT_EQ(0, receiver_.RenderBufferSizeMs()); 121 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
124 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 122 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
125 int num_of_frames = 10; 123 int num_of_frames = 10;
126 for (int i = 0; i < num_of_frames; ++i) { 124 for (int i = 0; i < num_of_frames; ++i) {
127 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 125 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
128 } 126 }
129 num_of_frames++; 127 num_of_frames++;
130 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 128 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
131 for (int i = 0; i < num_of_frames; ++i) { 129 for (int i = 0; i < num_of_frames; ++i) {
132 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 130 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
133 } 131 }
134 EXPECT_EQ((num_of_frames - 1) * kDefaultFramePeriodMs, 132 EXPECT_EQ((num_of_frames - 1) * kDefaultFramePeriodMs,
135 receiver_.RenderBufferSizeMs()); 133 receiver_.RenderBufferSizeMs());
136 } 134 }
137 135
138 TEST_F(TestVCMReceiver, RenderBufferSize_NoKeyFrame) { 136 TEST_F(TestVCMReceiver, RenderBufferSize_NoKeyFrame) {
139 EXPECT_EQ(0, receiver_.RenderBufferSizeMs()); 137 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
140 int num_of_frames = 10; 138 int num_of_frames = 10;
141 for (int i = 0; i < num_of_frames; ++i) { 139 for (int i = 0; i < num_of_frames; ++i) {
142 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 140 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
143 } 141 }
144 int64_t next_render_time_ms = 0; 142 int64_t next_render_time_ms = 0;
145 VCMEncodedFrame* frame = 143 VCMEncodedFrame* frame =
146 receiver_.FrameForDecoding(10, next_render_time_ms, false); 144 receiver_.FrameForDecoding(10, &next_render_time_ms, false);
147 EXPECT_TRUE(frame == NULL); 145 EXPECT_TRUE(frame == NULL);
148 receiver_.ReleaseFrame(frame); 146 receiver_.ReleaseFrame(frame);
149 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 147 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
150 for (int i = 0; i < num_of_frames; ++i) { 148 for (int i = 0; i < num_of_frames; ++i) {
151 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 149 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
152 } 150 }
153 EXPECT_EQ(0, receiver_.RenderBufferSizeMs()); 151 EXPECT_EQ(0, receiver_.RenderBufferSizeMs());
154 } 152 }
155 153
156 TEST_F(TestVCMReceiver, NonDecodableDuration_Empty) { 154 TEST_F(TestVCMReceiver, NonDecodableDuration_Empty) {
157 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 155 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
158 receiver_.SetNackMode(kNack, -1, -1); 156 receiver_.SetNackMode(kNack, -1, -1);
159 const size_t kMaxNackListSize = 1000; 157 const size_t kMaxNackListSize = 1000;
160 const int kMaxPacketAgeToNack = 1000; 158 const int kMaxPacketAgeToNack = 1000;
161 const int kMaxNonDecodableDuration = 500; 159 const int kMaxNonDecodableDuration = 500;
162 const int kMinDelayMs = 500; 160 const int kMinDelayMs = 500;
163 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 161 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
164 kMaxNonDecodableDuration); 162 kMaxNonDecodableDuration);
165 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 163 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
166 // Advance time until it's time to decode the key frame. 164 // Advance time until it's time to decode the key frame.
167 clock_->AdvanceTimeMilliseconds(kMinDelayMs); 165 clock_->AdvanceTimeMilliseconds(kMinDelayMs);
168 EXPECT_TRUE(DecodeNextFrame()); 166 EXPECT_TRUE(DecodeNextFrame());
169 bool request_key_frame = false; 167 bool request_key_frame = false;
170 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 168 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
171 EXPECT_FALSE(request_key_frame); 169 EXPECT_FALSE(request_key_frame);
172 } 170 }
173 171
174 TEST_F(TestVCMReceiver, NonDecodableDuration_NoKeyFrame) { 172 TEST_F(TestVCMReceiver, NonDecodableDuration_NoKeyFrame) {
175 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 173 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
176 receiver_.SetNackMode(kNack, -1, -1); 174 receiver_.SetNackMode(kNack, -1, -1);
177 const size_t kMaxNackListSize = 1000; 175 const size_t kMaxNackListSize = 1000;
178 const int kMaxPacketAgeToNack = 1000; 176 const int kMaxPacketAgeToNack = 1000;
179 const int kMaxNonDecodableDuration = 500; 177 const int kMaxNonDecodableDuration = 500;
180 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 178 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
181 kMaxNonDecodableDuration); 179 kMaxNonDecodableDuration);
182 const int kNumFrames = kDefaultFrameRate * kMaxNonDecodableDuration / 1000; 180 const int kNumFrames = kDefaultFrameRate * kMaxNonDecodableDuration / 1000;
183 for (int i = 0; i < kNumFrames; ++i) { 181 for (int i = 0; i < kNumFrames; ++i) {
184 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 182 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
185 } 183 }
186 bool request_key_frame = false; 184 bool request_key_frame = false;
187 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 185 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
188 EXPECT_TRUE(request_key_frame); 186 EXPECT_TRUE(request_key_frame);
189 } 187 }
190 188
191 TEST_F(TestVCMReceiver, NonDecodableDuration_OneIncomplete) { 189 TEST_F(TestVCMReceiver, NonDecodableDuration_OneIncomplete) {
192 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 190 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
193 receiver_.SetNackMode(kNack, -1, -1); 191 receiver_.SetNackMode(kNack, -1, -1);
194 const size_t kMaxNackListSize = 1000; 192 const size_t kMaxNackListSize = 1000;
195 const int kMaxPacketAgeToNack = 1000; 193 const int kMaxPacketAgeToNack = 1000;
196 const int kMaxNonDecodableDuration = 500; 194 const int kMaxNonDecodableDuration = 500;
197 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate * 195 const int kMaxNonDecodableDurationFrames =
198 kMaxNonDecodableDuration + 500) / 1000; 196 (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
199 const int kMinDelayMs = 500; 197 const int kMinDelayMs = 500;
200 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 198 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
201 kMaxNonDecodableDuration); 199 kMaxNonDecodableDuration);
202 receiver_.SetMinReceiverDelay(kMinDelayMs); 200 receiver_.SetMinReceiverDelay(kMinDelayMs);
203 int64_t key_frame_inserted = clock_->TimeInMilliseconds(); 201 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
204 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 202 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
205 // Insert an incomplete frame. 203 // Insert an incomplete frame.
206 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 204 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
207 // Insert enough frames to have too long non-decodable sequence. 205 // Insert enough frames to have too long non-decodable sequence.
208 for (int i = 0; i < kMaxNonDecodableDurationFrames; 206 for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
209 ++i) {
210 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 207 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
211 } 208 }
212 // Advance time until it's time to decode the key frame. 209 // Advance time until it's time to decode the key frame.
213 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() - 210 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
214 key_frame_inserted); 211 key_frame_inserted);
215 EXPECT_TRUE(DecodeNextFrame()); 212 EXPECT_TRUE(DecodeNextFrame());
216 // Make sure we get a key frame request. 213 // Make sure we get a key frame request.
217 bool request_key_frame = false; 214 bool request_key_frame = false;
218 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 215 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
219 EXPECT_TRUE(request_key_frame); 216 EXPECT_TRUE(request_key_frame);
220 } 217 }
221 218
222 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) { 219 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) {
223 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 220 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
224 receiver_.SetNackMode(kNack, -1, -1); 221 receiver_.SetNackMode(kNack, -1, -1);
225 const size_t kMaxNackListSize = 1000; 222 const size_t kMaxNackListSize = 1000;
226 const int kMaxPacketAgeToNack = 1000; 223 const int kMaxPacketAgeToNack = 1000;
227 const int kMaxNonDecodableDuration = 500; 224 const int kMaxNonDecodableDuration = 500;
228 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate * 225 const int kMaxNonDecodableDurationFrames =
229 kMaxNonDecodableDuration + 500) / 1000; 226 (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
230 const int kMinDelayMs = 500; 227 const int kMinDelayMs = 500;
231 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 228 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
232 kMaxNonDecodableDuration); 229 kMaxNonDecodableDuration);
233 receiver_.SetMinReceiverDelay(kMinDelayMs); 230 receiver_.SetMinReceiverDelay(kMinDelayMs);
234 int64_t key_frame_inserted = clock_->TimeInMilliseconds(); 231 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
235 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 232 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
236 // Insert an incomplete frame. 233 // Insert an incomplete frame.
237 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 234 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
238 // Insert all but one frame to not trigger a key frame request due to 235 // Insert all but one frame to not trigger a key frame request due to
239 // too long duration of non-decodable frames. 236 // too long duration of non-decodable frames.
240 for (int i = 0; i < kMaxNonDecodableDurationFrames - 1; 237 for (int i = 0; i < kMaxNonDecodableDurationFrames - 1; ++i) {
241 ++i) {
242 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 238 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
243 } 239 }
244 // Advance time until it's time to decode the key frame. 240 // Advance time until it's time to decode the key frame.
245 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() - 241 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
246 key_frame_inserted); 242 key_frame_inserted);
247 EXPECT_TRUE(DecodeNextFrame()); 243 EXPECT_TRUE(DecodeNextFrame());
248 // Make sure we don't get a key frame request since we haven't generated 244 // Make sure we don't get a key frame request since we haven't generated
249 // enough frames. 245 // enough frames.
250 bool request_key_frame = false; 246 bool request_key_frame = false;
251 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 247 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
252 EXPECT_FALSE(request_key_frame); 248 EXPECT_FALSE(request_key_frame);
253 } 249 }
254 250
255 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) { 251 TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) {
256 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 252 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
257 receiver_.SetNackMode(kNack, -1, -1); 253 receiver_.SetNackMode(kNack, -1, -1);
258 const size_t kMaxNackListSize = 1000; 254 const size_t kMaxNackListSize = 1000;
259 const int kMaxPacketAgeToNack = 1000; 255 const int kMaxPacketAgeToNack = 1000;
260 const int kMaxNonDecodableDuration = 500; 256 const int kMaxNonDecodableDuration = 500;
261 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate * 257 const int kMaxNonDecodableDurationFrames =
262 kMaxNonDecodableDuration + 500) / 1000; 258 (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
263 const int kMinDelayMs = 500; 259 const int kMinDelayMs = 500;
264 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 260 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
265 kMaxNonDecodableDuration); 261 kMaxNonDecodableDuration);
266 receiver_.SetMinReceiverDelay(kMinDelayMs); 262 receiver_.SetMinReceiverDelay(kMinDelayMs);
267 int64_t key_frame_inserted = clock_->TimeInMilliseconds(); 263 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
268 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 264 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
269 // Insert enough frames to have too long non-decodable sequence, except that 265 // Insert enough frames to have too long non-decodable sequence, except that
270 // we don't have any losses. 266 // we don't have any losses.
271 for (int i = 0; i < kMaxNonDecodableDurationFrames; 267 for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
272 ++i) {
273 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 268 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
274 } 269 }
275 // Insert an incomplete frame. 270 // Insert an incomplete frame.
276 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 271 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
277 // Advance time until it's time to decode the key frame. 272 // Advance time until it's time to decode the key frame.
278 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() - 273 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
279 key_frame_inserted); 274 key_frame_inserted);
280 EXPECT_TRUE(DecodeNextFrame()); 275 EXPECT_TRUE(DecodeNextFrame());
281 // Make sure we don't get a key frame request since the non-decodable duration 276 // Make sure we don't get a key frame request since the non-decodable duration
282 // is only one frame. 277 // is only one frame.
283 bool request_key_frame = false; 278 bool request_key_frame = false;
284 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 279 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
285 EXPECT_FALSE(request_key_frame); 280 EXPECT_FALSE(request_key_frame);
286 } 281 }
287 282
288 TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) { 283 TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) {
289 // Enable NACK and with no RTT thresholds for disabling retransmission delay. 284 // Enable NACK and with no RTT thresholds for disabling retransmission delay.
290 receiver_.SetNackMode(kNack, -1, -1); 285 receiver_.SetNackMode(kNack, -1, -1);
291 const size_t kMaxNackListSize = 1000; 286 const size_t kMaxNackListSize = 1000;
292 const int kMaxPacketAgeToNack = 1000; 287 const int kMaxPacketAgeToNack = 1000;
293 const int kMaxNonDecodableDuration = 500; 288 const int kMaxNonDecodableDuration = 500;
294 const int kMaxNonDecodableDurationFrames = (kDefaultFrameRate * 289 const int kMaxNonDecodableDurationFrames =
295 kMaxNonDecodableDuration + 500) / 1000; 290 (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
296 const int kMinDelayMs = 500; 291 const int kMinDelayMs = 500;
297 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 292 receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
298 kMaxNonDecodableDuration); 293 kMaxNonDecodableDuration);
299 receiver_.SetMinReceiverDelay(kMinDelayMs); 294 receiver_.SetMinReceiverDelay(kMinDelayMs);
300 int64_t key_frame_inserted = clock_->TimeInMilliseconds(); 295 int64_t key_frame_inserted = clock_->TimeInMilliseconds();
301 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 296 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
302 // Insert an incomplete frame. 297 // Insert an incomplete frame.
303 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError); 298 EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
304 // Insert enough frames to have too long non-decodable sequence. 299 // Insert enough frames to have too long non-decodable sequence.
305 for (int i = 0; i < kMaxNonDecodableDurationFrames; 300 for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
306 ++i) {
307 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError); 301 EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
308 } 302 }
309 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError); 303 EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
310 // Advance time until it's time to decode the key frame. 304 // Advance time until it's time to decode the key frame.
311 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() - 305 clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
312 key_frame_inserted); 306 key_frame_inserted);
313 EXPECT_TRUE(DecodeNextFrame()); 307 EXPECT_TRUE(DecodeNextFrame());
314 // Make sure we don't get a key frame request since we have a key frame 308 // Make sure we don't get a key frame request since we have a key frame
315 // in the list. 309 // in the list.
316 bool request_key_frame = false; 310 bool request_key_frame = false;
317 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame); 311 std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
318 EXPECT_FALSE(request_key_frame); 312 EXPECT_FALSE(request_key_frame);
319 } 313 }
320 314
321 // A simulated clock, when time elapses, will insert frames into the jitter 315 // A simulated clock, when time elapses, will insert frames into the jitter
322 // buffer, based on initial settings. 316 // buffer, based on initial settings.
(...skipping 10 matching lines...) Expand all
333 // now+|milliseconds|, the clock will be advanced to the arrival time of next 327 // now+|milliseconds|, the clock will be advanced to the arrival time of next
334 // frame. 328 // frame.
335 // Otherwise, the clock will be advanced by |milliseconds|. 329 // Otherwise, the clock will be advanced by |milliseconds|.
336 // 330 //
337 // For both cases, a frame will be inserted into the jitter buffer at the 331 // For both cases, a frame will be inserted into the jitter buffer at the
338 // instant when the clock time is timestamps_.front().arrive_time. 332 // instant when the clock time is timestamps_.front().arrive_time.
339 // 333 //
340 // Return true if some frame arrives between now and now+|milliseconds|. 334 // Return true if some frame arrives between now and now+|milliseconds|.
341 bool AdvanceTimeMilliseconds(int64_t milliseconds, bool stop_on_frame) { 335 bool AdvanceTimeMilliseconds(int64_t milliseconds, bool stop_on_frame) {
342 return AdvanceTimeMicroseconds(milliseconds * 1000, stop_on_frame); 336 return AdvanceTimeMicroseconds(milliseconds * 1000, stop_on_frame);
343 }; 337 }
344 338
345 bool AdvanceTimeMicroseconds(int64_t microseconds, bool stop_on_frame) { 339 bool AdvanceTimeMicroseconds(int64_t microseconds, bool stop_on_frame) {
346 int64_t start_time = TimeInMicroseconds(); 340 int64_t start_time = TimeInMicroseconds();
347 int64_t end_time = start_time + microseconds; 341 int64_t end_time = start_time + microseconds;
348 bool frame_injected = false; 342 bool frame_injected = false;
349 while (!timestamps_.empty() && 343 while (!timestamps_.empty() &&
350 timestamps_.front().arrive_time <= end_time) { 344 timestamps_.front().arrive_time <= end_time) {
351 RTC_DCHECK(timestamps_.front().arrive_time >= start_time); 345 RTC_DCHECK(timestamps_.front().arrive_time >= start_time);
352 346
353 SimulatedClock::AdvanceTimeMicroseconds(timestamps_.front().arrive_time - 347 SimulatedClock::AdvanceTimeMicroseconds(timestamps_.front().arrive_time -
354 TimeInMicroseconds()); 348 TimeInMicroseconds());
355 GenerateAndInsertFrame((timestamps_.front().render_time + 500) / 1000); 349 GenerateAndInsertFrame((timestamps_.front().render_time + 500) / 1000);
356 timestamps_.pop(); 350 timestamps_.pop();
357 frame_injected = true; 351 frame_injected = true;
358 352
359 if (stop_on_frame) 353 if (stop_on_frame)
360 return frame_injected; 354 return frame_injected;
361 } 355 }
362 356
363 if (TimeInMicroseconds() < end_time) { 357 if (TimeInMicroseconds() < end_time) {
364 SimulatedClock::AdvanceTimeMicroseconds(end_time - TimeInMicroseconds()); 358 SimulatedClock::AdvanceTimeMicroseconds(end_time - TimeInMicroseconds());
365 } 359 }
366 return frame_injected; 360 return frame_injected;
367 }; 361 }
368 362
369 // Input timestamps are in unit Milliseconds. 363 // Input timestamps are in unit Milliseconds.
370 // And |arrive_timestamps| must be positive and in increasing order. 364 // And |arrive_timestamps| must be positive and in increasing order.
371 // |arrive_timestamps| determine when we are going to insert frames into the 365 // |arrive_timestamps| determine when we are going to insert frames into the
372 // jitter buffer. 366 // jitter buffer.
373 // |render_timestamps| are the timestamps on the frame. 367 // |render_timestamps| are the timestamps on the frame.
374 void SetFrames(const int64_t* arrive_timestamps, 368 void SetFrames(const int64_t* arrive_timestamps,
375 const int64_t* render_timestamps, 369 const int64_t* render_timestamps,
376 size_t size) { 370 size_t size) {
377 int64_t previous_arrive_timestamp = 0; 371 int64_t previous_arrive_timestamp = 0;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 // This is used to simulate the JitterBuffer getting packets from internet as 418 // This is used to simulate the JitterBuffer getting packets from internet as
425 // time elapses. 419 // time elapses.
426 420
427 class FrameInjectEvent : public EventWrapper { 421 class FrameInjectEvent : public EventWrapper {
428 public: 422 public:
429 FrameInjectEvent(SimulatedClockWithFrames* clock, bool stop_on_frame) 423 FrameInjectEvent(SimulatedClockWithFrames* clock, bool stop_on_frame)
430 : clock_(clock), stop_on_frame_(stop_on_frame) {} 424 : clock_(clock), stop_on_frame_(stop_on_frame) {}
431 425
432 bool Set() override { return true; } 426 bool Set() override { return true; }
433 427
434 EventTypeWrapper Wait(unsigned long max_time) override { 428 EventTypeWrapper Wait(uint64_t max_time) override {
435 if (clock_->AdvanceTimeMilliseconds(max_time, stop_on_frame_) && 429 if (clock_->AdvanceTimeMilliseconds(max_time, stop_on_frame_) &&
436 stop_on_frame_) { 430 stop_on_frame_) {
437 return EventTypeWrapper::kEventSignaled; 431 return EventTypeWrapper::kEventSignaled;
438 } else { 432 } else {
439 return EventTypeWrapper::kEventTimeout; 433 return EventTypeWrapper::kEventTimeout;
440 } 434 }
441 } 435 }
442 436
443 private: 437 private:
444 SimulatedClockWithFrames* clock_; 438 SimulatedClockWithFrames* clock_;
445 bool stop_on_frame_; 439 bool stop_on_frame_;
446 }; 440 };
447 441
448 class VCMReceiverTimingTest : public ::testing::Test { 442 class VCMReceiverTimingTest : public ::testing::Test {
449 protected: 443 protected:
450
451 VCMReceiverTimingTest() 444 VCMReceiverTimingTest()
452 445
453 : clock_(&stream_generator_, &receiver_), 446 : clock_(&stream_generator_, &receiver_),
454 stream_generator_(0, clock_.TimeInMilliseconds()), 447 stream_generator_(0, clock_.TimeInMilliseconds()),
455 timing_(&clock_), 448 timing_(&clock_),
456 receiver_( 449 receiver_(
457 &timing_, 450 &timing_,
458 &clock_, 451 &clock_,
459 rtc::scoped_ptr<EventWrapper>(new FrameInjectEvent(&clock_, false)), 452 rtc::scoped_ptr<EventWrapper>(new FrameInjectEvent(&clock_, false)),
460 rtc::scoped_ptr<EventWrapper>( 453 rtc::scoped_ptr<EventWrapper>(
461 new FrameInjectEvent(&clock_, true))) {} 454 new FrameInjectEvent(&clock_, true))) {}
462 455
463
464 virtual void SetUp() { receiver_.Reset(); } 456 virtual void SetUp() { receiver_.Reset(); }
465 457
466 SimulatedClockWithFrames clock_; 458 SimulatedClockWithFrames clock_;
467 StreamGenerator stream_generator_; 459 StreamGenerator stream_generator_;
468 VCMTiming timing_; 460 VCMTiming timing_;
469 VCMReceiver receiver_; 461 VCMReceiver receiver_;
470 }; 462 };
471 463
472 // Test whether VCMReceiver::FrameForDecoding handles parameter 464 // Test whether VCMReceiver::FrameForDecoding handles parameter
473 // |max_wait_time_ms| correctly: 465 // |max_wait_time_ms| correctly:
(...skipping 25 matching lines...) Expand all
499 size_t num_frames_return = 0; 491 size_t num_frames_return = 0;
500 492
501 const int64_t kMaxWaitTime = 30; 493 const int64_t kMaxWaitTime = 30;
502 494
503 // Ideally, we should get all frames that we input in InitializeFrames. 495 // Ideally, we should get all frames that we input in InitializeFrames.
504 // In the case that FrameForDecoding kills frames by error, we rely on the 496 // In the case that FrameForDecoding kills frames by error, we rely on the
505 // build bot to kill the test. 497 // build bot to kill the test.
506 while (num_frames_return < kNumFrames) { 498 while (num_frames_return < kNumFrames) {
507 int64_t start_time = clock_.TimeInMilliseconds(); 499 int64_t start_time = clock_.TimeInMilliseconds();
508 VCMEncodedFrame* frame = 500 VCMEncodedFrame* frame =
509 receiver_.FrameForDecoding(kMaxWaitTime, next_render_time, false); 501 receiver_.FrameForDecoding(kMaxWaitTime, &next_render_time, false);
510 int64_t end_time = clock_.TimeInMilliseconds(); 502 int64_t end_time = clock_.TimeInMilliseconds();
511 503
512 // In any case the FrameForDecoding should not wait longer than 504 // In any case the FrameForDecoding should not wait longer than
513 // max_wait_time. 505 // max_wait_time.
514 // In the case that we did not get a frame, it should have been waiting for 506 // In the case that we did not get a frame, it should have been waiting for
515 // exactly max_wait_time. (By the testing samples we constructed above, we 507 // exactly max_wait_time. (By the testing samples we constructed above, we
516 // are sure there is no timing error, so the only case it returns with NULL 508 // are sure there is no timing error, so the only case it returns with NULL
517 // is that it runs out of time.) 509 // is that it runs out of time.)
518 if (frame) { 510 if (frame) {
519 receiver_.ReleaseFrame(frame); 511 receiver_.ReleaseFrame(frame);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 551
560 clock_.SetFrames(arrive_timestamps, render_timestamps, kNumFrames); 552 clock_.SetFrames(arrive_timestamps, render_timestamps, kNumFrames);
561 553
562 // Record how many frames we finally get out of the receiver. 554 // Record how many frames we finally get out of the receiver.
563 size_t num_frames_return = 0; 555 size_t num_frames_return = 0;
564 const int64_t kMaxWaitTime = 30; 556 const int64_t kMaxWaitTime = 30;
565 bool prefer_late_decoding = true; 557 bool prefer_late_decoding = true;
566 while (num_frames_return < kNumFrames) { 558 while (num_frames_return < kNumFrames) {
567 int64_t start_time = clock_.TimeInMilliseconds(); 559 int64_t start_time = clock_.TimeInMilliseconds();
568 560
569 VCMEncodedFrame* frame = 561 VCMEncodedFrame* frame = receiver_.FrameForDecoding(
570 receiver_.FrameForDecoding(kMaxWaitTime, next_render_time, 562 kMaxWaitTime, &next_render_time, prefer_late_decoding);
571 prefer_late_decoding);
572 int64_t end_time = clock_.TimeInMilliseconds(); 563 int64_t end_time = clock_.TimeInMilliseconds();
573 if (frame) { 564 if (frame) {
574 EXPECT_EQ(frame->RenderTimeMs() - max_decode_ms - render_delay_ms, 565 EXPECT_EQ(frame->RenderTimeMs() - max_decode_ms - render_delay_ms,
575 end_time); 566 end_time);
576 receiver_.ReleaseFrame(frame); 567 receiver_.ReleaseFrame(frame);
577 ++num_frames_return; 568 ++num_frames_return;
578 } else { 569 } else {
579 EXPECT_EQ(kMaxWaitTime, end_time - start_time); 570 EXPECT_EQ(kMaxWaitTime, end_time - start_time);
580 } 571 }
581 } 572 }
582 } 573 }
583 574
584 } // namespace webrtc 575 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698