Add audio streams to CallTest and a first A/V call test.

Add audio send and receive streams to CallTest and call the necessary voice engine APIs for the streams to be usable. Verifies the implementation by adding a simple test which monitors outgoing packets and checks that both audio and video is being sent with transport sequence numbers.

Audio streams are using a fake audio device with file input.

The CallTest implementation is to a big degree based on call_perf_tests.cc and should in the future replace a lot of that code.

R=pbos@webrtc.org
TBR=kjellander@webrtc.org

BUG=webrtc:5263

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

Cr-Commit-Position: refs/heads/master@{#11171}
diff --git a/webrtc/test/call_test.h b/webrtc/test/call_test.h
index 32820ed..46fbe7f 100644
--- a/webrtc/test/call_test.h
+++ b/webrtc/test/call_test.h
@@ -7,19 +7,26 @@
  *  in the file PATENTS.  All contributing project authors may
  *  be found in the AUTHORS file in the root of the source tree.
  */
-#ifndef WEBRTC_TEST_COMMON_CALL_TEST_H_
-#define WEBRTC_TEST_COMMON_CALL_TEST_H_
+#ifndef WEBRTC_TEST_CALL_TEST_H_
+#define WEBRTC_TEST_CALL_TEST_H_
 
 #include <vector>
 
 #include "webrtc/call.h"
+#include "webrtc/call/transport_adapter.h"
 #include "webrtc/system_wrappers/include/scoped_vector.h"
+#include "webrtc/test/fake_audio_device.h"
 #include "webrtc/test/fake_decoder.h"
 #include "webrtc/test/fake_encoder.h"
 #include "webrtc/test/frame_generator_capturer.h"
 #include "webrtc/test/rtp_rtcp_observer.h"
 
 namespace webrtc {
+
+class VoEBase;
+class VoECodec;
+class VoENetwork;
+
 namespace test {
 
 class BaseTest;
@@ -27,24 +34,30 @@
 class CallTest : public ::testing::Test {
  public:
   CallTest();
-  ~CallTest();
+  virtual ~CallTest();
 
   static const size_t kNumSsrcs = 3;
 
   static const int kDefaultTimeoutMs;
   static const int kLongTimeoutMs;
-  static const uint8_t kSendPayloadType;
+  static const uint8_t kVideoSendPayloadType;
   static const uint8_t kSendRtxPayloadType;
-  static const uint8_t kFakeSendPayloadType;
+  static const uint8_t kFakeVideoSendPayloadType;
   static const uint8_t kRedPayloadType;
   static const uint8_t kRtxRedPayloadType;
   static const uint8_t kUlpfecPayloadType;
+  static const uint8_t kAudioSendPayloadType;
   static const uint32_t kSendRtxSsrcs[kNumSsrcs];
-  static const uint32_t kSendSsrcs[kNumSsrcs];
-  static const uint32_t kReceiverLocalSsrc;
+  static const uint32_t kVideoSendSsrcs[kNumSsrcs];
+  static const uint32_t kAudioSendSsrc;
+  static const uint32_t kReceiverLocalVideoSsrc;
+  static const uint32_t kReceiverLocalAudioSsrc;
   static const int kNackRtpHistoryMs;
 
  protected:
+  // RunBaseTest overwrites the audio_state and the voice_engine of the send and
+  // receive Call configs to simplify test code and avoid having old VoiceEngine
+  // APIs in the tests.
   void RunBaseTest(BaseTest* test, const FakeNetworkPipe::Config& config);
 
   void CreateCalls(const Call::Config& sender_config,
@@ -53,12 +66,16 @@
   void CreateReceiverCall(const Call::Config& config);
   void DestroyCalls();
 
-  void CreateSendConfig(size_t num_streams, Transport* send_transport);
+  void CreateSendConfig(size_t num_video_streams,
+                        size_t num_audio_streams,
+                        Transport* send_transport);
   void CreateMatchingReceiveConfigs(Transport* rtcp_send_transport);
 
   void CreateFrameGeneratorCapturer();
+  void CreateFakeAudioDevices();
 
-  void CreateStreams();
+  void CreateVideoStreams();
+  void CreateAudioStreams();
   void Start();
   void Stop();
   void DestroyStreams();
@@ -70,15 +87,54 @@
   VideoSendStream::Config video_send_config_;
   VideoEncoderConfig video_encoder_config_;
   VideoSendStream* video_send_stream_;
+  AudioSendStream::Config audio_send_config_;
+  AudioSendStream* audio_send_stream_;
 
   rtc::scoped_ptr<Call> receiver_call_;
   rtc::scoped_ptr<PacketTransport> receive_transport_;
   std::vector<VideoReceiveStream::Config> video_receive_configs_;
   std::vector<VideoReceiveStream*> video_receive_streams_;
+  std::vector<AudioReceiveStream::Config> audio_receive_configs_;
+  std::vector<AudioReceiveStream*> audio_receive_streams_;
 
   rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
   test::FakeEncoder fake_encoder_;
   ScopedVector<VideoDecoder> allocated_decoders_;
+  size_t num_video_streams_;
+  size_t num_audio_streams_;
+
+ private:
+  // TODO(holmer): Remove once VoiceEngine is fully refactored to the new API.
+  // These methods are used to set up legacy voice engines and channels which is
+  // necessary while voice engine is being refactored to the new stream API.
+  struct VoiceEngineState {
+    VoiceEngineState()
+        : voice_engine(nullptr),
+          base(nullptr),
+          network(nullptr),
+          codec(nullptr),
+          channel_id(-1),
+          transport_adapter(nullptr) {}
+
+    VoiceEngine* voice_engine;
+    VoEBase* base;
+    VoENetwork* network;
+    VoECodec* codec;
+    int channel_id;
+    rtc::scoped_ptr<internal::TransportAdapter> transport_adapter;
+  };
+
+  void CreateVoiceEngines();
+  void SetupVoiceEngineTransports(PacketTransport* send_transport,
+                                  PacketTransport* recv_transport);
+  void DestroyVoiceEngines();
+
+  VoiceEngineState voe_send_;
+  VoiceEngineState voe_recv_;
+
+  // The audio devices must outlive the voice engines.
+  rtc::scoped_ptr<test::FakeAudioDevice> fake_send_audio_device_;
+  rtc::scoped_ptr<test::FakeAudioDevice> fake_recv_audio_device_;
 };
 
 class BaseTest : public RtpRtcpObserver {
@@ -89,7 +145,8 @@
   virtual void PerformTest() = 0;
   virtual bool ShouldCreateReceivers() const = 0;
 
-  virtual size_t GetNumStreams() const;
+  virtual size_t GetNumVideoStreams() const;
+  virtual size_t GetNumAudioStreams() const;
 
   virtual Call::Config GetSenderCallConfig();
   virtual Call::Config GetReceiverCallConfig();
@@ -105,6 +162,13 @@
       VideoSendStream* send_stream,
       const std::vector<VideoReceiveStream*>& receive_streams);
 
+  virtual void ModifyAudioConfigs(
+      AudioSendStream::Config* send_config,
+      std::vector<AudioReceiveStream::Config>* receive_configs);
+  virtual void OnAudioStreamsCreated(
+      AudioSendStream* send_stream,
+      const std::vector<AudioReceiveStream*>& receive_streams);
+
   virtual void OnFrameGeneratorCapturerCreated(
       FrameGeneratorCapturer* frame_generator_capturer);
 };
@@ -126,4 +190,4 @@
 }  // namespace test
 }  // namespace webrtc
 
-#endif  // WEBRTC_TEST_COMMON_CALL_TEST_H_
+#endif  // WEBRTC_TEST_CALL_TEST_H_