(Auto)update libjingle 66867790-> 66887616

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6128 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/peerconnection_unittest.cc b/talk/app/webrtc/peerconnection_unittest.cc
index f6003f6..b4d6bcc 100644
--- a/talk/app/webrtc/peerconnection_unittest.cc
+++ b/talk/app/webrtc/peerconnection_unittest.cc
@@ -85,7 +85,7 @@
 
 static const int kMaxWaitMs = 2000;
 static const int kMaxWaitForStatsMs = 3000;
-static const int kMaxWaitForFramesMs = 5000;
+static const int kMaxWaitForFramesMs = 10000;
 static const int kEndAudioFrameCount = 3;
 static const int kEndVideoFrameCount = 3;
 
diff --git a/talk/app/webrtc/statscollector.cc b/talk/app/webrtc/statscollector.cc
index 013e83f..23d3205 100644
--- a/talk/app/webrtc/statscollector.cc
+++ b/talk/app/webrtc/statscollector.cc
@@ -63,6 +63,18 @@
 const char StatsReport::kStatsValueNameContentName[] = "googContentName";
 const char StatsReport::kStatsValueNameCpuLimitedResolution[] =
     "googCpuLimitedResolution";
+const char StatsReport::kStatsValueNameDecodingCTSG[] =
+    "googDecodingCTSG";
+const char StatsReport::kStatsValueNameDecodingCTN[] =
+    "googDecodingCTN";
+const char StatsReport::kStatsValueNameDecodingNormal[] =
+    "googDecodingNormal";
+const char StatsReport::kStatsValueNameDecodingPLC[] =
+    "googDecodingPLC";
+const char StatsReport::kStatsValueNameDecodingCNG[] =
+    "googDecodingCNG";
+const char StatsReport::kStatsValueNameDecodingPLCCNG[] =
+    "googDecodingPLCCNG";
 const char StatsReport::kStatsValueNameDer[] = "googDerBase64";
 // Echo metrics from the audio processing module.
 const char StatsReport::kStatsValueNameEchoCancellationQualityMin[] =
@@ -273,6 +285,18 @@
                    info.packets_rcvd);
   report->AddValue(StatsReport::kStatsValueNamePacketsLost,
                    info.packets_lost);
+  report->AddValue(StatsReport::kStatsValueNameDecodingCTSG,
+                   info.decoding_calls_to_silence_generator);
+  report->AddValue(StatsReport::kStatsValueNameDecodingCTN,
+                   info.decoding_calls_to_neteq);
+  report->AddValue(StatsReport::kStatsValueNameDecodingNormal,
+                   info.decoding_normal);
+  report->AddValue(StatsReport::kStatsValueNameDecodingPLC,
+                   info.decoding_plc);
+  report->AddValue(StatsReport::kStatsValueNameDecodingCNG,
+                   info.decoding_cng);
+  report->AddValue(StatsReport::kStatsValueNameDecodingPLCCNG,
+                   info.decoding_plc_cng);
 }
 
 void ExtractStats(const cricket::VoiceSenderInfo& info, StatsReport* report) {
diff --git a/talk/app/webrtc/statscollector_unittest.cc b/talk/app/webrtc/statscollector_unittest.cc
index 24be20a..fb55969 100644
--- a/talk/app/webrtc/statscollector_unittest.cc
+++ b/talk/app/webrtc/statscollector_unittest.cc
@@ -263,6 +263,58 @@
   EXPECT_EQ(ders.size(), i);
 }
 
+void VerifyVoiceReceiverInfoReport(const StatsReport* report,
+                                   const cricket::VoiceReceiverInfo& sinfo) {
+  std::string value_in_report;
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.audio_level), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameBytesReceived, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.bytes_rcvd), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameJitterReceived, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.jitter_ms), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.jitter_buffer_ms), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNamePreferredJitterBufferMs,
+      &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.jitter_buffer_preferred_ms),
+      value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.delay_estimate_ms), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameExpandRate, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<float>(sinfo.expand_rate), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.packets_rcvd), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_calls_to_silence_generator),
+      value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_calls_to_neteq),
+      value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_normal), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_plc), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_cng), value_in_report);
+  EXPECT_TRUE(GetValue(
+      report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report));
+  EXPECT_EQ(talk_base::ToString<int>(sinfo.decoding_plc_cng), value_in_report);
+}
+
+
 void VerifyVoiceSenderInfoReport(const StatsReport* report,
                                  const cricket::VoiceSenderInfo& sinfo) {
   std::string value_in_report;
@@ -1067,6 +1119,66 @@
   VerifyVoiceSenderInfoReport(track_report, voice_sender_info);
 }
 
+
+// This test verifies that audio receive streams populate stats reports
+// correctly.
+TEST_F(StatsCollectorTest, GetStatsFromRemoteStream) {
+  webrtc::StatsCollector stats;  // Implementation under test.
+  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
+  // The content_name known by the voice channel.
+  const std::string kVcName("vcname");
+  cricket::VoiceChannel voice_channel(talk_base::Thread::Current(),
+      media_engine_, media_channel, &session_, kVcName, false);
+  stream_ = webrtc::MediaStream::Create("remoteStreamLabel");
+  stats.AddStream(stream_);
+
+  stats.set_session(&session_);
+
+  // Instruct the session to return stats containing the transport channel.
+  InitSessionStats(kVcName);
+  EXPECT_CALL(session_, GetStats(_))
+      .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_),
+                            Return(true)));
+
+  cricket::VoiceReceiverInfo voice_receiver_info;
+  voice_receiver_info.add_ssrc(kSsrcOfTrack);
+  voice_receiver_info.bytes_rcvd = 100;
+  voice_receiver_info.packets_rcvd = 101;
+  voice_receiver_info.packets_lost = 102;
+  voice_receiver_info.fraction_lost = 103;
+  voice_receiver_info.packets_lost = 104;
+  voice_receiver_info.ext_seqnum = 105;
+  voice_receiver_info.jitter_ms = 106;
+  voice_receiver_info.jitter_buffer_ms = 107;
+  voice_receiver_info.jitter_buffer_preferred_ms = 108;
+  voice_receiver_info.delay_estimate_ms = 109;
+  voice_receiver_info.audio_level = 110;
+  voice_receiver_info.expand_rate = 111;
+
+  // Constructs an ssrc stats update.
+  cricket::VoiceMediaInfo stats_read;
+  stats_read.receivers.push_back(voice_receiver_info);
+
+  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
+  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
+  EXPECT_CALL(*media_channel, GetStats(_))
+      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
+                            Return(true)));
+  EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
+      .WillRepeatedly(Return(true));
+
+  StatsReports reports;  // returned values.
+  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
+  stats.GetStats(NULL, &reports);
+
+  // Verify the remote report.
+  const StatsReport* report = FindNthReportByType(
+        reports, StatsReport::kStatsReportTypeSsrc, 1);
+  EXPECT_FALSE(report == NULL);
+  VerifyVoiceReceiverInfoReport(report, voice_receiver_info);
+}
+
+
 // This test verifies that a local stats object won't update its statistics
 // after a RemoveLocalAudioTrack() call.
 TEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
diff --git a/talk/app/webrtc/statstypes.h b/talk/app/webrtc/statstypes.h
index dd9da0d..e471dc9 100644
--- a/talk/app/webrtc/statstypes.h
+++ b/talk/app/webrtc/statstypes.h
@@ -200,6 +200,12 @@
   static const char kStatsValueNameRecvPacketGroupArrivalTimeDebug[];
   static const char kStatsValueNameRecvPacketGroupPropagationDeltaDebug[];
   static const char kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug[];
+  static const char kStatsValueNameDecodingCTSG[];
+  static const char kStatsValueNameDecodingCTN[];
+  static const char kStatsValueNameDecodingNormal[];
+  static const char kStatsValueNameDecodingPLC[];
+  static const char kStatsValueNameDecodingCNG[];
+  static const char kStatsValueNameDecodingPLCCNG[];
 };
 
 typedef std::vector<StatsReport> StatsReports;
diff --git a/talk/app/webrtc/test/peerconnectiontestwrapper.cc b/talk/app/webrtc/test/peerconnectiontestwrapper.cc
index d7c30a8..7d3664f 100644
--- a/talk/app/webrtc/test/peerconnectiontestwrapper.cc
+++ b/talk/app/webrtc/test/peerconnectiontestwrapper.cc
@@ -36,7 +36,7 @@
 static const char kStreamLabelBase[] = "stream_label";
 static const char kVideoTrackLabelBase[] = "video_track";
 static const char kAudioTrackLabelBase[] = "audio_track";
-static const int kMaxWait = 5000;
+static const int kMaxWait = 10000;
 static const int kTestAudioFrameCount = 3;
 static const int kTestVideoFrameCount = 3;