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 |