bug 1241064 - updating stats filter SSRC when audio channel SSRC changes; r?jib
bug: getStats was returning statistics for the shortlived, initial SSRC
now updating SSRC filter on statistics update callback to match audio channel ssrc
getStats API now returns statistics for correct SSRC: jitter, packets lost, etc.
MozReview-Commit-ID: WCd71WMkUW
--- a/media/webrtc/trunk/webrtc/voice_engine/channel.cc
+++ b/media/webrtc/trunk/webrtc/voice_engine/channel.cc
@@ -56,44 +56,49 @@ class StatisticsProxy : public RtcpStati
public:
StatisticsProxy(uint32_t ssrc)
: stats_lock_(CriticalSectionWrapper::CreateCriticalSection()),
ssrc_(ssrc) {}
virtual ~StatisticsProxy() {}
void StatisticsUpdated(const RtcpStatistics& statistics,
uint32_t ssrc) override {
+ CriticalSectionScoped cs(stats_lock_.get());
if (ssrc != ssrc_)
return;
- CriticalSectionScoped cs(stats_lock_.get());
stats_.rtcp = statistics;
if (statistics.jitter > stats_.max_jitter) {
stats_.max_jitter = statistics.jitter;
}
}
void CNameChanged(const char* cname, uint32_t ssrc) override {}
+ void SetSSRC(uint32_t ssrc) {
+ CriticalSectionScoped cs(stats_lock_.get());
+ ssrc_ = ssrc;
+ }
+
void ResetStatistics() {
CriticalSectionScoped cs(stats_lock_.get());
stats_ = ChannelStatistics();
}
ChannelStatistics GetStats() {
CriticalSectionScoped cs(stats_lock_.get());
return stats_;
}
private:
// StatisticsUpdated calls are triggered from threads in the RTP module,
// while GetStats calls can be triggered from the public voice engine API,
// hence synchronization is needed.
rtc::scoped_ptr<CriticalSectionWrapper> stats_lock_;
- const uint32_t ssrc_;
+ uint32_t ssrc_;
ChannelStatistics stats_;
};
class VoERtcpObserver : public RtcpBandwidthObserver {
public:
explicit VoERtcpObserver(Channel* owner) : owner_(owner) {}
virtual ~VoERtcpObserver() {}
@@ -339,16 +344,18 @@ void
Channel::OnIncomingSSRCChanged(int32_t id, uint32_t ssrc)
{
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId),
"Channel::OnIncomingSSRCChanged(id=%d, SSRC=%d)",
id, ssrc);
// Update ssrc so that NTP for AV sync can be updated.
_rtpRtcpModule->SetRemoteSSRC(ssrc);
+ // Update stats proxy to receive stats for new ssrc
+ statistics_proxy_->SetSSRC(ssrc);
}
void Channel::OnIncomingCSRCChanged(int32_t id,
uint32_t CSRC,
bool added)
{
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId),
"Channel::OnIncomingCSRCChanged(id=%d, CSRC=%d, added=%d)",