| Index: media/cast/rtcp/rtcp_sender.cc
|
| diff --git a/media/cast/rtcp/rtcp_sender.cc b/media/cast/rtcp/rtcp_sender.cc
|
| index 5d39fab59718c0e16b7b5c7be9ebb1e4f13335e6..86225f9926e6e1e7b27167ba0d571f8e26190fa8 100644
|
| --- a/media/cast/rtcp/rtcp_sender.cc
|
| +++ b/media/cast/rtcp/rtcp_sender.cc
|
| @@ -163,7 +163,8 @@ bool BuildRtcpReceiverLogMessage(
|
| // TODO(mikhal): This is only used by the receiver. Consider renaming.
|
| RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment,
|
| transport::PacedPacketSender* outgoing_transport,
|
| - uint32 sending_ssrc, const std::string& c_name)
|
| + uint32 sending_ssrc,
|
| + const std::string& c_name)
|
| : ssrc_(sending_ssrc),
|
| c_name_(c_name),
|
| transport_(outgoing_transport),
|
| @@ -183,41 +184,47 @@ void RtcpSender::SendRtcpFromRtpReceiver(
|
| const transport::RtcpReportBlock* report_block,
|
| const RtcpReceiverReferenceTimeReport* rrtr,
|
| const RtcpCastMessage* cast_message,
|
| - const ReceiverRtcpEventSubscriber* event_subscriber) {
|
| - if (packet_type_flags & kRtcpSr || packet_type_flags & kRtcpDlrr ||
|
| - packet_type_flags & kRtcpSenderLog) {
|
| + const ReceiverRtcpEventSubscriber* event_subscriber,
|
| + uint16 target_delay_ms) {
|
| + if (packet_type_flags & transport::kRtcpSr ||
|
| + packet_type_flags & transport::kRtcpDlrr ||
|
| + packet_type_flags & transport::kRtcpSenderLog) {
|
| NOTREACHED() << "Invalid argument";
|
| }
|
| - if (packet_type_flags & kRtcpPli || packet_type_flags & kRtcpRpsi ||
|
| - packet_type_flags & kRtcpRemb || packet_type_flags & kRtcpNack) {
|
| + if (packet_type_flags & transport::kRtcpPli ||
|
| + packet_type_flags & transport::kRtcpRpsi ||
|
| + packet_type_flags & transport::kRtcpRemb ||
|
| + packet_type_flags & transport::kRtcpNack) {
|
| // Implement these for webrtc interop.
|
| NOTIMPLEMENTED();
|
| }
|
| Packet packet;
|
| packet.reserve(kMaxIpPacketSize);
|
|
|
| - if (packet_type_flags & kRtcpRr) {
|
| + if (packet_type_flags & transport::kRtcpRr) {
|
| BuildRR(report_block, &packet);
|
| if (!c_name_.empty()) {
|
| BuildSdec(&packet);
|
| }
|
| }
|
| - if (packet_type_flags & kRtcpBye) {
|
| + if (packet_type_flags & transport::kRtcpBye) {
|
| BuildBye(&packet);
|
| }
|
| - if (packet_type_flags & kRtcpRrtr) {
|
| + if (packet_type_flags & transport::kRtcpRrtr) {
|
| DCHECK(rrtr) << "Invalid argument";
|
| BuildRrtr(rrtr, &packet);
|
| }
|
| - if (packet_type_flags & kRtcpCast) {
|
| + if (packet_type_flags & transport::kRtcpCast) {
|
| DCHECK(cast_message) << "Invalid argument";
|
| - BuildCast(cast_message, &packet);
|
| + BuildCast(cast_message, target_delay_ms, &packet);
|
| }
|
| - if (packet_type_flags & kRtcpReceiverLog) {
|
| + if (packet_type_flags & transport::kRtcpReceiverLog) {
|
| DCHECK(event_subscriber) << "Invalid argument";
|
| BuildReceiverLog(event_subscriber->get_rtcp_events(), &packet);
|
| }
|
| - if (packet.empty()) return; // Sanity don't send empty packets.
|
| +
|
| + if (packet.empty())
|
| + return; // Sanity don't send empty packets.
|
|
|
| transport_->SendRtcpPacket(packet);
|
| }
|
| @@ -226,7 +233,8 @@ void RtcpSender::BuildRR(const transport::RtcpReportBlock* report_block,
|
| Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 32, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 32 > kMaxIpPacketSize) return;
|
| + if (start_size + 32 > kMaxIpPacketSize)
|
| + return;
|
|
|
| uint16 number_of_rows = (report_block) ? 7 : 1;
|
| packet->resize(start_size + 8);
|
| @@ -247,7 +255,8 @@ void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block,
|
| Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 24 > kMaxIpPacketSize) return;
|
| + if (start_size + 24 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 24);
|
|
|
| @@ -276,7 +285,8 @@ void RtcpSender::BuildSdec(Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 12 + c_name_.length(), kMaxIpPacketSize)
|
| << "Not enough buffer space";
|
| - if (start_size + 12 > kMaxIpPacketSize) return;
|
| + if (start_size + 12 > kMaxIpPacketSize)
|
| + return;
|
|
|
| // SDES Source Description.
|
| packet->resize(start_size + 10);
|
| @@ -295,8 +305,8 @@ void RtcpSender::BuildSdec(Packet* packet) const {
|
| big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length()));
|
|
|
| size_t sdes_length = 10 + c_name_.length();
|
| - packet->insert(packet->end(), c_name_.c_str(),
|
| - c_name_.c_str() + c_name_.length());
|
| + packet->insert(
|
| + packet->end(), c_name_.c_str(), c_name_.c_str() + c_name_.length());
|
|
|
| size_t padding = 0;
|
|
|
| @@ -319,7 +329,8 @@ void RtcpSender::BuildSdec(Packet* packet) const {
|
| void RtcpSender::BuildPli(uint32 remote_ssrc, Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 12, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 12 > kMaxIpPacketSize) return;
|
| + if (start_size + 12 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 12);
|
|
|
| @@ -345,7 +356,8 @@ void RtcpSender::BuildPli(uint32 remote_ssrc, Packet* packet) const {
|
| void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi, Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 24 > kMaxIpPacketSize) return;
|
| + if (start_size + 24 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 24);
|
|
|
| @@ -400,7 +412,8 @@ void RtcpSender::BuildRemb(const RtcpRembMessage* remb, Packet* packet) const {
|
| size_t remb_size = 20 + 4 * remb->remb_ssrcs.size();
|
| DCHECK_LT(start_size + remb_size, kMaxIpPacketSize)
|
| << "Not enough buffer space";
|
| - if (start_size + remb_size > kMaxIpPacketSize) return;
|
| + if (start_size + remb_size > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + remb_size);
|
|
|
| @@ -421,8 +434,8 @@ void RtcpSender::BuildRemb(const RtcpRembMessage* remb, Packet* packet) const {
|
| // 6 bit exponent and a 18 bit mantissa.
|
| uint8 bitrate_exponent;
|
| uint32 bitrate_mantissa;
|
| - BitrateToRembExponentBitrate(remb->remb_bitrate, &bitrate_exponent,
|
| - &bitrate_mantissa);
|
| + BitrateToRembExponentBitrate(
|
| + remb->remb_bitrate, &bitrate_exponent, &bitrate_mantissa);
|
|
|
| big_endian_writer.WriteU8(static_cast<uint8>(
|
| (bitrate_exponent << 2) + ((bitrate_mantissa >> 16) & 0x03)));
|
| @@ -434,14 +447,15 @@ void RtcpSender::BuildRemb(const RtcpRembMessage* remb, Packet* packet) const {
|
| big_endian_writer.WriteU32(*it);
|
| }
|
| base::TimeTicks now = cast_environment_->Clock()->NowTicks();
|
| - cast_environment_->Logging()->InsertGenericEvent(now, kRembBitrate,
|
| - remb->remb_bitrate);
|
| + cast_environment_->Logging()->InsertGenericEvent(
|
| + now, kRembBitrate, remb->remb_bitrate);
|
| }
|
|
|
| void RtcpSender::BuildNack(const RtcpNackMessage* nack, Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 16, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 16 > kMaxIpPacketSize) return;
|
| + if (start_size + 16 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 16);
|
|
|
| @@ -481,7 +495,8 @@ void RtcpSender::BuildNack(const RtcpNackMessage* nack, Packet* packet) const {
|
| // Write the sequence number and the bitmask to the packet.
|
| start_size = packet->size();
|
| DCHECK_LT(start_size + 4, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 4 > kMaxIpPacketSize) return;
|
| + if (start_size + 4 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 4);
|
| base::BigEndianWriter big_endian_nack_writer(
|
| @@ -497,7 +512,8 @@ void RtcpSender::BuildNack(const RtcpNackMessage* nack, Packet* packet) const {
|
| void RtcpSender::BuildBye(Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 8, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 8 > kMaxIpPacketSize) return;
|
| + if (start_size + 8 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 8);
|
|
|
| @@ -513,7 +529,8 @@ void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr,
|
| Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 20, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 20 > kMaxIpPacketSize) return;
|
| + if (start_size + 20 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 20);
|
|
|
| @@ -533,10 +550,13 @@ void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr,
|
| big_endian_writer.WriteU32(rrtr->ntp_fraction);
|
| }
|
|
|
| -void RtcpSender::BuildCast(const RtcpCastMessage* cast, Packet* packet) const {
|
| +void RtcpSender::BuildCast(const RtcpCastMessage* cast,
|
| + uint16 target_delay_ms,
|
| + Packet* packet) const {
|
| size_t start_size = packet->size();
|
| DCHECK_LT(start_size + 20, kMaxIpPacketSize) << "Not enough buffer space";
|
| - if (start_size + 20 > kMaxIpPacketSize) return;
|
| + if (start_size + 20 > kMaxIpPacketSize)
|
| + return;
|
|
|
| packet->resize(start_size + 20);
|
|
|
| @@ -554,8 +574,7 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, Packet* packet) const {
|
| big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_));
|
| size_t cast_loss_field_pos = start_size + 17; // Save loss field position.
|
| big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields.
|
| - big_endian_writer.WriteU8(0); // Reserved.
|
| - big_endian_writer.WriteU8(0); // Reserved.
|
| + big_endian_writer.WriteU16(target_delay_ms);
|
|
|
| size_t number_of_loss_fields = 0;
|
| size_t max_number_of_loss_fields = std::min<size_t>(
|
|
|