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

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

Issue 2241193002: StartTimestamp generated randomly in RtpSender constructor (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: copy default random timestamp_offset to rtcp Created 4 years, 4 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 rtp_stats_callback_(nullptr), 102 rtp_stats_callback_(nullptr),
103 total_bitrate_sent_(kBitrateStatisticsWindowMs, 103 total_bitrate_sent_(kBitrateStatisticsWindowMs,
104 RateStatistics::kBpsScale), 104 RateStatistics::kBpsScale),
105 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale), 105 nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
106 frame_count_observer_(frame_count_observer), 106 frame_count_observer_(frame_count_observer),
107 send_side_delay_observer_(send_side_delay_observer), 107 send_side_delay_observer_(send_side_delay_observer),
108 event_log_(event_log), 108 event_log_(event_log),
109 send_packet_observer_(send_packet_observer), 109 send_packet_observer_(send_packet_observer),
110 bitrate_callback_(bitrate_callback), 110 bitrate_callback_(bitrate_callback),
111 // RTP variables 111 // RTP variables
112 start_timestamp_forced_(false),
113 start_timestamp_(0),
114 ssrc_db_(SSRCDatabase::GetSSRCDatabase()), 112 ssrc_db_(SSRCDatabase::GetSSRCDatabase()),
115 remote_ssrc_(0), 113 remote_ssrc_(0),
116 sequence_number_forced_(false), 114 sequence_number_forced_(false),
117 ssrc_forced_(false), 115 ssrc_forced_(false),
118 timestamp_(0), 116 timestamp_(0),
119 capture_time_ms_(0), 117 capture_time_ms_(0),
120 last_timestamp_time_ms_(0), 118 last_timestamp_time_ms_(0),
121 media_has_been_sent_(false), 119 media_has_been_sent_(false),
122 last_packet_marker_bit_(false), 120 last_packet_marker_bit_(false),
123 csrcs_(), 121 csrcs_(),
124 rtx_(kRtxOff), 122 rtx_(kRtxOff),
125 retransmission_rate_limiter_(retransmission_rate_limiter) { 123 retransmission_rate_limiter_(retransmission_rate_limiter) {
126 ssrc_ = ssrc_db_->CreateSSRC(); 124 ssrc_ = ssrc_db_->CreateSSRC();
127 RTC_DCHECK(ssrc_ != 0); 125 RTC_DCHECK(ssrc_ != 0);
128 ssrc_rtx_ = ssrc_db_->CreateSSRC(); 126 ssrc_rtx_ = ssrc_db_->CreateSSRC();
129 RTC_DCHECK(ssrc_rtx_ != 0); 127 RTC_DCHECK(ssrc_rtx_ != 0);
130 128
129 timestamp_offset_ = random_.Rand<uint32_t>();
terelius 2016/08/15 14:56:03 Note that this PRNG is not cryptographic strength.
danilchap 2016/08/15 15:23:17 Done. Simple note added.
131 // Random start, 16 bits. Can't be 0. 130 // Random start, 16 bits. Can't be 0.
132 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); 131 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
133 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); 132 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
134 } 133 }
135 134
136 RTPSender::~RTPSender() { 135 RTPSender::~RTPSender() {
137 // TODO(tommi): Use a thread checker to ensure the object is created and 136 // TODO(tommi): Use a thread checker to ensure the object is created and
138 // deleted on the same thread. At the moment this isn't possible due to 137 // deleted on the same thread. At the moment this isn't possible due to
139 // voe::ChannelOwner in voice engine. To reproduce, run: 138 // voe::ChannelOwner in voice engine. To reproduce, run:
140 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus 139 // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
(...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 int32_t RTPSender::BuildRtpHeader(uint8_t* data_buffer, 1091 int32_t RTPSender::BuildRtpHeader(uint8_t* data_buffer,
1093 int8_t payload_type, 1092 int8_t payload_type,
1094 bool marker_bit, 1093 bool marker_bit,
1095 uint32_t capture_timestamp, 1094 uint32_t capture_timestamp,
1096 int64_t capture_time_ms) { 1095 int64_t capture_time_ms) {
1097 assert(payload_type >= 0); 1096 assert(payload_type >= 0);
1098 rtc::CritScope lock(&send_critsect_); 1097 rtc::CritScope lock(&send_critsect_);
1099 if (!sending_media_) 1098 if (!sending_media_)
1100 return -1; 1099 return -1;
1101 1100
1102 timestamp_ = start_timestamp_ + capture_timestamp; 1101 timestamp_ = timestamp_offset_ + capture_timestamp;
1103 last_timestamp_time_ms_ = clock_->TimeInMilliseconds(); 1102 last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1104 uint32_t sequence_number = sequence_number_++; 1103 uint32_t sequence_number = sequence_number_++;
1105 capture_time_ms_ = capture_time_ms; 1104 capture_time_ms_ = capture_time_ms;
1106 last_packet_marker_bit_ = marker_bit; 1105 last_packet_marker_bit_ = marker_bit;
1107 return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit, 1106 return CreateRtpHeader(data_buffer, payload_type, ssrc_, marker_bit,
1108 timestamp_, sequence_number, csrcs_); 1107 timestamp_, sequence_number, csrcs_);
1109 } 1108 }
1110 1109
1111 uint16_t RTPSender::BuildRtpHeaderExtension(uint8_t* data_buffer, 1110 uint16_t RTPSender::BuildRtpHeaderExtension(uint8_t* data_buffer,
1112 bool marker_bit) const { 1111 bool marker_bit) const {
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 1491
1493 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1492 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1494 1493
1495 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id)) 1494 if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
1496 return false; 1495 return false;
1497 1496
1498 return true; 1497 return true;
1499 } 1498 }
1500 1499
1501 void RTPSender::SetSendingStatus(bool enabled) { 1500 void RTPSender::SetSendingStatus(bool enabled) {
1502 if (enabled) { 1501 if (!enabled) {
1503 uint32_t frequency_hz = SendPayloadFrequency();
1504 uint32_t RTPtime = CurrentRtp(*clock_, frequency_hz);
1505
1506 // Will be ignored if it's already configured via API.
1507 SetStartTimestamp(RTPtime, false);
1508 } else {
1509 rtc::CritScope lock(&send_critsect_); 1502 rtc::CritScope lock(&send_critsect_);
1510 if (!ssrc_forced_) { 1503 if (!ssrc_forced_) {
1511 // Generate a new SSRC. 1504 // Generate a new SSRC.
1512 ssrc_db_->ReturnSSRC(ssrc_); 1505 ssrc_db_->ReturnSSRC(ssrc_);
1513 ssrc_ = ssrc_db_->CreateSSRC(); 1506 ssrc_ = ssrc_db_->CreateSSRC();
1514 RTC_DCHECK(ssrc_ != 0); 1507 RTC_DCHECK(ssrc_ != 0);
1515 } 1508 }
1516 // Don't initialize seq number if SSRC passed externally. 1509 // Don't initialize seq number if SSRC passed externally.
1517 if (!sequence_number_forced_ && !ssrc_forced_) { 1510 if (!sequence_number_forced_ && !ssrc_forced_) {
1518 // Generate a new sequence number. 1511 // Generate a new sequence number.
(...skipping 10 matching lines...) Expand all
1529 bool RTPSender::SendingMedia() const { 1522 bool RTPSender::SendingMedia() const {
1530 rtc::CritScope lock(&send_critsect_); 1523 rtc::CritScope lock(&send_critsect_);
1531 return sending_media_; 1524 return sending_media_;
1532 } 1525 }
1533 1526
1534 uint32_t RTPSender::Timestamp() const { 1527 uint32_t RTPSender::Timestamp() const {
1535 rtc::CritScope lock(&send_critsect_); 1528 rtc::CritScope lock(&send_critsect_);
1536 return timestamp_; 1529 return timestamp_;
1537 } 1530 }
1538 1531
1539 void RTPSender::SetStartTimestamp(uint32_t timestamp, bool force) { 1532 void RTPSender::SetTimestampOffset(uint32_t timestamp) {
1540 rtc::CritScope lock(&send_critsect_); 1533 rtc::CritScope lock(&send_critsect_);
1541 if (force) { 1534 timestamp_offset_ = timestamp;
1542 start_timestamp_forced_ = true;
1543 start_timestamp_ = timestamp;
1544 } else {
1545 if (!start_timestamp_forced_) {
1546 start_timestamp_ = timestamp;
1547 }
1548 }
1549 } 1535 }
1550 1536
1551 uint32_t RTPSender::StartTimestamp() const { 1537 uint32_t RTPSender::TimestampOffset() const {
1552 rtc::CritScope lock(&send_critsect_); 1538 rtc::CritScope lock(&send_critsect_);
1553 return start_timestamp_; 1539 return timestamp_offset_;
1554 } 1540 }
1555 1541
1556 uint32_t RTPSender::GenerateNewSSRC() { 1542 uint32_t RTPSender::GenerateNewSSRC() {
1557 // If configured via API, return 0. 1543 // If configured via API, return 0.
1558 rtc::CritScope lock(&send_critsect_); 1544 rtc::CritScope lock(&send_critsect_);
1559 1545
1560 if (ssrc_forced_) { 1546 if (ssrc_forced_) {
1561 return 0; 1547 return 0;
1562 } 1548 }
1563 ssrc_ = ssrc_db_->CreateSSRC(); 1549 ssrc_ = ssrc_db_->CreateSSRC();
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 1708
1723 uint32_t RTPSender::BitrateSent() const { 1709 uint32_t RTPSender::BitrateSent() const {
1724 rtc::CritScope cs(&statistics_crit_); 1710 rtc::CritScope cs(&statistics_crit_);
1725 return total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0); 1711 return total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0);
1726 } 1712 }
1727 1713
1728 void RTPSender::SetRtpState(const RtpState& rtp_state) { 1714 void RTPSender::SetRtpState(const RtpState& rtp_state) {
1729 rtc::CritScope lock(&send_critsect_); 1715 rtc::CritScope lock(&send_critsect_);
1730 sequence_number_ = rtp_state.sequence_number; 1716 sequence_number_ = rtp_state.sequence_number;
1731 sequence_number_forced_ = true; 1717 sequence_number_forced_ = true;
1718 timestamp_offset_ = rtp_state.start_timestamp;
terelius 2016/08/15 14:56:03 Rename start_timestamp in the state struct too?
danilchap 2016/08/15 15:23:17 Prefer to avoid modifying structure in the /includ
1732 timestamp_ = rtp_state.timestamp; 1719 timestamp_ = rtp_state.timestamp;
1733 capture_time_ms_ = rtp_state.capture_time_ms; 1720 capture_time_ms_ = rtp_state.capture_time_ms;
1734 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms; 1721 last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms;
1735 media_has_been_sent_ = rtp_state.media_has_been_sent; 1722 media_has_been_sent_ = rtp_state.media_has_been_sent;
1736 } 1723 }
1737 1724
1738 RtpState RTPSender::GetRtpState() const { 1725 RtpState RTPSender::GetRtpState() const {
1739 rtc::CritScope lock(&send_critsect_); 1726 rtc::CritScope lock(&send_critsect_);
1740 1727
1741 RtpState state; 1728 RtpState state;
1742 state.sequence_number = sequence_number_; 1729 state.sequence_number = sequence_number_;
1743 state.start_timestamp = start_timestamp_; 1730 state.start_timestamp = timestamp_offset_;
1744 state.timestamp = timestamp_; 1731 state.timestamp = timestamp_;
1745 state.capture_time_ms = capture_time_ms_; 1732 state.capture_time_ms = capture_time_ms_;
1746 state.last_timestamp_time_ms = last_timestamp_time_ms_; 1733 state.last_timestamp_time_ms = last_timestamp_time_ms_;
1747 state.media_has_been_sent = media_has_been_sent_; 1734 state.media_has_been_sent = media_has_been_sent_;
1748 1735
1749 return state; 1736 return state;
1750 } 1737 }
1751 1738
1752 void RTPSender::SetRtxRtpState(const RtpState& rtp_state) { 1739 void RTPSender::SetRtxRtpState(const RtpState& rtp_state) {
1753 rtc::CritScope lock(&send_critsect_); 1740 rtc::CritScope lock(&send_critsect_);
1754 sequence_number_rtx_ = rtp_state.sequence_number; 1741 sequence_number_rtx_ = rtp_state.sequence_number;
1755 } 1742 }
1756 1743
1757 RtpState RTPSender::GetRtxRtpState() const { 1744 RtpState RTPSender::GetRtxRtpState() const {
1758 rtc::CritScope lock(&send_critsect_); 1745 rtc::CritScope lock(&send_critsect_);
1759 1746
1760 RtpState state; 1747 RtpState state;
1761 state.sequence_number = sequence_number_rtx_; 1748 state.sequence_number = sequence_number_rtx_;
1762 state.start_timestamp = start_timestamp_; 1749 state.start_timestamp = timestamp_offset_;
1763 1750
1764 return state; 1751 return state;
1765 } 1752 }
1766 1753
1767 } // namespace webrtc 1754 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698