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

Side by Side Diff: chrome/browser/media/cast_remoting_sender.cc

Issue 2725133002: Mojo: Armed Watchers (Closed)
Patch Set: . Created 3 years, 9 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "chrome/browser/media/cast_remoting_sender.h" 5 #include "chrome/browser/media/cast_remoting_sender.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 media::cast::RtpPayloadType::REMOTE_AUDIO), 85 media::cast::RtpPayloadType::REMOTE_AUDIO),
86 logging_flush_interval_(logging_flush_interval), 86 logging_flush_interval_(logging_flush_interval),
87 frame_event_cb_(cb), 87 frame_event_cb_(cb),
88 clock_(new base::DefaultTickClock()), 88 clock_(new base::DefaultTickClock()),
89 binding_(this), 89 binding_(this),
90 max_ack_delay_(kMaxAckDelay), 90 max_ack_delay_(kMaxAckDelay),
91 last_sent_frame_id_(media::cast::FrameId::first() - 1), 91 last_sent_frame_id_(media::cast::FrameId::first() - 1),
92 latest_acked_frame_id_(media::cast::FrameId::first() - 1), 92 latest_acked_frame_id_(media::cast::FrameId::first() - 1),
93 duplicate_ack_counter_(0), 93 duplicate_ack_counter_(0),
94 input_queue_discards_remaining_(0), 94 input_queue_discards_remaining_(0),
95 pipe_watcher_(FROM_HERE), 95 pipe_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
96 flow_restart_pending_(true), 96 flow_restart_pending_(true),
97 weak_factory_(this) { 97 weak_factory_(this) {
98 // Confirm this constructor is running on the IO BrowserThread. 98 // Confirm this constructor is running on the IO BrowserThread.
99 DCHECK_CURRENTLY_ON(BrowserThread::IO); 99 DCHECK_CURRENTLY_ON(BrowserThread::IO);
100 100
101 CastRemotingSender*& pointer_in_map = g_sender_map.Get()[rtp_stream_id_]; 101 CastRemotingSender*& pointer_in_map = g_sender_map.Get()[rtp_stream_id_];
102 DCHECK(!pointer_in_map); 102 DCHECK(!pointer_in_map);
103 pointer_in_map = this; 103 pointer_in_map = this;
104 104
105 transport_->InitializeStream( 105 transport_->InitializeStream(
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 DLOG(ERROR) << "Attempt to bind to CastRemotingSender a second time (id=" 157 DLOG(ERROR) << "Attempt to bind to CastRemotingSender a second time (id="
158 << rtp_stream_id << ")!"; 158 << rtp_stream_id << ")!";
159 error_callback.Run(); 159 error_callback.Run();
160 return; 160 return;
161 } 161 }
162 162
163 DCHECK(sender->error_callback_.is_null()); 163 DCHECK(sender->error_callback_.is_null());
164 sender->error_callback_ = error_callback; 164 sender->error_callback_ = error_callback;
165 165
166 sender->pipe_ = std::move(pipe); 166 sender->pipe_ = std::move(pipe);
167 sender->pipe_watcher_.Start( 167 sender->pipe_watcher_.Watch(sender->pipe_.get(),
168 sender->pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE, 168 MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
169 base::Bind(&CastRemotingSender::ProcessInputQueue, 169 base::Bind(&CastRemotingSender::ProcessInputQueue,
170 base::Unretained(sender))); 170 base::Unretained(sender)));
171 sender->pipe_watcher_.ArmOrNotify();
171 sender->binding_.Bind(std::move(request)); 172 sender->binding_.Bind(std::move(request));
172 sender->binding_.set_connection_error_handler(sender->error_callback_); 173 sender->binding_.set_connection_error_handler(sender->error_callback_);
173 } 174 }
174 175
175 void CastRemotingSender::OnReceivedRtt(base::TimeDelta round_trip_time) { 176 void CastRemotingSender::OnReceivedRtt(base::TimeDelta round_trip_time) {
176 DCHECK_GT(round_trip_time, base::TimeDelta()); 177 DCHECK_GT(round_trip_time, base::TimeDelta());
177 current_round_trip_time_ = round_trip_time; 178 current_round_trip_time_ = round_trip_time;
178 max_ack_delay_ = 2 * std::max(current_round_trip_time_, base::TimeDelta()) + 179 max_ack_delay_ = 2 * std::max(current_round_trip_time_, base::TimeDelta()) +
179 kReceiverProcessTime; 180 kReceiverProcessTime;
180 max_ack_delay_ = std::min(max_ack_delay_, kMaxAckDelay); 181 max_ack_delay_ = std::min(max_ack_delay_, kMaxAckDelay);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 } 372 }
372 373
373 // If the data is to be discarded, do a data pipe read with the DISCARD flag 374 // If the data is to be discarded, do a data pipe read with the DISCARD flag
374 // set. 375 // set.
375 if (discard_data) { 376 if (discard_data) {
376 const MojoResult result = mojo::ReadDataRaw( 377 const MojoResult result = mojo::ReadDataRaw(
377 pipe_.get(), nullptr, &size, 378 pipe_.get(), nullptr, &size,
378 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE); 379 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE);
379 if (result == MOJO_RESULT_OK) 380 if (result == MOJO_RESULT_OK)
380 return true; // Successfully discarded data. 381 return true; // Successfully discarded data.
381 if (result == MOJO_RESULT_OUT_OF_RANGE) 382 if (result == MOJO_RESULT_OUT_OF_RANGE) {
383 pipe_watcher_.ArmOrNotify();
382 return false; // Retry later. 384 return false; // Retry later.
385 }
383 LOG(ERROR) << SENDER_SSRC 386 LOG(ERROR) << SENDER_SSRC
384 << "Unexpected result when discarding from data pipe (" 387 << "Unexpected result when discarding from data pipe ("
385 << result << ')'; 388 << result << ')';
386 break; 389 break;
387 } 390 }
388 391
389 // If |total_payload_size| has changed, resize the data string. If it has 392 // If |total_payload_size| has changed, resize the data string. If it has
390 // not changed, the following statement will be a no-op. 393 // not changed, the following statement will be a no-op.
391 next_frame_data_.resize(total_payload_size); 394 next_frame_data_.resize(total_payload_size);
392 395
393 const MojoResult result = mojo::ReadDataRaw( 396 const MojoResult result = mojo::ReadDataRaw(
394 pipe_.get(), base::string_as_array(&next_frame_data_) + offset, &size, 397 pipe_.get(), base::string_as_array(&next_frame_data_) + offset, &size,
395 MOJO_READ_DATA_FLAG_ALL_OR_NONE); 398 MOJO_READ_DATA_FLAG_ALL_OR_NONE);
396 if (result == MOJO_RESULT_OK) 399 if (result == MOJO_RESULT_OK)
397 return true; // Successfully consumed data. 400 return true; // Successfully consumed data.
398 if (result == MOJO_RESULT_OUT_OF_RANGE) 401 if (result == MOJO_RESULT_OUT_OF_RANGE) {
402 pipe_watcher_.ArmOrNotify();
399 return false; // Retry later. 403 return false; // Retry later.
404 }
400 LOG(ERROR) 405 LOG(ERROR)
401 << SENDER_SSRC << "Read from data pipe failed (" << result << ')'; 406 << SENDER_SSRC << "Read from data pipe failed (" << result << ')';
402 } while (false); 407 } while (false);
403 408
404 // If this point is reached, there was a fatal error. Shut things down and run 409 // If this point is reached, there was a fatal error. Shut things down and run
405 // the error callback. 410 // the error callback.
406 pipe_watcher_.Cancel(); 411 pipe_watcher_.Cancel();
407 pipe_.reset(); 412 pipe_.reset();
408 binding_.Close(); 413 binding_.Close();
409 error_callback_.Run(); 414 error_callback_.Run();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 frame_event_cb_.Run(frame_events); 540 frame_event_cb_.Run(frame_events);
536 } 541 }
537 542
538 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 543 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
539 FROM_HERE, base::Bind(&CastRemotingSender::SendFrameEvents, 544 FROM_HERE, base::Bind(&CastRemotingSender::SendFrameEvents,
540 weak_factory_.GetWeakPtr()), 545 weak_factory_.GetWeakPtr()),
541 logging_flush_interval_); 546 logging_flush_interval_);
542 } 547 }
543 548
544 } // namespace cast 549 } // namespace cast
OLDNEW
« no previous file with comments | « chrome/browser/media/cast_remoting_sender.h ('k') | content/browser/loader/mojo_async_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698