| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 int64_t timestamp_us = feedback_packet.GetBaseTimeUs(); | 45 int64_t timestamp_us = feedback_packet.GetBaseTimeUs(); |
| 46 for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) { | 46 for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) { |
| 47 timestamp_us += rtp_packet_received.delta_us(); | 47 timestamp_us += rtp_packet_received.delta_us(); |
| 48 timestamps.push_back(timestamp_us / 1000); | 48 timestamps.push_back(timestamp_us / 1000); |
| 49 } | 49 } |
| 50 return timestamps; | 50 return timestamps; |
| 51 } | 51 } |
| 52 | 52 |
| 53 class MockPacketRouter : public PacketRouter { | 53 class MockPacketRouter : public PacketRouter { |
| 54 public: | 54 public: |
| 55 MOCK_METHOD1(SendFeedback, bool(rtcp::TransportFeedback* feedback_packet)); | 55 MOCK_METHOD1(SendTransportFeedback, |
| 56 bool(rtcp::TransportFeedback* feedback_packet)); |
| 56 }; | 57 }; |
| 57 | 58 |
| 58 class RemoteEstimatorProxyTest : public ::testing::Test { | 59 class RemoteEstimatorProxyTest : public ::testing::Test { |
| 59 public: | 60 public: |
| 60 RemoteEstimatorProxyTest() : clock_(0), proxy_(&clock_, &router_) {} | 61 RemoteEstimatorProxyTest() : clock_(0), proxy_(&clock_, &router_) {} |
| 61 | 62 |
| 62 protected: | 63 protected: |
| 63 void IncomingPacket(uint16_t seq, int64_t time_ms) { | 64 void IncomingPacket(uint16_t seq, int64_t time_ms) { |
| 64 RTPHeader header; | 65 RTPHeader header; |
| 65 header.extension.hasTransportSequenceNumber = true; | 66 header.extension.hasTransportSequenceNumber = true; |
| 66 header.extension.transportSequenceNumber = seq; | 67 header.extension.transportSequenceNumber = seq; |
| 67 header.ssrc = kMediaSsrc; | 68 header.ssrc = kMediaSsrc; |
| 68 proxy_.IncomingPacket(time_ms, kDefaultPacketSize, header); | 69 proxy_.IncomingPacket(time_ms, kDefaultPacketSize, header); |
| 69 } | 70 } |
| 70 | 71 |
| 71 void Process() { | 72 void Process() { |
| 72 clock_.AdvanceTimeMilliseconds( | 73 clock_.AdvanceTimeMilliseconds( |
| 73 RemoteEstimatorProxy::kDefaultSendIntervalMs); | 74 RemoteEstimatorProxy::kDefaultSendIntervalMs); |
| 74 proxy_.Process(); | 75 proxy_.Process(); |
| 75 } | 76 } |
| 76 | 77 |
| 77 SimulatedClock clock_; | 78 SimulatedClock clock_; |
| 78 testing::StrictMock<MockPacketRouter> router_; | 79 testing::StrictMock<MockPacketRouter> router_; |
| 79 RemoteEstimatorProxy proxy_; | 80 RemoteEstimatorProxy proxy_; |
| 80 }; | 81 }; |
| 81 | 82 |
| 82 TEST_F(RemoteEstimatorProxyTest, SendsSinglePacketFeedback) { | 83 TEST_F(RemoteEstimatorProxyTest, SendsSinglePacketFeedback) { |
| 83 IncomingPacket(kBaseSeq, kBaseTimeMs); | 84 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 84 | 85 |
| 85 EXPECT_CALL(router_, SendFeedback(_)) | 86 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 86 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 87 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 87 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 88 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 88 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 89 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 89 | 90 |
| 90 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); | 91 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
| 91 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); | 92 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
| 92 return true; | 93 return true; |
| 93 })); | 94 })); |
| 94 | 95 |
| 95 Process(); | 96 Process(); |
| 96 } | 97 } |
| 97 | 98 |
| 98 TEST_F(RemoteEstimatorProxyTest, DuplicatedPackets) { | 99 TEST_F(RemoteEstimatorProxyTest, DuplicatedPackets) { |
| 99 IncomingPacket(kBaseSeq, kBaseTimeMs); | 100 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 100 IncomingPacket(kBaseSeq, kBaseTimeMs + 1000); | 101 IncomingPacket(kBaseSeq, kBaseTimeMs + 1000); |
| 101 | 102 |
| 102 EXPECT_CALL(router_, SendFeedback(_)) | 103 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 103 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 104 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 104 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 105 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 105 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 106 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 106 | 107 |
| 107 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); | 108 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
| 108 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); | 109 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
| 109 return true; | 110 return true; |
| 110 })); | 111 })); |
| 111 | 112 |
| 112 Process(); | 113 Process(); |
| 113 } | 114 } |
| 114 | 115 |
| 115 TEST_F(RemoteEstimatorProxyTest, FeedbackWithMissingStart) { | 116 TEST_F(RemoteEstimatorProxyTest, FeedbackWithMissingStart) { |
| 116 // First feedback. | 117 // First feedback. |
| 117 IncomingPacket(kBaseSeq, kBaseTimeMs); | 118 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 118 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1000); | 119 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1000); |
| 119 EXPECT_CALL(router_, SendFeedback(_)).WillOnce(Return(true)); | 120 EXPECT_CALL(router_, SendTransportFeedback(_)).WillOnce(Return(true)); |
| 120 Process(); | 121 Process(); |
| 121 | 122 |
| 122 // Second feedback starts with a missing packet (DROP kBaseSeq + 2). | 123 // Second feedback starts with a missing packet (DROP kBaseSeq + 2). |
| 123 IncomingPacket(kBaseSeq + 3, kBaseTimeMs + 3000); | 124 IncomingPacket(kBaseSeq + 3, kBaseTimeMs + 3000); |
| 124 | 125 |
| 125 EXPECT_CALL(router_, SendFeedback(_)) | 126 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 126 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 127 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 127 EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); | 128 EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); |
| 128 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 129 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 129 | 130 |
| 130 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 131 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 131 ElementsAre(kBaseSeq + 3)); | 132 ElementsAre(kBaseSeq + 3)); |
| 132 EXPECT_THAT(TimestampsMs(*feedback_packet), | 133 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 133 ElementsAre(kBaseTimeMs + 3000)); | 134 ElementsAre(kBaseTimeMs + 3000)); |
| 134 return true; | 135 return true; |
| 135 })); | 136 })); |
| 136 | 137 |
| 137 Process(); | 138 Process(); |
| 138 } | 139 } |
| 139 | 140 |
| 140 TEST_F(RemoteEstimatorProxyTest, SendsFeedbackWithVaryingDeltas) { | 141 TEST_F(RemoteEstimatorProxyTest, SendsFeedbackWithVaryingDeltas) { |
| 141 IncomingPacket(kBaseSeq, kBaseTimeMs); | 142 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 142 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kMaxSmallDeltaMs); | 143 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kMaxSmallDeltaMs); |
| 143 IncomingPacket(kBaseSeq + 2, kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1); | 144 IncomingPacket(kBaseSeq + 2, kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1); |
| 144 | 145 |
| 145 EXPECT_CALL(router_, SendFeedback(_)) | 146 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 146 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 147 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 147 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 148 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 148 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 149 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 149 | 150 |
| 150 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 151 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 151 ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 2)); | 152 ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 2)); |
| 152 EXPECT_THAT(TimestampsMs(*feedback_packet), | 153 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 153 ElementsAre(kBaseTimeMs, kBaseTimeMs + kMaxSmallDeltaMs, | 154 ElementsAre(kBaseTimeMs, kBaseTimeMs + kMaxSmallDeltaMs, |
| 154 kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1)); | 155 kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1)); |
| 155 return true; | 156 return true; |
| 156 })); | 157 })); |
| 157 | 158 |
| 158 Process(); | 159 Process(); |
| 159 } | 160 } |
| 160 | 161 |
| 161 TEST_F(RemoteEstimatorProxyTest, SendsFragmentedFeedback) { | 162 TEST_F(RemoteEstimatorProxyTest, SendsFragmentedFeedback) { |
| 162 static constexpr int64_t kTooLargeDelta = | 163 static constexpr int64_t kTooLargeDelta = |
| 163 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 16); | 164 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 16); |
| 164 | 165 |
| 165 IncomingPacket(kBaseSeq, kBaseTimeMs); | 166 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 166 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kTooLargeDelta); | 167 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kTooLargeDelta); |
| 167 | 168 |
| 168 EXPECT_CALL(router_, SendFeedback(_)) | 169 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 169 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 170 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 170 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 171 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 171 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 172 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 172 | 173 |
| 173 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); | 174 EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq)); |
| 174 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); | 175 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
| 175 return true; | 176 return true; |
| 176 })) | 177 })) |
| 177 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 178 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 178 EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); | 179 EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); |
| 179 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 180 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 180 | 181 |
| 181 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 182 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 182 ElementsAre(kBaseSeq + 1)); | 183 ElementsAre(kBaseSeq + 1)); |
| 183 EXPECT_THAT(TimestampsMs(*feedback_packet), | 184 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 184 ElementsAre(kBaseTimeMs + kTooLargeDelta)); | 185 ElementsAre(kBaseTimeMs + kTooLargeDelta)); |
| 185 return true; | 186 return true; |
| 186 })); | 187 })); |
| 187 | 188 |
| 188 Process(); | 189 Process(); |
| 189 } | 190 } |
| 190 | 191 |
| 191 TEST_F(RemoteEstimatorProxyTest, GracefullyHandlesReorderingAndWrap) { | 192 TEST_F(RemoteEstimatorProxyTest, GracefullyHandlesReorderingAndWrap) { |
| 192 const int64_t kDeltaMs = 1000; | 193 const int64_t kDeltaMs = 1000; |
| 193 const uint16_t kLargeSeq = 62762; | 194 const uint16_t kLargeSeq = 62762; |
| 194 IncomingPacket(kBaseSeq, kBaseTimeMs); | 195 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 195 IncomingPacket(kLargeSeq, kBaseTimeMs + kDeltaMs); | 196 IncomingPacket(kLargeSeq, kBaseTimeMs + kDeltaMs); |
| 196 | 197 |
| 197 EXPECT_CALL(router_, SendFeedback(_)) | 198 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 198 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 199 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 199 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 200 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 200 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 201 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 201 | 202 |
| 202 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); | 203 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
| 203 return true; | 204 return true; |
| 204 })); | 205 })); |
| 205 | 206 |
| 206 Process(); | 207 Process(); |
| 207 } | 208 } |
| 208 | 209 |
| 209 TEST_F(RemoteEstimatorProxyTest, ResendsTimestampsOnReordering) { | 210 TEST_F(RemoteEstimatorProxyTest, ResendsTimestampsOnReordering) { |
| 210 IncomingPacket(kBaseSeq, kBaseTimeMs); | 211 IncomingPacket(kBaseSeq, kBaseTimeMs); |
| 211 IncomingPacket(kBaseSeq + 2, kBaseTimeMs + 2); | 212 IncomingPacket(kBaseSeq + 2, kBaseTimeMs + 2); |
| 212 | 213 |
| 213 EXPECT_CALL(router_, SendFeedback(_)) | 214 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 214 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 215 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 215 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 216 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 216 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 217 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 217 | 218 |
| 218 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 219 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 219 ElementsAre(kBaseSeq, kBaseSeq + 2)); | 220 ElementsAre(kBaseSeq, kBaseSeq + 2)); |
| 220 EXPECT_THAT(TimestampsMs(*feedback_packet), | 221 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 221 ElementsAre(kBaseTimeMs, kBaseTimeMs + 2)); | 222 ElementsAre(kBaseTimeMs, kBaseTimeMs + 2)); |
| 222 return true; | 223 return true; |
| 223 })); | 224 })); |
| 224 | 225 |
| 225 Process(); | 226 Process(); |
| 226 | 227 |
| 227 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1); | 228 IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1); |
| 228 | 229 |
| 229 EXPECT_CALL(router_, SendFeedback(_)) | 230 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 230 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 231 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 231 EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); | 232 EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence()); |
| 232 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); | 233 EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc()); |
| 233 | 234 |
| 234 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 235 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 235 ElementsAre(kBaseSeq + 1, kBaseSeq + 2)); | 236 ElementsAre(kBaseSeq + 1, kBaseSeq + 2)); |
| 236 EXPECT_THAT(TimestampsMs(*feedback_packet), | 237 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 237 ElementsAre(kBaseTimeMs + 1, kBaseTimeMs + 2)); | 238 ElementsAre(kBaseTimeMs + 1, kBaseTimeMs + 2)); |
| 238 return true; | 239 return true; |
| 239 })); | 240 })); |
| 240 | 241 |
| 241 Process(); | 242 Process(); |
| 242 } | 243 } |
| 243 | 244 |
| 244 TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) { | 245 TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) { |
| 245 const int64_t kTimeoutTimeMs = | 246 const int64_t kTimeoutTimeMs = |
| 246 kBaseTimeMs + RemoteEstimatorProxy::kBackWindowMs; | 247 kBaseTimeMs + RemoteEstimatorProxy::kBackWindowMs; |
| 247 | 248 |
| 248 IncomingPacket(kBaseSeq + 2, kBaseTimeMs); | 249 IncomingPacket(kBaseSeq + 2, kBaseTimeMs); |
| 249 | 250 |
| 250 EXPECT_CALL(router_, SendFeedback(_)) | 251 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 251 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { | 252 .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) { |
| 252 EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); | 253 EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence()); |
| 253 | 254 |
| 254 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); | 255 EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs)); |
| 255 return true; | 256 return true; |
| 256 })); | 257 })); |
| 257 | 258 |
| 258 Process(); | 259 Process(); |
| 259 | 260 |
| 260 IncomingPacket(kBaseSeq + 3, kTimeoutTimeMs); // kBaseSeq + 2 times out here. | 261 IncomingPacket(kBaseSeq + 3, kTimeoutTimeMs); // kBaseSeq + 2 times out here. |
| 261 | 262 |
| 262 EXPECT_CALL(router_, SendFeedback(_)) | 263 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 263 .WillOnce( | 264 .WillOnce( |
| 264 Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { | 265 Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { |
| 265 EXPECT_EQ(kBaseSeq + 3, feedback_packet->GetBaseSequence()); | 266 EXPECT_EQ(kBaseSeq + 3, feedback_packet->GetBaseSequence()); |
| 266 | 267 |
| 267 EXPECT_THAT(TimestampsMs(*feedback_packet), | 268 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 268 ElementsAre(kTimeoutTimeMs)); | 269 ElementsAre(kTimeoutTimeMs)); |
| 269 return true; | 270 return true; |
| 270 })); | 271 })); |
| 271 | 272 |
| 272 Process(); | 273 Process(); |
| 273 | 274 |
| 274 // New group, with sequence starting below the first so that they may be | 275 // New group, with sequence starting below the first so that they may be |
| 275 // retransmitted. | 276 // retransmitted. |
| 276 IncomingPacket(kBaseSeq, kBaseTimeMs - 1); | 277 IncomingPacket(kBaseSeq, kBaseTimeMs - 1); |
| 277 IncomingPacket(kBaseSeq + 1, kTimeoutTimeMs - 1); | 278 IncomingPacket(kBaseSeq + 1, kTimeoutTimeMs - 1); |
| 278 | 279 |
| 279 EXPECT_CALL(router_, SendFeedback(_)) | 280 EXPECT_CALL(router_, SendTransportFeedback(_)) |
| 280 .WillOnce( | 281 .WillOnce( |
| 281 Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { | 282 Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) { |
| 282 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); | 283 EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence()); |
| 283 | 284 |
| 284 EXPECT_THAT(SequenceNumbers(*feedback_packet), | 285 EXPECT_THAT(SequenceNumbers(*feedback_packet), |
| 285 ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 3)); | 286 ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 3)); |
| 286 EXPECT_THAT(TimestampsMs(*feedback_packet), | 287 EXPECT_THAT(TimestampsMs(*feedback_packet), |
| 287 ElementsAre(kBaseTimeMs - 1, kTimeoutTimeMs - 1, | 288 ElementsAre(kBaseTimeMs - 1, kTimeoutTimeMs - 1, |
| 288 kTimeoutTimeMs)); | 289 kTimeoutTimeMs)); |
| 289 return true; | 290 return true; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 | 329 |
| 329 TEST_F(RemoteEstimatorProxyTest, TwccReportsUse5PercentOfAvailableBandwidth) { | 330 TEST_F(RemoteEstimatorProxyTest, TwccReportsUse5PercentOfAvailableBandwidth) { |
| 330 Process(); | 331 Process(); |
| 331 proxy_.OnBitrateChanged(80000); | 332 proxy_.OnBitrateChanged(80000); |
| 332 // 80kbps * 0.05 = TwccReportSize(68B * 8b/B) * 1000ms / SendInterval(136ms) | 333 // 80kbps * 0.05 = TwccReportSize(68B * 8b/B) * 1000ms / SendInterval(136ms) |
| 333 EXPECT_EQ(136, proxy_.TimeUntilNextProcess()); | 334 EXPECT_EQ(136, proxy_.TimeUntilNextProcess()); |
| 334 } | 335 } |
| 335 | 336 |
| 336 } // namespace | 337 } // namespace |
| 337 } // namespace webrtc | 338 } // namespace webrtc |
| OLD | NEW |