| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 break; | 472 break; |
| 473 size_t payload_size = packet->payload_size(); | 473 size_t payload_size = packet->payload_size(); |
| 474 if (!PrepareAndSendPacket(std::move(packet), true, false, probe_cluster_id)) | 474 if (!PrepareAndSendPacket(std::move(packet), true, false, probe_cluster_id)) |
| 475 break; | 475 break; |
| 476 bytes_left -= payload_size; | 476 bytes_left -= payload_size; |
| 477 } | 477 } |
| 478 return bytes_to_send - bytes_left; | 478 return bytes_to_send - bytes_left; |
| 479 } | 479 } |
| 480 | 480 |
| 481 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { | 481 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { |
| 482 return DeprecatedSendPadData(bytes, false, 0, 0, probe_cluster_id); | |
| 483 } | |
| 484 | |
| 485 size_t RTPSender::SendPadData(size_t bytes, | |
| 486 bool timestamp_provided, | |
| 487 uint32_t timestamp, | |
| 488 int64_t capture_time_ms) { | |
| 489 return DeprecatedSendPadData(bytes, timestamp_provided, timestamp, | |
| 490 capture_time_ms, PacketInfo::kNotAProbe); | |
| 491 } | |
| 492 | |
| 493 size_t RTPSender::DeprecatedSendPadData(size_t bytes, | |
| 494 bool timestamp_provided, | |
| 495 uint32_t timestamp, | |
| 496 int64_t capture_time_ms, | |
| 497 int probe_cluster_id) { | |
| 498 // Always send full padding packets. This is accounted for by the | 482 // Always send full padding packets. This is accounted for by the |
| 499 // RtpPacketSender, | 483 // RtpPacketSender, which will make sure we don't send too much padding even |
| 500 // which will make sure we don't send too much padding even if a single packet | 484 // if a single packet is larger than requested. |
| 501 // is larger than requested. | |
| 502 size_t padding_bytes_in_packet = | 485 size_t padding_bytes_in_packet = |
| 503 std::min(MaxDataPayloadLength(), kMaxPaddingLength); | 486 std::min(MaxDataPayloadLength(), kMaxPaddingLength); |
| 504 size_t bytes_sent = 0; | 487 size_t bytes_sent = 0; |
| 505 bool using_transport_seq = | 488 while (bytes_sent < bytes) { |
| 506 IsRtpHeaderExtensionRegistered(kRtpExtensionTransportSequenceNumber) && | 489 int64_t now_ms = clock_->TimeInMilliseconds(); |
| 507 transport_sequence_number_allocator_; | |
| 508 for (; bytes > 0; bytes -= padding_bytes_in_packet) { | |
| 509 if (bytes < padding_bytes_in_packet) | |
| 510 bytes = padding_bytes_in_packet; | |
| 511 | |
| 512 uint32_t ssrc; | 490 uint32_t ssrc; |
| 491 uint32_t timestamp; |
| 492 int64_t capture_time_ms; |
| 513 uint16_t sequence_number; | 493 uint16_t sequence_number; |
| 514 int payload_type; | 494 int payload_type; |
| 515 bool over_rtx; | 495 bool over_rtx; |
| 516 { | 496 { |
| 517 rtc::CritScope lock(&send_critsect_); | 497 rtc::CritScope lock(&send_critsect_); |
| 518 if (!sending_media_) | 498 if (!sending_media_) |
| 519 return bytes_sent; | 499 break; |
| 520 if (!timestamp_provided) { | 500 timestamp = last_rtp_timestamp_; |
| 521 timestamp = last_rtp_timestamp_; | 501 capture_time_ms = capture_time_ms_; |
| 522 capture_time_ms = capture_time_ms_; | |
| 523 } | |
| 524 if (rtx_ == kRtxOff) { | 502 if (rtx_ == kRtxOff) { |
| 525 // Without RTX we can't send padding in the middle of frames. | 503 // Without RTX we can't send padding in the middle of frames. |
| 526 if (!last_packet_marker_bit_) | 504 if (!last_packet_marker_bit_) |
| 527 return 0; | 505 break; |
| 528 ssrc = ssrc_; | 506 ssrc = ssrc_; |
| 529 sequence_number = sequence_number_; | 507 sequence_number = sequence_number_; |
| 530 ++sequence_number_; | 508 ++sequence_number_; |
| 531 payload_type = payload_type_; | 509 payload_type = payload_type_; |
| 532 over_rtx = false; | 510 over_rtx = false; |
| 533 } else { | 511 } else { |
| 534 // Without abs-send-time or transport sequence number a media packet | 512 // Without abs-send-time or transport sequence number a media packet |
| 535 // must be sent before padding so that the timestamps used for | 513 // must be sent before padding so that the timestamps used for |
| 536 // estimation are correct. | 514 // estimation are correct. |
| 537 if (!media_has_been_sent_ && | 515 if (!media_has_been_sent_ && |
| 538 !(rtp_header_extension_map_.IsRegistered( | 516 !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) || |
| 539 kRtpExtensionAbsoluteSendTime) || | 517 (rtp_header_extension_map_.IsRegistered( |
| 540 using_transport_seq)) { | 518 TransportSequenceNumber::kId) && |
| 541 return 0; | 519 transport_sequence_number_allocator_))) { |
| 520 break; |
| 542 } | 521 } |
| 543 // Only change change the timestamp of padding packets sent over RTX. | 522 // Only change change the timestamp of padding packets sent over RTX. |
| 544 // Padding only packets over RTP has to be sent as part of a media | 523 // Padding only packets over RTP has to be sent as part of a media |
| 545 // frame (and therefore the same timestamp). | 524 // frame (and therefore the same timestamp). |
| 546 if (last_timestamp_time_ms_ > 0) { | 525 if (last_timestamp_time_ms_ > 0) { |
| 547 timestamp += | 526 timestamp += |
| 548 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_) * 90; | 527 (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs; |
| 549 capture_time_ms += | 528 capture_time_ms += (now_ms - last_timestamp_time_ms_); |
| 550 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_); | |
| 551 } | 529 } |
| 552 ssrc = ssrc_rtx_; | 530 ssrc = ssrc_rtx_; |
| 553 sequence_number = sequence_number_rtx_; | 531 sequence_number = sequence_number_rtx_; |
| 554 ++sequence_number_rtx_; | 532 ++sequence_number_rtx_; |
| 555 payload_type = rtx_payload_type_map_.begin()->second; | 533 payload_type = rtx_payload_type_map_.begin()->second; |
| 556 over_rtx = true; | 534 over_rtx = true; |
| 557 } | 535 } |
| 558 } | 536 } |
| 559 | 537 |
| 560 RtpPacketToSend padding_packet(&rtp_header_extension_map_, IP_PACKET_SIZE); | 538 RtpPacketToSend padding_packet(&rtp_header_extension_map_); |
| 561 padding_packet.SetPayloadType(payload_type); | 539 padding_packet.SetPayloadType(payload_type); |
| 562 padding_packet.SetMarker(false); | 540 padding_packet.SetMarker(false); |
| 563 padding_packet.SetSequenceNumber(sequence_number); | 541 padding_packet.SetSequenceNumber(sequence_number); |
| 564 padding_packet.SetTimestamp(timestamp); | 542 padding_packet.SetTimestamp(timestamp); |
| 565 padding_packet.SetSsrc(ssrc); | 543 padding_packet.SetSsrc(ssrc); |
| 566 | 544 |
| 567 int64_t now_ms = clock_->TimeInMilliseconds(); | |
| 568 | |
| 569 if (capture_time_ms > 0) { | 545 if (capture_time_ms > 0) { |
| 570 padding_packet.SetExtension<TransmissionOffset>( | 546 padding_packet.SetExtension<TransmissionOffset>( |
| 571 kTimestampTicksPerMs * (now_ms - capture_time_ms)); | 547 (now_ms - capture_time_ms) * kTimestampTicksPerMs); |
| 572 } | 548 } |
| 573 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); | 549 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); |
| 574 PacketOptions options; | 550 PacketOptions options; |
| 575 bool has_transport_seq_num = | 551 bool has_transport_seq_num = |
| 576 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); | 552 UpdateTransportSequenceNumber(&padding_packet, &options.packet_id); |
| 577 padding_packet.SetPadding(padding_bytes_in_packet, &random_); | 553 padding_packet.SetPadding(padding_bytes_in_packet, &random_); |
| 578 | 554 |
| 579 if (has_transport_seq_num) { | 555 if (has_transport_seq_num) { |
| 580 AddPacketToTransportFeedback(options.packet_id, padding_packet, | 556 AddPacketToTransportFeedback(options.packet_id, padding_packet, |
| 581 probe_cluster_id); | 557 probe_cluster_id); |
| (...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 return; | 1293 return; |
| 1318 } | 1294 } |
| 1319 rtp_overhead_bytes_per_packet_ = packet.headers_size(); | 1295 rtp_overhead_bytes_per_packet_ = packet.headers_size(); |
| 1320 overhead_bytes_per_packet = | 1296 overhead_bytes_per_packet = |
| 1321 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; | 1297 rtp_overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_; |
| 1322 } | 1298 } |
| 1323 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | 1299 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); |
| 1324 } | 1300 } |
| 1325 | 1301 |
| 1326 } // namespace webrtc | 1302 } // namespace webrtc |
| OLD | NEW |