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 18 matching lines...) Expand all Loading... |
29 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" |
30 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
31 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 31 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
32 #include "webrtc/system_wrappers/include/field_trial.h" | 32 #include "webrtc/system_wrappers/include/field_trial.h" |
33 | 33 |
34 namespace webrtc { | 34 namespace webrtc { |
35 | 35 |
36 namespace { | 36 namespace { |
37 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. | 37 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. |
38 constexpr size_t kMaxPaddingLength = 224; | 38 constexpr size_t kMaxPaddingLength = 224; |
39 constexpr size_t kMinAudioPaddingLength = 50; | |
40 constexpr int kSendSideDelayWindowMs = 1000; | 39 constexpr int kSendSideDelayWindowMs = 1000; |
41 constexpr size_t kRtpHeaderLength = 12; | 40 constexpr size_t kRtpHeaderLength = 12; |
42 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. | 41 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. |
43 constexpr uint32_t kTimestampTicksPerMs = 90; | 42 constexpr uint32_t kTimestampTicksPerMs = 90; |
44 constexpr int kBitrateStatisticsWindowMs = 1000; | 43 constexpr int kBitrateStatisticsWindowMs = 1000; |
45 | 44 |
46 constexpr size_t kMinFlexfecPacketsToStoreForPacing = 50; | 45 constexpr size_t kMinFlexfecPacketsToStoreForPacing = 50; |
47 | 46 |
48 const char* FrameTypeToString(FrameType frame_type) { | 47 const char* FrameTypeToString(FrameType frame_type) { |
49 switch (frame_type) { | 48 switch (frame_type) { |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 break; | 474 break; |
476 size_t payload_size = packet->payload_size(); | 475 size_t payload_size = packet->payload_size(); |
477 if (!PrepareAndSendPacket(std::move(packet), true, false, probe_cluster_id)) | 476 if (!PrepareAndSendPacket(std::move(packet), true, false, probe_cluster_id)) |
478 break; | 477 break; |
479 bytes_left -= payload_size; | 478 bytes_left -= payload_size; |
480 } | 479 } |
481 return bytes_to_send - bytes_left; | 480 return bytes_to_send - bytes_left; |
482 } | 481 } |
483 | 482 |
484 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { | 483 size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) { |
485 size_t padding_bytes_in_packet; | 484 // Always send full padding packets. This is accounted for by the |
486 if (audio_configured_) { | 485 // RtpPacketSender, which will make sure we don't send too much padding even |
487 // Allow smaller padding packets for audio. | 486 // if a single packet is larger than requested. |
488 padding_bytes_in_packet = std::max(std::min(bytes, MaxPayloadSize()), | 487 size_t padding_bytes_in_packet = |
489 kMinAudioPaddingLength); | 488 std::min(MaxPayloadSize(), kMaxPaddingLength); |
490 if (padding_bytes_in_packet > kMaxPaddingLength) | |
491 padding_bytes_in_packet = kMaxPaddingLength; | |
492 } else { | |
493 // Always send full padding packets. This is accounted for by the | |
494 // RtpPacketSender, which will make sure we don't send too much padding even | |
495 // if a single packet is larger than requested. | |
496 // We do this to avoid frequently sending small packets on higher bitrates. | |
497 padding_bytes_in_packet = | |
498 std::min(MaxPayloadSize(), kMaxPaddingLength); | |
499 } | |
500 size_t bytes_sent = 0; | 489 size_t bytes_sent = 0; |
501 while (bytes_sent < bytes) { | 490 while (bytes_sent < bytes) { |
502 int64_t now_ms = clock_->TimeInMilliseconds(); | 491 int64_t now_ms = clock_->TimeInMilliseconds(); |
503 uint32_t ssrc; | 492 uint32_t ssrc; |
504 uint32_t timestamp; | 493 uint32_t timestamp; |
505 int64_t capture_time_ms; | 494 int64_t capture_time_ms; |
506 uint16_t sequence_number; | 495 uint16_t sequence_number; |
507 int payload_type; | 496 int payload_type; |
508 bool over_rtx; | 497 bool over_rtx; |
509 { | 498 { |
510 rtc::CritScope lock(&send_critsect_); | 499 rtc::CritScope lock(&send_critsect_); |
511 if (!sending_media_) | 500 if (!sending_media_) |
512 break; | 501 break; |
513 timestamp = last_rtp_timestamp_; | 502 timestamp = last_rtp_timestamp_; |
514 capture_time_ms = capture_time_ms_; | 503 capture_time_ms = capture_time_ms_; |
515 if (rtx_ == kRtxOff) { | 504 if (rtx_ == kRtxOff) { |
516 if (payload_type_ == -1) | 505 // Without RTX we can't send padding in the middle of frames. |
| 506 if (!last_packet_marker_bit_) |
517 break; | 507 break; |
518 // Without RTX we can't send padding in the middle of frames. | |
519 // For audio marker bits doesn't mark the end of a frame and frames | |
520 // are usually a single packet, so for now we don't apply this rule | |
521 // for audio. | |
522 if (!audio_configured_ && !last_packet_marker_bit_) { | |
523 break; | |
524 } | |
525 ssrc = ssrc_; | 508 ssrc = ssrc_; |
526 sequence_number = sequence_number_; | 509 sequence_number = sequence_number_; |
527 ++sequence_number_; | 510 ++sequence_number_; |
528 payload_type = payload_type_; | 511 payload_type = payload_type_; |
529 over_rtx = false; | 512 over_rtx = false; |
530 } else { | 513 } else { |
531 // Without abs-send-time or transport sequence number a media packet | 514 // Without abs-send-time or transport sequence number a media packet |
532 // must be sent before padding so that the timestamps used for | 515 // must be sent before padding so that the timestamps used for |
533 // estimation are correct. | 516 // estimation are correct. |
534 if (!media_has_been_sent_ && | 517 if (!media_has_been_sent_ && |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 | 789 |
807 // RED+ULPFEC. | 790 // RED+ULPFEC. |
808 int pt_red; | 791 int pt_red; |
809 int pt_fec; | 792 int pt_fec; |
810 video_->GetUlpfecConfig(&pt_red, &pt_fec); | 793 video_->GetUlpfecConfig(&pt_red, &pt_fec); |
811 return static_cast<int>(packet.PayloadType()) == pt_red && | 794 return static_cast<int>(packet.PayloadType()) == pt_red && |
812 static_cast<int>(packet.payload()[0]) == pt_fec; | 795 static_cast<int>(packet.payload()[0]) == pt_fec; |
813 } | 796 } |
814 | 797 |
815 size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) { | 798 size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) { |
816 if (bytes == 0) | 799 if (audio_configured_ || bytes == 0) |
817 return 0; | 800 return 0; |
818 size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id); | 801 size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id); |
819 if (bytes_sent < bytes) | 802 if (bytes_sent < bytes) |
820 bytes_sent += SendPadData(bytes - bytes_sent, probe_cluster_id); | 803 bytes_sent += SendPadData(bytes - bytes_sent, probe_cluster_id); |
821 return bytes_sent; | 804 return bytes_sent; |
822 } | 805 } |
823 | 806 |
824 bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet, | 807 bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet, |
825 StorageType storage, | 808 StorageType storage, |
826 RtpPacketSender::Priority priority) { | 809 RtpPacketSender::Priority priority) { |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { | 1278 if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) { |
1296 return; | 1279 return; |
1297 } | 1280 } |
1298 rtp_overhead_bytes_per_packet_ = packet.headers_size(); | 1281 rtp_overhead_bytes_per_packet_ = packet.headers_size(); |
1299 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; | 1282 overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_; |
1300 } | 1283 } |
1301 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); | 1284 overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet); |
1302 } | 1285 } |
1303 | 1286 |
1304 } // namespace webrtc | 1287 } // namespace webrtc |
OLD | NEW |