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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
96 BitrateObserver retransmit_bitrate_observer_; | 96 BitrateObserver retransmit_bitrate_observer_; |
97 uint32_t ssrc_; | 97 uint32_t ssrc_; |
98 }; | 98 }; |
99 | 99 |
100 RTPSender::RTPSender(int32_t id, | 100 RTPSender::RTPSender(int32_t id, |
101 bool audio, | 101 bool audio, |
102 Clock* clock, | 102 Clock* clock, |
103 Transport* transport, | 103 Transport* transport, |
104 RtpAudioFeedback* audio_feedback, | 104 RtpAudioFeedback* audio_feedback, |
105 PacedSender* paced_sender, | 105 PacedSender* paced_sender, |
106 PacketRouter* packet_router, | |
106 BitrateStatisticsObserver* bitrate_callback, | 107 BitrateStatisticsObserver* bitrate_callback, |
107 FrameCountObserver* frame_count_observer, | 108 FrameCountObserver* frame_count_observer, |
108 SendSideDelayObserver* send_side_delay_observer) | 109 SendSideDelayObserver* send_side_delay_observer) |
109 : clock_(clock), | 110 : clock_(clock), |
110 // TODO(holmer): Remove this conversion when we remove the use of | 111 // TODO(holmer): Remove this conversion when we remove the use of |
111 // TickTime. | 112 // TickTime. |
112 clock_delta_ms_(clock_->TimeInMilliseconds() - | 113 clock_delta_ms_(clock_->TimeInMilliseconds() - |
113 TickTime::MillisecondTimestamp()), | 114 TickTime::MillisecondTimestamp()), |
114 bitrates_(new BitrateAggregator(bitrate_callback)), | 115 bitrates_(new BitrateAggregator(bitrate_callback)), |
115 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), | 116 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), |
116 id_(id), | 117 id_(id), |
117 audio_configured_(audio), | 118 audio_configured_(audio), |
118 audio_(audio ? new RTPSenderAudio(id, clock, this, audio_feedback) | 119 audio_(audio ? new RTPSenderAudio(id, clock, this, audio_feedback) |
119 : nullptr), | 120 : nullptr), |
120 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), | 121 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), |
121 paced_sender_(paced_sender), | 122 paced_sender_(paced_sender), |
123 packet_router_(packet_router), | |
122 last_capture_time_ms_sent_(0), | 124 last_capture_time_ms_sent_(0), |
123 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 125 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
124 transport_(transport), | 126 transport_(transport), |
125 sending_media_(true), // Default to sending media. | 127 sending_media_(true), // Default to sending media. |
126 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 128 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
127 packet_over_head_(28), | 129 packet_over_head_(28), |
128 payload_type_(-1), | 130 payload_type_(-1), |
129 payload_type_map_(), | 131 payload_type_map_(), |
130 rtp_header_extension_map_(), | 132 rtp_header_extension_map_(), |
131 transmission_time_offset_(0), | 133 transmission_time_offset_(0), |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
596 } | 598 } |
597 } | 599 } |
598 return SendPadData(timestamp, capture_time_ms, bytes); | 600 return SendPadData(timestamp, capture_time_ms, bytes); |
599 } | 601 } |
600 | 602 |
601 size_t RTPSender::SendPadData(uint32_t timestamp, | 603 size_t RTPSender::SendPadData(uint32_t timestamp, |
602 int64_t capture_time_ms, | 604 int64_t capture_time_ms, |
603 size_t bytes) { | 605 size_t bytes) { |
604 size_t padding_bytes_in_packet = 0; | 606 size_t padding_bytes_in_packet = 0; |
605 size_t bytes_sent = 0; | 607 size_t bytes_sent = 0; |
608 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( | |
609 kRtpExtensionTransportSequenceNumber) && | |
610 packet_router_; | |
606 for (; bytes > 0; bytes -= padding_bytes_in_packet) { | 611 for (; bytes > 0; bytes -= padding_bytes_in_packet) { |
607 // Always send full padding packets. | 612 // Always send full padding packets. |
608 if (bytes < kMaxPaddingLength) | 613 if (bytes < kMaxPaddingLength) |
609 bytes = kMaxPaddingLength; | 614 bytes = kMaxPaddingLength; |
610 | 615 |
611 uint32_t ssrc; | 616 uint32_t ssrc; |
612 uint16_t sequence_number; | 617 uint16_t sequence_number; |
613 int payload_type; | 618 int payload_type; |
614 bool over_rtx; | 619 bool over_rtx; |
615 { | 620 { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
652 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); | 657 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); |
653 RTPHeader rtp_header; | 658 RTPHeader rtp_header; |
654 rtp_parser.Parse(rtp_header); | 659 rtp_parser.Parse(rtp_header); |
655 | 660 |
656 if (capture_time_ms > 0) { | 661 if (capture_time_ms > 0) { |
657 UpdateTransmissionTimeOffset( | 662 UpdateTransmissionTimeOffset( |
658 padding_packet, length, rtp_header, now_ms - capture_time_ms); | 663 padding_packet, length, rtp_header, now_ms - capture_time_ms); |
659 } | 664 } |
660 | 665 |
661 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); | 666 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); |
667 | |
668 uint16_t transport_seq = 0; | |
669 if (using_transport_seq) { | |
670 transport_seq = | |
671 UpdateTransportSequenceNumber(padding_packet, length, rtp_header); | |
672 } | |
673 | |
674 UpdateTransportSequenceNumber(padding_packet, length, rtp_header); | |
662 if (!SendPacketToNetwork(padding_packet, length)) | 675 if (!SendPacketToNetwork(padding_packet, length)) |
663 break; | 676 break; |
677 if (using_transport_seq) | |
678 packet_router_->OnPacketSent(transport_seq, now_ms); | |
679 | |
664 bytes_sent += padding_bytes_in_packet; | 680 bytes_sent += padding_bytes_in_packet; |
665 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); | 681 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); |
666 } | 682 } |
667 | 683 |
668 return bytes_sent; | 684 return bytes_sent; |
669 } | 685 } |
670 | 686 |
671 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { | 687 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { |
672 packet_history_.SetStorePacketsStatus(enable, number_to_store); | 688 packet_history_.SetStorePacketsStatus(enable, number_to_store); |
673 } | 689 } |
(...skipping 29 matching lines...) Expand all Loading... | |
703 // We can't send the packet right now. | 719 // We can't send the packet right now. |
704 // We will be called when it is time. | 720 // We will be called when it is time. |
705 return length; | 721 return length; |
706 } | 722 } |
707 } | 723 } |
708 int rtx = kRtxOff; | 724 int rtx = kRtxOff; |
709 { | 725 { |
710 CriticalSectionScoped lock(send_critsect_.get()); | 726 CriticalSectionScoped lock(send_critsect_.get()); |
711 rtx = rtx_; | 727 rtx = rtx_; |
712 } | 728 } |
713 return PrepareAndSendPacket(data_buffer, length, capture_time_ms, | 729 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, |
714 (rtx & kRtxRetransmitted) > 0, true) ? | 730 (rtx & kRtxRetransmitted) > 0, true)) { |
715 static_cast<int32_t>(length) : -1; | 731 return -1; |
732 } | |
733 return static_cast<int32_t>(length); | |
716 } | 734 } |
717 | 735 |
718 bool RTPSender::SendPacketToNetwork(const uint8_t *packet, size_t size) { | 736 bool RTPSender::SendPacketToNetwork(const uint8_t *packet, size_t size) { |
719 int bytes_sent = -1; | 737 int bytes_sent = -1; |
720 if (transport_) { | 738 if (transport_) { |
721 bytes_sent = transport_->SendPacket(id_, packet, size); | 739 bytes_sent = transport_->SendPacket(id_, packet, size); |
722 } | 740 } |
723 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 741 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
724 "RTPSender::SendPacketToNetwork", "size", size, "sent", | 742 "RTPSender::SendPacketToNetwork", "size", size, "sent", |
725 bytes_sent); | 743 bytes_sent); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
890 if (send_over_rtx) { | 908 if (send_over_rtx) { |
891 BuildRtxPacket(buffer, &length, data_buffer_rtx); | 909 BuildRtxPacket(buffer, &length, data_buffer_rtx); |
892 buffer_to_send_ptr = data_buffer_rtx; | 910 buffer_to_send_ptr = data_buffer_rtx; |
893 } | 911 } |
894 | 912 |
895 int64_t now_ms = clock_->TimeInMilliseconds(); | 913 int64_t now_ms = clock_->TimeInMilliseconds(); |
896 int64_t diff_ms = now_ms - capture_time_ms; | 914 int64_t diff_ms = now_ms - capture_time_ms; |
897 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, | 915 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, |
898 diff_ms); | 916 diff_ms); |
899 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); | 917 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); |
918 | |
919 uint16_t transport_seq = 0; | |
920 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( | |
921 kRtpExtensionTransportSequenceNumber) && | |
922 packet_router_; | |
923 if (using_transport_seq) { | |
924 transport_seq = | |
925 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); | |
stefan-webrtc
2015/07/22 10:49:00
You have probably thought about this, but is there
sprang_webrtc
2015/07/22 15:11:32
Three reasons:
1. When it's TimeToSendPadding<tm>
stefan-webrtc
2015/07/27 12:13:49
Acknowledged.
| |
926 } | |
927 | |
900 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length); | 928 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length); |
901 if (ret) { | 929 if (ret) { |
902 CriticalSectionScoped lock(send_critsect_.get()); | 930 CriticalSectionScoped lock(send_critsect_.get()); |
903 media_has_been_sent_ = true; | 931 media_has_been_sent_ = true; |
904 } | 932 } |
933 if (using_transport_seq) | |
934 packet_router_->OnPacketSent(transport_seq, now_ms); | |
905 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, | 935 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, |
906 is_retransmit); | 936 is_retransmit); |
907 return ret; | 937 return ret; |
908 } | 938 } |
909 | 939 |
910 void RTPSender::UpdateRtpStats(const uint8_t* buffer, | 940 void RTPSender::UpdateRtpStats(const uint8_t* buffer, |
911 size_t packet_length, | 941 size_t packet_length, |
912 const RTPHeader& header, | 942 const RTPHeader& header, |
913 bool is_rtx, | 943 bool is_rtx, |
914 bool is_retransmit) { | 944 bool is_retransmit) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
953 return fec_enabled && | 983 return fec_enabled && |
954 header.payloadType == pt_red && | 984 header.payloadType == pt_red && |
955 buffer[header.headerLength] == pt_fec; | 985 buffer[header.headerLength] == pt_fec; |
956 } | 986 } |
957 | 987 |
958 size_t RTPSender::TimeToSendPadding(size_t bytes) { | 988 size_t RTPSender::TimeToSendPadding(size_t bytes) { |
959 if (bytes == 0) | 989 if (bytes == 0) |
960 return 0; | 990 return 0; |
961 { | 991 { |
962 CriticalSectionScoped cs(send_critsect_.get()); | 992 CriticalSectionScoped cs(send_critsect_.get()); |
963 if (!sending_media_) return 0; | 993 if (!sending_media_) |
994 return 0; | |
964 } | 995 } |
965 size_t bytes_sent = TrySendRedundantPayloads(bytes); | 996 size_t bytes_sent = TrySendRedundantPayloads(bytes); |
966 if (bytes_sent < bytes) | 997 if (bytes_sent < bytes) |
967 bytes_sent += TrySendPadData(bytes - bytes_sent); | 998 bytes_sent += TrySendPadData(bytes - bytes_sent); |
968 return bytes_sent; | 999 return bytes_sent; |
969 } | 1000 } |
970 | 1001 |
971 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | 1002 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. |
972 int32_t RTPSender::SendToNetwork( | 1003 int32_t RTPSender::SendToNetwork( |
973 uint8_t *buffer, size_t payload_length, size_t rtp_header_length, | 1004 uint8_t *buffer, size_t payload_length, size_t rtp_header_length, |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1205 case kRtpExtensionAudioLevel: | 1236 case kRtpExtensionAudioLevel: |
1206 block_length = BuildAudioLevelExtension(extension_data); | 1237 block_length = BuildAudioLevelExtension(extension_data); |
1207 break; | 1238 break; |
1208 case kRtpExtensionAbsoluteSendTime: | 1239 case kRtpExtensionAbsoluteSendTime: |
1209 block_length = BuildAbsoluteSendTimeExtension(extension_data); | 1240 block_length = BuildAbsoluteSendTimeExtension(extension_data); |
1210 break; | 1241 break; |
1211 case kRtpExtensionVideoRotation: | 1242 case kRtpExtensionVideoRotation: |
1212 block_length = BuildVideoRotationExtension(extension_data); | 1243 block_length = BuildVideoRotationExtension(extension_data); |
1213 break; | 1244 break; |
1214 case kRtpExtensionTransportSequenceNumber: | 1245 case kRtpExtensionTransportSequenceNumber: |
1215 block_length = BuildTransportSequenceNumberExtension(extension_data); | 1246 block_length = BuildTransportSequenceNumberExtension( |
1247 extension_data, transport_sequence_number_); | |
1216 break; | 1248 break; |
1217 default: | 1249 default: |
1218 assert(false); | 1250 assert(false); |
1219 } | 1251 } |
1220 total_block_length += block_length; | 1252 total_block_length += block_length; |
1221 type = rtp_header_extension_map_.Next(type); | 1253 type = rtp_header_extension_map_.Next(type); |
1222 } | 1254 } |
1223 if (total_block_length == 0) { | 1255 if (total_block_length == 0) { |
1224 // No extension added. | 1256 // No extension added. |
1225 return 0; | 1257 return 0; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1358 } | 1390 } |
1359 size_t pos = 0; | 1391 size_t pos = 0; |
1360 const uint8_t len = 0; | 1392 const uint8_t len = 0; |
1361 data_buffer[pos++] = (id << 4) + len; | 1393 data_buffer[pos++] = (id << 4) + len; |
1362 data_buffer[pos++] = ConvertVideoRotationToCVOByte(rotation_); | 1394 data_buffer[pos++] = ConvertVideoRotationToCVOByte(rotation_); |
1363 assert(pos == kVideoRotationLength); | 1395 assert(pos == kVideoRotationLength); |
1364 return kVideoRotationLength; | 1396 return kVideoRotationLength; |
1365 } | 1397 } |
1366 | 1398 |
1367 uint8_t RTPSender::BuildTransportSequenceNumberExtension( | 1399 uint8_t RTPSender::BuildTransportSequenceNumberExtension( |
1368 uint8_t* data_buffer) const { | 1400 uint8_t* data_buffer, |
1401 uint16_t sequence_number) const { | |
1369 // 0 1 2 | 1402 // 0 1 2 |
1370 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 | 1403 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 |
1371 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1404 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
1372 // | ID | L=1 |transport wide sequence number | | 1405 // | ID | L=1 |transport wide sequence number | |
1373 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1406 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
1374 | 1407 |
1375 // Get id defined by user. | 1408 // Get id defined by user. |
1376 uint8_t id; | 1409 uint8_t id; |
1377 if (rtp_header_extension_map_.GetId(kRtpExtensionTransportSequenceNumber, | 1410 if (rtp_header_extension_map_.GetId(kRtpExtensionTransportSequenceNumber, |
1378 &id) != 0) { | 1411 &id) != 0) { |
1379 // Not registered. | 1412 // Not registered. |
1380 return 0; | 1413 return 0; |
1381 } | 1414 } |
1382 size_t pos = 0; | 1415 size_t pos = 0; |
1383 const uint8_t len = 1; | 1416 const uint8_t len = 1; |
1384 data_buffer[pos++] = (id << 4) + len; | 1417 data_buffer[pos++] = (id << 4) + len; |
1385 ByteWriter<uint16_t>::WriteBigEndian(data_buffer + pos, | 1418 ByteWriter<uint16_t>::WriteBigEndian(data_buffer + pos, sequence_number); |
1386 transport_sequence_number_); | |
1387 pos += 2; | 1419 pos += 2; |
1388 assert(pos == kTransportSequenceNumberLength); | 1420 assert(pos == kTransportSequenceNumberLength); |
1389 return kTransportSequenceNumberLength; | 1421 return kTransportSequenceNumberLength; |
1390 } | 1422 } |
1391 | 1423 |
1392 bool RTPSender::FindHeaderExtensionPosition(RTPExtensionType type, | 1424 bool RTPSender::FindHeaderExtensionPosition(RTPExtensionType type, |
1393 const uint8_t* rtp_packet, | 1425 const uint8_t* rtp_packet, |
1394 size_t rtp_packet_length, | 1426 size_t rtp_packet_length, |
1395 const RTPHeader& rtp_header, | 1427 const RTPHeader& rtp_header, |
1396 size_t* position) const { | 1428 size_t* position) const { |
(...skipping 22 matching lines...) Expand all Loading... | |
1419 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { | 1451 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { |
1420 LOG(LS_WARNING) << "Failed to find extension position for " << type | 1452 LOG(LS_WARNING) << "Failed to find extension position for " << type |
1421 << "as hdr extension not found."; | 1453 << "as hdr extension not found."; |
1422 return false; | 1454 return false; |
1423 } | 1455 } |
1424 | 1456 |
1425 *position = block_pos; | 1457 *position = block_pos; |
1426 return true; | 1458 return true; |
1427 } | 1459 } |
1428 | 1460 |
1461 RTPSender::ExtensionStatus RTPSender::VerifyExtension( | |
1462 RTPExtensionType extension_type, | |
1463 uint8_t* rtp_packet, | |
1464 size_t rtp_packet_length, | |
1465 const RTPHeader& rtp_header, | |
1466 size_t extension_length_bytes, | |
1467 size_t* extension_offset) const { | |
1468 // Get id. | |
1469 uint8_t id = 0; | |
1470 if (rtp_header_extension_map_.GetId(extension_type, &id) != 0) | |
1471 return ExtensionStatus::kNotRegistered; | |
1472 | |
1473 size_t block_pos = 0; | |
1474 if (!FindHeaderExtensionPosition(extension_type, rtp_packet, | |
1475 rtp_packet_length, rtp_header, &block_pos)) | |
1476 return ExtensionStatus::kError; | |
1477 | |
1478 // Verify that header contains extension. | |
1479 if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) && | |
1480 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { | |
1481 LOG(LS_WARNING) | |
1482 << "Failed to update absolute send time, hdr extension not found."; | |
1483 return ExtensionStatus::kError; | |
1484 } | |
1485 | |
1486 // Verify first byte in block. | |
1487 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2); | |
1488 if (rtp_packet[block_pos] != first_block_byte) | |
1489 return ExtensionStatus::kError; | |
1490 | |
1491 *extension_offset = block_pos; | |
1492 return ExtensionStatus::kOk; | |
1493 } | |
1494 | |
1429 void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, | 1495 void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, |
1430 size_t rtp_packet_length, | 1496 size_t rtp_packet_length, |
1431 const RTPHeader& rtp_header, | 1497 const RTPHeader& rtp_header, |
1432 int64_t time_diff_ms) const { | 1498 int64_t time_diff_ms) const { |
1499 size_t offset; | |
1433 CriticalSectionScoped cs(send_critsect_.get()); | 1500 CriticalSectionScoped cs(send_critsect_.get()); |
1434 // Get id. | 1501 switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet, |
1435 uint8_t id = 0; | 1502 rtp_packet_length, rtp_header, |
1436 if (rtp_header_extension_map_.GetId(kRtpExtensionTransmissionTimeOffset, | 1503 kTransmissionTimeOffsetLength, &offset)) { |
1437 &id) != 0) { | 1504 case ExtensionStatus::kNotRegistered: |
1438 // Not registered. | 1505 return; |
1439 return; | 1506 case ExtensionStatus::kError: |
1507 LOG(LS_WARNING) << "Failed to update transmission time offset."; | |
1508 return; | |
1509 case ExtensionStatus::kOk: | |
1510 break; | |
1511 default: | |
1512 RTC_NOTREACHED(); | |
1440 } | 1513 } |
1441 | 1514 |
1442 size_t block_pos = 0; | |
1443 if (!FindHeaderExtensionPosition(kRtpExtensionTransmissionTimeOffset, | |
1444 rtp_packet, rtp_packet_length, rtp_header, | |
1445 &block_pos)) { | |
1446 LOG(LS_WARNING) << "Failed to update transmission time offset."; | |
1447 return; | |
1448 } | |
1449 | |
1450 // Verify first byte in block. | |
1451 const uint8_t first_block_byte = (id << 4) + 2; | |
1452 if (rtp_packet[block_pos] != first_block_byte) { | |
1453 LOG(LS_WARNING) << "Failed to update transmission time offset."; | |
1454 return; | |
1455 } | |
1456 // Update transmission offset field (converting to a 90 kHz timestamp). | 1515 // Update transmission offset field (converting to a 90 kHz timestamp). |
1457 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + block_pos + 1, | 1516 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, |
1458 time_diff_ms * 90); // RTP timestamp. | 1517 time_diff_ms * 90); // RTP timestamp. |
1459 } | 1518 } |
1460 | 1519 |
1461 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, | 1520 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, |
1462 size_t rtp_packet_length, | 1521 size_t rtp_packet_length, |
1463 const RTPHeader& rtp_header, | 1522 const RTPHeader& rtp_header, |
1464 bool is_voiced, | 1523 bool is_voiced, |
1465 uint8_t dBov) const { | 1524 uint8_t dBov) const { |
1525 size_t offset; | |
1466 CriticalSectionScoped cs(send_critsect_.get()); | 1526 CriticalSectionScoped cs(send_critsect_.get()); |
1467 | 1527 |
1468 // Get id. | 1528 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, |
1469 uint8_t id = 0; | 1529 rtp_packet_length, rtp_header, kAudioLevelLength, |
1470 if (rtp_header_extension_map_.GetId(kRtpExtensionAudioLevel, &id) != 0) { | 1530 &offset)) { |
1471 // Not registered. | 1531 case ExtensionStatus::kNotRegistered: |
1472 return false; | 1532 return false; |
1533 case ExtensionStatus::kError: | |
1534 LOG(LS_WARNING) << "Failed to update audio level."; | |
1535 return false; | |
1536 case ExtensionStatus::kOk: | |
1537 break; | |
1538 default: | |
1539 RTC_NOTREACHED(); | |
1473 } | 1540 } |
1474 | 1541 |
1475 size_t block_pos = 0; | 1542 rtp_packet[offset + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f); |
1476 if (!FindHeaderExtensionPosition(kRtpExtensionAudioLevel, rtp_packet, | |
1477 rtp_packet_length, rtp_header, &block_pos)) { | |
1478 LOG(LS_WARNING) << "Failed to update audio level."; | |
1479 return false; | |
1480 } | |
1481 | |
1482 // Verify first byte in block. | |
1483 const uint8_t first_block_byte = (id << 4) + 0; | |
1484 if (rtp_packet[block_pos] != first_block_byte) { | |
1485 LOG(LS_WARNING) << "Failed to update audio level."; | |
1486 return false; | |
1487 } | |
1488 rtp_packet[block_pos + 1] = (is_voiced ? 0x80 : 0x00) + (dBov & 0x7f); | |
1489 return true; | 1543 return true; |
1490 } | 1544 } |
1491 | 1545 |
1492 bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet, | 1546 bool RTPSender::UpdateVideoRotation(uint8_t* rtp_packet, |
1493 size_t rtp_packet_length, | 1547 size_t rtp_packet_length, |
1494 const RTPHeader& rtp_header, | 1548 const RTPHeader& rtp_header, |
1495 VideoRotation rotation) const { | 1549 VideoRotation rotation) const { |
1550 size_t offset; | |
1496 CriticalSectionScoped cs(send_critsect_.get()); | 1551 CriticalSectionScoped cs(send_critsect_.get()); |
1497 | 1552 |
1498 // Get id. | 1553 switch (VerifyExtension(kRtpExtensionVideoRotation, rtp_packet, |
1499 uint8_t id = 0; | 1554 rtp_packet_length, rtp_header, kVideoRotationLength, |
1500 if (rtp_header_extension_map_.GetId(kRtpExtensionVideoRotation, &id) != 0) { | 1555 &offset)) { |
1501 // Not registered. | 1556 case ExtensionStatus::kNotRegistered: |
1502 return false; | 1557 return false; |
1558 case ExtensionStatus::kError: | |
1559 LOG(LS_WARNING) << "Failed to update CVO."; | |
1560 return false; | |
1561 case ExtensionStatus::kOk: | |
1562 break; | |
1563 default: | |
1564 RTC_NOTREACHED(); | |
1503 } | 1565 } |
1504 | 1566 |
1505 size_t block_pos = 0; | 1567 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); |
1506 if (!FindHeaderExtensionPosition(kRtpExtensionVideoRotation, rtp_packet, | |
1507 rtp_packet_length, rtp_header, &block_pos)) { | |
1508 LOG(LS_WARNING) << "Failed to update video rotation (CVO)."; | |
1509 return false; | |
1510 } | |
1511 // Get length until start of header extension block. | |
1512 int extension_block_pos = | |
1513 rtp_header_extension_map_.GetLengthUntilBlockStartInBytes( | |
1514 kRtpExtensionVideoRotation); | |
1515 if (extension_block_pos < 0) { | |
1516 // The feature is not enabled. | |
1517 return false; | |
1518 } | |
1519 | |
1520 // Verify first byte in block. | |
1521 const uint8_t first_block_byte = (id << 4) + 0; | |
1522 if (rtp_packet[block_pos] != first_block_byte) { | |
1523 LOG(LS_WARNING) << "Failed to update CVO."; | |
1524 return false; | |
1525 } | |
1526 rtp_packet[block_pos + 1] = ConvertVideoRotationToCVOByte(rotation); | |
1527 return true; | 1568 return true; |
1528 } | 1569 } |
1529 | 1570 |
1530 void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, | 1571 void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, |
1531 size_t rtp_packet_length, | 1572 size_t rtp_packet_length, |
1532 const RTPHeader& rtp_header, | 1573 const RTPHeader& rtp_header, |
1533 int64_t now_ms) const { | 1574 int64_t now_ms) const { |
1575 size_t offset; | |
1534 CriticalSectionScoped cs(send_critsect_.get()); | 1576 CriticalSectionScoped cs(send_critsect_.get()); |
1535 | 1577 |
1536 // Get id. | 1578 switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet, |
1537 uint8_t id = 0; | 1579 rtp_packet_length, rtp_header, |
1538 if (rtp_header_extension_map_.GetId(kRtpExtensionAbsoluteSendTime, | 1580 kAbsoluteSendTimeLength, &offset)) { |
1539 &id) != 0) { | 1581 case ExtensionStatus::kNotRegistered: |
1540 // Not registered. | 1582 return; |
1541 return; | 1583 case ExtensionStatus::kError: |
1584 LOG(LS_WARNING) << "Failed to update absolute send time"; | |
1585 return; | |
1586 case ExtensionStatus::kOk: | |
1587 break; | |
1588 default: | |
1589 RTC_NOTREACHED(); | |
1542 } | 1590 } |
1543 // Get length until start of header extension block. | 1591 |
1544 int extension_block_pos = | |
1545 rtp_header_extension_map_.GetLengthUntilBlockStartInBytes( | |
1546 kRtpExtensionAbsoluteSendTime); | |
1547 if (extension_block_pos < 0) { | |
1548 // The feature is not enabled. | |
1549 return; | |
1550 } | |
1551 size_t block_pos = | |
1552 kRtpHeaderLength + rtp_header.numCSRCs + extension_block_pos; | |
1553 if (rtp_packet_length < block_pos + kAbsoluteSendTimeLength || | |
1554 rtp_header.headerLength < block_pos + kAbsoluteSendTimeLength) { | |
1555 LOG(LS_WARNING) << "Failed to update absolute send time, invalid length."; | |
1556 return; | |
1557 } | |
1558 // Verify that header contains extension. | |
1559 if (!((rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs] == 0xBE) && | |
1560 (rtp_packet[kRtpHeaderLength + rtp_header.numCSRCs + 1] == 0xDE))) { | |
1561 LOG(LS_WARNING) | |
1562 << "Failed to update absolute send time, hdr extension not found."; | |
1563 return; | |
1564 } | |
1565 // Verify first byte in block. | |
1566 const uint8_t first_block_byte = (id << 4) + 2; | |
1567 if (rtp_packet[block_pos] != first_block_byte) { | |
1568 LOG(LS_WARNING) << "Failed to update absolute send time."; | |
1569 return; | |
1570 } | |
1571 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit | 1592 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit |
1572 // fractional part). | 1593 // fractional part). |
1573 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + block_pos + 1, | 1594 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, |
1574 ((now_ms << 18) / 1000) & 0x00ffffff); | 1595 ((now_ms << 18) / 1000) & 0x00ffffff); |
1575 } | 1596 } |
1576 | 1597 |
1598 uint16_t RTPSender::UpdateTransportSequenceNumber( | |
1599 uint8_t* rtp_packet, | |
1600 size_t rtp_packet_length, | |
1601 const RTPHeader& rtp_header) const { | |
1602 size_t offset; | |
1603 CriticalSectionScoped cs(send_critsect_.get()); | |
1604 | |
1605 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, | |
1606 rtp_packet_length, rtp_header, | |
1607 kTransportSequenceNumberLength, &offset)) { | |
1608 case ExtensionStatus::kNotRegistered: | |
1609 return 0; | |
1610 case ExtensionStatus::kError: | |
1611 LOG(LS_WARNING) << "Failed to update transport sequence number"; | |
1612 return 0; | |
1613 case ExtensionStatus::kOk: | |
1614 break; | |
1615 default: | |
1616 RTC_NOTREACHED(); | |
1617 } | |
1618 | |
1619 uint16_t seq = packet_router_->AllocateSequenceNumber(); | |
1620 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); | |
1621 return seq; | |
1622 } | |
1623 | |
1577 void RTPSender::SetSendingStatus(bool enabled) { | 1624 void RTPSender::SetSendingStatus(bool enabled) { |
1578 if (enabled) { | 1625 if (enabled) { |
1579 uint32_t frequency_hz = SendPayloadFrequency(); | 1626 uint32_t frequency_hz = SendPayloadFrequency(); |
1580 uint32_t RTPtime = RtpUtility::GetCurrentRTP(clock_, frequency_hz); | 1627 uint32_t RTPtime = RtpUtility::GetCurrentRTP(clock_, frequency_hz); |
1581 | 1628 |
1582 // Will be ignored if it's already configured via API. | 1629 // Will be ignored if it's already configured via API. |
1583 SetStartTimestamp(RTPtime, false); | 1630 SetStartTimestamp(RTPtime, false); |
1584 } else { | 1631 } else { |
1585 CriticalSectionScoped lock(send_critsect_.get()); | 1632 CriticalSectionScoped lock(send_critsect_.get()); |
1586 if (!ssrc_forced_) { | 1633 if (!ssrc_forced_) { |
1587 // Generate a new SSRC. | 1634 // Generate a new SSRC. |
1588 ssrc_db_.ReturnSSRC(ssrc_); | 1635 ssrc_db_.ReturnSSRC(ssrc_); |
1589 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 1636 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. |
1590 bitrates_->set_ssrc(ssrc_); | 1637 bitrates_->set_ssrc(ssrc_); |
1638 if (packet_router_) | |
1639 packet_router_->OnSsrcChanged(); | |
1591 } | 1640 } |
1592 // Don't initialize seq number if SSRC passed externally. | 1641 // Don't initialize seq number if SSRC passed externally. |
1593 if (!sequence_number_forced_ && !ssrc_forced_) { | 1642 if (!sequence_number_forced_ && !ssrc_forced_) { |
1594 // Generate a new sequence number. | 1643 // Generate a new sequence number. |
1595 sequence_number_ = | 1644 sequence_number_ = |
1596 rand() / (RAND_MAX / MAX_INIT_RTP_SEQ_NUMBER); // NOLINT | 1645 rand() / (RAND_MAX / MAX_INIT_RTP_SEQ_NUMBER); // NOLINT |
1597 } | 1646 } |
1598 } | 1647 } |
1599 } | 1648 } |
1600 | 1649 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1632 | 1681 |
1633 uint32_t RTPSender::GenerateNewSSRC() { | 1682 uint32_t RTPSender::GenerateNewSSRC() { |
1634 // If configured via API, return 0. | 1683 // If configured via API, return 0. |
1635 CriticalSectionScoped cs(send_critsect_.get()); | 1684 CriticalSectionScoped cs(send_critsect_.get()); |
1636 | 1685 |
1637 if (ssrc_forced_) { | 1686 if (ssrc_forced_) { |
1638 return 0; | 1687 return 0; |
1639 } | 1688 } |
1640 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. | 1689 ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0. |
1641 bitrates_->set_ssrc(ssrc_); | 1690 bitrates_->set_ssrc(ssrc_); |
1691 if (packet_router_) | |
1692 packet_router_->OnSsrcChanged(); | |
1642 return ssrc_; | 1693 return ssrc_; |
1643 } | 1694 } |
1644 | 1695 |
1645 void RTPSender::SetSSRC(uint32_t ssrc) { | 1696 void RTPSender::SetSSRC(uint32_t ssrc) { |
1646 // This is configured via the API. | 1697 // This is configured via the API. |
1647 CriticalSectionScoped cs(send_critsect_.get()); | 1698 CriticalSectionScoped cs(send_critsect_.get()); |
1648 | 1699 |
1649 if (ssrc_ == ssrc && ssrc_forced_) { | 1700 if (ssrc_ == ssrc && ssrc_forced_) { |
1650 return; // Since it's same ssrc, don't reset anything. | 1701 return; // Since it's same ssrc, don't reset anything. |
1651 } | 1702 } |
1652 ssrc_forced_ = true; | 1703 ssrc_forced_ = true; |
1653 ssrc_db_.ReturnSSRC(ssrc_); | 1704 ssrc_db_.ReturnSSRC(ssrc_); |
1654 ssrc_db_.RegisterSSRC(ssrc); | 1705 ssrc_db_.RegisterSSRC(ssrc); |
1655 ssrc_ = ssrc; | 1706 ssrc_ = ssrc; |
1656 bitrates_->set_ssrc(ssrc_); | 1707 bitrates_->set_ssrc(ssrc_); |
1657 if (!sequence_number_forced_) { | 1708 if (!sequence_number_forced_) { |
1658 sequence_number_ = | 1709 sequence_number_ = |
1659 rand() / (RAND_MAX / MAX_INIT_RTP_SEQ_NUMBER); // NOLINT | 1710 rand() / (RAND_MAX / MAX_INIT_RTP_SEQ_NUMBER); // NOLINT |
1660 } | 1711 } |
1712 if (packet_router_) | |
1713 packet_router_->OnSsrcChanged(); | |
1661 } | 1714 } |
1662 | 1715 |
1663 uint32_t RTPSender::SSRC() const { | 1716 uint32_t RTPSender::SSRC() const { |
1664 CriticalSectionScoped cs(send_critsect_.get()); | 1717 CriticalSectionScoped cs(send_critsect_.get()); |
1665 return ssrc_; | 1718 return ssrc_; |
1666 } | 1719 } |
1667 | 1720 |
1668 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { | 1721 void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) { |
1669 assert(csrcs.size() <= kRtpCsrcSize); | 1722 assert(csrcs.size() <= kRtpCsrcSize); |
1670 CriticalSectionScoped cs(send_critsect_.get()); | 1723 CriticalSectionScoped cs(send_critsect_.get()); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1849 CriticalSectionScoped lock(send_critsect_.get()); | 1902 CriticalSectionScoped lock(send_critsect_.get()); |
1850 | 1903 |
1851 RtpState state; | 1904 RtpState state; |
1852 state.sequence_number = sequence_number_rtx_; | 1905 state.sequence_number = sequence_number_rtx_; |
1853 state.start_timestamp = start_timestamp_; | 1906 state.start_timestamp = start_timestamp_; |
1854 | 1907 |
1855 return state; | 1908 return state; |
1856 } | 1909 } |
1857 | 1910 |
1858 } // namespace webrtc | 1911 } // namespace webrtc |
OLD | NEW |