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 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 | 612 |
613 // Fill data buffer with random data. | 613 // Fill data buffer with random data. |
614 for (size_t j = 0; j < (padding_length >> 2); ++j) { | 614 for (size_t j = 0; j < (padding_length >> 2); ++j) { |
615 data[j] = rand(); // NOLINT | 615 data[j] = rand(); // NOLINT |
616 } | 616 } |
617 // Set number of padding bytes in the last byte of the packet. | 617 // Set number of padding bytes in the last byte of the packet. |
618 packet[header_length + padding_length - 1] = | 618 packet[header_length + padding_length - 1] = |
619 static_cast<uint8_t>(padding_length); | 619 static_cast<uint8_t>(padding_length); |
620 } | 620 } |
621 | 621 |
622 size_t RTPSender::SendPadData(size_t bytes, | |
623 bool timestamp_provided, | |
624 uint32_t timestamp, | |
625 int64_t capture_time_ms) { | |
626 return SendPadData(bytes, timestamp_provided, timestamp, capture_time_ms, | |
627 PacketInfo::kNotAProbe); | |
628 } | |
629 | 622 |
630 size_t RTPSender::SendPadData(size_t bytes, | 623 size_t RTPSender::SendPadData(size_t bytes, |
631 bool timestamp_provided, | |
632 uint32_t timestamp, | |
633 int64_t capture_time_ms, | |
634 int probe_cluster_id) { | 624 int probe_cluster_id) { |
| 625 uint32_t timestamp = 0; |
| 626 int64_t capture_time_ms = 0; |
635 // Always send full padding packets. This is accounted for by the | 627 // Always send full padding packets. This is accounted for by the |
636 // RtpPacketSender, | 628 // RtpPacketSender, |
637 // which will make sure we don't send too much padding even if a single packet | 629 // which will make sure we don't send too much padding even if a single packet |
638 // is larger than requested. | 630 // is larger than requested. |
639 size_t padding_bytes_in_packet = | 631 size_t padding_bytes_in_packet = |
640 std::min(MaxDataPayloadLength(), kMaxPaddingLength); | 632 std::min(MaxDataPayloadLength(), kMaxPaddingLength); |
641 size_t bytes_sent = 0; | 633 size_t bytes_sent = 0; |
642 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( | 634 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( |
643 kRtpExtensionTransportSequenceNumber) && | 635 kRtpExtensionTransportSequenceNumber) && |
644 transport_sequence_number_allocator_; | 636 transport_sequence_number_allocator_; |
645 for (; bytes > 0; bytes -= padding_bytes_in_packet) { | 637 for (; bytes > 0; bytes -= padding_bytes_in_packet) { |
646 if (bytes < padding_bytes_in_packet) | 638 if (bytes < padding_bytes_in_packet) |
647 bytes = padding_bytes_in_packet; | 639 bytes = padding_bytes_in_packet; |
648 | 640 |
649 uint32_t ssrc; | 641 uint32_t ssrc; |
650 uint16_t sequence_number; | 642 uint16_t sequence_number; |
651 int payload_type; | 643 int payload_type; |
652 bool over_rtx; | 644 bool over_rtx; |
653 { | 645 { |
654 rtc::CritScope lock(&send_critsect_); | 646 rtc::CritScope lock(&send_critsect_); |
655 if (!sending_media_) | 647 if (!sending_media_) |
656 return bytes_sent; | 648 return bytes_sent; |
657 if (!timestamp_provided) { | 649 timestamp = timestamp_; |
658 timestamp = timestamp_; | 650 capture_time_ms = capture_time_ms_; |
659 capture_time_ms = capture_time_ms_; | |
660 } | |
661 if (rtx_ == kRtxOff) { | 651 if (rtx_ == kRtxOff) { |
662 // Without RTX we can't send padding in the middle of frames. | 652 // Without RTX we can't send padding in the middle of frames. |
663 if (!last_packet_marker_bit_) | 653 if (!last_packet_marker_bit_) |
664 return 0; | 654 return 0; |
665 ssrc = ssrc_; | 655 ssrc = ssrc_; |
666 sequence_number = sequence_number_; | 656 sequence_number = sequence_number_; |
667 ++sequence_number_; | 657 ++sequence_number_; |
668 payload_type = payload_type_; | 658 payload_type = payload_type_; |
669 over_rtx = false; | 659 over_rtx = false; |
670 } else { | 660 } else { |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1046 return fec_enabled && | 1036 return fec_enabled && |
1047 header.payloadType == pt_red && | 1037 header.payloadType == pt_red && |
1048 buffer[header.headerLength] == pt_fec; | 1038 buffer[header.headerLength] == pt_fec; |
1049 } | 1039 } |
1050 | 1040 |
1051 size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) { | 1041 size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) { |
1052 if (audio_configured_ || bytes == 0) | 1042 if (audio_configured_ || bytes == 0) |
1053 return 0; | 1043 return 0; |
1054 size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id); | 1044 size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id); |
1055 if (bytes_sent < bytes) | 1045 if (bytes_sent < bytes) |
1056 bytes_sent += | 1046 bytes_sent += SendPadData(bytes - bytes_sent, probe_cluster_id); |
1057 SendPadData(bytes - bytes_sent, false, 0, 0, probe_cluster_id); | |
1058 return bytes_sent; | 1047 return bytes_sent; |
1059 } | 1048 } |
1060 | 1049 |
1061 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | 1050 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. |
1062 int32_t RTPSender::SendToNetwork(uint8_t* buffer, | 1051 int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
1063 size_t payload_length, | 1052 size_t payload_length, |
1064 size_t rtp_header_length, | 1053 size_t rtp_header_length, |
1065 int64_t capture_time_ms, | 1054 int64_t capture_time_ms, |
1066 StorageType storage, | 1055 StorageType storage, |
1067 RtpPacketSender::Priority priority) { | 1056 RtpPacketSender::Priority priority) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 ByteWriter<uint32_t>::WriteBigEndian(ptr, csrcs[i]); | 1222 ByteWriter<uint32_t>::WriteBigEndian(ptr, csrcs[i]); |
1234 ptr += 4; | 1223 ptr += 4; |
1235 } | 1224 } |
1236 header[0] = (header[0] & 0xf0) | csrcs.size(); | 1225 header[0] = (header[0] & 0xf0) | csrcs.size(); |
1237 | 1226 |
1238 // Update length of header. | 1227 // Update length of header. |
1239 rtp_header_length += sizeof(uint32_t) * csrcs.size(); | 1228 rtp_header_length += sizeof(uint32_t) * csrcs.size(); |
1240 } | 1229 } |
1241 | 1230 |
1242 uint16_t len = | 1231 uint16_t len = |
1243 BuildRTPHeaderExtension(header + rtp_header_length, marker_bit); | 1232 BuildRtpHeaderExtension(header + rtp_header_length, marker_bit); |
1244 if (len > 0) { | 1233 if (len > 0) { |
1245 header[0] |= 0x10; // Set extension bit. | 1234 header[0] |= 0x10; // Set extension bit. |
1246 rtp_header_length += len; | 1235 rtp_header_length += len; |
1247 } | 1236 } |
1248 return rtp_header_length; | 1237 return rtp_header_length; |
1249 } | 1238 } |
1250 | 1239 |
1251 int32_t RTPSender::BuildRTPheader(uint8_t* data_buffer, | 1240 int32_t RTPSender::BuildRtpHeader(uint8_t* data_buffer, |
1252 int8_t payload_type, | 1241 int8_t payload_type, |
1253 bool marker_bit, | 1242 bool marker_bit, |
1254 uint32_t capture_timestamp, | 1243 uint32_t capture_timestamp, |
1255 int64_t capture_time_ms, | 1244 int64_t capture_time_ms) { |
1256 bool timestamp_provided, | |
1257 bool inc_sequence_number) { | |
1258 assert(payload_type >= 0); | 1245 assert(payload_type >= 0); |
1259 rtc::CritScope lock(&send_critsect_); | 1246 rtc::CritScope lock(&send_critsect_); |
1260 | 1247 |
1261 if (timestamp_provided) { | 1248 timestamp_ = start_timestamp_ + capture_timestamp; |
1262 timestamp_ = start_timestamp_ + capture_timestamp; | |
1263 } else { | |
1264 // Make a unique time stamp. | |
1265 // We can't inc by the actual time, since then we increase the risk of back | |
1266 // timing. | |
1267 timestamp_++; | |
1268 } | |
1269 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); | 1249 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); |
1270 uint32_t sequence_number = sequence_number_++; | 1250 uint32_t sequence_number = sequence_number_++; |
1271 capture_time_ms_ = capture_time_ms; | 1251 capture_time_ms_ = capture_time_ms; |
1272 last_packet_marker_bit_ = marker_bit; | 1252 last_packet_marker_bit_ = marker_bit; |
1273 return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit, | 1253 return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit, |
1274 timestamp_, sequence_number, csrcs_); | 1254 timestamp_, sequence_number, csrcs_); |
1275 } | 1255 } |
1276 | 1256 |
1277 uint16_t RTPSender::BuildRTPHeaderExtension(uint8_t* data_buffer, | 1257 uint16_t RTPSender::BuildRtpHeaderExtension(uint8_t* data_buffer, |
1278 bool marker_bit) const { | 1258 bool marker_bit) const { |
1279 if (rtp_header_extension_map_.Size() <= 0) { | 1259 if (rtp_header_extension_map_.Size() <= 0) { |
1280 return 0; | 1260 return 0; |
1281 } | 1261 } |
1282 // RTP header extension, RFC 3550. | 1262 // RTP header extension, RFC 3550. |
1283 // 0 1 2 3 | 1263 // 0 1 2 3 |
1284 // 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 | 1264 // 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 |
1285 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1265 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
1286 // | defined by profile | length | | 1266 // | defined by profile | length | |
1287 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1267 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1996 rtc::CritScope lock(&send_critsect_); | 1976 rtc::CritScope lock(&send_critsect_); |
1997 | 1977 |
1998 RtpState state; | 1978 RtpState state; |
1999 state.sequence_number = sequence_number_rtx_; | 1979 state.sequence_number = sequence_number_rtx_; |
2000 state.start_timestamp = start_timestamp_; | 1980 state.start_timestamp = start_timestamp_; |
2001 | 1981 |
2002 return state; | 1982 return state; |
2003 } | 1983 } |
2004 | 1984 |
2005 } // namespace webrtc | 1985 } // namespace webrtc |
OLD | NEW |