| 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" | 10 #include "base/debug/trace_event.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 | 169 |
| 170 // SDES Source Description. | 170 // SDES Source Description. |
| 171 packet->resize(start_size + 10); | 171 packet->resize(start_size + 10); |
| 172 | 172 |
| 173 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); | 173 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); |
| 174 // We always need to add one SDES CNAME. | 174 // We always need to add one SDES CNAME. |
| 175 big_endian_writer.WriteU8(0x80 + 1); | 175 big_endian_writer.WriteU8(0x80 + 1); |
| 176 big_endian_writer.WriteU8(202); | 176 big_endian_writer.WriteU8(202); |
| 177 | 177 |
| 178 // Handle SDES length later on. | 178 // Handle SDES length later on. |
| 179 uint32 sdes_length_position = start_size + 3; | 179 uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; |
| 180 big_endian_writer.WriteU16(0); | 180 big_endian_writer.WriteU16(0); |
| 181 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 181 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
| 182 big_endian_writer.WriteU8(1); // CNAME = 1 | 182 big_endian_writer.WriteU8(1); // CNAME = 1 |
| 183 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length())); | 183 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length())); |
| 184 | 184 |
| 185 size_t sdes_length = 10 + c_name_.length(); | 185 size_t sdes_length = 10 + c_name_.length(); |
| 186 packet->insert(packet->end(), c_name_.c_str(), | 186 packet->insert(packet->end(), c_name_.c_str(), |
| 187 c_name_.c_str() + c_name_.length()); | 187 c_name_.c_str() + c_name_.length()); |
| 188 | 188 |
| 189 size_t padding = 0; | 189 size_t padding = 0; |
| 190 | 190 |
| 191 // We must have a zero field even if we have an even multiple of 4 bytes. | 191 // We must have a zero field even if we have an even multiple of 4 bytes. |
| 192 if ((packet->size() % 4) == 0) { | 192 if ((packet->size() % 4) == 0) { |
| 193 padding++; | 193 padding++; |
| 194 packet->push_back(0); | 194 packet->push_back(0); |
| 195 } | 195 } |
| 196 while ((packet->size() % 4) != 0) { | 196 while ((packet->size() % 4) != 0) { |
| 197 padding++; | 197 padding++; |
| 198 packet->push_back(0); | 198 packet->push_back(0); |
| 199 } | 199 } |
| 200 sdes_length += padding; | 200 sdes_length += padding; |
| 201 | 201 |
| 202 // In 32-bit words minus one and we don't count the header. | 202 // In 32-bit words minus one and we don't count the header. |
| 203 uint8 buffer_length = (sdes_length / 4) - 1; | 203 uint8 buffer_length = static_cast<uint8>((sdes_length / 4) - 1); |
| 204 (*packet)[sdes_length_position] = buffer_length; | 204 (*packet)[sdes_length_position] = buffer_length; |
| 205 } | 205 } |
| 206 | 206 |
| 207 void RtcpSender::BuildPli(uint32 remote_ssrc, | 207 void RtcpSender::BuildPli(uint32 remote_ssrc, |
| 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 + 12, kIpPacketSize) << "Not enough buffer space"; | 210 DCHECK_LT(start_size + 12, kIpPacketSize) << "Not enough buffer space"; |
| 211 if (start_size + 12 > kIpPacketSize) return; | 211 if (start_size + 12 > kIpPacketSize) return; |
| 212 | 212 |
| 213 packet->resize(start_size + 12); | 213 packet->resize(start_size + 12); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 | 296 |
| 297 packet->resize(start_size + remb_size); | 297 packet->resize(start_size + remb_size); |
| 298 | 298 |
| 299 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size); | 299 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size); |
| 300 | 300 |
| 301 // Add application layer feedback. | 301 // Add application layer feedback. |
| 302 uint8 FMT = 15; | 302 uint8 FMT = 15; |
| 303 big_endian_writer.WriteU8(0x80 + FMT); | 303 big_endian_writer.WriteU8(0x80 + FMT); |
| 304 big_endian_writer.WriteU8(206); | 304 big_endian_writer.WriteU8(206); |
| 305 big_endian_writer.WriteU8(0); | 305 big_endian_writer.WriteU8(0); |
| 306 big_endian_writer.WriteU8(remb->remb_ssrcs.size() + 4); | 306 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); |
| 307 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 307 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
| 308 big_endian_writer.WriteU32(0); // Remote SSRC must be 0. | 308 big_endian_writer.WriteU32(0); // Remote SSRC must be 0. |
| 309 big_endian_writer.WriteU32(kRemb); | 309 big_endian_writer.WriteU32(kRemb); |
| 310 big_endian_writer.WriteU8(remb->remb_ssrcs.size()); | 310 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size())); |
| 311 | 311 |
| 312 // 6 bit exponent and a 18 bit mantissa. | 312 // 6 bit exponent and a 18 bit mantissa. |
| 313 uint8 bitrate_exponent; | 313 uint8 bitrate_exponent; |
| 314 uint32 bitrate_mantissa; | 314 uint32 bitrate_mantissa; |
| 315 BitrateToRembExponentBitrate(remb->remb_bitrate, | 315 BitrateToRembExponentBitrate(remb->remb_bitrate, |
| 316 &bitrate_exponent, | 316 &bitrate_exponent, |
| 317 &bitrate_mantissa); | 317 &bitrate_mantissa); |
| 318 | 318 |
| 319 big_endian_writer.WriteU8(static_cast<uint8>((bitrate_exponent << 2) + | 319 big_endian_writer.WriteU8(static_cast<uint8>((bitrate_exponent << 2) + |
| 320 ((bitrate_mantissa >> 16) & 0x03))); | 320 ((bitrate_mantissa >> 16) & 0x03))); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 336 if (start_size + 16 > kIpPacketSize) return; | 336 if (start_size + 16 > kIpPacketSize) return; |
| 337 | 337 |
| 338 packet->resize(start_size + 16); | 338 packet->resize(start_size + 16); |
| 339 | 339 |
| 340 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16); | 340 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16); |
| 341 | 341 |
| 342 uint8 FMT = 1; | 342 uint8 FMT = 1; |
| 343 big_endian_writer.WriteU8(0x80 + FMT); | 343 big_endian_writer.WriteU8(0x80 + FMT); |
| 344 big_endian_writer.WriteU8(205); | 344 big_endian_writer.WriteU8(205); |
| 345 big_endian_writer.WriteU8(0); | 345 big_endian_writer.WriteU8(0); |
| 346 int nack_size_pos = start_size + 3; | 346 int nack_size_pos = static_cast<int>(start_size) + 3; |
| 347 big_endian_writer.WriteU8(3); | 347 big_endian_writer.WriteU8(3); |
| 348 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 348 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
| 349 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. | 349 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. |
| 350 | 350 |
| 351 // Build NACK bitmasks and write them to the Rtcp message. | 351 // Build NACK bitmasks and write them to the Rtcp message. |
| 352 // The nack list should be sorted and not contain duplicates. | 352 // The nack list should be sorted and not contain duplicates. |
| 353 int number_of_nack_fields = 0; | 353 int number_of_nack_fields = 0; |
| 354 int max_number_of_nack_fields = | 354 int max_number_of_nack_fields = |
| 355 std::min<int>(kRtcpMaxNackFields, (kIpPacketSize - packet->size()) / 4); | 355 std::min<int>(kRtcpMaxNackFields, |
| 356 (kIpPacketSize - static_cast<int>(packet->size())) / 4); |
| 356 | 357 |
| 357 std::list<uint16>::const_iterator it = nack->nack_list.begin(); | 358 std::list<uint16>::const_iterator it = nack->nack_list.begin(); |
| 358 while (it != nack->nack_list.end() && | 359 while (it != nack->nack_list.end() && |
| 359 number_of_nack_fields < max_number_of_nack_fields) { | 360 number_of_nack_fields < max_number_of_nack_fields) { |
| 360 uint16 nack_sequence_number = *it; | 361 uint16 nack_sequence_number = *it; |
| 361 uint16 bitmask = 0; | 362 uint16 bitmask = 0; |
| 362 ++it; | 363 ++it; |
| 363 while (it != nack->nack_list.end()) { | 364 while (it != nack->nack_list.end()) { |
| 364 int shift = static_cast<uint16>(*it - nack_sequence_number) - 1; | 365 int shift = static_cast<uint16>(*it - nack_sequence_number) - 1; |
| 365 if (shift >= 0 && shift <= 15) { | 366 if (shift >= 0 && shift <= 15) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; | 467 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; |
| 467 if (start_size + 20 > kIpPacketSize) return; | 468 if (start_size + 20 > kIpPacketSize) return; |
| 468 | 469 |
| 469 packet->resize(start_size + 20); | 470 packet->resize(start_size + 20); |
| 470 | 471 |
| 471 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); | 472 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); |
| 472 uint8 FMT = 15; // Application layer feedback. | 473 uint8 FMT = 15; // Application layer feedback. |
| 473 big_endian_writer.WriteU8(0x80 + FMT); | 474 big_endian_writer.WriteU8(0x80 + FMT); |
| 474 big_endian_writer.WriteU8(206); | 475 big_endian_writer.WriteU8(206); |
| 475 big_endian_writer.WriteU8(0); | 476 big_endian_writer.WriteU8(0); |
| 476 int cast_size_pos = start_size + 3; // Save length position. | 477 int cast_size_pos = |
| 478 static_cast<int>(start_size) + 3; // Save length position. |
| 477 big_endian_writer.WriteU8(4); | 479 big_endian_writer.WriteU8(4); |
| 478 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 480 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
| 479 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC. | 481 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC. |
| 480 big_endian_writer.WriteU32(kCast); | 482 big_endian_writer.WriteU32(kCast); |
| 481 big_endian_writer.WriteU8(cast->ack_frame_id_); | 483 big_endian_writer.WriteU8(cast->ack_frame_id_); |
| 482 int cast_loss_field_pos = start_size + 17; // Save loss field position. | 484 int cast_loss_field_pos = |
| 485 static_cast<int>(start_size) + 17; // Save loss field position. |
| 483 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. | 486 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. |
| 484 big_endian_writer.WriteU8(0); // Reserved. | 487 big_endian_writer.WriteU8(0); // Reserved. |
| 485 big_endian_writer.WriteU8(0); // Reserved. | 488 big_endian_writer.WriteU8(0); // Reserved. |
| 486 | 489 |
| 487 int number_of_loss_fields = 0; | 490 int number_of_loss_fields = 0; |
| 488 int max_number_of_loss_fields = std::min<int>(kRtcpMaxCastLossFields, | 491 int max_number_of_loss_fields = |
| 489 (kIpPacketSize - packet->size()) / 4); | 492 std::min<int>(kRtcpMaxCastLossFields, |
| 493 kIpPacketSize - static_cast<int>(packet->size()) / 4); |
| 490 | 494 |
| 491 std::map<uint8, std::set<uint16> >::const_iterator frame_it = | 495 std::map<uint8, std::set<uint16> >::const_iterator frame_it = |
| 492 cast->missing_frames_and_packets_.begin(); | 496 cast->missing_frames_and_packets_.begin(); |
| 493 | 497 |
| 494 for (; frame_it != cast->missing_frames_and_packets_.end() && | 498 for (; frame_it != cast->missing_frames_and_packets_.end() && |
| 495 number_of_loss_fields < max_number_of_loss_fields; ++frame_it) { | 499 number_of_loss_fields < max_number_of_loss_fields; ++frame_it) { |
| 496 // Iterate through all frames with missing packets. | 500 // Iterate through all frames with missing packets. |
| 497 if (frame_it->second.empty()) { | 501 if (frame_it->second.empty()) { |
| 498 // Special case all packets in a frame is missing. | 502 // Special case all packets in a frame is missing. |
| 499 start_size = packet->size(); | 503 start_size = packet->size(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 (*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields); | 540 (*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields); |
| 537 (*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields); | 541 (*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields); |
| 538 | 542 |
| 539 // Frames with missing packets. | 543 // Frames with missing packets. |
| 540 TRACE_COUNTER_ID1("cast_rtcp", "RtcpSender::CastNACK", ssrc_, | 544 TRACE_COUNTER_ID1("cast_rtcp", "RtcpSender::CastNACK", ssrc_, |
| 541 cast->missing_frames_and_packets_.size()); | 545 cast->missing_frames_and_packets_.size()); |
| 542 } | 546 } |
| 543 | 547 |
| 544 } // namespace cast | 548 } // namespace cast |
| 545 } // namespace media | 549 } // namespace media |
| OLD | NEW |