OLD | NEW |
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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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( |
72 const RtcpCastMessageCallback& cast_callback, | 72 const RtcpCastMessageCallback& cast_callback, |
73 const RtcpRttCallback& rtt_callback, | 73 const RtcpRttCallback& rtt_callback, |
74 const RtcpLogMessageCallback& log_callback, | 74 const RtcpLogMessageCallback& log_callback, |
| 75 const RtcpPliCallback pli_callback, |
75 base::TickClock* clock, | 76 base::TickClock* clock, |
76 PacedPacketSender* packet_sender, | 77 PacedPacketSender* packet_sender, |
77 uint32_t local_ssrc, | 78 uint32_t local_ssrc, |
78 uint32_t remote_ssrc) | 79 uint32_t remote_ssrc) |
79 : clock_(clock), | 80 : clock_(clock), |
80 packet_sender_(packet_sender), | 81 packet_sender_(packet_sender), |
81 local_ssrc_(local_ssrc), | 82 local_ssrc_(local_ssrc), |
82 remote_ssrc_(remote_ssrc), | 83 remote_ssrc_(remote_ssrc), |
83 cast_callback_(cast_callback), | 84 cast_callback_(cast_callback), |
84 rtt_callback_(rtt_callback), | 85 rtt_callback_(rtt_callback), |
85 log_callback_(log_callback), | 86 log_callback_(log_callback), |
| 87 pli_callback_(pli_callback), |
86 largest_seen_timestamp_(base::TimeTicks::FromInternalValue( | 88 largest_seen_timestamp_(base::TimeTicks::FromInternalValue( |
87 std::numeric_limits<int64_t>::min())), | 89 std::numeric_limits<int64_t>::min())), |
88 parser_(local_ssrc, remote_ssrc), | 90 parser_(local_ssrc, remote_ssrc), |
89 ack_frame_id_wrap_helper_(kFirstFrameId - 1) {} | 91 ack_frame_id_wrap_helper_(kFirstFrameId - 1) {} |
90 | 92 |
91 SenderRtcpSession::~SenderRtcpSession() {} | 93 SenderRtcpSession::~SenderRtcpSession() {} |
92 | 94 |
93 bool SenderRtcpSession::IncomingRtcpPacket(const uint8_t* data, size_t length) { | 95 bool SenderRtcpSession::IncomingRtcpPacket(const uint8_t* data, size_t length) { |
94 // Check if this is a valid RTCP packet. | 96 // Check if this is a valid RTCP packet. |
95 if (!IsRtcpPacket(data, length)) { | 97 if (!IsRtcpPacket(data, length)) { |
96 VLOG(1) << "Rtcp@" << this << "::IncomingRtcpPacket() -- " | 98 VLOG(1) << "Rtcp@" << this << "::IncomingRtcpPacket() -- " |
97 << "Received an invalid (non-RTCP?) packet."; | 99 << "Received an invalid (non-RTCP?) packet."; |
98 return false; | 100 return false; |
99 } | 101 } |
100 | 102 |
101 // Check if this packet is to us. | 103 // Check if this packet is to us. |
102 uint32_t ssrc_of_sender = GetSsrcOfSender(data, length); | 104 uint32_t ssrc_of_sender = GetSsrcOfSender(data, length); |
103 if (ssrc_of_sender != remote_ssrc_) { | 105 if (ssrc_of_sender != remote_ssrc_) { |
104 return false; | 106 return false; |
105 } | 107 } |
106 | 108 |
107 // Parse this packet. | 109 // Parse this packet. |
108 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); | 110 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); |
109 if (parser_.Parse(&reader)) { | 111 if (parser_.Parse(&reader)) { |
| 112 if (parser_.has_picture_loss_indicator()) { |
| 113 if (!pli_callback_.is_null()) |
| 114 pli_callback_.Run(); |
| 115 } |
110 if (parser_.has_receiver_reference_time_report()) { | 116 if (parser_.has_receiver_reference_time_report()) { |
111 base::TimeTicks t = ConvertNtpToTimeTicks( | 117 base::TimeTicks t = ConvertNtpToTimeTicks( |
112 parser_.receiver_reference_time_report().ntp_seconds, | 118 parser_.receiver_reference_time_report().ntp_seconds, |
113 parser_.receiver_reference_time_report().ntp_fraction); | 119 parser_.receiver_reference_time_report().ntp_fraction); |
114 if (t > largest_seen_timestamp_) { | 120 if (t > largest_seen_timestamp_) { |
115 largest_seen_timestamp_ = t; | 121 largest_seen_timestamp_ = t; |
116 } else if ((largest_seen_timestamp_ - t).InMilliseconds() > | 122 } else if ((largest_seen_timestamp_ - t).InMilliseconds() > |
117 kOutOfOrderMaxAgeMs) { | 123 kOutOfOrderMaxAgeMs) { |
118 // Reject packet, it is too old. | 124 // Reject packet, it is too old. |
119 VLOG(1) << "Rejecting RTCP packet as it is too old (" | 125 VLOG(1) << "Rejecting RTCP packet as it is too old (" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 | 261 |
256 void SenderRtcpSession::OnReceivedReceiverLog( | 262 void SenderRtcpSession::OnReceivedReceiverLog( |
257 const RtcpReceiverLogMessage& receiver_log) { | 263 const RtcpReceiverLogMessage& receiver_log) { |
258 if (log_callback_.is_null()) | 264 if (log_callback_.is_null()) |
259 return; | 265 return; |
260 log_callback_.Run(receiver_log); | 266 log_callback_.Run(receiver_log); |
261 } | 267 } |
262 | 268 |
263 } // namespace cast | 269 } // namespace cast |
264 } // namespace media | 270 } // namespace media |
OLD | NEW |