| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/net/rtcp/rtcp.h" | 9 #include "media/cast/net/rtcp/rtcp.h" |
| 10 #include "media/cast/net/rtp/cast_message_builder.h" | 10 #include "media/cast/net/rtp/cast_message_builder.h" |
| 11 #include "media/cast/net/rtp/framer.h" |
| 11 #include "media/cast/net/rtp/rtp_receiver_defines.h" | 12 #include "media/cast/net/rtp/rtp_receiver_defines.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 namespace media { | 15 namespace media { |
| 15 namespace cast { | 16 namespace cast { |
| 16 | 17 |
| 17 namespace { | 18 namespace { |
| 18 static const uint32 kSsrc = 0x1234; | 19 static const uint32 kSsrc = 0x1234; |
| 19 static const uint32 kShortTimeIncrementMs = 10; | 20 static const uint32 kShortTimeIncrementMs = 10; |
| 20 static const uint32 kLongTimeIncrementMs = 40; | 21 static const uint32 kLongTimeIncrementMs = 40; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 MissingPacketsMap missing_packets_; // Missing packets per frame. | 76 MissingPacketsMap missing_packets_; // Missing packets per frame. |
| 76 uint32 last_frame_acked_; | 77 uint32 last_frame_acked_; |
| 77 | 78 |
| 78 DISALLOW_COPY_AND_ASSIGN(NackFeedbackVerification); | 79 DISALLOW_COPY_AND_ASSIGN(NackFeedbackVerification); |
| 79 }; | 80 }; |
| 80 } // namespace | 81 } // namespace |
| 81 | 82 |
| 82 class CastMessageBuilderTest : public ::testing::Test { | 83 class CastMessageBuilderTest : public ::testing::Test { |
| 83 protected: | 84 protected: |
| 84 CastMessageBuilderTest() | 85 CastMessageBuilderTest() |
| 85 : cast_msg_builder_(new CastMessageBuilder(&testing_clock_, | 86 : framer_(&testing_clock_, |
| 87 &feedback_, |
| 88 kSsrc, |
| 89 true, |
| 90 10), |
| 91 cast_msg_builder_(new CastMessageBuilder(&testing_clock_, |
| 86 &feedback_, | 92 &feedback_, |
| 87 &frame_id_map_, | 93 &framer_, |
| 88 kSsrc, | 94 kSsrc, |
| 89 true, | 95 true, |
| 90 0)) { | 96 0)) { |
| 91 rtp_header_.sender_ssrc = kSsrc; | 97 rtp_header_.sender_ssrc = kSsrc; |
| 92 rtp_header_.is_key_frame = false; | 98 rtp_header_.is_key_frame = false; |
| 93 testing_clock_.Advance( | 99 testing_clock_.Advance( |
| 94 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 100 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| 95 } | 101 } |
| 96 | 102 |
| 97 virtual ~CastMessageBuilderTest() {} | 103 virtual ~CastMessageBuilderTest() {} |
| 98 | 104 |
| 99 void SetFrameIds(uint32 frame_id, uint32 reference_frame_id) { | 105 void SetFrameIds(uint32 frame_id, uint32 reference_frame_id) { |
| 100 rtp_header_.frame_id = frame_id; | 106 rtp_header_.frame_id = frame_id; |
| 101 rtp_header_.reference_frame_id = reference_frame_id; | 107 rtp_header_.reference_frame_id = reference_frame_id; |
| 102 } | 108 } |
| 103 | 109 |
| 104 void SetPacketId(uint16 packet_id) { rtp_header_.packet_id = packet_id; } | 110 void SetPacketId(uint16 packet_id) { rtp_header_.packet_id = packet_id; } |
| 105 | 111 |
| 106 void SetMaxPacketId(uint16 max_packet_id) { | 112 void SetMaxPacketId(uint16 max_packet_id) { |
| 107 rtp_header_.max_packet_id = max_packet_id; | 113 rtp_header_.max_packet_id = max_packet_id; |
| 108 } | 114 } |
| 109 | 115 |
| 110 void SetKeyFrame(bool is_key) { rtp_header_.is_key_frame = is_key; } | 116 void SetKeyFrame(bool is_key) { rtp_header_.is_key_frame = is_key; } |
| 111 | 117 |
| 112 void InsertPacket() { | 118 void InsertPacket() { |
| 113 PacketType packet_type = frame_id_map_.InsertPacket(rtp_header_); | 119 bool duplicate; |
| 114 if (packet_type == kNewPacketCompletingFrame) { | 120 uint8 payload = 0; |
| 121 if (framer_.InsertPacket(&payload, 1, rtp_header_, &duplicate)) { |
| 115 cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id); | 122 cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id); |
| 116 } | 123 } |
| 117 cast_msg_builder_->UpdateCastMessage(); | 124 cast_msg_builder_->UpdateCastMessage(); |
| 118 } | 125 } |
| 119 | 126 |
| 120 void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) { | 127 void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) { |
| 121 cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_, | 128 cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_, |
| 122 &feedback_, | 129 &feedback_, |
| 123 &frame_id_map_, | 130 &framer_, |
| 124 kSsrc, | 131 kSsrc, |
| 125 false, | 132 false, |
| 126 max_unacked_frames)); | 133 max_unacked_frames)); |
| 127 } | 134 } |
| 128 | 135 |
| 129 NackFeedbackVerification feedback_; | 136 NackFeedbackVerification feedback_; |
| 137 Framer framer_; |
| 130 scoped_ptr<CastMessageBuilder> cast_msg_builder_; | 138 scoped_ptr<CastMessageBuilder> cast_msg_builder_; |
| 131 RtpCastHeader rtp_header_; | 139 RtpCastHeader rtp_header_; |
| 132 FrameIdMap frame_id_map_; | |
| 133 base::SimpleTestTickClock testing_clock_; | 140 base::SimpleTestTickClock testing_clock_; |
| 134 | 141 |
| 135 DISALLOW_COPY_AND_ASSIGN(CastMessageBuilderTest); | 142 DISALLOW_COPY_AND_ASSIGN(CastMessageBuilderTest); |
| 136 }; | 143 }; |
| 137 | 144 |
| 138 TEST_F(CastMessageBuilderTest, OneFrameNackList) { | 145 TEST_F(CastMessageBuilderTest, OneFrameNackList) { |
| 139 SetFrameIds(0, 0); | 146 SetFrameIds(0, 0); |
| 140 SetPacketId(4); | 147 SetPacketId(4); |
| 141 SetMaxPacketId(10); | 148 SetMaxPacketId(10); |
| 142 InsertPacket(); | 149 InsertPacket(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 EXPECT_EQ(2u, feedback_.last_frame_acked()); | 196 EXPECT_EQ(2u, feedback_.last_frame_acked()); |
| 190 testing_clock_.Advance( | 197 testing_clock_.Advance( |
| 191 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 198 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 192 SetFrameIds(5, 5); | 199 SetFrameIds(5, 5); |
| 193 SetPacketId(0); | 200 SetPacketId(0); |
| 194 SetMaxPacketId(0); | 201 SetMaxPacketId(0); |
| 195 SetKeyFrame(true); | 202 SetKeyFrame(true); |
| 196 InsertPacket(); | 203 InsertPacket(); |
| 197 testing_clock_.Advance( | 204 testing_clock_.Advance( |
| 198 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 205 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 199 frame_id_map_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering. | 206 framer_.RemoveOldFrames(5); // Simulate 5 being pulled for rendering. |
| 200 cast_msg_builder_->UpdateCastMessage(); | 207 cast_msg_builder_->UpdateCastMessage(); |
| 201 EXPECT_TRUE(feedback_.triggered()); | 208 EXPECT_TRUE(feedback_.triggered()); |
| 202 EXPECT_EQ(5u, feedback_.last_frame_acked()); | 209 EXPECT_EQ(5u, feedback_.last_frame_acked()); |
| 203 testing_clock_.Advance( | 210 testing_clock_.Advance( |
| 204 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 211 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 205 SetFrameIds(1, 0); | 212 SetFrameIds(1, 0); |
| 206 SetPacketId(1); | 213 SetPacketId(1); |
| 207 SetMaxPacketId(1); | 214 SetMaxPacketId(1); |
| 208 InsertPacket(); | 215 InsertPacket(); |
| 209 EXPECT_FALSE(feedback_.triggered()); | 216 EXPECT_FALSE(feedback_.triggered()); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 283 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 277 EXPECT_TRUE(feedback_.triggered()); | 284 EXPECT_TRUE(feedback_.triggered()); |
| 278 EXPECT_EQ(0u, feedback_.num_missing_packets(0)); | 285 EXPECT_EQ(0u, feedback_.num_missing_packets(0)); |
| 279 } | 286 } |
| 280 | 287 |
| 281 TEST_F(CastMessageBuilderTest, Reset) { | 288 TEST_F(CastMessageBuilderTest, Reset) { |
| 282 InsertPacket(); | 289 InsertPacket(); |
| 283 testing_clock_.Advance( | 290 testing_clock_.Advance( |
| 284 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 291 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 285 cast_msg_builder_->Reset(); | 292 cast_msg_builder_->Reset(); |
| 286 frame_id_map_.Clear(); | 293 framer_.Reset(); |
| 287 // Should reset nack list state and request a key frame. | 294 // Should reset nack list state and request a key frame. |
| 288 cast_msg_builder_->UpdateCastMessage(); | 295 cast_msg_builder_->UpdateCastMessage(); |
| 289 EXPECT_TRUE(feedback_.triggered()); | 296 EXPECT_TRUE(feedback_.triggered()); |
| 290 EXPECT_EQ(0u, feedback_.num_missing_packets(0)); | 297 EXPECT_EQ(0u, feedback_.num_missing_packets(0)); |
| 291 } | 298 } |
| 292 | 299 |
| 293 TEST_F(CastMessageBuilderTest, DeltaAfterReset) { | 300 TEST_F(CastMessageBuilderTest, DeltaAfterReset) { |
| 294 SetFrameIds(0, 0); | 301 SetFrameIds(0, 0); |
| 295 SetPacketId(0); | 302 SetPacketId(0); |
| 296 SetMaxPacketId(0); | 303 SetMaxPacketId(0); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 318 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 325 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 319 EXPECT_TRUE(feedback_.triggered()); | 326 EXPECT_TRUE(feedback_.triggered()); |
| 320 EXPECT_EQ(0u, feedback_.last_frame_acked()); | 327 EXPECT_EQ(0u, feedback_.last_frame_acked()); |
| 321 SetFrameIds(3, 0); | 328 SetFrameIds(3, 0); |
| 322 SetKeyFrame(false); | 329 SetKeyFrame(false); |
| 323 InsertPacket(); | 330 InsertPacket(); |
| 324 EXPECT_TRUE(feedback_.triggered()); | 331 EXPECT_TRUE(feedback_.triggered()); |
| 325 EXPECT_EQ(3u, feedback_.last_frame_acked()); | 332 EXPECT_EQ(3u, feedback_.last_frame_acked()); |
| 326 testing_clock_.Advance( | 333 testing_clock_.Advance( |
| 327 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); | 334 base::TimeDelta::FromMilliseconds(kLongTimeIncrementMs)); |
| 328 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering. | 335 framer_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering. |
| 329 cast_msg_builder_->UpdateCastMessage(); | 336 cast_msg_builder_->UpdateCastMessage(); |
| 330 EXPECT_TRUE(feedback_.triggered()); | 337 EXPECT_TRUE(feedback_.triggered()); |
| 331 EXPECT_EQ(3u, feedback_.last_frame_acked()); | 338 EXPECT_EQ(3u, feedback_.last_frame_acked()); |
| 332 } | 339 } |
| 333 | 340 |
| 334 TEST_F(CastMessageBuilderTest, InOrderRps) { | 341 TEST_F(CastMessageBuilderTest, InOrderRps) { |
| 335 // Create a pattern - skip to rps, and don't look back. | 342 // Create a pattern - skip to rps, and don't look back. |
| 336 SetFrameIds(0, 0); | 343 SetFrameIds(0, 0); |
| 337 SetPacketId(0); | 344 SetPacketId(0); |
| 338 SetMaxPacketId(0); | 345 SetMaxPacketId(0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 350 testing_clock_.Advance( | 357 testing_clock_.Advance( |
| 351 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 358 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 352 EXPECT_FALSE(feedback_.triggered()); | 359 EXPECT_FALSE(feedback_.triggered()); |
| 353 SetFrameIds(3, 0); | 360 SetFrameIds(3, 0); |
| 354 SetPacketId(0); | 361 SetPacketId(0); |
| 355 SetMaxPacketId(0); | 362 SetMaxPacketId(0); |
| 356 SetKeyFrame(false); | 363 SetKeyFrame(false); |
| 357 InsertPacket(); | 364 InsertPacket(); |
| 358 testing_clock_.Advance( | 365 testing_clock_.Advance( |
| 359 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 366 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 360 frame_id_map_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering. | 367 framer_.RemoveOldFrames(3); // Simulate 3 being pulled for rendering. |
| 361 testing_clock_.Advance( | 368 testing_clock_.Advance( |
| 362 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 369 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 363 cast_msg_builder_->UpdateCastMessage(); | 370 cast_msg_builder_->UpdateCastMessage(); |
| 364 EXPECT_TRUE(feedback_.triggered()); | 371 EXPECT_TRUE(feedback_.triggered()); |
| 365 EXPECT_EQ(3u, feedback_.last_frame_acked()); | 372 EXPECT_EQ(3u, feedback_.last_frame_acked()); |
| 366 // Make an old frame complete - should not trigger an ack. | 373 // Make an old frame complete - should not trigger an ack. |
| 367 SetFrameIds(1, 0); | 374 SetFrameIds(1, 0); |
| 368 SetPacketId(1); | 375 SetPacketId(1); |
| 369 SetMaxPacketId(1); | 376 SetMaxPacketId(1); |
| 370 SetKeyFrame(false); | 377 SetKeyFrame(false); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); | 414 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); |
| 408 SetFrameIds(frame_id, frame_id - 1); | 415 SetFrameIds(frame_id, frame_id - 1); |
| 409 InsertPacket(); | 416 InsertPacket(); |
| 410 testing_clock_.Advance( | 417 testing_clock_.Advance( |
| 411 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 418 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 412 } | 419 } |
| 413 EXPECT_FALSE(feedback_.triggered()); | 420 EXPECT_FALSE(feedback_.triggered()); |
| 414 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); | 421 EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); |
| 415 | 422 |
| 416 // Simulate frame_id being pulled for rendering. | 423 // Simulate frame_id being pulled for rendering. |
| 417 frame_id_map_.RemoveOldFrames(frame_id); | 424 framer_.RemoveOldFrames(frame_id); |
| 418 // We should now leave the slowdown ACK state. | 425 // We should now leave the slowdown ACK state. |
| 419 ++frame_id; | 426 ++frame_id; |
| 420 SetFrameIds(frame_id, frame_id - 1); | 427 SetFrameIds(frame_id, frame_id - 1); |
| 421 InsertPacket(); | 428 InsertPacket(); |
| 422 testing_clock_.Advance( | 429 testing_clock_.Advance( |
| 423 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 430 base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); |
| 424 EXPECT_TRUE(feedback_.triggered()); | 431 EXPECT_TRUE(feedback_.triggered()); |
| 425 EXPECT_EQ(frame_id, feedback_.last_frame_acked()); | 432 EXPECT_EQ(frame_id, feedback_.last_frame_acked()); |
| 426 } | 433 } |
| 427 | 434 |
| 428 } // namespace cast | 435 } // namespace cast |
| 429 } // namespace media | 436 } // namespace media |
| OLD | NEW |