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/logging.h" | 10 #include "base/logging.h" |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 std::vector<uint8>* packet) const { | 188 std::vector<uint8>* packet) const { |
189 size_t start_size = packet->size(); | 189 size_t start_size = packet->size(); |
190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space"; | 190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space"; |
191 if (start_size + 32 > kIpPacketSize) return; | 191 if (start_size + 32 > kIpPacketSize) return; |
192 | 192 |
193 uint16 number_of_rows = (report_block) ? 7 : 1; | 193 uint16 number_of_rows = (report_block) ? 7 : 1; |
194 packet->resize(start_size + 8); | 194 packet->resize(start_size + 8); |
195 | 195 |
196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); | 196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); |
197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); | 197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); |
198 big_endian_writer.WriteU8(kPacketTypeReceiverReport); | 198 big_endian_writer.WriteU8(transport::kPacketTypeReceiverReport); |
199 big_endian_writer.WriteU16(number_of_rows); | 199 big_endian_writer.WriteU16(number_of_rows); |
200 big_endian_writer.WriteU32(ssrc_); | 200 big_endian_writer.WriteU32(ssrc_); |
201 | 201 |
202 if (report_block) { | 202 if (report_block) { |
203 AddReportBlocks(*report_block, packet); // Adds 24 bytes. | 203 AddReportBlocks(*report_block, packet); // Adds 24 bytes. |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block, | 207 void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block, |
208 std::vector<uint8>* packet) const { | 208 std::vector<uint8>* packet) const { |
(...skipping 28 matching lines...) Expand all Loading... |
237 DCHECK_LT(start_size + 12 + c_name_.length(), kIpPacketSize) | 237 DCHECK_LT(start_size + 12 + c_name_.length(), kIpPacketSize) |
238 << "Not enough buffer space"; | 238 << "Not enough buffer space"; |
239 if (start_size + 12 > kIpPacketSize) return; | 239 if (start_size + 12 > kIpPacketSize) return; |
240 | 240 |
241 // SDES Source Description. | 241 // SDES Source Description. |
242 packet->resize(start_size + 10); | 242 packet->resize(start_size + 10); |
243 | 243 |
244 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); | 244 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); |
245 // We always need to add one SDES CNAME. | 245 // We always need to add one SDES CNAME. |
246 big_endian_writer.WriteU8(0x80 + 1); | 246 big_endian_writer.WriteU8(0x80 + 1); |
247 big_endian_writer.WriteU8(kPacketTypeSdes); | 247 big_endian_writer.WriteU8(transport::kPacketTypeSdes); |
248 | 248 |
249 // Handle SDES length later on. | 249 // Handle SDES length later on. |
250 uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; | 250 uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; |
251 big_endian_writer.WriteU16(0); | 251 big_endian_writer.WriteU16(0); |
252 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 252 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
253 big_endian_writer.WriteU8(1); // CNAME = 1 | 253 big_endian_writer.WriteU8(1); // CNAME = 1 |
254 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length())); | 254 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length())); |
255 | 255 |
256 size_t sdes_length = 10 + c_name_.length(); | 256 size_t sdes_length = 10 + c_name_.length(); |
257 packet->insert(packet->end(), c_name_.c_str(), | 257 packet->insert(packet->end(), c_name_.c_str(), |
(...skipping 21 matching lines...) Expand all Loading... |
279 std::vector<uint8>* packet) const { | 279 std::vector<uint8>* packet) const { |
280 size_t start_size = packet->size(); | 280 size_t start_size = packet->size(); |
281 DCHECK_LT(start_size + 12, kIpPacketSize) << "Not enough buffer space"; | 281 DCHECK_LT(start_size + 12, kIpPacketSize) << "Not enough buffer space"; |
282 if (start_size + 12 > kIpPacketSize) return; | 282 if (start_size + 12 > kIpPacketSize) return; |
283 | 283 |
284 packet->resize(start_size + 12); | 284 packet->resize(start_size + 12); |
285 | 285 |
286 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12); | 286 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12); |
287 uint8 FMT = 1; // Picture loss indicator. | 287 uint8 FMT = 1; // Picture loss indicator. |
288 big_endian_writer.WriteU8(0x80 + FMT); | 288 big_endian_writer.WriteU8(0x80 + FMT); |
289 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); | 289 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); |
290 big_endian_writer.WriteU16(2); // Used fixed length of 2. | 290 big_endian_writer.WriteU16(2); // Used fixed length of 2. |
291 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 291 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
292 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. | 292 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. |
293 } | 293 } |
294 | 294 |
295 /* | 295 /* |
296 0 1 2 3 | 296 0 1 2 3 |
297 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 | 297 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 |
298 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 298 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
299 | PB |0| Payload Type| Native Rpsi bit string | | 299 | PB |0| Payload Type| Native Rpsi bit string | |
300 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 300 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
301 | defined per codec ... | Padding (0) | | 301 | defined per codec ... | Padding (0) | |
302 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 302 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
303 */ | 303 */ |
304 void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi, | 304 void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi, |
305 std::vector<uint8>* packet) const { | 305 std::vector<uint8>* packet) const { |
306 size_t start_size = packet->size(); | 306 size_t start_size = packet->size(); |
307 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space"; | 307 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space"; |
308 if (start_size + 24 > kIpPacketSize) return; | 308 if (start_size + 24 > kIpPacketSize) return; |
309 | 309 |
310 packet->resize(start_size + 24); | 310 packet->resize(start_size + 24); |
311 | 311 |
312 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); | 312 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); |
313 uint8 FMT = 3; // Reference Picture Selection Indication. | 313 uint8 FMT = 3; // Reference Picture Selection Indication. |
314 big_endian_writer.WriteU8(0x80 + FMT); | 314 big_endian_writer.WriteU8(0x80 + FMT); |
315 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); | 315 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); |
316 | 316 |
317 // Calculate length. | 317 // Calculate length. |
318 uint32 bits_required = 7; | 318 uint32 bits_required = 7; |
319 uint8 bytes_required = 1; | 319 uint8 bytes_required = 1; |
320 while ((rpsi->picture_id >> bits_required) > 0) { | 320 while ((rpsi->picture_id >> bits_required) > 0) { |
321 bits_required += 7; | 321 bits_required += 7; |
322 bytes_required++; | 322 bytes_required++; |
323 } | 323 } |
324 uint8 size = 3; | 324 uint8 size = 3; |
325 if (bytes_required > 6) { | 325 if (bytes_required > 6) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 << "Not enough buffer space"; | 362 << "Not enough buffer space"; |
363 if (start_size + remb_size > kIpPacketSize) return; | 363 if (start_size + remb_size > kIpPacketSize) return; |
364 | 364 |
365 packet->resize(start_size + remb_size); | 365 packet->resize(start_size + remb_size); |
366 | 366 |
367 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size); | 367 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size); |
368 | 368 |
369 // Add application layer feedback. | 369 // Add application layer feedback. |
370 uint8 FMT = 15; | 370 uint8 FMT = 15; |
371 big_endian_writer.WriteU8(0x80 + FMT); | 371 big_endian_writer.WriteU8(0x80 + FMT); |
372 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); | 372 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); |
373 big_endian_writer.WriteU8(0); | 373 big_endian_writer.WriteU8(0); |
374 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); | 374 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); |
375 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 375 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
376 big_endian_writer.WriteU32(0); // Remote SSRC must be 0. | 376 big_endian_writer.WriteU32(0); // Remote SSRC must be 0. |
377 big_endian_writer.WriteU32(kRemb); | 377 big_endian_writer.WriteU32(kRemb); |
378 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size())); | 378 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size())); |
379 | 379 |
380 // 6 bit exponent and a 18 bit mantissa. | 380 // 6 bit exponent and a 18 bit mantissa. |
381 uint8 bitrate_exponent; | 381 uint8 bitrate_exponent; |
382 uint32 bitrate_mantissa; | 382 uint32 bitrate_mantissa; |
(...skipping 20 matching lines...) Expand all Loading... |
403 size_t start_size = packet->size(); | 403 size_t start_size = packet->size(); |
404 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space"; | 404 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space"; |
405 if (start_size + 16 > kIpPacketSize) return; | 405 if (start_size + 16 > kIpPacketSize) return; |
406 | 406 |
407 packet->resize(start_size + 16); | 407 packet->resize(start_size + 16); |
408 | 408 |
409 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16); | 409 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16); |
410 | 410 |
411 uint8 FMT = 1; | 411 uint8 FMT = 1; |
412 big_endian_writer.WriteU8(0x80 + FMT); | 412 big_endian_writer.WriteU8(0x80 + FMT); |
413 big_endian_writer.WriteU8(kPacketTypeGenericRtpFeedback); | 413 big_endian_writer.WriteU8(transport::kPacketTypeGenericRtpFeedback); |
414 big_endian_writer.WriteU8(0); | 414 big_endian_writer.WriteU8(0); |
415 size_t nack_size_pos = start_size + 3; | 415 size_t nack_size_pos = start_size + 3; |
416 big_endian_writer.WriteU8(3); | 416 big_endian_writer.WriteU8(3); |
417 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 417 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
418 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. | 418 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. |
419 | 419 |
420 // Build NACK bitmasks and write them to the Rtcp message. | 420 // Build NACK bitmasks and write them to the Rtcp message. |
421 // The nack list should be sorted and not contain duplicates. | 421 // The nack list should be sorted and not contain duplicates. |
422 size_t number_of_nack_fields = 0; | 422 size_t number_of_nack_fields = 0; |
423 size_t max_number_of_nack_fields = std::min<size_t>(kRtcpMaxNackFields, | 423 size_t max_number_of_nack_fields = std::min<size_t>(kRtcpMaxNackFields, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 | 455 |
456 void RtcpSender::BuildBye(std::vector<uint8>* packet) const { | 456 void RtcpSender::BuildBye(std::vector<uint8>* packet) const { |
457 size_t start_size = packet->size(); | 457 size_t start_size = packet->size(); |
458 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space"; | 458 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space"; |
459 if (start_size + 8 > kIpPacketSize) return; | 459 if (start_size + 8 > kIpPacketSize) return; |
460 | 460 |
461 packet->resize(start_size + 8); | 461 packet->resize(start_size + 8); |
462 | 462 |
463 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); | 463 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); |
464 big_endian_writer.WriteU8(0x80 + 1); | 464 big_endian_writer.WriteU8(0x80 + 1); |
465 big_endian_writer.WriteU8(kPacketTypeBye); | 465 big_endian_writer.WriteU8(transport::kPacketTypeBye); |
466 big_endian_writer.WriteU16(1); // Length. | 466 big_endian_writer.WriteU16(1); // Length. |
467 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 467 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
468 } | 468 } |
469 | 469 |
470 void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, | 470 void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, |
471 std::vector<uint8>* packet) const { | 471 std::vector<uint8>* packet) const { |
472 size_t start_size = packet->size(); | 472 size_t start_size = packet->size(); |
473 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; | 473 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; |
474 if (start_size + 20 > kIpPacketSize) return; | 474 if (start_size + 20 > kIpPacketSize) return; |
475 | 475 |
476 packet->resize(start_size + 20); | 476 packet->resize(start_size + 20); |
477 | 477 |
478 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); | 478 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); |
479 | 479 |
480 big_endian_writer.WriteU8(0x80); | 480 big_endian_writer.WriteU8(0x80); |
481 big_endian_writer.WriteU8(kPacketTypeXr); | 481 big_endian_writer.WriteU8(transport::kPacketTypeXr); |
482 big_endian_writer.WriteU16(4); // Length. | 482 big_endian_writer.WriteU16(4); // Length. |
483 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 483 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
484 big_endian_writer.WriteU8(4); // Add block type. | 484 big_endian_writer.WriteU8(4); // Add block type. |
485 big_endian_writer.WriteU8(0); // Add reserved. | 485 big_endian_writer.WriteU8(0); // Add reserved. |
486 big_endian_writer.WriteU16(2); // Block length. | 486 big_endian_writer.WriteU16(2); // Block length. |
487 | 487 |
488 // Add the media (received RTP) SSRC. | 488 // Add the media (received RTP) SSRC. |
489 big_endian_writer.WriteU32(rrtr->ntp_seconds); | 489 big_endian_writer.WriteU32(rrtr->ntp_seconds); |
490 big_endian_writer.WriteU32(rrtr->ntp_fraction); | 490 big_endian_writer.WriteU32(rrtr->ntp_fraction); |
491 } | 491 } |
492 | 492 |
493 void RtcpSender::BuildCast(const RtcpCastMessage* cast, | 493 void RtcpSender::BuildCast(const RtcpCastMessage* cast, |
494 std::vector<uint8>* packet) const { | 494 std::vector<uint8>* packet) const { |
495 size_t start_size = packet->size(); | 495 size_t start_size = packet->size(); |
496 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; | 496 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; |
497 if (start_size + 20 > kIpPacketSize) return; | 497 if (start_size + 20 > kIpPacketSize) return; |
498 | 498 |
499 packet->resize(start_size + 20); | 499 packet->resize(start_size + 20); |
500 | 500 |
501 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); | 501 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); |
502 uint8 FMT = 15; // Application layer feedback. | 502 uint8 FMT = 15; // Application layer feedback. |
503 big_endian_writer.WriteU8(0x80 + FMT); | 503 big_endian_writer.WriteU8(0x80 + FMT); |
504 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); | 504 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); |
505 big_endian_writer.WriteU8(0); | 505 big_endian_writer.WriteU8(0); |
506 size_t cast_size_pos = start_size + 3; // Save length position. | 506 size_t cast_size_pos = start_size + 3; // Save length position. |
507 big_endian_writer.WriteU8(4); | 507 big_endian_writer.WriteU8(4); |
508 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 508 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
509 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC. | 509 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC. |
510 big_endian_writer.WriteU32(kCast); | 510 big_endian_writer.WriteU32(kCast); |
511 big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_)); | 511 big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_)); |
512 size_t cast_loss_field_pos = start_size + 17; // Save loss field position. | 512 size_t cast_loss_field_pos = start_size + 17; // Save loss field position. |
513 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. | 513 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. |
514 big_endian_writer.WriteU8(0); // Reserved. | 514 big_endian_writer.WriteU8(0); // Reserved. |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 &number_of_frames, | 581 &number_of_frames, |
582 &total_number_of_messages_to_send, | 582 &total_number_of_messages_to_send, |
583 &rtcp_log_size)) { | 583 &rtcp_log_size)) { |
584 return; | 584 return; |
585 } | 585 } |
586 packet->resize(packet_start_size + rtcp_log_size); | 586 packet->resize(packet_start_size + rtcp_log_size); |
587 | 587 |
588 net::BigEndianWriter big_endian_writer(&((*packet)[packet_start_size]), | 588 net::BigEndianWriter big_endian_writer(&((*packet)[packet_start_size]), |
589 rtcp_log_size); | 589 rtcp_log_size); |
590 big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype); | 590 big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype); |
591 big_endian_writer.WriteU8(kPacketTypeApplicationDefined); | 591 big_endian_writer.WriteU8(transport::kPacketTypeApplicationDefined); |
592 big_endian_writer.WriteU16(static_cast<uint16>(2 + 2 * number_of_frames + | 592 big_endian_writer.WriteU16(static_cast<uint16>(2 + 2 * number_of_frames + |
593 total_number_of_messages_to_send)); | 593 total_number_of_messages_to_send)); |
594 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. | 594 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
595 big_endian_writer.WriteU32(kCast); | 595 big_endian_writer.WriteU32(kCast); |
596 | 596 |
597 while (!receiver_log_message->empty() && | 597 while (!receiver_log_message->empty() && |
598 total_number_of_messages_to_send > 0) { | 598 total_number_of_messages_to_send > 0) { |
599 RtcpReceiverFrameLogMessage& frame_log_messages = | 599 RtcpReceiverFrameLogMessage& frame_log_messages = |
600 receiver_log_message->front(); | 600 receiver_log_message->front(); |
601 // Add our frame header. | 601 // Add our frame header. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 if (frame_log_messages.event_log_messages_.empty()) { | 649 if (frame_log_messages.event_log_messages_.empty()) { |
650 // We sent all messages on this frame; pop the frame header. | 650 // We sent all messages on this frame; pop the frame header. |
651 receiver_log_message->pop_front(); | 651 receiver_log_message->pop_front(); |
652 } | 652 } |
653 } | 653 } |
654 DCHECK_EQ(total_number_of_messages_to_send, 0); | 654 DCHECK_EQ(total_number_of_messages_to_send, 0); |
655 } | 655 } |
656 | 656 |
657 } // namespace cast | 657 } // namespace cast |
658 } // namespace media | 658 } // namespace media |
OLD | NEW |