| 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/debug/trace_event.h" | |
| 11 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "media/cast/cast_environment.h" |
| 12 #include "media/cast/pacing/paced_sender.h" | 12 #include "media/cast/pacing/paced_sender.h" |
| 13 #include "media/cast/rtcp/rtcp_utility.h" | 13 #include "media/cast/rtcp/rtcp_utility.h" |
| 14 #include "net/base/big_endian.h" | 14 #include "net/base/big_endian.h" |
| 15 | 15 |
| 16 namespace media { | 16 namespace media { |
| 17 namespace cast { | 17 namespace cast { |
| 18 | 18 |
| 19 static const size_t kRtcpMaxNackFields = 253; | 19 static const size_t kRtcpMaxNackFields = 253; |
| 20 static const size_t kRtcpMaxCastLossFields = 100; | 20 static const size_t kRtcpMaxCastLossFields = 100; |
| 21 | 21 |
| 22 RtcpSender::RtcpSender(PacedPacketSender* outgoing_transport, | 22 RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment, |
| 23 PacedPacketSender* outgoing_transport, |
| 23 uint32 sending_ssrc, | 24 uint32 sending_ssrc, |
| 24 const std::string& c_name) | 25 const std::string& c_name) |
| 25 : ssrc_(sending_ssrc), | 26 : ssrc_(sending_ssrc), |
| 26 c_name_(c_name), | 27 c_name_(c_name), |
| 27 transport_(outgoing_transport) { | 28 transport_(outgoing_transport), |
| 29 cast_environment_(cast_environment) { |
| 28 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; | 30 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; |
| 29 } | 31 } |
| 30 | 32 |
| 31 RtcpSender::~RtcpSender() {} | 33 RtcpSender::~RtcpSender() {} |
| 32 | 34 |
| 33 void RtcpSender::SendRtcp(uint32 packet_type_flags, | 35 void RtcpSender::SendRtcp(uint32 packet_type_flags, |
| 34 const RtcpSenderInfo* sender_info, | 36 const RtcpSenderInfo* sender_info, |
| 35 const RtcpReportBlock* report_block, | 37 const RtcpReportBlock* report_block, |
| 36 uint32 pli_remote_ssrc, | 38 uint32 pli_remote_ssrc, |
| 37 const RtcpDlrrReportBlock* dlrr, | 39 const RtcpDlrrReportBlock* dlrr, |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 | 213 |
| 212 packet->resize(start_size + 12); | 214 packet->resize(start_size + 12); |
| 213 | 215 |
| 214 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12); | 216 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12); |
| 215 uint8 FMT = 1; // Picture loss indicator. | 217 uint8 FMT = 1; // Picture loss indicator. |
| 216 big_endian_writer.WriteU8(0x80 + FMT); | 218 big_endian_writer.WriteU8(0x80 + FMT); |
| 217 big_endian_writer.WriteU8(206); | 219 big_endian_writer.WriteU8(206); |
| 218 big_endian_writer.WriteU16(2); // Used fixed length of 2. | 220 big_endian_writer.WriteU16(2); // Used fixed length of 2. |
| 219 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 221 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
| 220 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. | 222 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. |
| 221 TRACE_EVENT_INSTANT2("cast_rtcp", "RtcpSender::PLI", TRACE_EVENT_SCOPE_THREAD, | |
| 222 "remote_ssrc", remote_ssrc, | |
| 223 "ssrc", ssrc_); | |
| 224 } | 223 } |
| 225 | 224 |
| 226 /* | 225 /* |
| 227 0 1 2 3 | 226 0 1 2 3 |
| 228 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 227 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| 229 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 228 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 230 | PB |0| Payload Type| Native Rpsi bit string | | 229 | PB |0| Payload Type| Native Rpsi bit string | |
| 231 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 230 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 232 | defined per codec ... | Padding (0) | | 231 | defined per codec ... | Padding (0) | |
| 233 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 232 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 316 |
| 318 big_endian_writer.WriteU8(static_cast<uint8>((bitrate_exponent << 2) + | 317 big_endian_writer.WriteU8(static_cast<uint8>((bitrate_exponent << 2) + |
| 319 ((bitrate_mantissa >> 16) & 0x03))); | 318 ((bitrate_mantissa >> 16) & 0x03))); |
| 320 big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa >> 8)); | 319 big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa >> 8)); |
| 321 big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa)); | 320 big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa)); |
| 322 | 321 |
| 323 std::list<uint32>::const_iterator it = remb->remb_ssrcs.begin(); | 322 std::list<uint32>::const_iterator it = remb->remb_ssrcs.begin(); |
| 324 for (; it != remb->remb_ssrcs.end(); ++it) { | 323 for (; it != remb->remb_ssrcs.end(); ++it) { |
| 325 big_endian_writer.WriteU32(*it); | 324 big_endian_writer.WriteU32(*it); |
| 326 } | 325 } |
| 327 TRACE_COUNTER_ID1("cast_rtcp", "RtcpSender::RembBitrate", ssrc_, | 326 cast_environment_->Logging()->InsertGenericEvent(kRembBitrate, |
| 328 remb->remb_bitrate); | 327 remb->remb_bitrate); |
| 329 } | 328 } |
| 330 | 329 |
| 331 void RtcpSender::BuildNack(const RtcpNackMessage* nack, | 330 void RtcpSender::BuildNack(const RtcpNackMessage* nack, |
| 332 std::vector<uint8>* packet) const { | 331 std::vector<uint8>* packet) const { |
| 333 size_t start_size = packet->size(); | 332 size_t start_size = packet->size(); |
| 334 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space"; | 333 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space"; |
| 335 if (start_size + 16 > kIpPacketSize) return; | 334 if (start_size + 16 > kIpPacketSize) return; |
| 336 | 335 |
| 337 packet->resize(start_size + 16); | 336 packet->resize(start_size + 16); |
| 338 | 337 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 if (start_size + 4 > kIpPacketSize) return; | 373 if (start_size + 4 > kIpPacketSize) return; |
| 375 | 374 |
| 376 packet->resize(start_size + 4); | 375 packet->resize(start_size + 4); |
| 377 net::BigEndianWriter big_endian_nack_writer(&((*packet)[start_size]), 4); | 376 net::BigEndianWriter big_endian_nack_writer(&((*packet)[start_size]), 4); |
| 378 big_endian_nack_writer.WriteU16(nack_sequence_number); | 377 big_endian_nack_writer.WriteU16(nack_sequence_number); |
| 379 big_endian_nack_writer.WriteU16(bitmask); | 378 big_endian_nack_writer.WriteU16(bitmask); |
| 380 number_of_nack_fields++; | 379 number_of_nack_fields++; |
| 381 } | 380 } |
| 382 DCHECK_GE(kRtcpMaxNackFields, number_of_nack_fields); | 381 DCHECK_GE(kRtcpMaxNackFields, number_of_nack_fields); |
| 383 (*packet)[nack_size_pos] = static_cast<uint8>(2 + number_of_nack_fields); | 382 (*packet)[nack_size_pos] = static_cast<uint8>(2 + number_of_nack_fields); |
| 384 TRACE_COUNTER_ID1("cast_rtcp", "RtcpSender::NACK", ssrc_, | |
| 385 nack->nack_list.size()); | |
| 386 } | 383 } |
| 387 | 384 |
| 388 void RtcpSender::BuildBye(std::vector<uint8>* packet) const { | 385 void RtcpSender::BuildBye(std::vector<uint8>* packet) const { |
| 389 size_t start_size = packet->size(); | 386 size_t start_size = packet->size(); |
| 390 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space"; | 387 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space"; |
| 391 if (start_size + 8 > kIpPacketSize) return; | 388 if (start_size + 8 > kIpPacketSize) return; |
| 392 | 389 |
| 393 packet->resize(start_size + 8); | 390 packet->resize(start_size + 8); |
| 394 | 391 |
| 395 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); | 392 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 } | 526 } |
| 530 } | 527 } |
| 531 big_endian_nack_writer.WriteU8(bitmask); | 528 big_endian_nack_writer.WriteU8(bitmask); |
| 532 ++number_of_loss_fields; | 529 ++number_of_loss_fields; |
| 533 } | 530 } |
| 534 } | 531 } |
| 535 } | 532 } |
| 536 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); | 533 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); |
| 537 (*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields); | 534 (*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields); |
| 538 (*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields); | 535 (*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields); |
| 539 | |
| 540 // Frames with missing packets. | |
| 541 TRACE_COUNTER_ID1("cast_rtcp", "RtcpSender::CastNACK", ssrc_, | |
| 542 cast->missing_frames_and_packets_.size()); | |
| 543 } | 536 } |
| 544 | 537 |
| 545 } // namespace cast | 538 } // namespace cast |
| 546 } // namespace media | 539 } // namespace media |
| OLD | NEW |