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

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

Issue 289483003: Cast: Only ACK decodable frames (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor formatting change Created 6 years, 7 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_id_map.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/test/simple_test_tick_clock.h" 8 #include "base/test/simple_test_tick_clock.h"
9 #include "media/cast/framer/cast_message_builder.h" 9 #include "media/cast/framer/cast_message_builder.h"
10 #include "media/cast/rtcp/rtcp.h" 10 #include "media/cast/rtcp/rtcp.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 void SetMaxPacketId(uint16 max_packet_id) { 106 void SetMaxPacketId(uint16 max_packet_id) {
107 rtp_header_.max_packet_id = max_packet_id; 107 rtp_header_.max_packet_id = max_packet_id;
108 } 108 }
109 109
110 void SetKeyFrame(bool is_key) { rtp_header_.is_key_frame = is_key; } 110 void SetKeyFrame(bool is_key) { rtp_header_.is_key_frame = is_key; }
111 111
112 void InsertPacket() { 112 void InsertPacket() {
113 PacketType packet_type = frame_id_map_.InsertPacket(rtp_header_); 113 PacketType packet_type = frame_id_map_.InsertPacket(rtp_header_);
114 if (packet_type == kNewPacketCompletingFrame) { 114 if (packet_type == kNewPacketCompletingFrame) {
115 cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id, 115 cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id);
116 rtp_header_.is_key_frame);
117 } 116 }
118 cast_msg_builder_->UpdateCastMessage(); 117 cast_msg_builder_->UpdateCastMessage();
119 } 118 }
120 119
121 void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) { 120 void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) {
122 cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_, 121 cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_,
123 &feedback_, 122 &feedback_,
124 &frame_id_map_, 123 &frame_id_map_,
125 kSsrc, 124 kSsrc,
126 false, 125 false,
127 max_unacked_frames)); 126 max_unacked_frames));
128 } 127 }
129 128
130 NackFeedbackVerification feedback_; 129 NackFeedbackVerification feedback_;
131 scoped_ptr<CastMessageBuilder> cast_msg_builder_; 130 scoped_ptr<CastMessageBuilder> cast_msg_builder_;
132 RtpCastHeader rtp_header_; 131 RtpCastHeader rtp_header_;
133 FrameIdMap frame_id_map_; 132 FrameIdMap frame_id_map_;
134 base::SimpleTestTickClock testing_clock_; 133 base::SimpleTestTickClock testing_clock_;
135 134
136 DISALLOW_COPY_AND_ASSIGN(CastMessageBuilderTest); 135 DISALLOW_COPY_AND_ASSIGN(CastMessageBuilderTest);
137 }; 136 };
138 137
139 TEST_F(CastMessageBuilderTest, StartWithAKeyFrame) {
140 SetFrameIds(3, 2);
141 SetPacketId(0);
142 SetMaxPacketId(0);
143 InsertPacket();
144 // Should not trigger ack.
145 EXPECT_FALSE(feedback_.triggered());
146 SetFrameIds(5, 5);
147 SetPacketId(0);
148 SetMaxPacketId(0);
149 SetKeyFrame(true);
150 InsertPacket();
151 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering.
152 testing_clock_.Advance(
153 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
154 cast_msg_builder_->UpdateCastMessage();
155 EXPECT_TRUE(feedback_.triggered());
156 EXPECT_EQ(5u, feedback_.last_frame_acked());
157 }
158
159 TEST_F(CastMessageBuilderTest, OneFrameNackList) { 138 TEST_F(CastMessageBuilderTest, OneFrameNackList) {
160 SetFrameIds(0, 0); 139 SetFrameIds(0, 0);
161 SetPacketId(4); 140 SetPacketId(4);
162 SetMaxPacketId(10); 141 SetMaxPacketId(10);
163 InsertPacket(); 142 InsertPacket();
164 testing_clock_.Advance( 143 testing_clock_.Advance(
165 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); 144 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
166 EXPECT_FALSE(feedback_.triggered()); 145 EXPECT_FALSE(feedback_.triggered());
167 testing_clock_.Advance( 146 testing_clock_.Advance(
168 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 147 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
(...skipping 11 matching lines...) Expand all
180 testing_clock_.Advance( 159 testing_clock_.Advance(
181 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 160 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
182 SetFrameIds(2, 1); 161 SetFrameIds(2, 1);
183 SetPacketId(2); 162 SetPacketId(2);
184 SetMaxPacketId(5); 163 SetMaxPacketId(5);
185 InsertPacket(); 164 InsertPacket();
186 EXPECT_TRUE(feedback_.triggered()); 165 EXPECT_TRUE(feedback_.triggered());
187 EXPECT_EQ(kRtcpCastAllPacketsLost, feedback_.num_missing_packets(1)); 166 EXPECT_EQ(kRtcpCastAllPacketsLost, feedback_.num_missing_packets(1));
188 } 167 }
189 168
190 TEST_F(CastMessageBuilderTest, FastForwardAck) {
191 SetFrameIds(1, 0);
192 SetPacketId(0);
193 SetMaxPacketId(0);
194 InsertPacket();
195 EXPECT_FALSE(feedback_.triggered());
196 testing_clock_.Advance(
197 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
198 SetFrameIds(2, 1);
199 SetPacketId(0);
200 SetMaxPacketId(0);
201 InsertPacket();
202 EXPECT_TRUE(feedback_.triggered());
203 EXPECT_EQ(kStartFrameId, feedback_.last_frame_acked());
204 testing_clock_.Advance(
205 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
206 SetFrameIds(0, 0);
207 SetPacketId(0);
208 SetMaxPacketId(0);
209 SetKeyFrame(true);
210 InsertPacket();
211 EXPECT_TRUE(feedback_.triggered());
212 EXPECT_EQ(2u, feedback_.last_frame_acked());
213 }
214
215 TEST_F(CastMessageBuilderTest, RemoveOldFrames) { 169 TEST_F(CastMessageBuilderTest, RemoveOldFrames) {
216 SetFrameIds(1, 0); 170 SetFrameIds(1, 0);
217 SetPacketId(0); 171 SetPacketId(0);
218 SetMaxPacketId(1); 172 SetMaxPacketId(1);
219 InsertPacket(); 173 InsertPacket();
220 EXPECT_FALSE(feedback_.triggered()); 174 EXPECT_FALSE(feedback_.triggered());
221 testing_clock_.Advance( 175 testing_clock_.Advance(
222 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 176 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
223 SetFrameIds(2, 1); 177 SetFrameIds(2, 1);
224 SetPacketId(0); 178 SetPacketId(0);
225 SetMaxPacketId(0); 179 SetMaxPacketId(0);
226 InsertPacket(); 180 InsertPacket();
227 EXPECT_TRUE(feedback_.triggered()); 181 EXPECT_TRUE(feedback_.triggered());
228 testing_clock_.Advance( 182 testing_clock_.Advance(
229 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 183 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
230 SetFrameIds(3, 2); 184 SetFrameIds(3, 2);
231 SetPacketId(0); 185 SetPacketId(0);
232 SetMaxPacketId(5); 186 SetMaxPacketId(5);
233 InsertPacket(); 187 InsertPacket();
234 EXPECT_TRUE(feedback_.triggered()); 188 EXPECT_TRUE(feedback_.triggered());
235 EXPECT_EQ(kStartFrameId, feedback_.last_frame_acked()); 189 EXPECT_EQ(2u, feedback_.last_frame_acked());
236 testing_clock_.Advance( 190 testing_clock_.Advance(
237 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 191 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
238 SetFrameIds(5, 5); 192 SetFrameIds(5, 5);
239 SetPacketId(0); 193 SetPacketId(0);
240 SetMaxPacketId(0); 194 SetMaxPacketId(0);
241 SetKeyFrame(true); 195 SetKeyFrame(true);
242 InsertPacket(); 196 InsertPacket();
243 testing_clock_.Advance( 197 testing_clock_.Advance(
244 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 198 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
245 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering. 199 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering.
246 cast_msg_builder_->UpdateCastMessage(); 200 cast_msg_builder_->UpdateCastMessage();
247 EXPECT_TRUE(feedback_.triggered()); 201 EXPECT_TRUE(feedback_.triggered());
248 EXPECT_EQ(5u, feedback_.last_frame_acked()); 202 EXPECT_EQ(5u, feedback_.last_frame_acked());
249 testing_clock_.Advance( 203 testing_clock_.Advance(
250 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); 204 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
251 SetFrameIds(1, 0); 205 SetFrameIds(1, 0);
252 SetPacketId(1); 206 SetPacketId(1);
253 SetMaxPacketId(1); 207 SetMaxPacketId(1);
254 InsertPacket(); 208 InsertPacket();
255 EXPECT_FALSE(feedback_.triggered()); 209 EXPECT_FALSE(feedback_.triggered());
256 testing_clock_.Advance( 210 testing_clock_.Advance(
257 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 211 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
258 InsertPacket(); 212 InsertPacket();
259 EXPECT_TRUE(feedback_.triggered()); 213 EXPECT_TRUE(feedback_.triggered());
260 EXPECT_EQ(5u, feedback_.last_frame_acked()); 214 EXPECT_EQ(5u, feedback_.last_frame_acked());
261 } 215 }
262 216
263 TEST_F(CastMessageBuilderTest, WrapFastForward) {
264 SetFrameIds(254, 254);
265 SetPacketId(0);
266 SetMaxPacketId(1);
267 SetKeyFrame(true);
268 InsertPacket();
269 EXPECT_FALSE(feedback_.triggered());
270 testing_clock_.Advance(
271 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
272 SetFrameIds(255, 254);
273 SetPacketId(0);
274 SetMaxPacketId(0);
275 SetKeyFrame(false);
276 InsertPacket();
277 EXPECT_TRUE(feedback_.triggered());
278 EXPECT_EQ(253u, feedback_.last_frame_acked());
279 testing_clock_.Advance(
280 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
281 SetFrameIds(256, 255);
282 SetPacketId(0);
283 SetMaxPacketId(0);
284 SetKeyFrame(false);
285 InsertPacket();
286 EXPECT_TRUE(feedback_.triggered());
287 EXPECT_EQ(253u, feedback_.last_frame_acked());
288 testing_clock_.Advance(
289 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
290 SetFrameIds(254, 254);
291 SetPacketId(1);
292 SetMaxPacketId(1);
293 SetKeyFrame(true);
294 InsertPacket();
295 EXPECT_TRUE(feedback_.triggered());
296 EXPECT_EQ(256u, feedback_.last_frame_acked());
297 }
298
299 TEST_F(CastMessageBuilderTest, NackUntilMaxReceivedPacket) { 217 TEST_F(CastMessageBuilderTest, NackUntilMaxReceivedPacket) {
300 SetFrameIds(0, 0); 218 SetFrameIds(0, 0);
301 SetPacketId(0); 219 SetPacketId(0);
302 SetMaxPacketId(20); 220 SetMaxPacketId(20);
303 SetKeyFrame(true); 221 SetKeyFrame(true);
304 InsertPacket(); 222 InsertPacket();
305 testing_clock_.Advance( 223 testing_clock_.Advance(
306 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 224 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
307 SetPacketId(5); 225 SetPacketId(5);
308 InsertPacket(); 226 InsertPacket();
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 SetKeyFrame(true); 315 SetKeyFrame(true);
398 InsertPacket(); 316 InsertPacket();
399 testing_clock_.Advance( 317 testing_clock_.Advance(
400 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 318 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
401 EXPECT_TRUE(feedback_.triggered()); 319 EXPECT_TRUE(feedback_.triggered());
402 EXPECT_EQ(0u, feedback_.last_frame_acked()); 320 EXPECT_EQ(0u, feedback_.last_frame_acked());
403 SetFrameIds(3, 0); 321 SetFrameIds(3, 0);
404 SetKeyFrame(false); 322 SetKeyFrame(false);
405 InsertPacket(); 323 InsertPacket();
406 EXPECT_TRUE(feedback_.triggered()); 324 EXPECT_TRUE(feedback_.triggered());
407 EXPECT_EQ(0u, feedback_.last_frame_acked()); 325 EXPECT_EQ(3u, feedback_.last_frame_acked());
408 testing_clock_.Advance( 326 testing_clock_.Advance(
409 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); 327 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs));
410 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering. 328 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering.
411 cast_msg_builder_->UpdateCastMessage(); 329 cast_msg_builder_->UpdateCastMessage();
412 EXPECT_TRUE(feedback_.triggered()); 330 EXPECT_TRUE(feedback_.triggered());
413 EXPECT_EQ(3u, feedback_.last_frame_acked()); 331 EXPECT_EQ(3u, feedback_.last_frame_acked());
414 } 332 }
415 333
416 TEST_F(CastMessageBuilderTest, InOrderRps) { 334 TEST_F(CastMessageBuilderTest, InOrderRps) {
417 // Create a pattern - skip to rps, and don't look back. 335 // Create a pattern - skip to rps, and don't look back.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 EXPECT_TRUE(feedback_.triggered()); 391 EXPECT_TRUE(feedback_.triggered());
474 EXPECT_EQ(frame_id - 1, feedback_.last_frame_acked()); 392 EXPECT_EQ(frame_id - 1, feedback_.last_frame_acked());
475 SetFrameIds(frame_id, frame_id - 1); 393 SetFrameIds(frame_id, frame_id - 1);
476 InsertPacket(); 394 InsertPacket();
477 testing_clock_.Advance( 395 testing_clock_.Advance(
478 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); 396 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
479 } 397 }
480 // We should now have entered the slowdown ACK state. 398 // We should now have entered the slowdown ACK state.
481 uint32 expected_frame_id = 1; 399 uint32 expected_frame_id = 1;
482 for (; frame_id < 10; ++frame_id) { 400 for (; frame_id < 10; ++frame_id) {
483 if (frame_id % 2) 401 if (frame_id % 2) {
484 ++expected_frame_id; 402 ++expected_frame_id;
485 EXPECT_TRUE(feedback_.triggered()); 403 EXPECT_TRUE(feedback_.triggered());
404 } else {
405 EXPECT_FALSE(feedback_.triggered());
406 }
486 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); 407 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked());
487 SetFrameIds(frame_id, frame_id - 1); 408 SetFrameIds(frame_id, frame_id - 1);
488 InsertPacket(); 409 InsertPacket();
489 testing_clock_.Advance( 410 testing_clock_.Advance(
490 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); 411 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
491 } 412 }
492 EXPECT_TRUE(feedback_.triggered()); 413 EXPECT_FALSE(feedback_.triggered());
493 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); 414 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked());
494 415
495 // Simulate frame_id being pulled for rendering. 416 // Simulate frame_id being pulled for rendering.
496 frame_id_map_.RemoveOldFrames(frame_id); 417 frame_id_map_.RemoveOldFrames(frame_id);
497 // We should now leave the slowdown ACK state. 418 // We should now leave the slowdown ACK state.
498 ++frame_id; 419 ++frame_id;
499 SetFrameIds(frame_id, frame_id - 1); 420 SetFrameIds(frame_id, frame_id - 1);
500 InsertPacket(); 421 InsertPacket();
501 testing_clock_.Advance( 422 testing_clock_.Advance(
502 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); 423 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs));
503 EXPECT_TRUE(feedback_.triggered()); 424 EXPECT_TRUE(feedback_.triggered());
504 EXPECT_EQ(frame_id, feedback_.last_frame_acked()); 425 EXPECT_EQ(frame_id, feedback_.last_frame_acked());
505 } 426 }
506 427
507 } // namespace cast 428 } // namespace cast
508 } // namespace media 429 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/framer/cast_message_builder.cc ('k') | media/cast/framer/frame_id_map.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698