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

Side by Side Diff: media/cast/test/utility/udp_proxy.cc

Issue 1905763002: Convert //media/cast from scoped_ptr to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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/test/utility/udp_proxy.h ('k') | media/cast/test/utility/udp_proxy_main.cc » ('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 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 "media/cast/test/utility/udp_proxy.h" 5 #include "media/cast/test/utility/udp_proxy.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 19 matching lines...) Expand all
30 PacketPipe::~PacketPipe() {} 30 PacketPipe::~PacketPipe() {}
31 void PacketPipe::InitOnIOThread( 31 void PacketPipe::InitOnIOThread(
32 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 32 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
33 base::TickClock* clock) { 33 base::TickClock* clock) {
34 task_runner_ = task_runner; 34 task_runner_ = task_runner;
35 clock_ = clock; 35 clock_ = clock;
36 if (pipe_) { 36 if (pipe_) {
37 pipe_->InitOnIOThread(task_runner, clock); 37 pipe_->InitOnIOThread(task_runner, clock);
38 } 38 }
39 } 39 }
40 void PacketPipe::AppendToPipe(scoped_ptr<PacketPipe> pipe) { 40 void PacketPipe::AppendToPipe(std::unique_ptr<PacketPipe> pipe) {
41 if (pipe_) { 41 if (pipe_) {
42 pipe_->AppendToPipe(std::move(pipe)); 42 pipe_->AppendToPipe(std::move(pipe));
43 } else { 43 } else {
44 pipe_ = std::move(pipe); 44 pipe_ = std::move(pipe);
45 } 45 }
46 } 46 }
47 47
48 // Roughly emulates a buffer inside a device. 48 // Roughly emulates a buffer inside a device.
49 // If the buffer is full, packets are dropped. 49 // If the buffer is full, packets are dropped.
50 // Packets are output at a maximum bandwidth. 50 // Packets are output at a maximum bandwidth.
51 class Buffer : public PacketPipe { 51 class Buffer : public PacketPipe {
52 public: 52 public:
53 Buffer(size_t buffer_size, double max_megabits_per_second) 53 Buffer(size_t buffer_size, double max_megabits_per_second)
54 : buffer_size_(0), 54 : buffer_size_(0),
55 max_buffer_size_(buffer_size), 55 max_buffer_size_(buffer_size),
56 max_megabits_per_second_(max_megabits_per_second), 56 max_megabits_per_second_(max_megabits_per_second),
57 weak_factory_(this) { 57 weak_factory_(this) {
58 CHECK_GT(max_buffer_size_, 0UL); 58 CHECK_GT(max_buffer_size_, 0UL);
59 CHECK_GT(max_megabits_per_second, 0); 59 CHECK_GT(max_megabits_per_second, 0);
60 } 60 }
61 61
62 void Send(scoped_ptr<Packet> packet) final { 62 void Send(std::unique_ptr<Packet> packet) final {
63 if (packet->size() + buffer_size_ <= max_buffer_size_) { 63 if (packet->size() + buffer_size_ <= max_buffer_size_) {
64 buffer_size_ += packet->size(); 64 buffer_size_ += packet->size();
65 buffer_.push_back(linked_ptr<Packet>(packet.release())); 65 buffer_.push_back(linked_ptr<Packet>(packet.release()));
66 if (buffer_.size() == 1) { 66 if (buffer_.size() == 1) {
67 Schedule(); 67 Schedule();
68 } 68 }
69 } 69 }
70 } 70 }
71 71
72 private: 72 private:
(...skipping 11 matching lines...) Expand all
84 void ProcessBuffer() { 84 void ProcessBuffer() {
85 int64_t bytes_to_send = static_cast<int64_t>( 85 int64_t bytes_to_send = static_cast<int64_t>(
86 (clock_->NowTicks() - last_schedule_).InSecondsF() * 86 (clock_->NowTicks() - last_schedule_).InSecondsF() *
87 max_megabits_per_second_ * 1E6 / 8); 87 max_megabits_per_second_ * 1E6 / 8);
88 if (bytes_to_send < static_cast<int64_t>(buffer_.front()->size())) { 88 if (bytes_to_send < static_cast<int64_t>(buffer_.front()->size())) {
89 bytes_to_send = buffer_.front()->size(); 89 bytes_to_send = buffer_.front()->size();
90 } 90 }
91 while (!buffer_.empty() && 91 while (!buffer_.empty() &&
92 static_cast<int64_t>(buffer_.front()->size()) <= bytes_to_send) { 92 static_cast<int64_t>(buffer_.front()->size()) <= bytes_to_send) {
93 CHECK(!buffer_.empty()); 93 CHECK(!buffer_.empty());
94 scoped_ptr<Packet> packet(buffer_.front().release()); 94 std::unique_ptr<Packet> packet(buffer_.front().release());
95 bytes_to_send -= packet->size(); 95 bytes_to_send -= packet->size();
96 buffer_size_ -= packet->size(); 96 buffer_size_ -= packet->size();
97 buffer_.pop_front(); 97 buffer_.pop_front();
98 pipe_->Send(std::move(packet)); 98 pipe_->Send(std::move(packet));
99 } 99 }
100 if (!buffer_.empty()) { 100 if (!buffer_.empty()) {
101 Schedule(); 101 Schedule();
102 } 102 }
103 } 103 }
104 104
105 std::deque<linked_ptr<Packet> > buffer_; 105 std::deque<linked_ptr<Packet> > buffer_;
106 base::TimeTicks last_schedule_; 106 base::TimeTicks last_schedule_;
107 size_t buffer_size_; 107 size_t buffer_size_;
108 size_t max_buffer_size_; 108 size_t max_buffer_size_;
109 double max_megabits_per_second_; // megabits per second 109 double max_megabits_per_second_; // megabits per second
110 base::WeakPtrFactory<Buffer> weak_factory_; 110 base::WeakPtrFactory<Buffer> weak_factory_;
111 }; 111 };
112 112
113 scoped_ptr<PacketPipe> NewBuffer(size_t buffer_size, double bandwidth) { 113 std::unique_ptr<PacketPipe> NewBuffer(size_t buffer_size, double bandwidth) {
114 return scoped_ptr<PacketPipe>(new Buffer(buffer_size, bandwidth)); 114 return std::unique_ptr<PacketPipe>(new Buffer(buffer_size, bandwidth));
115 } 115 }
116 116
117 class RandomDrop : public PacketPipe { 117 class RandomDrop : public PacketPipe {
118 public: 118 public:
119 RandomDrop(double drop_fraction) 119 RandomDrop(double drop_fraction)
120 : drop_fraction_(static_cast<int>(drop_fraction * RAND_MAX)) {} 120 : drop_fraction_(static_cast<int>(drop_fraction * RAND_MAX)) {}
121 121
122 void Send(scoped_ptr<Packet> packet) final { 122 void Send(std::unique_ptr<Packet> packet) final {
123 if (rand() > drop_fraction_) { 123 if (rand() > drop_fraction_) {
124 pipe_->Send(std::move(packet)); 124 pipe_->Send(std::move(packet));
125 } 125 }
126 } 126 }
127 127
128 private: 128 private:
129 int drop_fraction_; 129 int drop_fraction_;
130 }; 130 };
131 131
132 scoped_ptr<PacketPipe> NewRandomDrop(double drop_fraction) { 132 std::unique_ptr<PacketPipe> NewRandomDrop(double drop_fraction) {
133 return scoped_ptr<PacketPipe>(new RandomDrop(drop_fraction)); 133 return std::unique_ptr<PacketPipe>(new RandomDrop(drop_fraction));
134 } 134 }
135 135
136 class SimpleDelayBase : public PacketPipe { 136 class SimpleDelayBase : public PacketPipe {
137 public: 137 public:
138 SimpleDelayBase() : weak_factory_(this) {} 138 SimpleDelayBase() : weak_factory_(this) {}
139 ~SimpleDelayBase() override {} 139 ~SimpleDelayBase() override {}
140 140
141 void Send(scoped_ptr<Packet> packet) override { 141 void Send(std::unique_ptr<Packet> packet) override {
142 double seconds = GetDelay(); 142 double seconds = GetDelay();
143 task_runner_->PostDelayedTask( 143 task_runner_->PostDelayedTask(
144 FROM_HERE, 144 FROM_HERE,
145 base::Bind(&SimpleDelayBase::SendInternal, weak_factory_.GetWeakPtr(), 145 base::Bind(&SimpleDelayBase::SendInternal, weak_factory_.GetWeakPtr(),
146 base::Passed(&packet)), 146 base::Passed(&packet)),
147 base::TimeDelta::FromMicroseconds(static_cast<int64_t>(seconds * 1E6))); 147 base::TimeDelta::FromMicroseconds(static_cast<int64_t>(seconds * 1E6)));
148 } 148 }
149 protected: 149 protected:
150 virtual double GetDelay() = 0; 150 virtual double GetDelay() = 0;
151 151
152 private: 152 private:
153 virtual void SendInternal(scoped_ptr<Packet> packet) { 153 virtual void SendInternal(std::unique_ptr<Packet> packet) {
154 pipe_->Send(std::move(packet)); 154 pipe_->Send(std::move(packet));
155 } 155 }
156 156
157 base::WeakPtrFactory<SimpleDelayBase> weak_factory_; 157 base::WeakPtrFactory<SimpleDelayBase> weak_factory_;
158 }; 158 };
159 159
160 class ConstantDelay : public SimpleDelayBase { 160 class ConstantDelay : public SimpleDelayBase {
161 public: 161 public:
162 ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) {} 162 ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) {}
163 double GetDelay() final { return delay_seconds_; } 163 double GetDelay() final { return delay_seconds_; }
164 164
165 private: 165 private:
166 double delay_seconds_; 166 double delay_seconds_;
167 }; 167 };
168 168
169 scoped_ptr<PacketPipe> NewConstantDelay(double delay_seconds) { 169 std::unique_ptr<PacketPipe> NewConstantDelay(double delay_seconds) {
170 return scoped_ptr<PacketPipe>(new ConstantDelay(delay_seconds)); 170 return std::unique_ptr<PacketPipe>(new ConstantDelay(delay_seconds));
171 } 171 }
172 172
173 class RandomUnsortedDelay : public SimpleDelayBase { 173 class RandomUnsortedDelay : public SimpleDelayBase {
174 public: 174 public:
175 RandomUnsortedDelay(double random_delay) : random_delay_(random_delay) {} 175 RandomUnsortedDelay(double random_delay) : random_delay_(random_delay) {}
176 176
177 double GetDelay() override { return random_delay_ * base::RandDouble(); } 177 double GetDelay() override { return random_delay_ * base::RandDouble(); }
178 178
179 private: 179 private:
180 double random_delay_; 180 double random_delay_;
181 }; 181 };
182 182
183 scoped_ptr<PacketPipe> NewRandomUnsortedDelay(double random_delay) { 183 std::unique_ptr<PacketPipe> NewRandomUnsortedDelay(double random_delay) {
184 return scoped_ptr<PacketPipe>(new RandomUnsortedDelay(random_delay)); 184 return std::unique_ptr<PacketPipe>(new RandomUnsortedDelay(random_delay));
185 } 185 }
186 186
187 class DuplicateAndDelay : public RandomUnsortedDelay { 187 class DuplicateAndDelay : public RandomUnsortedDelay {
188 public: 188 public:
189 DuplicateAndDelay(double delay_min, 189 DuplicateAndDelay(double delay_min,
190 double random_delay) : 190 double random_delay) :
191 RandomUnsortedDelay(random_delay), 191 RandomUnsortedDelay(random_delay),
192 delay_min_(delay_min) { 192 delay_min_(delay_min) {
193 } 193 }
194 void Send(scoped_ptr<Packet> packet) final { 194 void Send(std::unique_ptr<Packet> packet) final {
195 pipe_->Send(scoped_ptr<Packet>(new Packet(*packet.get()))); 195 pipe_->Send(std::unique_ptr<Packet>(new Packet(*packet.get())));
196 RandomUnsortedDelay::Send(std::move(packet)); 196 RandomUnsortedDelay::Send(std::move(packet));
197 } 197 }
198 double GetDelay() final { 198 double GetDelay() final {
199 return RandomUnsortedDelay::GetDelay() + delay_min_; 199 return RandomUnsortedDelay::GetDelay() + delay_min_;
200 } 200 }
201 private: 201 private:
202 double delay_min_; 202 double delay_min_;
203 }; 203 };
204 204
205 scoped_ptr<PacketPipe> NewDuplicateAndDelay(double delay_min, 205 std::unique_ptr<PacketPipe> NewDuplicateAndDelay(double delay_min,
206 double random_delay) { 206 double random_delay) {
207 return scoped_ptr<PacketPipe>(new DuplicateAndDelay(delay_min, random_delay)); 207 return std::unique_ptr<PacketPipe>(
208 new DuplicateAndDelay(delay_min, random_delay));
208 } 209 }
209 210
210 class RandomSortedDelay : public PacketPipe { 211 class RandomSortedDelay : public PacketPipe {
211 public: 212 public:
212 RandomSortedDelay(double random_delay, 213 RandomSortedDelay(double random_delay,
213 double extra_delay, 214 double extra_delay,
214 double seconds_between_extra_delay) 215 double seconds_between_extra_delay)
215 : random_delay_(random_delay), 216 : random_delay_(random_delay),
216 extra_delay_(extra_delay), 217 extra_delay_(extra_delay),
217 seconds_between_extra_delay_(seconds_between_extra_delay), 218 seconds_between_extra_delay_(seconds_between_extra_delay),
218 weak_factory_(this) {} 219 weak_factory_(this) {}
219 220
220 void Send(scoped_ptr<Packet> packet) final { 221 void Send(std::unique_ptr<Packet> packet) final {
221 buffer_.push_back(linked_ptr<Packet>(packet.release())); 222 buffer_.push_back(linked_ptr<Packet>(packet.release()));
222 if (buffer_.size() == 1) { 223 if (buffer_.size() == 1) {
223 next_send_ = std::max( 224 next_send_ = std::max(
224 clock_->NowTicks() + 225 clock_->NowTicks() +
225 base::TimeDelta::FromSecondsD(base::RandDouble() * random_delay_), 226 base::TimeDelta::FromSecondsD(base::RandDouble() * random_delay_),
226 next_send_); 227 next_send_);
227 ProcessBuffer(); 228 ProcessBuffer();
228 } 229 }
229 } 230 }
230 void InitOnIOThread( 231 void InitOnIOThread(
(...skipping 23 matching lines...) Expand all
254 next_send_); 255 next_send_);
255 // An extra delay just happened, wait up to seconds_between_extra_delay_*2 256 // An extra delay just happened, wait up to seconds_between_extra_delay_*2
256 // before scheduling another one to make the average equal to 257 // before scheduling another one to make the average equal to
257 // seconds_between_extra_delay_. 258 // seconds_between_extra_delay_.
258 ScheduleExtraDelay(2.0); 259 ScheduleExtraDelay(2.0);
259 } 260 }
260 261
261 void ProcessBuffer() { 262 void ProcessBuffer() {
262 base::TimeTicks now = clock_->NowTicks(); 263 base::TimeTicks now = clock_->NowTicks();
263 while (!buffer_.empty() && next_send_ <= now) { 264 while (!buffer_.empty() && next_send_ <= now) {
264 scoped_ptr<Packet> packet(buffer_.front().release()); 265 std::unique_ptr<Packet> packet(buffer_.front().release());
265 pipe_->Send(std::move(packet)); 266 pipe_->Send(std::move(packet));
266 buffer_.pop_front(); 267 buffer_.pop_front();
267 268
268 next_send_ += base::TimeDelta::FromSecondsD( 269 next_send_ += base::TimeDelta::FromSecondsD(
269 base::RandDouble() * random_delay_); 270 base::RandDouble() * random_delay_);
270 } 271 }
271 272
272 if (!buffer_.empty()) { 273 if (!buffer_.empty()) {
273 task_runner_->PostDelayedTask( 274 task_runner_->PostDelayedTask(
274 FROM_HERE, 275 FROM_HERE,
275 base::Bind(&RandomSortedDelay::ProcessBuffer, 276 base::Bind(&RandomSortedDelay::ProcessBuffer,
276 weak_factory_.GetWeakPtr()), 277 weak_factory_.GetWeakPtr()),
277 next_send_ - now); 278 next_send_ - now);
278 } 279 }
279 } 280 }
280 281
281 base::TimeTicks block_until_; 282 base::TimeTicks block_until_;
282 std::deque<linked_ptr<Packet> > buffer_; 283 std::deque<linked_ptr<Packet> > buffer_;
283 double random_delay_; 284 double random_delay_;
284 double extra_delay_; 285 double extra_delay_;
285 double seconds_between_extra_delay_; 286 double seconds_between_extra_delay_;
286 base::TimeTicks next_send_; 287 base::TimeTicks next_send_;
287 base::WeakPtrFactory<RandomSortedDelay> weak_factory_; 288 base::WeakPtrFactory<RandomSortedDelay> weak_factory_;
288 }; 289 };
289 290
290 scoped_ptr<PacketPipe> NewRandomSortedDelay( 291 std::unique_ptr<PacketPipe> NewRandomSortedDelay(
291 double random_delay, 292 double random_delay,
292 double extra_delay, 293 double extra_delay,
293 double seconds_between_extra_delay) { 294 double seconds_between_extra_delay) {
294 return scoped_ptr<PacketPipe>(new RandomSortedDelay( 295 return std::unique_ptr<PacketPipe>(new RandomSortedDelay(
295 random_delay, extra_delay, seconds_between_extra_delay)); 296 random_delay, extra_delay, seconds_between_extra_delay));
296 } 297 }
297 298
298 class NetworkGlitchPipe : public PacketPipe { 299 class NetworkGlitchPipe : public PacketPipe {
299 public: 300 public:
300 NetworkGlitchPipe(double average_work_time, double average_outage_time) 301 NetworkGlitchPipe(double average_work_time, double average_outage_time)
301 : works_(false), 302 : works_(false),
302 max_work_time_(average_work_time * 2), 303 max_work_time_(average_work_time * 2),
303 max_outage_time_(average_outage_time * 2), 304 max_outage_time_(average_outage_time * 2),
304 weak_factory_(this) {} 305 weak_factory_(this) {}
305 306
306 void InitOnIOThread( 307 void InitOnIOThread(
307 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 308 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
308 base::TickClock* clock) final { 309 base::TickClock* clock) final {
309 PacketPipe::InitOnIOThread(task_runner, clock); 310 PacketPipe::InitOnIOThread(task_runner, clock);
310 Flip(); 311 Flip();
311 } 312 }
312 313
313 void Send(scoped_ptr<Packet> packet) final { 314 void Send(std::unique_ptr<Packet> packet) final {
314 if (works_) { 315 if (works_) {
315 pipe_->Send(std::move(packet)); 316 pipe_->Send(std::move(packet));
316 } 317 }
317 } 318 }
318 319
319 private: 320 private:
320 void Flip() { 321 void Flip() {
321 works_ = !works_; 322 works_ = !works_;
322 double seconds = base::RandDouble() * 323 double seconds = base::RandDouble() *
323 (works_ ? max_work_time_ : max_outage_time_); 324 (works_ ? max_work_time_ : max_outage_time_);
324 int64_t microseconds = static_cast<int64_t>(seconds * 1E6); 325 int64_t microseconds = static_cast<int64_t>(seconds * 1E6);
325 task_runner_->PostDelayedTask( 326 task_runner_->PostDelayedTask(
326 FROM_HERE, 327 FROM_HERE,
327 base::Bind(&NetworkGlitchPipe::Flip, weak_factory_.GetWeakPtr()), 328 base::Bind(&NetworkGlitchPipe::Flip, weak_factory_.GetWeakPtr()),
328 base::TimeDelta::FromMicroseconds(microseconds)); 329 base::TimeDelta::FromMicroseconds(microseconds));
329 } 330 }
330 331
331 bool works_; 332 bool works_;
332 double max_work_time_; 333 double max_work_time_;
333 double max_outage_time_; 334 double max_outage_time_;
334 base::WeakPtrFactory<NetworkGlitchPipe> weak_factory_; 335 base::WeakPtrFactory<NetworkGlitchPipe> weak_factory_;
335 }; 336 };
336 337
337 scoped_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time, 338 std::unique_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time,
338 double average_outage_time) { 339 double average_outage_time) {
339 return scoped_ptr<PacketPipe>( 340 return std::unique_ptr<PacketPipe>(
340 new NetworkGlitchPipe(average_work_time, average_outage_time)); 341 new NetworkGlitchPipe(average_work_time, average_outage_time));
341 } 342 }
342 343
343 344
344 // Internal buffer object for a client of the IPP model. 345 // Internal buffer object for a client of the IPP model.
345 class InterruptedPoissonProcess::InternalBuffer : public PacketPipe { 346 class InterruptedPoissonProcess::InternalBuffer : public PacketPipe {
346 public: 347 public:
347 InternalBuffer(base::WeakPtr<InterruptedPoissonProcess> ipp, 348 InternalBuffer(base::WeakPtr<InterruptedPoissonProcess> ipp,
348 size_t size) 349 size_t size)
349 : ipp_(ipp), 350 : ipp_(ipp),
350 stored_size_(0), 351 stored_size_(0),
351 stored_limit_(size), 352 stored_limit_(size),
352 clock_(NULL), 353 clock_(NULL),
353 weak_factory_(this) { 354 weak_factory_(this) {
354 } 355 }
355 356
356 void Send(scoped_ptr<Packet> packet) final { 357 void Send(std::unique_ptr<Packet> packet) final {
357 // Drop if buffer is full. 358 // Drop if buffer is full.
358 if (stored_size_ >= stored_limit_) 359 if (stored_size_ >= stored_limit_)
359 return; 360 return;
360 stored_size_ += packet->size(); 361 stored_size_ += packet->size();
361 buffer_.push_back(linked_ptr<Packet>(packet.release())); 362 buffer_.push_back(linked_ptr<Packet>(packet.release()));
362 buffer_time_.push_back(clock_->NowTicks()); 363 buffer_time_.push_back(clock_->NowTicks());
363 DCHECK(buffer_.size() == buffer_time_.size()); 364 DCHECK(buffer_.size() == buffer_time_.size());
364 } 365 }
365 366
366 void InitOnIOThread( 367 void InitOnIOThread(
367 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 368 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
368 base::TickClock* clock) final { 369 base::TickClock* clock) final {
369 clock_ = clock; 370 clock_ = clock;
370 if (ipp_) 371 if (ipp_)
371 ipp_->InitOnIOThread(task_runner, clock); 372 ipp_->InitOnIOThread(task_runner, clock);
372 PacketPipe::InitOnIOThread(task_runner, clock); 373 PacketPipe::InitOnIOThread(task_runner, clock);
373 } 374 }
374 375
375 void SendOnePacket() { 376 void SendOnePacket() {
376 scoped_ptr<Packet> packet(buffer_.front().release()); 377 std::unique_ptr<Packet> packet(buffer_.front().release());
377 stored_size_ -= packet->size(); 378 stored_size_ -= packet->size();
378 buffer_.pop_front(); 379 buffer_.pop_front();
379 buffer_time_.pop_front(); 380 buffer_time_.pop_front();
380 pipe_->Send(std::move(packet)); 381 pipe_->Send(std::move(packet));
381 DCHECK(buffer_.size() == buffer_time_.size()); 382 DCHECK(buffer_.size() == buffer_time_.size());
382 } 383 }
383 384
384 bool Empty() const { 385 bool Empty() const {
385 return buffer_.empty(); 386 return buffer_.empty();
386 } 387 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 // Already initialized and started. 434 // Already initialized and started.
434 if (task_runner_.get() && clock_) 435 if (task_runner_.get() && clock_)
435 return; 436 return;
436 task_runner_ = task_runner; 437 task_runner_ = task_runner;
437 clock_ = clock; 438 clock_ = clock;
438 UpdateRates(); 439 UpdateRates();
439 SwitchOn(); 440 SwitchOn();
440 SendPacket(); 441 SendPacket();
441 } 442 }
442 443
443 scoped_ptr<PacketPipe> InterruptedPoissonProcess::NewBuffer(size_t size) { 444 std::unique_ptr<PacketPipe> InterruptedPoissonProcess::NewBuffer(size_t size) {
444 scoped_ptr<InternalBuffer> buffer( 445 std::unique_ptr<InternalBuffer> buffer(
445 new InternalBuffer(weak_factory_.GetWeakPtr(), size)); 446 new InternalBuffer(weak_factory_.GetWeakPtr(), size));
446 send_buffers_.push_back(buffer->GetWeakPtr()); 447 send_buffers_.push_back(buffer->GetWeakPtr());
447 return std::move(buffer); 448 return std::move(buffer);
448 } 449 }
449 450
450 base::TimeDelta InterruptedPoissonProcess::NextEvent(double rate) { 451 base::TimeDelta InterruptedPoissonProcess::NextEvent(double rate) {
451 // Rate is per milliseconds. 452 // Rate is per milliseconds.
452 // The time until next event is exponentially distributed to the 453 // The time until next event is exponentially distributed to the
453 // inverse of |rate|. 454 // inverse of |rate|.
454 return base::TimeDelta::FromMillisecondsD( 455 return base::TimeDelta::FromMillisecondsD(
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 break; 539 break;
539 } 540 }
540 } 541 }
541 542
542 class UDPProxyImpl; 543 class UDPProxyImpl;
543 544
544 class PacketSender : public PacketPipe { 545 class PacketSender : public PacketPipe {
545 public: 546 public:
546 PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination) 547 PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination)
547 : udp_proxy_(udp_proxy), destination_(destination) {} 548 : udp_proxy_(udp_proxy), destination_(destination) {}
548 void Send(scoped_ptr<Packet> packet) final; 549 void Send(std::unique_ptr<Packet> packet) final;
549 void AppendToPipe(scoped_ptr<PacketPipe> pipe) final { NOTREACHED(); } 550 void AppendToPipe(std::unique_ptr<PacketPipe> pipe) final { NOTREACHED(); }
550 551
551 private: 552 private:
552 UDPProxyImpl* udp_proxy_; 553 UDPProxyImpl* udp_proxy_;
553 const net::IPEndPoint* destination_; // not owned 554 const net::IPEndPoint* destination_; // not owned
554 }; 555 };
555 556
556 namespace { 557 namespace {
557 void BuildPipe(scoped_ptr<PacketPipe>* pipe, PacketPipe* next) { 558 void BuildPipe(std::unique_ptr<PacketPipe>* pipe, PacketPipe* next) {
558 if (*pipe) { 559 if (*pipe) {
559 (*pipe)->AppendToPipe(scoped_ptr<PacketPipe>(next)); 560 (*pipe)->AppendToPipe(std::unique_ptr<PacketPipe>(next));
560 } else { 561 } else {
561 pipe->reset(next); 562 pipe->reset(next);
562 } 563 }
563 } 564 }
564 } // namespace 565 } // namespace
565 566
566 scoped_ptr<PacketPipe> GoodNetwork() { 567 std::unique_ptr<PacketPipe> GoodNetwork() {
567 // This represents the buffer on the sender. 568 // This represents the buffer on the sender.
568 scoped_ptr<PacketPipe> pipe; 569 std::unique_ptr<PacketPipe> pipe;
569 BuildPipe(&pipe, new Buffer(2 << 20, 50)); 570 BuildPipe(&pipe, new Buffer(2 << 20, 50));
570 BuildPipe(&pipe, new ConstantDelay(1E-3)); 571 BuildPipe(&pipe, new ConstantDelay(1E-3));
571 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 2E-3, 3)); 572 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 2E-3, 3));
572 // This represents the buffer on the receiving device. 573 // This represents the buffer on the receiving device.
573 BuildPipe(&pipe, new Buffer(2 << 20, 50)); 574 BuildPipe(&pipe, new Buffer(2 << 20, 50));
574 return pipe; 575 return pipe;
575 } 576 }
576 577
577 scoped_ptr<PacketPipe> WifiNetwork() { 578 std::unique_ptr<PacketPipe> WifiNetwork() {
578 // This represents the buffer on the sender. 579 // This represents the buffer on the sender.
579 scoped_ptr<PacketPipe> pipe; 580 std::unique_ptr<PacketPipe> pipe;
580 BuildPipe(&pipe, new Buffer(256 << 10, 20)); 581 BuildPipe(&pipe, new Buffer(256 << 10, 20));
581 BuildPipe(&pipe, new RandomDrop(0.005)); 582 BuildPipe(&pipe, new RandomDrop(0.005));
582 // This represents the buffer on the router. 583 // This represents the buffer on the router.
583 BuildPipe(&pipe, new ConstantDelay(1E-3)); 584 BuildPipe(&pipe, new ConstantDelay(1E-3));
584 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 20E-3, 3)); 585 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 20E-3, 3));
585 BuildPipe(&pipe, new Buffer(256 << 10, 20)); 586 BuildPipe(&pipe, new Buffer(256 << 10, 20));
586 BuildPipe(&pipe, new ConstantDelay(1E-3)); 587 BuildPipe(&pipe, new ConstantDelay(1E-3));
587 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 20E-3, 3)); 588 BuildPipe(&pipe, new RandomSortedDelay(1E-3, 20E-3, 3));
588 BuildPipe(&pipe, new RandomDrop(0.005)); 589 BuildPipe(&pipe, new RandomDrop(0.005));
589 // This represents the buffer on the receiving device. 590 // This represents the buffer on the receiving device.
590 BuildPipe(&pipe, new Buffer(256 << 10, 20)); 591 BuildPipe(&pipe, new Buffer(256 << 10, 20));
591 return pipe; 592 return pipe;
592 } 593 }
593 594
594 scoped_ptr<PacketPipe> BadNetwork() { 595 std::unique_ptr<PacketPipe> BadNetwork() {
595 scoped_ptr<PacketPipe> pipe; 596 std::unique_ptr<PacketPipe> pipe;
596 // This represents the buffer on the sender. 597 // This represents the buffer on the sender.
597 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 5mbit/s 598 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 5mbit/s
598 BuildPipe(&pipe, new RandomDrop(0.05)); // 5% packet drop 599 BuildPipe(&pipe, new RandomDrop(0.05)); // 5% packet drop
599 BuildPipe(&pipe, new RandomSortedDelay(2E-3, 20E-3, 1)); 600 BuildPipe(&pipe, new RandomSortedDelay(2E-3, 20E-3, 1));
600 // This represents the buffer on the router. 601 // This represents the buffer on the router.
601 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 4mbit/s 602 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 4mbit/s
602 BuildPipe(&pipe, new ConstantDelay(1E-3)); 603 BuildPipe(&pipe, new ConstantDelay(1E-3));
603 // Random 40ms every other second 604 // Random 40ms every other second
604 // BuildPipe(&pipe, new NetworkGlitchPipe(2, 40E-1)); 605 // BuildPipe(&pipe, new NetworkGlitchPipe(2, 40E-1));
605 BuildPipe(&pipe, new RandomUnsortedDelay(5E-3)); 606 BuildPipe(&pipe, new RandomUnsortedDelay(5E-3));
606 // This represents the buffer on the receiving device. 607 // This represents the buffer on the receiving device.
607 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 5mbit/s 608 BuildPipe(&pipe, new Buffer(64 << 10, 5)); // 64 kb buf, 5mbit/s
608 return pipe; 609 return pipe;
609 } 610 }
610 611
611 612 std::unique_ptr<PacketPipe> EvilNetwork() {
612 scoped_ptr<PacketPipe> EvilNetwork() {
613 // This represents the buffer on the sender. 613 // This represents the buffer on the sender.
614 scoped_ptr<PacketPipe> pipe; 614 std::unique_ptr<PacketPipe> pipe;
615 BuildPipe(&pipe, new Buffer(4 << 10, 5)); // 4 kb buf, 2mbit/s 615 BuildPipe(&pipe, new Buffer(4 << 10, 5)); // 4 kb buf, 2mbit/s
616 // This represents the buffer on the router. 616 // This represents the buffer on the router.
617 BuildPipe(&pipe, new RandomDrop(0.1)); // 10% packet drop 617 BuildPipe(&pipe, new RandomDrop(0.1)); // 10% packet drop
618 BuildPipe(&pipe, new RandomSortedDelay(20E-3, 60E-3, 1)); 618 BuildPipe(&pipe, new RandomSortedDelay(20E-3, 60E-3, 1));
619 BuildPipe(&pipe, new Buffer(4 << 10, 2)); // 4 kb buf, 2mbit/s 619 BuildPipe(&pipe, new Buffer(4 << 10, 2)); // 4 kb buf, 2mbit/s
620 BuildPipe(&pipe, new RandomDrop(0.1)); // 10% packet drop 620 BuildPipe(&pipe, new RandomDrop(0.1)); // 10% packet drop
621 BuildPipe(&pipe, new ConstantDelay(1E-3)); 621 BuildPipe(&pipe, new ConstantDelay(1E-3));
622 BuildPipe(&pipe, new NetworkGlitchPipe(2.0, 0.3)); 622 BuildPipe(&pipe, new NetworkGlitchPipe(2.0, 0.3));
623 BuildPipe(&pipe, new RandomUnsortedDelay(20E-3)); 623 BuildPipe(&pipe, new RandomUnsortedDelay(20E-3));
624 // This represents the buffer on the receiving device. 624 // This represents the buffer on the receiving device.
625 BuildPipe(&pipe, new Buffer(4 << 10, 2)); // 4 kb buf, 2mbit/s 625 BuildPipe(&pipe, new Buffer(4 << 10, 2)); // 4 kb buf, 2mbit/s
626 return pipe; 626 return pipe;
627 } 627 }
628 628
629 scoped_ptr<InterruptedPoissonProcess> DefaultInterruptedPoissonProcess() { 629 std::unique_ptr<InterruptedPoissonProcess> DefaultInterruptedPoissonProcess() {
630 // The following values are taken from a session reported from a user. 630 // The following values are taken from a session reported from a user.
631 // They are experimentally tested to demonstrate challenging network 631 // They are experimentally tested to demonstrate challenging network
632 // conditions. The average bitrate is about 2mbits/s. 632 // conditions. The average bitrate is about 2mbits/s.
633 633
634 // Each element in this vector is the average number of packets sent 634 // Each element in this vector is the average number of packets sent
635 // per millisecond. The average changes and rotates every second. 635 // per millisecond. The average changes and rotates every second.
636 std::vector<double> average_rates; 636 std::vector<double> average_rates;
637 average_rates.push_back(0.609); 637 average_rates.push_back(0.609);
638 average_rates.push_back(0.495); 638 average_rates.push_back(0.495);
639 average_rates.push_back(0.561); 639 average_rates.push_back(0.561);
640 average_rates.push_back(0.458); 640 average_rates.push_back(0.458);
641 average_rates.push_back(0.538); 641 average_rates.push_back(0.538);
642 average_rates.push_back(0.513); 642 average_rates.push_back(0.513);
643 average_rates.push_back(0.585); 643 average_rates.push_back(0.585);
644 average_rates.push_back(0.592); 644 average_rates.push_back(0.592);
645 average_rates.push_back(0.658); 645 average_rates.push_back(0.658);
646 average_rates.push_back(0.556); 646 average_rates.push_back(0.556);
647 average_rates.push_back(0.371); 647 average_rates.push_back(0.371);
648 average_rates.push_back(0.595); 648 average_rates.push_back(0.595);
649 average_rates.push_back(0.490); 649 average_rates.push_back(0.490);
650 average_rates.push_back(0.980); 650 average_rates.push_back(0.980);
651 average_rates.push_back(0.781); 651 average_rates.push_back(0.781);
652 average_rates.push_back(0.463); 652 average_rates.push_back(0.463);
653 653
654 const double burstiness = 0.609; 654 const double burstiness = 0.609;
655 const double variance = 4.1; 655 const double variance = 4.1;
656 656
657 scoped_ptr<InterruptedPoissonProcess> ipp( 657 std::unique_ptr<InterruptedPoissonProcess> ipp(
658 new InterruptedPoissonProcess( 658 new InterruptedPoissonProcess(average_rates, burstiness, variance, 0));
659 average_rates, burstiness, variance, 0));
660 return ipp; 659 return ipp;
661 } 660 }
662 661
663 class UDPProxyImpl : public UDPProxy { 662 class UDPProxyImpl : public UDPProxy {
664 public: 663 public:
665 UDPProxyImpl(const net::IPEndPoint& local_port, 664 UDPProxyImpl(const net::IPEndPoint& local_port,
666 const net::IPEndPoint& destination, 665 const net::IPEndPoint& destination,
667 scoped_ptr<PacketPipe> to_dest_pipe, 666 std::unique_ptr<PacketPipe> to_dest_pipe,
668 scoped_ptr<PacketPipe> from_dest_pipe, 667 std::unique_ptr<PacketPipe> from_dest_pipe,
669 net::NetLog* net_log) 668 net::NetLog* net_log)
670 : local_port_(local_port), 669 : local_port_(local_port),
671 destination_(destination), 670 destination_(destination),
672 destination_is_mutable_(destination.address().empty()), 671 destination_is_mutable_(destination.address().empty()),
673 proxy_thread_("media::cast::test::UdpProxy Thread"), 672 proxy_thread_("media::cast::test::UdpProxy Thread"),
674 to_dest_pipe_(std::move(to_dest_pipe)), 673 to_dest_pipe_(std::move(to_dest_pipe)),
675 from_dest_pipe_(std::move(from_dest_pipe)), 674 from_dest_pipe_(std::move(from_dest_pipe)),
676 blocked_(false), 675 blocked_(false),
677 weak_factory_(this) { 676 weak_factory_(this) {
678 proxy_thread_.StartWithOptions( 677 proxy_thread_.StartWithOptions(
(...skipping 12 matching lines...) Expand all
691 base::WaitableEvent stop_event(false, false); 690 base::WaitableEvent stop_event(false, false);
692 proxy_thread_.task_runner()->PostTask( 691 proxy_thread_.task_runner()->PostTask(
693 FROM_HERE, 692 FROM_HERE,
694 base::Bind(&UDPProxyImpl::Stop, 693 base::Bind(&UDPProxyImpl::Stop,
695 base::Unretained(this), 694 base::Unretained(this),
696 base::Unretained(&stop_event))); 695 base::Unretained(&stop_event)));
697 stop_event.Wait(); 696 stop_event.Wait();
698 proxy_thread_.Stop(); 697 proxy_thread_.Stop();
699 } 698 }
700 699
701 void Send(scoped_ptr<Packet> packet, 700 void Send(std::unique_ptr<Packet> packet,
702 const net::IPEndPoint& destination) { 701 const net::IPEndPoint& destination) {
703 if (blocked_) { 702 if (blocked_) {
704 LOG(ERROR) << "Cannot write packet right now: blocked"; 703 LOG(ERROR) << "Cannot write packet right now: blocked";
705 return; 704 return;
706 } 705 }
707 706
708 VLOG(1) << "Sending packet, len = " << packet->size(); 707 VLOG(1) << "Sending packet, len = " << packet->size();
709 // We ignore all problems, callbacks and errors. 708 // We ignore all problems, callbacks and errors.
710 // If it didn't work we just drop the packet at and call it a day. 709 // If it didn't work we just drop the packet at and call it a day.
711 scoped_refptr<net::IOBuffer> buf = 710 scoped_refptr<net::IOBuffer> buf =
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 &recv_address_, 799 &recv_address_,
801 base::Bind( 800 base::Bind(
802 &UDPProxyImpl::ReadCallback, base::Unretained(this), recv_buf)); 801 &UDPProxyImpl::ReadCallback, base::Unretained(this), recv_buf));
803 if (len == net::ERR_IO_PENDING) 802 if (len == net::ERR_IO_PENDING)
804 break; 803 break;
805 ProcessPacket(recv_buf, len); 804 ProcessPacket(recv_buf, len);
806 } 805 }
807 } 806 }
808 807
809 void AllowWrite(scoped_refptr<net::IOBuffer> buf, 808 void AllowWrite(scoped_refptr<net::IOBuffer> buf,
810 scoped_ptr<Packet> packet, 809 std::unique_ptr<Packet> packet,
811 int unused_len) { 810 int unused_len) {
812 DCHECK(blocked_); 811 DCHECK(blocked_);
813 blocked_ = false; 812 blocked_ = false;
814 } 813 }
815 814
816 // Input 815 // Input
817 net::IPEndPoint local_port_; 816 net::IPEndPoint local_port_;
818 817
819 net::IPEndPoint destination_; 818 net::IPEndPoint destination_;
820 bool destination_is_mutable_; 819 bool destination_is_mutable_;
821 820
822 net::IPEndPoint return_address_; 821 net::IPEndPoint return_address_;
823 bool set_destination_next_; 822 bool set_destination_next_;
824 823
825 base::DefaultTickClock tick_clock_; 824 base::DefaultTickClock tick_clock_;
826 base::Thread proxy_thread_; 825 base::Thread proxy_thread_;
827 scoped_ptr<net::UDPServerSocket> socket_; 826 std::unique_ptr<net::UDPServerSocket> socket_;
828 scoped_ptr<PacketPipe> to_dest_pipe_; 827 std::unique_ptr<PacketPipe> to_dest_pipe_;
829 scoped_ptr<PacketPipe> from_dest_pipe_; 828 std::unique_ptr<PacketPipe> from_dest_pipe_;
830 829
831 // For receiving. 830 // For receiving.
832 net::IPEndPoint recv_address_; 831 net::IPEndPoint recv_address_;
833 scoped_ptr<Packet> packet_; 832 std::unique_ptr<Packet> packet_;
834 833
835 // For sending. 834 // For sending.
836 bool blocked_; 835 bool blocked_;
837 836
838 base::WeakPtrFactory<UDPProxyImpl> weak_factory_; 837 base::WeakPtrFactory<UDPProxyImpl> weak_factory_;
839 }; 838 };
840 839
841 void PacketSender::Send(scoped_ptr<Packet> packet) { 840 void PacketSender::Send(std::unique_ptr<Packet> packet) {
842 udp_proxy_->Send(std::move(packet), *destination_); 841 udp_proxy_->Send(std::move(packet), *destination_);
843 } 842 }
844 843
845 scoped_ptr<UDPProxy> UDPProxy::Create( 844 std::unique_ptr<UDPProxy> UDPProxy::Create(
846 const net::IPEndPoint& local_port, 845 const net::IPEndPoint& local_port,
847 const net::IPEndPoint& destination, 846 const net::IPEndPoint& destination,
848 scoped_ptr<PacketPipe> to_dest_pipe, 847 std::unique_ptr<PacketPipe> to_dest_pipe,
849 scoped_ptr<PacketPipe> from_dest_pipe, 848 std::unique_ptr<PacketPipe> from_dest_pipe,
850 net::NetLog* net_log) { 849 net::NetLog* net_log) {
851 scoped_ptr<UDPProxy> ret( 850 std::unique_ptr<UDPProxy> ret(
852 new UDPProxyImpl(local_port, destination, std::move(to_dest_pipe), 851 new UDPProxyImpl(local_port, destination, std::move(to_dest_pipe),
853 std::move(from_dest_pipe), net_log)); 852 std::move(from_dest_pipe), net_log));
854 return ret; 853 return ret;
855 } 854 }
856 855
857 } // namespace test 856 } // namespace test
858 } // namespace cast 857 } // namespace cast
859 } // namespace media 858 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/test/utility/udp_proxy.h ('k') | media/cast/test/utility/udp_proxy_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698