summaryrefslogtreecommitdiff
path: root/modules/rtp_rtcp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/rtp_rtcp')
-rw-r--r--modules/rtp_rtcp/interface/rtp_rtcp.h5
-rw-r--r--modules/rtp_rtcp/source/rtp_rtcp_impl.cc6
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.cc32
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.h4
-rw-r--r--modules/rtp_rtcp/source/rtp_sender_unittest.cc10
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);
}
};