Add ToString method to AggregatedStats and log stats at the end of a call.

BUG=webrtc:5283

Review-Url: https://codereview.webrtc.org/2494423002
Cr-Commit-Position: refs/heads/master@{#15088}
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
index 3ed7947..2f69cf4 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -349,12 +349,16 @@
   if (send_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps",
                                 send_bitrate_stats.average);
+    LOG(LS_INFO) << "WebRTC.Call.EstimatedSendBitrateInKbps, "
+                 << send_bitrate_stats.ToString();
   }
   AggregatedStats pacer_bitrate_stats =
       pacer_bitrate_kbps_counter_.ProcessAndGetStats();
   if (pacer_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps",
                                 pacer_bitrate_stats.average);
+    LOG(LS_INFO) << "WebRTC.Call.PacerBitrateInKbps, "
+                 << pacer_bitrate_stats.ToString();
   }
 }
 
@@ -365,24 +369,32 @@
   if (video_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.VideoBitrateReceivedInKbps",
                                 video_bytes_per_sec.average * 8 / 1000);
+    LOG(LS_INFO) << "WebRTC.Call.VideoBitrateReceivedInKbps, "
+                 << video_bytes_per_sec.ToString();
   }
   AggregatedStats audio_bytes_per_sec =
       received_audio_bytes_per_second_counter_.GetStats();
   if (audio_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.AudioBitrateReceivedInKbps",
                                 audio_bytes_per_sec.average * 8 / 1000);
+    LOG(LS_INFO) << "WebRTC.Call.AudioBitrateReceivedInKbps, "
+                 << audio_bytes_per_sec.ToString();
   }
   AggregatedStats rtcp_bytes_per_sec =
       received_rtcp_bytes_per_second_counter_.GetStats();
   if (rtcp_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.RtcpBitrateReceivedInBps",
                                 rtcp_bytes_per_sec.average * 8);
+    LOG(LS_INFO) << "WebRTC.Call.RtcpBitrateReceivedInBps, "
+                 << rtcp_bytes_per_sec.ToString();
   }
   AggregatedStats recv_bytes_per_sec =
       received_bytes_per_second_counter_.GetStats();
   if (recv_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
     RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.BitrateReceivedInKbps",
                                 recv_bytes_per_sec.average * 8 / 1000);
+    LOG(LS_INFO) << "WebRTC.Call.BitrateReceivedInKbps, "
+                 << recv_bytes_per_sec.ToString();
   }
 }
 
diff --git a/webrtc/video/receive_statistics_proxy.cc b/webrtc/video/receive_statistics_proxy.cc
index ded510a..b15ef68 100644
--- a/webrtc/video/receive_statistics_proxy.cc
+++ b/webrtc/video/receive_statistics_proxy.cc
@@ -77,6 +77,8 @@
   if (freq_offset_stats.num_samples > 0) {
     RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtpToNtpFreqOffsetInKhz",
                                freq_offset_stats.average);
+    LOG(LS_INFO) << "WebRTC.Video.RtpToNtpFreqOffsetInKhz, "
+                 << freq_offset_stats.ToString();
   }
 
   int qp = qp_counters_.vp8.Avg(kMinRequiredSamples);
diff --git a/webrtc/video/send_delay_stats.cc b/webrtc/video/send_delay_stats.cc
index 8ae0615..1c3fd2a 100644
--- a/webrtc/video/send_delay_stats.cc
+++ b/webrtc/video/send_delay_stats.cc
@@ -45,6 +45,7 @@
     AggregatedStats stats = it.second->GetStats();
     if (stats.num_samples >= kMinRequiredPeriodicSamples) {
       RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.SendDelayInMs", stats.average);
+      LOG(LS_INFO) << "WebRTC.Video.SendDelayInMs, " << stats.ToString();
     }
   }
 }
diff --git a/webrtc/video/stats_counter.cc b/webrtc/video/stats_counter.cc
index 9923ed2..b1c24ee 100644
--- a/webrtc/video/stats_counter.cc
+++ b/webrtc/video/stats_counter.cc
@@ -25,6 +25,15 @@
 const uint32_t kStreamId0 = 0;
 }  // namespace
 
+std::string AggregatedStats::ToString() const {
+  std::stringstream ss;
+  ss << "periodic_samples:" << num_samples << ", {";
+  ss << "min:" << min << ", ";
+  ss << "avg:" << average << ", ";
+  ss << "max:" << max << "}";
+  return ss.str();
+}
+
 // Class holding periodically computed metrics.
 class AggregatedCounter {
  public:
diff --git a/webrtc/video/stats_counter.h b/webrtc/video/stats_counter.h
index 08663f8..e84d73b 100644
--- a/webrtc/video/stats_counter.h
+++ b/webrtc/video/stats_counter.h
@@ -12,6 +12,7 @@
 #define WEBRTC_VIDEO_STATS_COUNTER_H_
 
 #include <memory>
+#include <string>
 
 #include "webrtc/base/constructormagic.h"
 #include "webrtc/typedefs.h"
@@ -31,6 +32,8 @@
 };
 
 struct AggregatedStats {
+  std::string ToString() const;
+
   int64_t num_samples = 0;
   int min = -1;
   int max = -1;