| 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 |