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

Side by Side Diff: media/cast/framer/cast_message_builder_unittest.cc

Issue 23467003: Added framer to cast. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rtcp
Patch Set: Merge Created 7 years, 3 months 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
« no previous file with comments | « media/cast/framer/cast_message_builder.cc ('k') | media/cast/framer/frame_buffer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/memory/scoped_ptr.h"
6 #include "base/test/simple_test_tick_clock.h"
7 #include "media/cast/framer/cast_message_builder.h"
8 #include "media/cast/rtcp/rtcp.h"
9 #include "media/cast/rtp_common/rtp_defines.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace media {
13 namespace cast {
14
15 static const uint32 kSsrc = 0x1234;
16 static const uint32 kShortTimeIncrementMs = 10;
17 static const uint32 kLongTimeIncrementMs = 40;
18 static const int64 kStartMillisecond = 123456789;
19
20 typedef std::map<uint8, int> MissingPacketsMap;
21
22 class NackFeedbackVerification : public RtpPayloadFeedback {
23 public:
24 NackFeedbackVerification()
25 : triggered_(false),
26 missing_packets_(),
27 last_frame_acked_(0) {}
28
29
30 virtual void RequestKeyFrame() OVERRIDE {
31 request_key_frame_ = true;
32 }
33
34 virtual void CastFeedback(const RtcpCastMessage& cast_feedback) OVERRIDE {
35 EXPECT_EQ(kSsrc, cast_feedback.media_ssrc_);
36
37 last_frame_acked_ = cast_feedback.ack_frame_id_;
38
39 MissingFramesAndPacketsMap::const_iterator frame_it =
40 cast_feedback.missing_frames_and_packets_.begin();
41
42 // Keep track of the number of missing packets per frame.
43 missing_packets_.clear();
44 while (frame_it != cast_feedback.missing_frames_and_packets_.end()) {
45 missing_packets_.insert(
46 std::make_pair(frame_it->first, frame_it->second.size()));
47 ++frame_it;
48 }
49 triggered_ = true;
50 }
51
52 int num_missing_packets(uint8 frame_id) {
53 MissingPacketsMap::iterator it;
54 it = missing_packets_.find(frame_id);
55 if (it == missing_packets_.end()) return 0;
56
57 return it->second;
58 }
59
60 // Holds value for one call.
61 bool triggered() {
62 bool ret_val = triggered_;
63 triggered_ = false;
64 return ret_val;
65 }
66
67 bool request_key_frame() {
68 bool ret_val = request_key_frame_;
69 request_key_frame_ = false;
70 return ret_val;
71 }
72 uint8 last_frame_acked() { return last_frame_acked_; }
73
74 private:
75 bool triggered_;
76 MissingPacketsMap missing_packets_; // Missing packets per frame.
77 uint8 last_frame_acked_;
78 bool request_key_frame_;
79 };
80
81 class CastMessageBuilderTest : public ::testing::Test {
82 protected:
83 CastMessageBuilderTest()
84 : cast_msg_builder_(new CastMessageBuilder(&feedback_,
85 &frame_id_map_,
86 kSsrc,
87 true,
88 0)) {
89 rtp_header_.webrtc.header.ssrc = kSsrc;
90 rtp_header_.is_key_frame = false;
91 testing_clock_.Advance(
92 base::TimeDelta::FromMilliseconds(kStartMillisecond));
93 cast_msg_builder_->set_clock(&testing_clock_);
94 }
95
96 ~CastMessageBuilderTest() {}
97
98 void SetFrameId(uint8 frame_id) {
99 rtp_header_.frame_id = frame_id;
100 }
101
102 void SetPacketId(uint16 packet_id) {
103 rtp_header_.packet_id = packet_id;
104 }
105
106 void SetMaxPacketId(uint16 max_packet_id) {
107 rtp_header_.max_packet_id = max_packet_id;
108 }
109
110 void SetKeyFrame(bool is_key) {
111 rtp_header_.is_key_frame = is_key;
112 }
113
114 void SetReferenceFrameId(uint8 reference_frame_id) {
115 rtp_header_.is_reference = true;
116 rtp_header_.reference_frame_id = reference_frame_id;
117 }
118
119 void InsertPacket() {
120 bool complete = false;
121 frame_id_map_.InsertPacket(rtp_header_, &complete);
122 if (complete) {
123 cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id,
124 rtp_header_.is_key_frame);
125 }
126 cast_msg_builder_->UpdateCastMessage();
127 }
128
129 void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) {
130 cast_msg_builder_.reset(new CastMessageBuilder(&feedback_,
131 &frame_id_map_,
132 kSsrc,
133 false,
134 max_unacked_frames));
135 }
136
137 NackFeedbackVerification feedback_;
138 scoped_ptr<CastMessageBuilder> cast_msg_builder_;
139 RtpCastHeader rtp_header_;
140 FrameIdMap frame_id_map_;
141 base::SimpleTestTickClock testing_clock_;
142 };
143
144 TEST_F(CastMessageBuilderTest, StartWithAKeyFrame) {
145 SetFrameId(3);
146 SetPacketId(0);
147 SetMaxPacketId(0);
148 InsertPacket();
149 // Should not trigger ack.
150 EXPECT_FALSE(feedback_.triggered());
151 SetFrameId(5);
152 SetPacketId(0);
153 SetMaxPacketId(0);
154 SetKeyFrame(true);
155 InsertPacket();
156 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering.
157 testing_clock_.Advance(
158 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
159 cast_msg_builder_->UpdateCastMessage();
160 EXPECT_TRUE(feedback_.triggered());
161 EXPECT_EQ(5, feedback_.last_frame_acked());
162 }
163
164 TEST_F(CastMessageBuilderTest, OneFrameNackList) {
165 SetFrameId(0);
166 SetPacketId(4);
167 SetMaxPacketId(10);
168 InsertPacket();
169 testing_clock_.Advance(
170 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
171 EXPECT_FALSE(feedback_.triggered());
172 testing_clock_.Advance(
173 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
174 SetPacketId(5);
175 InsertPacket();
176 EXPECT_TRUE(feedback_.triggered());
177 EXPECT_EQ(4, feedback_.num_missing_packets(0));
178 }
179
180 TEST_F(CastMessageBuilderTest, CompleteFrameMissing) {
181 // TODO(mikhal): Add indication.
182 SetFrameId(0);
183 SetPacketId(2);
184 SetMaxPacketId(5);
185 InsertPacket();
186 testing_clock_.Advance(
187 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
188 SetFrameId(2);
189 SetPacketId(2);
190 SetMaxPacketId(5);
191 InsertPacket();
192 }
193
194 TEST_F(CastMessageBuilderTest, FastForwardAck) {
195 SetFrameId(1);
196 SetPacketId(0);
197 SetMaxPacketId(0);
198 InsertPacket();
199 EXPECT_FALSE(feedback_.triggered());
200 testing_clock_.Advance(
201 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
202 SetFrameId(2);
203 SetPacketId(0);
204 SetMaxPacketId(0);
205 InsertPacket();
206 EXPECT_TRUE(feedback_.triggered());
207 EXPECT_EQ(255, feedback_.last_frame_acked());
208 testing_clock_.Advance(
209 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
210 SetFrameId(0);
211 SetPacketId(0);
212 SetMaxPacketId(0);
213 SetKeyFrame(true);
214 InsertPacket();
215 EXPECT_TRUE(feedback_.triggered());
216 EXPECT_EQ(2, feedback_.last_frame_acked());
217 }
218
219 TEST_F(CastMessageBuilderTest, RemoveOldFrames) {
220 SetFrameId(1);
221 SetPacketId(0);
222 SetMaxPacketId(1);
223 InsertPacket();
224 EXPECT_FALSE(feedback_.triggered());
225 testing_clock_.Advance(
226 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
227 SetFrameId(2);
228 SetPacketId(0);
229 SetMaxPacketId(0);
230 InsertPacket();
231 EXPECT_TRUE(feedback_.triggered());
232 testing_clock_.Advance(
233 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
234 SetFrameId(3);
235 SetPacketId(0);
236 SetMaxPacketId(5);
237 InsertPacket();
238 EXPECT_TRUE(feedback_.triggered());
239 EXPECT_EQ(255, feedback_.last_frame_acked());
240 testing_clock_.Advance(
241 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
242 SetFrameId(5);
243 SetPacketId(0);
244 SetMaxPacketId(0);
245 SetKeyFrame(true);
246 InsertPacket();
247 testing_clock_.Advance(
248 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
249 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering.
250 cast_msg_builder_->UpdateCastMessage();
251 EXPECT_TRUE(feedback_.triggered());
252 EXPECT_EQ(5, feedback_.last_frame_acked());
253 testing_clock_.Advance(
254 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
255 SetFrameId(1);
256 SetPacketId(1);
257 SetMaxPacketId(1);
258 InsertPacket();
259 EXPECT_FALSE(feedback_.triggered());
260 testing_clock_.Advance(
261 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
262 InsertPacket();
263 EXPECT_TRUE(feedback_.triggered());
264 EXPECT_EQ(5, feedback_.last_frame_acked());
265 }
266
267 TEST_F(CastMessageBuilderTest, WrapFastForward) {
268 SetFrameId(254);
269 SetPacketId(0);
270 SetMaxPacketId(1);
271 SetKeyFrame(true);
272 InsertPacket();
273 EXPECT_FALSE(feedback_.triggered());
274 testing_clock_.Advance(
275 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
276 SetFrameId(255);
277 SetPacketId(0);
278 SetMaxPacketId(0);
279 SetKeyFrame(false);
280 InsertPacket();
281 EXPECT_TRUE(feedback_.triggered());
282 EXPECT_EQ(253, feedback_.last_frame_acked());
283 testing_clock_.Advance(
284 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
285 SetFrameId(0);
286 SetPacketId(0);
287 SetMaxPacketId(0);
288 SetKeyFrame(false);
289 InsertPacket();
290 EXPECT_TRUE(feedback_.triggered());
291 EXPECT_EQ(253, feedback_.last_frame_acked());
292 testing_clock_.Advance(
293 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
294 SetFrameId(254);
295 SetPacketId(1);
296 SetMaxPacketId(1);
297 SetKeyFrame(true);
298 InsertPacket();
299 EXPECT_TRUE(feedback_.triggered());
300 EXPECT_EQ(0, feedback_.last_frame_acked());
301 }
302
303 TEST_F(CastMessageBuilderTest, NackUntilMaxReceivedPacket) {
304 SetFrameId(0);
305 SetPacketId(0);
306 SetMaxPacketId(20);
307 SetKeyFrame(true);
308 InsertPacket();
309 testing_clock_.Advance(
310 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
311 SetPacketId(5);
312 InsertPacket();
313 EXPECT_TRUE(feedback_.triggered());
314 EXPECT_EQ(4, feedback_.num_missing_packets(0));
315 }
316
317 TEST_F(CastMessageBuilderTest, NackUntilMaxReceivedPacketNextFrame) {
318 SetFrameId(0);
319 SetPacketId(0);
320 SetMaxPacketId(20);
321 SetKeyFrame(true);
322 InsertPacket();
323 testing_clock_.Advance(
324 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
325 SetPacketId(5);
326 InsertPacket();
327 testing_clock_.Advance(
328 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
329 EXPECT_TRUE(feedback_.triggered());
330 EXPECT_EQ(4, feedback_.num_missing_packets(0));
331 SetFrameId(1);
332 SetMaxPacketId(2);
333 SetPacketId(0);
334 SetKeyFrame(false);
335 InsertPacket();
336 testing_clock_.Advance(
337 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
338 EXPECT_TRUE(feedback_.triggered());
339 EXPECT_EQ(21 - 2, feedback_.num_missing_packets(0));
340 }
341
342 TEST_F(CastMessageBuilderTest, NackUntilMaxReceivedPacketNextKey) {
343 SetFrameId(0);
344 SetPacketId(0);
345 SetMaxPacketId(20);
346 SetKeyFrame(true);
347 InsertPacket();
348 testing_clock_.Advance(
349 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
350 SetPacketId(5);
351 InsertPacket();
352 testing_clock_.Advance(
353 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
354 EXPECT_TRUE(feedback_.triggered());
355 EXPECT_EQ(4, feedback_.num_missing_packets(0));
356 SetFrameId(1);
357 SetMaxPacketId(0);
358 SetPacketId(0);
359 SetKeyFrame(true);
360 InsertPacket();
361 testing_clock_.Advance(
362 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
363 EXPECT_TRUE(feedback_.triggered());
364 EXPECT_EQ(0, feedback_.num_missing_packets(0));
365 }
366
367 TEST_F(CastMessageBuilderTest, Reset) {
368 InsertPacket();
369 testing_clock_.Advance(
370 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
371 cast_msg_builder_->Reset();
372 frame_id_map_.Clear();
373 // Should reset nack list state and request a key frame.
374 cast_msg_builder_->UpdateCastMessage();
375 EXPECT_TRUE(feedback_.triggered());
376 EXPECT_EQ(0, feedback_.num_missing_packets(0));
377 }
378
379 TEST_F(CastMessageBuilderTest, DeltaAfterReset) {
380 SetFrameId(0);
381 SetPacketId(0);
382 SetMaxPacketId(0);
383 SetKeyFrame(true);
384 InsertPacket();
385 EXPECT_TRUE(feedback_.triggered());
386 EXPECT_EQ(0, feedback_.num_missing_packets(0));
387 testing_clock_.Advance(
388 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
389 cast_msg_builder_->Reset();
390 SetFrameId(1);
391 SetPacketId(0);
392 SetMaxPacketId(0);
393 SetKeyFrame(true);
394 EXPECT_FALSE(feedback_.triggered());
395 }
396
397 TEST_F(CastMessageBuilderTest, BasicRps) {
398 SetFrameId(0);
399 SetPacketId(0);
400 SetMaxPacketId(0);
401 SetKeyFrame(true);
402 InsertPacket();
403 testing_clock_.Advance(
404 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
405 EXPECT_TRUE(feedback_.triggered());
406 EXPECT_EQ(0, feedback_.last_frame_acked());
407 SetFrameId(3);
408 SetKeyFrame(false);
409 SetReferenceFrameId(0);
410 InsertPacket();
411 EXPECT_TRUE(feedback_.triggered());
412 EXPECT_EQ(0, feedback_.last_frame_acked());
413 testing_clock_.Advance(
414 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
415 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering.
416 cast_msg_builder_->UpdateCastMessage();
417 EXPECT_TRUE(feedback_.triggered());
418 EXPECT_EQ(3, feedback_.last_frame_acked());
419 }
420
421 TEST_F(CastMessageBuilderTest, InOrderRps) {
422 // Create a pattern - skip to rps, and don't look back.
423 SetFrameId(0);
424 SetPacketId(0);
425 SetMaxPacketId(0);
426 SetKeyFrame(true);
427 InsertPacket();
428 testing_clock_.Advance(
429 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
430 EXPECT_TRUE(feedback_.triggered());
431 EXPECT_EQ(0, feedback_.last_frame_acked());
432 SetFrameId(1);
433 SetPacketId(0);
434 SetMaxPacketId(1);
435 SetKeyFrame(false);
436 InsertPacket();
437 testing_clock_.Advance(
438 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
439 EXPECT_FALSE(feedback_.triggered());
440 SetFrameId(3);
441 SetPacketId(0);
442 SetMaxPacketId(0);
443 SetKeyFrame(false);
444 SetReferenceFrameId(0);
445 InsertPacket();
446 testing_clock_.Advance(
447 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
448 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering.
449 testing_clock_.Advance(
450 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
451 cast_msg_builder_->UpdateCastMessage();
452 EXPECT_TRUE(feedback_.triggered());
453 EXPECT_EQ(3, feedback_.last_frame_acked());
454 // Make an old frame complete - should not trigger an ack.
455 SetFrameId(1);
456 SetPacketId(1);
457 SetMaxPacketId(1);
458 SetKeyFrame(false);
459 InsertPacket();
460 testing_clock_.Advance(
461 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
462 EXPECT_FALSE(feedback_.triggered());
463 EXPECT_EQ(3, feedback_.last_frame_acked());
464 }
465
466 TEST_F(CastMessageBuilderTest, SlowDownAck) {
467 SetDecoderSlowerThanMaxFrameRate(3);
468 SetFrameId(0);
469 SetPacketId(0);
470 SetMaxPacketId(0);
471 SetKeyFrame(true);
472 InsertPacket();
473
474 int frame_id;
475 testing_clock_.Advance(
476 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
477 SetKeyFrame(false);
478 for (frame_id = 1; frame_id < 3; ++frame_id) {
479 EXPECT_TRUE(feedback_.triggered());
480 EXPECT_EQ(frame_id - 1, feedback_.last_frame_acked());
481 SetFrameId(frame_id);
482 InsertPacket();
483 testing_clock_.Advance(
484 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
485 }
486 // We should now have entered the slowdown ACK state.
487 uint8_t expected_frame_id = 1;
488 for (; frame_id < 10; ++frame_id) {
489 if (frame_id % 2) ++expected_frame_id;
490 EXPECT_TRUE(feedback_.triggered());
491 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked());
492 SetFrameId(frame_id);
493 InsertPacket();
494 testing_clock_.Advance(
495 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
496 }
497 EXPECT_TRUE(feedback_.triggered());
498 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked());
499
500 // Simulate frame_id being pulled for rendering.
501 frame_id_map_.RemoveOldFrames(frame_id);
502 // We should now leave the slowdown ACK state.
503 ++frame_id;
504 SetFrameId(frame_id);
505 InsertPacket();
506 testing_clock_.Advance(
507 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
508 EXPECT_TRUE(feedback_.triggered());
509 EXPECT_EQ(frame_id, feedback_.last_frame_acked());
510 }
511
512 } // namespace cast
513 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/framer/cast_message_builder.cc ('k') | media/cast/framer/frame_buffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698