Added support for logging the SSRC corresponding to AudioPlayout events.

To do this, the logging of this event was moved from the ACM to
VoiceEngine Channel. A new LogAudioPlayoutEvent function was added on
the RtcEventLog interface, and the LogDebugEvent function was removed
since it is no longer being used.

BUG=webrtc:4741
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, kwiberg@webrtc.org, stefan@webrtc.org, terelius@webrtc.org

Review URL: https://codereview.webrtc.org/1340283002 .

Cr-Commit-Position: refs/heads/master@{#9972}
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
index 3013925..98b5265 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
@@ -27,7 +27,6 @@
 #include "webrtc/system_wrappers/interface/rw_lock_wrapper.h"
 #include "webrtc/system_wrappers/interface/trace.h"
 #include "webrtc/typedefs.h"
-#include "webrtc/video/rtc_event_log.h"
 
 namespace webrtc {
 
@@ -147,8 +146,7 @@
       first_frame_(true),
       callback_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
       packetization_callback_(NULL),
-      vad_callback_(NULL),
-      event_log_(config.event_log) {
+      vad_callback_(NULL) {
   if (InitializeReceiverSafe() < 0) {
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                  "Cannot initialize receiver");
@@ -682,11 +680,6 @@
                  "PlayoutData failed, RecOut Failed");
     return -1;
   }
-  {
-    if (event_log_)
-      event_log_->LogDebugEvent(RtcEventLog::DebugEvent::kAudioPlayout);
-  }
-
   audio_frame->id_ = id_;
   return 0;
 }
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
index 837cd11..f7bad88 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
@@ -295,8 +295,6 @@
   AudioPacketizationCallback* packetization_callback_
       GUARDED_BY(callback_crit_sect_);
   ACMVADCallback* vad_callback_ GUARDED_BY(callback_crit_sect_);
-
-  RtcEventLog* const event_log_;
 };
 
 }  // namespace acm2
diff --git a/webrtc/modules/audio_coding/main/interface/audio_coding_module.h b/webrtc/modules/audio_coding/main/interface/audio_coding_module.h
index 0d3d5da..9ce622f 100644
--- a/webrtc/modules/audio_coding/main/interface/audio_coding_module.h
+++ b/webrtc/modules/audio_coding/main/interface/audio_coding_module.h
@@ -29,7 +29,6 @@
 class AudioDecoder;
 class AudioEncoder;
 class AudioFrame;
-class RtcEventLog;
 class RTPFragmentationHeader;
 
 #define WEBRTC_10MS_PCM_AUDIO 960  // 16 bits super wideband 48 kHz
@@ -83,16 +82,11 @@
 
  public:
   struct Config {
-    Config()
-        : id(0),
-          neteq_config(),
-          clock(Clock::GetRealTimeClock()),
-          event_log(nullptr) {}
+    Config() : id(0), neteq_config(), clock(Clock::GetRealTimeClock()) {}
 
     int id;
     NetEq::Config neteq_config;
     Clock* clock;
-    RtcEventLog* event_log;
   };
 
   ///////////////////////////////////////////////////////////////////////////
diff --git a/webrtc/video/rtc_event_log.cc b/webrtc/video/rtc_event_log.cc
index 7086b3e..8e6d1b9 100644
--- a/webrtc/video/rtc_event_log.cc
+++ b/webrtc/video/rtc_event_log.cc
@@ -50,7 +50,7 @@
                      MediaType media_type,
                      const uint8_t* packet,
                      size_t length) override {}
-  void LogDebugEvent(DebugEvent event_type) override {}
+  void LogAudioPlayout(uint32_t ssrc) override {}
 };
 
 #else  // ENABLE_RTC_EVENT_LOG is defined
@@ -72,7 +72,7 @@
                      MediaType media_type,
                      const uint8_t* packet,
                      size_t length) override;
-  void LogDebugEvent(DebugEvent event_type) override;
+  void LogAudioPlayout(uint32_t ssrc) override;
 
  private:
   // Stops logging and clears the stored data and buffers.
@@ -111,20 +111,6 @@
 // unnamed namespace. The intention is to make the compiler warn if anyone
 // adds unhandled new events/modes/etc.
 
-rtclog::DebugEvent_EventType ConvertDebugEvent(
-    RtcEventLog::DebugEvent event_type) {
-  switch (event_type) {
-    case RtcEventLog::DebugEvent::kLogStart:
-      return rtclog::DebugEvent::LOG_START;
-    case RtcEventLog::DebugEvent::kLogEnd:
-      return rtclog::DebugEvent::LOG_END;
-    case RtcEventLog::DebugEvent::kAudioPlayout:
-      return rtclog::DebugEvent::AUDIO_PLAYOUT;
-  }
-  RTC_NOTREACHED();
-  return rtclog::DebugEvent::UNKNOWN_EVENT;
-}
-
 rtclog::VideoReceiveConfig_RtcpMode ConvertRtcpMode(
     newapi::RtcpMode rtcp_mode) {
   switch (rtcp_mode) {
@@ -188,7 +174,7 @@
   start_event.set_timestamp_us(start_time_us_);
   start_event.set_type(rtclog::Event::DEBUG_EVENT);
   auto debug_event = start_event.mutable_debug_event();
-  debug_event->set_type(ConvertDebugEvent(DebugEvent::kLogStart));
+  debug_event->set_type(rtclog::DebugEvent_EventType_LOG_START);
   StoreToFile(&start_event);
 }
 
@@ -330,14 +316,15 @@
   HandleEvent(&rtcp_event);
 }
 
-void RtcEventLogImpl::LogDebugEvent(DebugEvent event_type) {
+void RtcEventLogImpl::LogAudioPlayout(uint32_t ssrc) {
   rtc::CritScope lock(&crit_);
   rtclog::Event event;
   const int64_t timestamp = clock_->TimeInMicroseconds();
   event.set_timestamp_us(timestamp);
   event.set_type(rtclog::Event::DEBUG_EVENT);
   auto debug_event = event.mutable_debug_event();
-  debug_event->set_type(ConvertDebugEvent(event_type));
+  debug_event->set_type(rtclog::DebugEvent_EventType_AUDIO_PLAYOUT);
+  debug_event->set_local_ssrc(ssrc);
   HandleEvent(&event);
 }
 
@@ -350,7 +337,7 @@
     event.set_timestamp_us(timestamp);
     event.set_type(rtclog::Event::DEBUG_EVENT);
     auto debug_event = event.mutable_debug_event();
-    debug_event->set_type(ConvertDebugEvent(DebugEvent::kLogEnd));
+    debug_event->set_type(rtclog::DebugEvent_EventType_LOG_END);
     // Store the event and close the file
     RTC_DCHECK(file_->Open());
     StoreToFile(&event);
diff --git a/webrtc/video/rtc_event_log.h b/webrtc/video/rtc_event_log.h
index a58d745..daab3c1 100644
--- a/webrtc/video/rtc_event_log.h
+++ b/webrtc/video/rtc_event_log.h
@@ -31,9 +31,6 @@
 
 class RtcEventLog {
  public:
-  // The types of debug events that are currently supported for logging.
-  enum class DebugEvent { kLogStart, kLogEnd, kAudioPlayout };
-
   virtual ~RtcEventLog() {}
 
   static rtc::scoped_ptr<RtcEventLog> Create();
@@ -67,8 +64,8 @@
                              const uint8_t* packet,
                              size_t length) = 0;
 
-  // Logs a debug event.
-  virtual void LogDebugEvent(DebugEvent event_type) = 0;
+  // Logs an audio playout event
+  virtual void LogAudioPlayout(uint32_t ssrc) = 0;
 
   // Reads an RtcEventLog file and returns true when reading was successful.
   // The result is stored in the given EventStream object.
diff --git a/webrtc/video/rtc_event_log.proto b/webrtc/video/rtc_event_log.proto
index 7e4e699..bdb6bb1 100644
--- a/webrtc/video/rtc_event_log.proto
+++ b/webrtc/video/rtc_event_log.proto
@@ -106,6 +106,9 @@
 
   // required
   optional EventType type = 1;
+
+  // required if type == AUDIO_PLAYOUT
+  optional uint32 local_ssrc = 2;
 }
 
 
diff --git a/webrtc/video/rtc_event_log_unittest.cc b/webrtc/video/rtc_event_log_unittest.cc
index 7a2bd11..6c1786b 100644
--- a/webrtc/video/rtc_event_log_unittest.cc
+++ b/webrtc/video/rtc_event_log_unittest.cc
@@ -265,12 +265,14 @@
   }
 }
 
-void VerifyPlayoutEvent(const rtclog::Event& event) {
+void VerifyPlayoutEvent(const rtclog::Event& event, uint32_t ssrc) {
   ASSERT_TRUE(IsValidBasicEvent(event));
   ASSERT_EQ(rtclog::Event::DEBUG_EVENT, event.type());
   const rtclog::DebugEvent& debug_event = event.debug_event();
   ASSERT_TRUE(debug_event.has_type());
   EXPECT_EQ(rtclog::DebugEvent::AUDIO_PLAYOUT, debug_event.type());
+  ASSERT_TRUE(debug_event.has_local_ssrc());
+  EXPECT_EQ(ssrc, debug_event.local_ssrc());
 }
 
 void VerifyLogStartEvent(const rtclog::Event& event) {
@@ -407,6 +409,7 @@
   std::vector<rtc::Buffer> rtp_packets;
   std::vector<rtc::Buffer> rtcp_packets;
   std::vector<size_t> rtp_header_sizes;
+  std::vector<uint32_t> playout_ssrcs;
 
   VideoReceiveStream::Config receiver_config(nullptr);
   VideoSendStream::Config sender_config(nullptr);
@@ -427,6 +430,10 @@
     rtcp_packets.push_back(rtc::Buffer(packet_size));
     GenerateRtcpPacket(rtcp_packets[i].data(), packet_size);
   }
+  // Create debug_count random SSRCs to use when logging AudioPlayout events.
+  for (size_t i = 0; i < debug_count; i++) {
+    playout_ssrcs.push_back(static_cast<uint32_t>(rand()));
+  }
   // Create configurations for the video streams.
   GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config);
   GenerateVideoSendConfig(extensions_bitvector, &sender_config);
@@ -459,7 +466,7 @@
         rtcp_index++;
       }
       if (i * debug_count >= debug_index * rtp_count) {
-        log_dumper->LogDebugEvent(RtcEventLog::DebugEvent::kAudioPlayout);
+        log_dumper->LogAudioPlayout(playout_ssrcs[debug_index - 1]);
         debug_index++;
       }
       if (i == rtp_count / 2) {
@@ -497,7 +504,8 @@
       rtcp_index++;
     }
     if (i * debug_count >= debug_index * rtp_count) {
-      VerifyPlayoutEvent(parsed_stream.stream(event_index));
+      VerifyPlayoutEvent(parsed_stream.stream(event_index),
+                         playout_ssrcs[debug_index - 1]);
       event_index++;
       debug_index++;
     }
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc
index fb29dfa..a8fb179 100644
--- a/webrtc/voice_engine/channel.cc
+++ b/webrtc/voice_engine/channel.cc
@@ -12,6 +12,7 @@
 
 #include <algorithm>
 
+#include "webrtc/base/checks.h"
 #include "webrtc/base/format_macros.h"
 #include "webrtc/base/timeutils.h"
 #include "webrtc/common.h"
@@ -450,6 +451,11 @@
     WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId),
                  "Channel::GetAudioFrame(id=%d)", id);
 
+    if (event_log_) {
+      unsigned int ssrc;
+      RTC_CHECK_EQ(GetLocalSSRC(ssrc), 0);
+      event_log_->LogAudioPlayout(ssrc);
+    }
     // Get 10ms raw PCM data from the ACM (mixer limits output frequency)
     if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_,
                                        audioFrame) == -1)
@@ -719,6 +725,7 @@
     volume_settings_critsect_(*CriticalSectionWrapper::CreateCriticalSection()),
     _instanceId(instanceId),
     _channelId(channelId),
+    event_log_(event_log),
     rtp_header_parser_(RtpHeaderParser::Create()),
     rtp_payload_registry_(
         new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))),
@@ -809,7 +816,6 @@
     }
     acm_config.neteq_config.enable_fast_accelerate =
         config.Get<NetEqFastAccelerate>().enabled;
-    acm_config.event_log = event_log;
     audio_coding_.reset(AudioCodingModule::Create(acm_config));
 
     _inbandDtmfQueue.ResetDtmf();
diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h
index 56f6ce4..66eaff1 100644
--- a/webrtc/voice_engine/channel.h
+++ b/webrtc/voice_engine/channel.h
@@ -488,6 +488,8 @@
 
     ChannelState channel_state_;
 
+    RtcEventLog* const event_log_;
+
     rtc::scoped_ptr<RtpHeaderParser> rtp_header_parser_;
     rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
     rtc::scoped_ptr<ReceiveStatistics> rtp_receive_statistics_;