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

Side by Side Diff: media/cast/net/rtcp/sender_rtcp_session.cc

Issue 1878883003: Refactor: simplify interface of SenderRtcpSession and CastTransport. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 7 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/net/rtcp/sender_rtcp_session.h ('k') | media/cast/sender/audio_sender.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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <algorithm> 5 #include <algorithm>
6 #include <limits> 6 #include <limits>
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/big_endian.h" 9 #include "base/big_endian.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 value1 <<= 16; 61 value1 <<= 16;
62 value1 |= packet_id_or_zero; 62 value1 |= packet_id_or_zero;
63 value1 <<= 32; 63 value1 <<= 32;
64 value1 |= frame_rtp_timestamp.lower_32_bits(); 64 value1 |= frame_rtp_timestamp.lower_32_bits();
65 return std::make_pair( 65 return std::make_pair(
66 value1, static_cast<uint64_t>(event_timestamp.ToInternalValue())); 66 value1, static_cast<uint64_t>(event_timestamp.ToInternalValue()));
67 } 67 }
68 68
69 } // namespace 69 } // namespace
70 70
71 SenderRtcpSession::SenderRtcpSession( 71 SenderRtcpSession::SenderRtcpSession(base::TickClock* clock,
72 const RtcpCastMessageCallback& cast_callback, 72 PacedPacketSender* packet_sender,
73 const RtcpRttCallback& rtt_callback, 73 RtcpObserver* observer,
74 const RtcpLogMessageCallback& log_callback, 74 uint32_t local_ssrc,
75 const RtcpPliCallback pli_callback, 75 uint32_t remote_ssrc)
76 base::TickClock* clock,
77 PacedPacketSender* packet_sender,
78 uint32_t local_ssrc,
79 uint32_t remote_ssrc)
80 : clock_(clock), 76 : clock_(clock),
81 packet_sender_(packet_sender), 77 packet_sender_(packet_sender),
82 local_ssrc_(local_ssrc), 78 local_ssrc_(local_ssrc),
83 remote_ssrc_(remote_ssrc), 79 remote_ssrc_(remote_ssrc),
84 cast_callback_(cast_callback), 80 rtcp_observer_(observer),
85 rtt_callback_(rtt_callback),
86 log_callback_(log_callback),
87 pli_callback_(pli_callback),
88 largest_seen_timestamp_(base::TimeTicks::FromInternalValue( 81 largest_seen_timestamp_(base::TimeTicks::FromInternalValue(
89 std::numeric_limits<int64_t>::min())), 82 std::numeric_limits<int64_t>::min())),
90 parser_(local_ssrc, remote_ssrc) {} 83 parser_(local_ssrc, remote_ssrc) {}
91 84
92 SenderRtcpSession::~SenderRtcpSession() {} 85 SenderRtcpSession::~SenderRtcpSession() {}
93 86
94 void SenderRtcpSession::WillSendFrame(FrameId frame_id) { 87 void SenderRtcpSession::WillSendFrame(FrameId frame_id) {
95 if (parser_.max_valid_frame_id().is_null() || 88 if (parser_.max_valid_frame_id().is_null() ||
96 frame_id > parser_.max_valid_frame_id()) { 89 frame_id > parser_.max_valid_frame_id()) {
97 parser_.SetMaxValidFrameId(frame_id); 90 parser_.SetMaxValidFrameId(frame_id);
(...skipping 10 matching lines...) Expand all
108 101
109 // Check if this packet is to us. 102 // Check if this packet is to us.
110 uint32_t ssrc_of_sender = GetSsrcOfSender(data, length); 103 uint32_t ssrc_of_sender = GetSsrcOfSender(data, length);
111 if (ssrc_of_sender != remote_ssrc_) { 104 if (ssrc_of_sender != remote_ssrc_) {
112 return false; 105 return false;
113 } 106 }
114 107
115 // Parse this packet. 108 // Parse this packet.
116 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); 109 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length);
117 if (parser_.Parse(&reader)) { 110 if (parser_.Parse(&reader)) {
118 if (parser_.has_picture_loss_indicator()) { 111 if (parser_.has_picture_loss_indicator())
119 if (!pli_callback_.is_null()) 112 rtcp_observer_->OnReceivedPli();
120 pli_callback_.Run();
121 }
122 if (parser_.has_receiver_reference_time_report()) { 113 if (parser_.has_receiver_reference_time_report()) {
123 base::TimeTicks t = ConvertNtpToTimeTicks( 114 base::TimeTicks t = ConvertNtpToTimeTicks(
124 parser_.receiver_reference_time_report().ntp_seconds, 115 parser_.receiver_reference_time_report().ntp_seconds,
125 parser_.receiver_reference_time_report().ntp_fraction); 116 parser_.receiver_reference_time_report().ntp_fraction);
126 if (t > largest_seen_timestamp_) { 117 if (t > largest_seen_timestamp_) {
127 largest_seen_timestamp_ = t; 118 largest_seen_timestamp_ = t;
128 } else if ((largest_seen_timestamp_ - t).InMilliseconds() > 119 } else if ((largest_seen_timestamp_ - t).InMilliseconds() >
129 kOutOfOrderMaxAgeMs) { 120 kOutOfOrderMaxAgeMs) {
130 // Reject packet, it is too old. 121 // Reject packet, it is too old.
131 VLOG(1) << "Rejecting RTCP packet as it is too old (" 122 VLOG(1) << "Rejecting RTCP packet as it is too old ("
132 << (largest_seen_timestamp_ - t).InMilliseconds() << " ms)"; 123 << (largest_seen_timestamp_ - t).InMilliseconds() << " ms)";
133 return true; 124 return true;
134 } 125 }
135 } 126 }
136 if (parser_.has_receiver_log()) { 127 if (parser_.has_receiver_log()) {
137 if (DedupeReceiverLog(parser_.mutable_receiver_log())) { 128 if (DedupeReceiverLog(parser_.mutable_receiver_log())) {
138 OnReceivedReceiverLog(parser_.receiver_log()); 129 rtcp_observer_->OnReceivedReceiverLog(parser_.receiver_log());
139 } 130 }
140 } 131 }
141 if (parser_.has_last_report()) { 132 if (parser_.has_last_report()) {
142 OnReceivedDelaySinceLastReport(parser_.last_report(), 133 OnReceivedDelaySinceLastReport(parser_.last_report(),
143 parser_.delay_since_last_report()); 134 parser_.delay_since_last_report());
144 } 135 }
145 if (parser_.has_cast_message()) { 136 if (parser_.has_cast_message()) {
146 OnReceivedCastFeedback(parser_.cast_message()); 137 rtcp_observer_->OnReceivedCastMessage(parser_.cast_message());
147 } 138 }
148 } 139 }
149 return true; 140 return true;
150 } 141 }
151 142
152 void SenderRtcpSession::OnReceivedDelaySinceLastReport( 143 void SenderRtcpSession::OnReceivedDelaySinceLastReport(
153 uint32_t last_report, 144 uint32_t last_report,
154 uint32_t delay_since_last_report) { 145 uint32_t delay_since_last_report) {
155 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report); 146 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report);
156 if (it == last_reports_sent_map_.end()) { 147 if (it == last_reports_sent_map_.end()) {
157 return; // Feedback on another report. 148 return; // Feedback on another report.
158 } 149 }
159 150
160 const base::TimeDelta sender_delay = clock_->NowTicks() - it->second; 151 const base::TimeDelta sender_delay = clock_->NowTicks() - it->second;
161 const base::TimeDelta receiver_delay = 152 const base::TimeDelta receiver_delay =
162 ConvertFromNtpDiff(delay_since_last_report); 153 ConvertFromNtpDiff(delay_since_last_report);
163 current_round_trip_time_ = sender_delay - receiver_delay; 154 current_round_trip_time_ = sender_delay - receiver_delay;
164 // If the round trip time was computed as less than 1 ms, assume clock 155 // If the round trip time was computed as less than 1 ms, assume clock
165 // imprecision by one or both peers caused a bad value to be calculated. 156 // imprecision by one or both peers caused a bad value to be calculated.
166 // While plenty of networks do easily achieve less than 1 ms round trip time, 157 // While plenty of networks do easily achieve less than 1 ms round trip time,
167 // such a level of precision cannot be measured with our approach; and 1 ms is 158 // such a level of precision cannot be measured with our approach; and 1 ms is
168 // good enough to represent "under 1 ms" for our use cases. 159 // good enough to represent "under 1 ms" for our use cases.
169 current_round_trip_time_ = 160 current_round_trip_time_ =
170 std::max(current_round_trip_time_, base::TimeDelta::FromMilliseconds(1)); 161 std::max(current_round_trip_time_, base::TimeDelta::FromMilliseconds(1));
171 162
172 if (!rtt_callback_.is_null()) 163 rtcp_observer_->OnReceivedRtt(current_round_trip_time_);
173 rtt_callback_.Run(current_round_trip_time_);
174 } 164 }
175 165
176 void SenderRtcpSession::SaveLastSentNtpTime(const base::TimeTicks& now, 166 void SenderRtcpSession::SaveLastSentNtpTime(const base::TimeTicks& now,
177 uint32_t last_ntp_seconds, 167 uint32_t last_ntp_seconds,
178 uint32_t last_ntp_fraction) { 168 uint32_t last_ntp_fraction) {
179 // Make sure |now| is always greater than the last element in 169 // Make sure |now| is always greater than the last element in
180 // |last_reports_sent_queue_|. 170 // |last_reports_sent_queue_|.
181 if (!last_reports_sent_queue_.empty()) { 171 if (!last_reports_sent_queue_.empty()) {
182 DCHECK(now >= last_reports_sent_queue_.back().second); 172 DCHECK(now >= last_reports_sent_queue_.back().second);
183 } 173 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 sender_info.ntp_fraction = current_ntp_fractions; 238 sender_info.ntp_fraction = current_ntp_fractions;
249 sender_info.rtp_timestamp = current_time_as_rtp_timestamp; 239 sender_info.rtp_timestamp = current_time_as_rtp_timestamp;
250 sender_info.send_packet_count = send_packet_count; 240 sender_info.send_packet_count = send_packet_count;
251 sender_info.send_octet_count = send_octet_count; 241 sender_info.send_octet_count = send_octet_count;
252 242
253 RtcpBuilder rtcp_builder(local_ssrc_); 243 RtcpBuilder rtcp_builder(local_ssrc_);
254 packet_sender_->SendRtcpPacket(local_ssrc_, 244 packet_sender_->SendRtcpPacket(local_ssrc_,
255 rtcp_builder.BuildRtcpFromSender(sender_info)); 245 rtcp_builder.BuildRtcpFromSender(sender_info));
256 } 246 }
257 247
258 void SenderRtcpSession::OnReceivedCastFeedback(
259 const RtcpCastMessage& cast_message) {
260 if (cast_callback_.is_null())
261 return;
262 cast_callback_.Run(cast_message);
263 }
264
265 void SenderRtcpSession::OnReceivedReceiverLog(
266 const RtcpReceiverLogMessage& receiver_log) {
267 if (log_callback_.is_null())
268 return;
269 log_callback_.Run(receiver_log);
270 }
271
272 } // namespace cast 248 } // namespace cast
273 } // namespace media 249 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/net/rtcp/sender_rtcp_session.h ('k') | media/cast/sender/audio_sender.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698