| 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/framer.h" | 
| 12 #include "media/cast/net/rtp/rtp_defines.h" | 12 #include "media/cast/net/rtp/rtp_defines.h" | 
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" | 
| 14 | 14 | 
| 15 namespace media { | 15 namespace media { | 
| 16 namespace cast { | 16 namespace cast { | 
| 17 | 17 | 
| 18 namespace { | 18 namespace { | 
| 19 static const uint32 kSsrc = 0x1234; | 19 static const uint32_t kSsrc = 0x1234; | 
| 20 static const uint32 kShortTimeIncrementMs = 10; | 20 static const uint32_t kShortTimeIncrementMs = 10; | 
| 21 static const uint32 kLongTimeIncrementMs = 40; | 21 static const uint32_t kLongTimeIncrementMs = 40; | 
| 22 static const int64 kStartMillisecond = INT64_C(12345678900000); | 22 static const int64_t kStartMillisecond = INT64_C(12345678900000); | 
| 23 | 23 | 
| 24 typedef std::map<uint32, size_t> MissingPacketsMap; | 24 typedef std::map<uint32_t, size_t> MissingPacketsMap; | 
| 25 | 25 | 
| 26 class NackFeedbackVerification : public RtpPayloadFeedback { | 26 class NackFeedbackVerification : public RtpPayloadFeedback { | 
| 27  public: | 27  public: | 
| 28   NackFeedbackVerification() | 28   NackFeedbackVerification() | 
| 29       : triggered_(false), missing_packets_(), last_frame_acked_(0) {} | 29       : triggered_(false), missing_packets_(), last_frame_acked_(0) {} | 
| 30 | 30 | 
| 31   void CastFeedback(const RtcpCastMessage& cast_feedback) final { | 31   void CastFeedback(const RtcpCastMessage& cast_feedback) final { | 
| 32     EXPECT_EQ(kSsrc, cast_feedback.media_ssrc); | 32     EXPECT_EQ(kSsrc, cast_feedback.media_ssrc); | 
| 33 | 33 | 
| 34     last_frame_acked_ = cast_feedback.ack_frame_id; | 34     last_frame_acked_ = cast_feedback.ack_frame_id; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 46             std::make_pair(frame_it->first, kRtcpCastAllPacketsLost)); | 46             std::make_pair(frame_it->first, kRtcpCastAllPacketsLost)); | 
| 47       } else { | 47       } else { | 
| 48         missing_packets_.insert( | 48         missing_packets_.insert( | 
| 49             std::make_pair(frame_it->first, frame_it->second.size())); | 49             std::make_pair(frame_it->first, frame_it->second.size())); | 
| 50       } | 50       } | 
| 51       ++frame_it; | 51       ++frame_it; | 
| 52     } | 52     } | 
| 53     triggered_ = true; | 53     triggered_ = true; | 
| 54   } | 54   } | 
| 55 | 55 | 
| 56   size_t num_missing_packets(uint32 frame_id) { | 56   size_t num_missing_packets(uint32_t frame_id) { | 
| 57     MissingPacketsMap::iterator it; | 57     MissingPacketsMap::iterator it; | 
| 58     it = missing_packets_.find(frame_id); | 58     it = missing_packets_.find(frame_id); | 
| 59     if (it == missing_packets_.end()) | 59     if (it == missing_packets_.end()) | 
| 60       return 0; | 60       return 0; | 
| 61 | 61 | 
| 62     return it->second; | 62     return it->second; | 
| 63   } | 63   } | 
| 64 | 64 | 
| 65   // Holds value for one call. | 65   // Holds value for one call. | 
| 66   bool triggered() { | 66   bool triggered() { | 
| 67     bool ret_val = triggered_; | 67     bool ret_val = triggered_; | 
| 68     triggered_ = false; | 68     triggered_ = false; | 
| 69     return ret_val; | 69     return ret_val; | 
| 70   } | 70   } | 
| 71 | 71 | 
| 72   uint32 last_frame_acked() { return last_frame_acked_; } | 72   uint32_t last_frame_acked() { return last_frame_acked_; } | 
| 73 | 73 | 
| 74  private: | 74  private: | 
| 75   bool triggered_; | 75   bool triggered_; | 
| 76   MissingPacketsMap missing_packets_;  // Missing packets per frame. | 76   MissingPacketsMap missing_packets_;  // Missing packets per frame. | 
| 77   uint32 last_frame_acked_; | 77   uint32_t last_frame_acked_; | 
| 78 | 78 | 
| 79   DISALLOW_COPY_AND_ASSIGN(NackFeedbackVerification); | 79   DISALLOW_COPY_AND_ASSIGN(NackFeedbackVerification); | 
| 80 }; | 80 }; | 
| 81 }  // namespace | 81 }  // namespace | 
| 82 | 82 | 
| 83 class CastMessageBuilderTest : public ::testing::Test { | 83 class CastMessageBuilderTest : public ::testing::Test { | 
| 84  protected: | 84  protected: | 
| 85   CastMessageBuilderTest() | 85   CastMessageBuilderTest() | 
| 86       : framer_(&testing_clock_, | 86       : framer_(&testing_clock_, | 
| 87                 &feedback_, | 87                 &feedback_, | 
| 88                 kSsrc, | 88                 kSsrc, | 
| 89                 true, | 89                 true, | 
| 90                 10), | 90                 10), | 
| 91         cast_msg_builder_(new CastMessageBuilder(&testing_clock_, | 91         cast_msg_builder_(new CastMessageBuilder(&testing_clock_, | 
| 92                                                  &feedback_, | 92                                                  &feedback_, | 
| 93                                                  &framer_, | 93                                                  &framer_, | 
| 94                                                  kSsrc, | 94                                                  kSsrc, | 
| 95                                                  true, | 95                                                  true, | 
| 96                                                  0)) { | 96                                                  0)) { | 
| 97     rtp_header_.sender_ssrc = kSsrc; | 97     rtp_header_.sender_ssrc = kSsrc; | 
| 98     rtp_header_.is_key_frame = false; | 98     rtp_header_.is_key_frame = false; | 
| 99     testing_clock_.Advance( | 99     testing_clock_.Advance( | 
| 100         base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 100         base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 
| 101   } | 101   } | 
| 102 | 102 | 
| 103   ~CastMessageBuilderTest() override {} | 103   ~CastMessageBuilderTest() override {} | 
| 104 | 104 | 
| 105   void SetFrameIds(uint32 frame_id, uint32 reference_frame_id) { | 105   void SetFrameIds(uint32_t frame_id, uint32_t reference_frame_id) { | 
| 106     rtp_header_.frame_id = frame_id; | 106     rtp_header_.frame_id = frame_id; | 
| 107     rtp_header_.reference_frame_id = reference_frame_id; | 107     rtp_header_.reference_frame_id = reference_frame_id; | 
| 108   } | 108   } | 
| 109 | 109 | 
| 110   void SetPacketId(uint16 packet_id) { rtp_header_.packet_id = packet_id; } | 110   void SetPacketId(uint16_t packet_id) { rtp_header_.packet_id = packet_id; } | 
| 111 | 111 | 
| 112   void SetMaxPacketId(uint16 max_packet_id) { | 112   void SetMaxPacketId(uint16_t max_packet_id) { | 
| 113     rtp_header_.max_packet_id = max_packet_id; | 113     rtp_header_.max_packet_id = max_packet_id; | 
| 114   } | 114   } | 
| 115 | 115 | 
| 116   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; } | 
| 117 | 117 | 
| 118   void InsertPacket() { | 118   void InsertPacket() { | 
| 119     bool duplicate; | 119     bool duplicate; | 
| 120     uint8 payload = 0; | 120     uint8_t payload = 0; | 
| 121     if (framer_.InsertPacket(&payload, 1, rtp_header_, &duplicate)) { | 121     if (framer_.InsertPacket(&payload, 1, rtp_header_, &duplicate)) { | 
| 122       cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id); | 122       cast_msg_builder_->CompleteFrameReceived(rtp_header_.frame_id); | 
| 123     } | 123     } | 
| 124     cast_msg_builder_->UpdateCastMessage(); | 124     cast_msg_builder_->UpdateCastMessage(); | 
| 125   } | 125   } | 
| 126 | 126 | 
| 127   void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) { | 127   void SetDecoderSlowerThanMaxFrameRate(int max_unacked_frames) { | 
| 128     cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_, | 128     cast_msg_builder_.reset(new CastMessageBuilder(&testing_clock_, | 
| 129                                                    &feedback_, | 129                                                    &feedback_, | 
| 130                                                    &framer_, | 130                                                    &framer_, | 
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 384 } | 384 } | 
| 385 | 385 | 
| 386 TEST_F(CastMessageBuilderTest, SlowDownAck) { | 386 TEST_F(CastMessageBuilderTest, SlowDownAck) { | 
| 387   SetDecoderSlowerThanMaxFrameRate(3); | 387   SetDecoderSlowerThanMaxFrameRate(3); | 
| 388   SetFrameIds(0, 0); | 388   SetFrameIds(0, 0); | 
| 389   SetPacketId(0); | 389   SetPacketId(0); | 
| 390   SetMaxPacketId(0); | 390   SetMaxPacketId(0); | 
| 391   SetKeyFrame(true); | 391   SetKeyFrame(true); | 
| 392   InsertPacket(); | 392   InsertPacket(); | 
| 393 | 393 | 
| 394   uint32 frame_id; | 394   uint32_t frame_id; | 
| 395   testing_clock_.Advance( | 395   testing_clock_.Advance( | 
| 396       base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 396       base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 
| 397   SetKeyFrame(false); | 397   SetKeyFrame(false); | 
| 398   for (frame_id = 1; frame_id < 3; ++frame_id) { | 398   for (frame_id = 1; frame_id < 3; ++frame_id) { | 
| 399     EXPECT_TRUE(feedback_.triggered()); | 399     EXPECT_TRUE(feedback_.triggered()); | 
| 400     EXPECT_EQ(frame_id - 1, feedback_.last_frame_acked()); | 400     EXPECT_EQ(frame_id - 1, feedback_.last_frame_acked()); | 
| 401     SetFrameIds(frame_id, frame_id - 1); | 401     SetFrameIds(frame_id, frame_id - 1); | 
| 402     InsertPacket(); | 402     InsertPacket(); | 
| 403     testing_clock_.Advance( | 403     testing_clock_.Advance( | 
| 404         base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 404         base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 
| 405   } | 405   } | 
| 406   // We should now have entered the slowdown ACK state. | 406   // We should now have entered the slowdown ACK state. | 
| 407   uint32 expected_frame_id = 1; | 407   uint32_t expected_frame_id = 1; | 
| 408   for (; frame_id < 10; ++frame_id) { | 408   for (; frame_id < 10; ++frame_id) { | 
| 409     if (frame_id % 2) { | 409     if (frame_id % 2) { | 
| 410       ++expected_frame_id; | 410       ++expected_frame_id; | 
| 411       EXPECT_TRUE(feedback_.triggered()); | 411       EXPECT_TRUE(feedback_.triggered()); | 
| 412     } else { | 412     } else { | 
| 413       EXPECT_FALSE(feedback_.triggered()); | 413       EXPECT_FALSE(feedback_.triggered()); | 
| 414     } | 414     } | 
| 415     EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); | 415     EXPECT_EQ(expected_frame_id, feedback_.last_frame_acked()); | 
| 416     SetFrameIds(frame_id, frame_id - 1); | 416     SetFrameIds(frame_id, frame_id - 1); | 
| 417     InsertPacket(); | 417     InsertPacket(); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 428   SetFrameIds(frame_id, frame_id - 1); | 428   SetFrameIds(frame_id, frame_id - 1); | 
| 429   InsertPacket(); | 429   InsertPacket(); | 
| 430   testing_clock_.Advance( | 430   testing_clock_.Advance( | 
| 431       base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 431       base::TimeDelta::FromMilliseconds(kShortTimeIncrementMs)); | 
| 432   EXPECT_TRUE(feedback_.triggered()); | 432   EXPECT_TRUE(feedback_.triggered()); | 
| 433   EXPECT_EQ(frame_id, feedback_.last_frame_acked()); | 433   EXPECT_EQ(frame_id, feedback_.last_frame_acked()); | 
| 434 } | 434 } | 
| 435 | 435 | 
| 436 }  // namespace cast | 436 }  // namespace cast | 
| 437 }  // namespace media | 437 }  // namespace media | 
| OLD | NEW | 
|---|