Move pacer to fully use webrtc::Clock instead of webrtc::TickTime.
This required rewriting the send-side delay stats api to be callback based, as otherwise the SuspendBelowMinBitrate test started flaking much more frequently since it had lock order inversion problems. R=pbos@webrtc.org, tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/21869005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6664 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -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,
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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_);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user