Index: media/cast/net/rtcp/rtcp_sender.cc |
diff --git a/media/cast/net/rtcp/rtcp_sender.cc b/media/cast/net/rtcp/rtcp_sender.cc |
index 61f620f14f23e9011d7607aea312c9ad26213d98..244c4d3983aee3cb7dd611e2d8e0e35b99ed9c64 100644 |
--- a/media/cast/net/rtcp/rtcp_sender.cc |
+++ b/media/cast/net/rtcp/rtcp_sender.cc |
@@ -146,12 +146,9 @@ class NackStringBuilder { |
} // namespace |
RtcpSender::RtcpSender(PacedPacketSender* outgoing_transport, |
- uint32 sending_ssrc, |
- const std::string& c_name) |
+ uint32 sending_ssrc) |
: ssrc_(sending_ssrc), |
- c_name_(c_name), |
transport_(outgoing_transport) { |
- DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; |
} |
RtcpSender::~RtcpSender() {} |
@@ -163,28 +160,13 @@ void RtcpSender::SendRtcpFromRtpReceiver( |
const RtcpCastMessage* cast_message, |
const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, |
base::TimeDelta target_delay) { |
- if (packet_type_flags & kRtcpSr || |
- packet_type_flags & kRtcpDlrr || |
- packet_type_flags & kRtcpSenderLog) { |
+ if (packet_type_flags & kRtcpDlrr) { |
NOTREACHED() << "Invalid argument"; |
} |
- if (packet_type_flags & kRtcpPli || |
- packet_type_flags & kRtcpRpsi || |
- packet_type_flags & kRtcpRemb || |
- packet_type_flags & kRtcpNack) { |
- // Implement these for webrtc interop. |
- NOTIMPLEMENTED(); |
- } |
PacketRef packet(new base::RefCountedData<Packet>); |
packet->data.reserve(kMaxIpPacketSize); |
if (packet_type_flags & kRtcpRr) { |
BuildRR(report_block, &packet->data); |
- if (!c_name_.empty()) { |
- BuildSdec(&packet->data); |
- } |
- } |
- if (packet_type_flags & kRtcpBye) { |
- BuildBye(&packet->data); |
} |
if (packet_type_flags & kRtcpRrtr) { |
DCHECK(rrtr) << "Invalid argument"; |
@@ -212,23 +194,15 @@ void RtcpSender::SendRtcpFromRtpSender( |
const RtcpSenderInfo& sender_info, |
const RtcpDlrrReportBlock& dlrr) { |
if (packet_type_flags & kRtcpRr || |
- packet_type_flags & kRtcpPli || |
packet_type_flags & kRtcpRrtr || |
packet_type_flags & kRtcpCast || |
- packet_type_flags & kRtcpReceiverLog || |
- packet_type_flags & kRtcpRpsi || |
- packet_type_flags & kRtcpRemb || |
- packet_type_flags & kRtcpNack) { |
+ packet_type_flags & kRtcpReceiverLog) { |
NOTREACHED() << "Invalid argument"; |
} |
PacketRef packet(new base::RefCountedData<Packet>); |
packet->data.reserve(kMaxIpPacketSize); |
if (packet_type_flags & kRtcpSr) { |
BuildSR(sender_info, &packet->data); |
- BuildSdec(&packet->data); |
- } |
- if (packet_type_flags & kRtcpBye) { |
- BuildBye(&packet->data); |
} |
if (packet_type_flags & kRtcpDlrr) { |
BuildDlrrRb(dlrr, &packet->data); |
@@ -293,250 +267,6 @@ void RtcpSender::AddReportBlocks(const RtcpReportBlock& report_block, |
big_endian_writer.WriteU32(report_block.delay_since_last_sr); |
} |
-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; |
- |
- // SDES Source Description. |
- packet->resize(start_size + 10); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 10); |
- // We always need to add one SDES CNAME. |
- big_endian_writer.WriteU8(0x80 + 1); |
- big_endian_writer.WriteU8(kPacketTypeSdes); |
- |
- // Handle SDES length later on. |
- uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; |
- big_endian_writer.WriteU16(0); |
- big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
- big_endian_writer.WriteU8(1); // CNAME = 1 |
- 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()); |
- |
- size_t padding = 0; |
- |
- // We must have a zero field even if we have an even multiple of 4 bytes. |
- if ((packet->size() % 4) == 0) { |
- padding++; |
- packet->push_back(0); |
- } |
- while ((packet->size() % 4) != 0) { |
- padding++; |
- packet->push_back(0); |
- } |
- sdes_length += padding; |
- |
- // In 32-bit words minus one and we don't count the header. |
- uint8 buffer_length = static_cast<uint8>((sdes_length / 4) - 1); |
- (*packet)[sdes_length_position] = buffer_length; |
-} |
- |
-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; |
- |
- packet->resize(start_size + 12); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 12); |
- uint8 FMT = 1; // Picture loss indicator. |
- big_endian_writer.WriteU8(0x80 + FMT); |
- big_endian_writer.WriteU8(kPacketTypePayloadSpecific); |
- big_endian_writer.WriteU16(2); // Used fixed length of 2. |
- big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
- big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. |
-} |
- |
-/* |
- 0 1 2 3 |
- 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 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
- | PB |0| Payload Type| Native Rpsi bit string | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
- | defined per codec ... | Padding (0) | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-*/ |
-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; |
- |
- packet->resize(start_size + 24); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 24); |
- uint8 FMT = 3; // Reference Picture Selection Indication. |
- big_endian_writer.WriteU8(0x80 + FMT); |
- big_endian_writer.WriteU8(kPacketTypePayloadSpecific); |
- |
- // Calculate length. |
- uint32 bits_required = 7; |
- uint8 bytes_required = 1; |
- while ((rpsi->picture_id >> bits_required) > 0) { |
- bits_required += 7; |
- bytes_required++; |
- } |
- uint8 size = 3; |
- if (bytes_required > 6) { |
- size = 5; |
- } else if (bytes_required > 2) { |
- size = 4; |
- } |
- big_endian_writer.WriteU8(0); |
- big_endian_writer.WriteU8(size); |
- big_endian_writer.WriteU32(ssrc_); |
- big_endian_writer.WriteU32(rpsi->remote_ssrc); |
- |
- uint8 padding_bytes = 4 - ((2 + bytes_required) % 4); |
- if (padding_bytes == 4) { |
- padding_bytes = 0; |
- } |
- // Add padding length in bits, padding can be 0, 8, 16 or 24. |
- big_endian_writer.WriteU8(padding_bytes * 8); |
- big_endian_writer.WriteU8(rpsi->payload_type); |
- |
- // Add picture ID. |
- for (int i = bytes_required - 1; i > 0; i--) { |
- big_endian_writer.WriteU8(0x80 | |
- static_cast<uint8>(rpsi->picture_id >> (i * 7))); |
- } |
- // Add last byte of picture ID. |
- big_endian_writer.WriteU8(static_cast<uint8>(rpsi->picture_id & 0x7f)); |
- |
- // Add padding. |
- for (int j = 0; j < padding_bytes; ++j) { |
- big_endian_writer.WriteU8(0); |
- } |
-} |
- |
-void RtcpSender::BuildRemb(const RtcpRembMessage* remb, |
- Packet* packet) const { |
- size_t start_size = packet->size(); |
- 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; |
- |
- packet->resize(start_size + remb_size); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), remb_size); |
- |
- // Add application layer feedback. |
- uint8 FMT = 15; |
- big_endian_writer.WriteU8(0x80 + FMT); |
- big_endian_writer.WriteU8(kPacketTypePayloadSpecific); |
- big_endian_writer.WriteU8(0); |
- big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); |
- big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
- big_endian_writer.WriteU32(0); // Remote SSRC must be 0. |
- big_endian_writer.WriteU32(kRemb); |
- big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size())); |
- |
- // 6 bit exponent and a 18 bit mantissa. |
- uint8 bitrate_exponent; |
- uint32 bitrate_mantissa; |
- BitrateToRembExponentBitrate( |
- remb->remb_bitrate, &bitrate_exponent, &bitrate_mantissa); |
- |
- big_endian_writer.WriteU8(static_cast<uint8>( |
- (bitrate_exponent << 2) + ((bitrate_mantissa >> 16) & 0x03))); |
- big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa >> 8)); |
- big_endian_writer.WriteU8(static_cast<uint8>(bitrate_mantissa)); |
- |
- std::list<uint32>::const_iterator it = remb->remb_ssrcs.begin(); |
- for (; it != remb->remb_ssrcs.end(); ++it) { |
- big_endian_writer.WriteU32(*it); |
- } |
-} |
- |
-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; |
- |
- packet->resize(start_size + 16); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 16); |
- |
- uint8 FMT = 1; |
- big_endian_writer.WriteU8(0x80 + FMT); |
- big_endian_writer.WriteU8(kPacketTypeGenericRtpFeedback); |
- big_endian_writer.WriteU8(0); |
- size_t nack_size_pos = start_size + 3; |
- big_endian_writer.WriteU8(3); |
- big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
- big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. |
- |
- // Build NACK bitmasks and write them to the Rtcp message. |
- // The nack list should be sorted and not contain duplicates. |
- size_t number_of_nack_fields = 0; |
- size_t max_number_of_nack_fields = std::min<size_t>( |
- kRtcpMaxNackFields, (kMaxIpPacketSize - packet->size()) / 4); |
- |
- std::list<uint16>::const_iterator it = nack->nack_list.begin(); |
- while (it != nack->nack_list.end() && |
- number_of_nack_fields < max_number_of_nack_fields) { |
- uint16 nack_sequence_number = *it; |
- uint16 bitmask = 0; |
- ++it; |
- while (it != nack->nack_list.end()) { |
- int shift = static_cast<uint16>(*it - nack_sequence_number) - 1; |
- if (shift >= 0 && shift <= 15) { |
- bitmask |= (1 << shift); |
- ++it; |
- } else { |
- break; |
- } |
- } |
- // 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; |
- |
- packet->resize(start_size + 4); |
- base::BigEndianWriter big_endian_nack_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 4); |
- big_endian_nack_writer.WriteU16(nack_sequence_number); |
- big_endian_nack_writer.WriteU16(bitmask); |
- number_of_nack_fields++; |
- } |
- DCHECK_GE(kRtcpMaxNackFields, number_of_nack_fields); |
- (*packet)[nack_size_pos] = static_cast<uint8>(2 + number_of_nack_fields); |
-} |
- |
-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; |
- |
- packet->resize(start_size + 8); |
- |
- base::BigEndianWriter big_endian_writer( |
- reinterpret_cast<char*>(&((*packet)[start_size])), 8); |
- big_endian_writer.WriteU8(0x80 + 1); |
- big_endian_writer.WriteU8(kPacketTypeBye); |
- big_endian_writer.WriteU16(1); // Length. |
- big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
-} |
- |
void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, |
Packet* packet) const { |
size_t start_size = packet->size(); |