Index: media/cast/sender/frame_sender.cc |
diff --git a/media/cast/sender/frame_sender.cc b/media/cast/sender/frame_sender.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e5bc95cd50d70aa041542ead71507e65154fba3d |
--- /dev/null |
+++ b/media/cast/sender/frame_sender.cc |
@@ -0,0 +1,72 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/cast/sender/frame_sender.h" |
+ |
+namespace media { |
+namespace cast { |
+namespace { |
+const int kMinSchedulingDelayMs = 1; |
+} // namespace |
+ |
+FrameSender::FrameSender(scoped_refptr<CastEnvironment> cast_environment, |
+ CastTransportSender* const transport_sender, |
+ base::TimeDelta rtcp_interval, |
+ int frequency, |
+ uint32 ssrc) |
+ : cast_environment_(cast_environment), |
+ transport_sender_(transport_sender), |
+ rtp_timestamp_helper_(frequency), |
+ rtt_available_(false), |
+ rtcp_interval_(rtcp_interval), |
+ ssrc_(ssrc), |
+ weak_factory_(this) { |
+} |
+ |
+FrameSender::~FrameSender() { |
+} |
+ |
+void FrameSender::ScheduleNextRtcpReport() { |
+ DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
+ base::TimeDelta time_to_next = rtcp_interval_; |
+ |
+ time_to_next = std::max( |
+ time_to_next, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); |
+ |
+ cast_environment_->PostDelayedTask( |
+ CastEnvironment::MAIN, |
+ FROM_HERE, |
+ base::Bind(&FrameSender::SendRtcpReport, weak_factory_.GetWeakPtr(), |
+ true), |
+ time_to_next); |
+} |
+ |
+void FrameSender::SendRtcpReport(bool schedule_future_reports) { |
+ DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
+ const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
+ uint32 now_as_rtp_timestamp = 0; |
+ if (rtp_timestamp_helper_.GetCurrentTimeAsRtpTimestamp( |
+ now, &now_as_rtp_timestamp)) { |
+ transport_sender_->SendSenderReport(ssrc_, now, now_as_rtp_timestamp); |
+ } else { |
+ // |rtp_timestamp_helper_| should have stored a mapping by this point. |
+ NOTREACHED(); |
+ } |
+ if (schedule_future_reports) |
+ ScheduleNextRtcpReport(); |
+} |
+ |
+void FrameSender::OnReceivedRtt(base::TimeDelta rtt, |
+ base::TimeDelta avg_rtt, |
+ base::TimeDelta min_rtt, |
+ base::TimeDelta max_rtt) { |
+ rtt_available_ = true; |
+ rtt_ = rtt; |
+ avg_rtt_ = avg_rtt; |
+ min_rtt_ = min_rtt; |
+ max_rtt_ = max_rtt; |
+} |
+ |
+} // namespace cast |
+} // namespace media |