Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 1247293002: Add support for transport wide sequence numbers (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698