diff options
Diffstat (limited to 'modules/rtp_rtcp')
-rw-r--r-- | modules/rtp_rtcp/interface/rtp_rtcp.h | 5 | ||||
-rw-r--r-- | modules/rtp_rtcp/source/rtp_rtcp_impl.cc | 6 | ||||
-rw-r--r-- | modules/rtp_rtcp/source/rtp_sender.cc | 32 | ||||
-rw-r--r-- | modules/rtp_rtcp/source/rtp_sender.h | 4 | ||||
-rw-r--r-- | modules/rtp_rtcp/source/rtp_sender_unittest.cc | 10 |
5 files changed, 39 insertions, 18 deletions
diff --git a/modules/rtp_rtcp/interface/rtp_rtcp.h b/modules/rtp_rtcp/interface/rtp_rtcp.h index b662849b..7b0a4f8a 100644 --- a/modules/rtp_rtcp/interface/rtp_rtcp.h +++ b/modules/rtp_rtcp/interface/rtp_rtcp.h @@ -47,8 +47,8 @@ class RtpRtcp : public Module { * intra_frame_callback - Called when the receiver request a intra frame. * bandwidth_callback - Called when we receive a changed estimate from * the receiver of out stream. - * audio_messages - Telehone events. May not be NULL; default callback - * will do nothing. + * audio_messages - Telephone events. May not be NULL; default + * callback will do nothing. * remote_bitrate_estimator - Estimates the bandwidth available for a set of * streams from the same client. * paced_sender - Spread any bursts of packets into smaller @@ -69,6 +69,7 @@ class RtpRtcp : public Module { PacedSender* paced_sender; BitrateStatisticsObserver* send_bitrate_observer; FrameCountObserver* send_frame_count_observer; + SendSideDelayObserver* send_side_delay_observer; }; /* diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index f706b42e..0c771c51 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -39,7 +39,8 @@ RtpRtcp::Configuration::Configuration() remote_bitrate_estimator(NULL), paced_sender(NULL), send_bitrate_observer(NULL), - send_frame_count_observer(NULL) { + send_frame_count_observer(NULL), + send_side_delay_observer(NULL) { } RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) { @@ -64,7 +65,8 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration) configuration.audio_messages, configuration.paced_sender, configuration.send_bitrate_observer, - configuration.send_frame_count_observer), + configuration.send_frame_count_observer, + configuration.send_side_delay_observer), rtcp_sender_(configuration.id, configuration.audio, configuration.clock, diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc index e638074c..c24b15a3 100644 --- a/modules/rtp_rtcp/source/rtp_sender.cc +++ b/modules/rtp_rtcp/source/rtp_sender.cc @@ -47,7 +47,8 @@ RTPSender::RTPSender(const int32_t id, RtpAudioFeedback* audio_feedback, PacedSender* paced_sender, BitrateStatisticsObserver* bitrate_callback, - FrameCountObserver* frame_count_observer) + FrameCountObserver* frame_count_observer, + SendSideDelayObserver* send_side_delay_observer) : clock_(clock), bitrate_sent_(clock, this), id_(id), @@ -75,6 +76,7 @@ RTPSender::RTPSender(const int32_t id, rtp_stats_callback_(NULL), bitrate_callback_(bitrate_callback), frame_count_observer_(frame_count_observer), + send_side_delay_observer_(send_side_delay_observer), // RTP variables start_timestamp_forced_(false), start_timestamp_(0), @@ -164,9 +166,7 @@ uint32_t RTPSender::NackOverheadRate() const { bool RTPSender::GetSendSideDelay(int* avg_send_delay_ms, int* max_send_delay_ms) const { - if (!SendingMedia()) - return false; - CriticalSectionScoped cs(statistics_crit_.get()); + CriticalSectionScoped lock(statistics_crit_.get()); SendDelayMap::const_iterator it = send_delays_.upper_bound( clock_->TimeInMilliseconds() - kSendSideDelayWindowMs); if (it == send_delays_.end()) @@ -997,10 +997,26 @@ int32_t RTPSender::SendToNetwork( } void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { - CriticalSectionScoped cs(statistics_crit_.get()); - send_delays_[now_ms] = now_ms - capture_time_ms; - send_delays_.erase(send_delays_.begin(), - send_delays_.lower_bound(now_ms - kSendSideDelayWindowMs)); + uint32_t ssrc; + int avg_delay_ms = 0; + int max_delay_ms = 0; + { + CriticalSectionScoped lock(send_critsect_); + ssrc = ssrc_; + } + { + CriticalSectionScoped cs(statistics_crit_.get()); + // TODO(holmer): Compute this iteratively instead. + send_delays_[now_ms] = now_ms - capture_time_ms; + send_delays_.erase(send_delays_.begin(), + send_delays_.lower_bound(now_ms - + kSendSideDelayWindowMs)); + } + if (send_side_delay_observer_ && + GetSendSideDelay(&avg_delay_ms, &max_delay_ms)) { + send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, + max_delay_ms, ssrc); + } } void RTPSender::ProcessBitrate() { diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h index f65c8c27..4a9e10ed 100644 --- a/modules/rtp_rtcp/source/rtp_sender.h +++ b/modules/rtp_rtcp/source/rtp_sender.h @@ -71,7 +71,8 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer { Transport *transport, RtpAudioFeedback *audio_feedback, PacedSender *paced_sender, BitrateStatisticsObserver* bitrate_callback, - FrameCountObserver* frame_count_observer); + FrameCountObserver* frame_count_observer, + SendSideDelayObserver* send_side_delay_observer); virtual ~RTPSender(); void ProcessBitrate(); @@ -379,6 +380,7 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer { StreamDataCountersCallback* rtp_stats_callback_ GUARDED_BY(statistics_crit_); BitrateStatisticsObserver* const bitrate_callback_; FrameCountObserver* const frame_count_observer_; + SendSideDelayObserver* const send_side_delay_observer_; // RTP variables bool start_timestamp_forced_ GUARDED_BY(send_critsect_); diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index 57f1460f..40b10548 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -94,7 +94,7 @@ class RtpSenderTest : public ::testing::Test { virtual void SetUp() { rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, - &mock_paced_sender_, NULL, NULL)); + &mock_paced_sender_, NULL, NULL, NULL)); rtp_sender_->SetSequenceNumber(kSeqNum); } @@ -672,7 +672,7 @@ TEST_F(RtpSenderTest, SendPadding) { TEST_F(RtpSenderTest, SendRedundantPayloads) { MockTransport transport; rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport, NULL, - &mock_paced_sender_, NULL, NULL)); + &mock_paced_sender_, NULL, NULL, NULL)); rtp_sender_->SetSequenceNumber(kSeqNum); // Make all packets go through the pacer. EXPECT_CALL(mock_paced_sender_, @@ -818,7 +818,7 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) { } callback; rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, - &mock_paced_sender_, NULL, &callback)); + &mock_paced_sender_, NULL, &callback, NULL)); char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; const uint8_t payload_type = 127; @@ -867,7 +867,7 @@ TEST_F(RtpSenderTest, BitrateCallbacks) { BitrateStatistics bitrate_; } callback; rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, - &mock_paced_sender_, &callback, NULL)); + &mock_paced_sender_, &callback, NULL, NULL)); // Simulate kNumPackets sent with kPacketInterval ms intervals. const uint32_t kNumPackets = 15; @@ -923,7 +923,7 @@ class RtpSenderAudioTest : public RtpSenderTest { virtual void SetUp() { payload_ = kAudioPayload; rtp_sender_.reset(new RTPSender(0, true, &fake_clock_, &transport_, NULL, - &mock_paced_sender_, NULL, NULL)); + &mock_paced_sender_, NULL, NULL, NULL)); rtp_sender_->SetSequenceNumber(kSeqNum); } }; |