fix bug 1241064 - updating stats filter SSRC when audio channel SSRC changes; r?jib draft
author[:ng] <na-g@nostrum.com>
Thu, 03 Mar 2016 08:03:06 -0800
changeset 336550 eed3b4c57281a3f9d2834982a95732b1c4383641
parent 336372 52cfda4c6bae5c28ab09709655435da6ecda9e2a
child 515443 270be92b1db500f12ef8f579265526297e09c40c
push id12116
push userna-g@nostrum.com
push dateThu, 03 Mar 2016 18:44:01 +0000
reviewersjib
bugs1241064
milestone47.0a1
fix 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: 26p5ux6EwwQ
media/webrtc/trunk/webrtc/voice_engine/channel.cc
--- 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)",