OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/rtcp/rtcp_sender.h" | 5 #include "media/cast/rtcp/rtcp_sender.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "media/cast/cast_environment.h" | 11 #include "media/cast/cast_environment.h" |
12 #include "media/cast/net/cast_net_defines.h" | |
13 #include "media/cast/net/pacing/paced_sender.h" | |
14 #include "media/cast/rtcp/rtcp_utility.h" | 12 #include "media/cast/rtcp/rtcp_utility.h" |
| 13 #include "media/cast/transport/cast_transport_defines.h" |
| 14 #include "media/cast/transport/pacing/paced_sender.h" |
15 #include "net/base/big_endian.h" | 15 #include "net/base/big_endian.h" |
16 | 16 |
17 static const size_t kRtcpCastLogHeaderSize = 12; | 17 static const size_t kRtcpCastLogHeaderSize = 12; |
18 static const size_t kRtcpSenderFrameLogSize = 4; | 18 static const size_t kRtcpSenderFrameLogSize = 4; |
19 static const size_t kRtcpReceiverFrameLogSize = 8; | 19 static const size_t kRtcpReceiverFrameLogSize = 8; |
20 static const size_t kRtcpReceiverEventLogSize = 4; | 20 static const size_t kRtcpReceiverEventLogSize = 4; |
21 | 21 |
22 namespace { | 22 namespace { |
23 uint16 MergeEventTypeAndTimestampForWireFormat( | 23 uint16 MergeEventTypeAndTimestampForWireFormat( |
24 const media::cast::CastLoggingEvent& event, | 24 const media::cast::CastLoggingEvent& event, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 VLOG(1) << "total messages to send " << *total_number_of_messages_to_send; | 118 VLOG(1) << "total messages to send " << *total_number_of_messages_to_send; |
119 VLOG(1) << "rtcp log size " << *rtcp_log_size; | 119 VLOG(1) << "rtcp log size " << *rtcp_log_size; |
120 return true; | 120 return true; |
121 } | 121 } |
122 } // namespace | 122 } // namespace |
123 | 123 |
124 namespace media { | 124 namespace media { |
125 namespace cast { | 125 namespace cast { |
126 | 126 |
127 RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment, | 127 RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment, |
128 PacedPacketSender* outgoing_transport, | 128 transport::PacedPacketSender* outgoing_transport, |
129 uint32 sending_ssrc, | 129 uint32 sending_ssrc, |
130 const std::string& c_name) | 130 const std::string& c_name) |
131 : ssrc_(sending_ssrc), | 131 : ssrc_(sending_ssrc), |
132 c_name_(c_name), | 132 c_name_(c_name), |
133 transport_(outgoing_transport), | 133 transport_(outgoing_transport), |
134 cast_environment_(cast_environment) { | 134 cast_environment_(cast_environment) { |
135 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; | 135 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; |
136 } | 136 } |
137 | 137 |
138 RtcpSender::~RtcpSender() {} | 138 RtcpSender::~RtcpSender() {} |
139 | 139 |
140 void RtcpSender::SendRtcpFromRtpReceiver( | 140 void RtcpSender::SendRtcpFromRtpReceiver( |
141 uint32 packet_type_flags, | 141 uint32 packet_type_flags, |
142 const RtcpReportBlock* report_block, | 142 const transport::RtcpReportBlock* report_block, |
143 const RtcpReceiverReferenceTimeReport* rrtr, | 143 const RtcpReceiverReferenceTimeReport* rrtr, |
144 const RtcpCastMessage* cast_message, | 144 const RtcpCastMessage* cast_message, |
145 RtcpReceiverLogMessage* receiver_log) { | 145 RtcpReceiverLogMessage* receiver_log) { |
146 if (packet_type_flags & kRtcpSr || | 146 if (packet_type_flags & kRtcpSr || |
147 packet_type_flags & kRtcpDlrr || | 147 packet_type_flags & kRtcpDlrr || |
148 packet_type_flags & kRtcpSenderLog) { | 148 packet_type_flags & kRtcpSenderLog) { |
149 NOTREACHED() << "Invalid argument"; | 149 NOTREACHED() << "Invalid argument"; |
150 } | 150 } |
151 if (packet_type_flags & kRtcpPli || | 151 if (packet_type_flags & kRtcpPli || |
152 packet_type_flags & kRtcpRpsi || | 152 packet_type_flags & kRtcpRpsi || |
(...skipping 24 matching lines...) Expand all Loading... |
177 } | 177 } |
178 if (packet_type_flags & kRtcpReceiverLog) { | 178 if (packet_type_flags & kRtcpReceiverLog) { |
179 DCHECK(receiver_log) << "Invalid argument"; | 179 DCHECK(receiver_log) << "Invalid argument"; |
180 BuildReceiverLog(receiver_log, &packet); | 180 BuildReceiverLog(receiver_log, &packet); |
181 } | 181 } |
182 if (packet.empty()) return; // Sanity don't send empty packets. | 182 if (packet.empty()) return; // Sanity don't send empty packets. |
183 | 183 |
184 transport_->SendRtcpPacket(packet); | 184 transport_->SendRtcpPacket(packet); |
185 } | 185 } |
186 | 186 |
187 void RtcpSender::BuildRR(const RtcpReportBlock* report_block, | 187 void RtcpSender::BuildRR(const transport::RtcpReportBlock* report_block, |
188 std::vector<uint8>* packet) const { | 188 std::vector<uint8>* packet) const { |
189 size_t start_size = packet->size(); | 189 size_t start_size = packet->size(); |
190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space"; | 190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space"; |
191 if (start_size + 32 > kIpPacketSize) return; | 191 if (start_size + 32 > kIpPacketSize) return; |
192 | 192 |
193 uint16 number_of_rows = (report_block) ? 7 : 1; | 193 uint16 number_of_rows = (report_block) ? 7 : 1; |
194 packet->resize(start_size + 8); | 194 packet->resize(start_size + 8); |
195 | 195 |
196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); | 196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); |
197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); | 197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); |
198 big_endian_writer.WriteU8(kPacketTypeReceiverReport); | 198 big_endian_writer.WriteU8(kPacketTypeReceiverReport); |
199 big_endian_writer.WriteU16(number_of_rows); | 199 big_endian_writer.WriteU16(number_of_rows); |
200 big_endian_writer.WriteU32(ssrc_); | 200 big_endian_writer.WriteU32(ssrc_); |
201 | 201 |
202 if (report_block) { | 202 if (report_block) { |
203 AddReportBlocks(*report_block, packet); // Adds 24 bytes. | 203 AddReportBlocks(*report_block, packet); // Adds 24 bytes. |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 void RtcpSender::AddReportBlocks(const RtcpReportBlock& report_block, | 207 void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block, |
208 std::vector<uint8>* packet) const { | 208 std::vector<uint8>* packet) const { |
209 size_t start_size = packet->size(); | 209 size_t start_size = packet->size(); |
210 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space"; | 210 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space"; |
211 if (start_size + 24 > kIpPacketSize) return; | 211 if (start_size + 24 > kIpPacketSize) return; |
212 | 212 |
213 packet->resize(start_size + 24); | 213 packet->resize(start_size + 24); |
214 | 214 |
215 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); | 215 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); |
216 big_endian_writer.WriteU32(report_block.media_ssrc); | 216 big_endian_writer.WriteU32(report_block.media_ssrc); |
217 big_endian_writer.WriteU8(report_block.fraction_lost); | 217 big_endian_writer.WriteU8(report_block.fraction_lost); |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 if (frame_log_messages.event_log_messages_.empty()) { | 649 if (frame_log_messages.event_log_messages_.empty()) { |
650 // We sent all messages on this frame; pop the frame header. | 650 // We sent all messages on this frame; pop the frame header. |
651 receiver_log_message->pop_front(); | 651 receiver_log_message->pop_front(); |
652 } | 652 } |
653 } | 653 } |
654 DCHECK_EQ(total_number_of_messages_to_send, 0); | 654 DCHECK_EQ(total_number_of_messages_to_send, 0); |
655 } | 655 } |
656 | 656 |
657 } // namespace cast | 657 } // namespace cast |
658 } // namespace media | 658 } // namespace media |
OLD | NEW |