Move the VIE tests to use external transport instead of the built in udp transport
Review URL: https://webrtc-codereview.appspot.com/1216010

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@3712 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/test/channel_transport/channel_transport.cc b/test/channel_transport/channel_transport.cc
index 877a601..3985688 100644
--- a/test/channel_transport/channel_transport.cc
+++ b/test/channel_transport/channel_transport.cc
@@ -12,7 +12,9 @@
 
 #include <stdio.h>
 
+#ifndef WEBRTC_ANDROID
 #include "gtest/gtest.h"
+#endif
 #include "webrtc/test/channel_transport/udp_transport.h"
 #include "webrtc/video_engine/include/vie_network.h"
 #include "webrtc/voice_engine/include/voe_network.h"
@@ -27,8 +29,12 @@
       voe_network_(voe_network) {
   WebRtc_UWord8 socket_threads = 1;
   socket_transport_ = UdpTransport::Create(channel, socket_threads);
+#ifndef WEBRTC_ANDROID
   EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel,
                                                        *socket_transport_));
+#else
+  voe_network_->RegisterExternalTransport(channel, *socket_transport_);
+#endif
 }
 
 VoiceChannelTransport::~VoiceChannelTransport() {
@@ -69,8 +75,12 @@
       vie_network_(vie_network) {
   WebRtc_UWord8 socket_threads = 1;
   socket_transport_ = UdpTransport::Create(channel, socket_threads);
+#ifndef WEBRTC_ANDROID
   EXPECT_EQ(0, vie_network_->RegisterSendTransport(channel,
                                                    *socket_transport_));
+#else
+  vie_network_->RegisterSendTransport(channel, *socket_transport_);
+#endif
 }
   
 VideoChannelTransport::~VideoChannelTransport() {
diff --git a/video_engine/test/android/jni/Android.mk b/video_engine/test/android/jni/Android.mk
index 55eae39..1b51044 100644
--- a/video_engine/test/android/jni/Android.mk
+++ b/video_engine/test/android/jni/Android.mk
@@ -219,6 +219,12 @@
 include $(PREBUILT_STATIC_LIBRARY)
 
 include $(CLEAR_VARS)
+LOCAL_MODULE := libchannel_transport
+LOCAL_SRC_FILES := \
+    $(MY_LIBS_PATH)/libchannel_transport.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
 LOCAL_MODULE := libwebrtc_utility
 LOCAL_SRC_FILES := \
     $(MY_LIBS_PATH)/libwebrtc_utility.a
@@ -349,6 +355,7 @@
     librtp_rtcp \
     libmedia_file \
     libudp_transport \
+    libchannel_transport \
     libwebrtc_utility \
     libaudio_conference_mixer \
     libyuv \
diff --git a/video_engine/test/android/jni/vie_android_java_api.cc b/video_engine/test/android/jni/vie_android_java_api.cc
index 8c8aa0b..ce07dd6 100644
--- a/video_engine/test/android/jni/vie_android_java_api.cc
+++ b/video_engine/test/android/jni/vie_android_java_api.cc
@@ -34,6 +34,9 @@
 #include "common_types.h"
 #include "android_media_codec_decoder.h"
 
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+
 #define WEBRTC_LOG_TAG "*WEBRTCN*"
 #define VALIDATE_BASE_POINTER                                           \
   if (!voeData.base)                                                    \
@@ -88,6 +91,7 @@
   }
 
 using namespace webrtc;
+using namespace test;
 
 //Forward declaration.
 class VideoCallbackAndroid;
@@ -107,6 +111,7 @@
   VoEHardware* hardware;
   VoERTP_RTCP* rtp;
   JavaVM* jvm;
+  scoped_ptr<VoiceChannelTransport> transport;
 } VoiceEngineData;
 
 class AndroidVideoRenderCallback;
@@ -122,7 +127,7 @@
   ViECapture* capture;
   ViEExternalCodec* externalCodec;
   VideoCallbackAndroid* callback;
-
+  scoped_ptr<VideoChannelTransport> transport;
 } VideoEngineData;
 
 // Global variables
@@ -589,7 +594,7 @@
     if (voiceChannel >= 0) {
       vieData.base->ConnectAudioChannel(channel, voiceChannel);
     }
-
+    vieData.transport.reset(new VideoChannelTransport(vieData.netw, channel));
     return channel;
   }
   else {
@@ -610,13 +615,10 @@
 {
   __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetLocalReceiver");
 
-  if (vieData.vie) {
-    int ret = vieData.netw->SetLocalReceiver(channel, port);
-    return ret;
+  if (vieData.transport.get()) {
+    return vieData.transport->SetLocalReceiver(port);
   }
-  else {
-    return -1;
-  }
+  return -1;
 }
 
 /*
@@ -646,7 +648,10 @@
                       "SetSendDestination: channel=%d, port=%d, ip=%s\n",
                       channel, port, ip);
 
-  return vieData.netw->SetSendDestination(channel, ip, port);
+  if (vieData.transport.get()) {
+    return vieData.transport->SetSendDestination(ip, port);
+  }
+  return -1;
 }
 
 
@@ -1264,7 +1269,7 @@
   }
 
   jint channel = voeData.base->CreateChannel();
-
+  voeData.transport.reset(new VoiceChannelTransport(voeData.netw, channel));
   return channel;
 }
 
@@ -1295,7 +1300,10 @@
 {
   __android_log_write(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG, "SetLocalReceiver");
   VALIDATE_BASE_POINTER;
-  return voeData.base->SetLocalReceiver(channel, port);
+  if (voeData.transport.get()) {
+    return voeData.transport->SetLocalReceiver(port);
+  }
+  return -1;
 }
 
 /*
@@ -1319,9 +1327,13 @@
                         "Could not get UTF string");
     return -1;
   }
-  jint retVal = voeData.base->SetSendDestination(channel, port, ipaddrNative);
+  if (voeData.transport.get()) {
+    jint retVal = voeData.transport->SetSendDestination(ipaddrNative, port);
+    env->ReleaseStringUTFChars(ipaddr, ipaddrNative);
+    return retVal;
+  }
   env->ReleaseStringUTFChars(ipaddr, ipaddrNative);
-  return retVal;
+  return -1;
 }
 
 /*
diff --git a/video_engine/test/auto_test/automated/vie_api_integration_test.cc b/video_engine/test/auto_test/automated/vie_api_integration_test.cc
index 7b49103..96b401b 100644
--- a/video_engine/test/auto_test/automated/vie_api_integration_test.cc
+++ b/video_engine/test/auto_test/automated/vie_api_integration_test.cc
@@ -48,10 +48,6 @@
   tests_->ViEImageProcessAPITest();
 }
 
-TEST_F(DISABLED_ON_MAC(ViEApiIntegrationTest), RunsNetworkTestWithoutErrors) {
-  tests_->ViENetworkAPITest();
-}
-
 TEST_F(DISABLED_ON_MAC(ViEApiIntegrationTest), RunsRenderTestWithoutErrors) {
   tests_->ViERenderAPITest();
 }
diff --git a/video_engine/test/auto_test/automated/vie_extended_integration_test.cc b/video_engine/test/auto_test/automated/vie_extended_integration_test.cc
index c091475..d224bde 100644
--- a/video_engine/test/auto_test/automated/vie_extended_integration_test.cc
+++ b/video_engine/test/auto_test/automated/vie_extended_integration_test.cc
@@ -51,11 +51,6 @@
 }
 
 TEST_F(DISABLED_ON_MAC(ViEExtendedIntegrationTest),
-       RunsNetworkTestWithoutErrors) {
-  tests_->ViENetworkExtendedTest();
-}
-
-TEST_F(DISABLED_ON_MAC(ViEExtendedIntegrationTest),
        RunsRenderTestWithoutErrors) {
   tests_->ViERenderExtendedTest();
 }
diff --git a/video_engine/test/auto_test/automated/vie_standard_integration_test.cc b/video_engine/test/auto_test/automated/vie_standard_integration_test.cc
index 4f90aac..30364e0 100644
--- a/video_engine/test/auto_test/automated/vie_standard_integration_test.cc
+++ b/video_engine/test/auto_test/automated/vie_standard_integration_test.cc
@@ -54,10 +54,6 @@
   tests_->ViEImageProcessStandardTest();
 }
 
-TEST_F(ViEStandardIntegrationTest, RunsNetworkTestWithoutErrors)  {
-  tests_->ViENetworkStandardTest();
-}
-
 TEST_F(ViEStandardIntegrationTest, RunsRenderTestWithoutErrors)  {
   tests_->ViERenderStandardTest();
 }
diff --git a/video_engine/test/auto_test/source/vie_autotest.cc b/video_engine/test/auto_test/source/vie_autotest.cc
index a707e70..04fe7e7 100644
--- a/video_engine/test/auto_test/source/vie_autotest.cc
+++ b/video_engine/test/auto_test/source/vie_autotest.cc
@@ -67,7 +67,6 @@
     ViEEncryptionStandardTest();
     ViEFileStandardTest();
     ViEImageProcessStandardTest();
-    ViENetworkStandardTest();
     ViERenderStandardTest();
     ViERtpRtcpStandardTest();
 }
@@ -80,7 +79,6 @@
     ViEEncryptionExtendedTest();
     ViEFileExtendedTest();
     ViEImageProcessExtendedTest();
-    ViENetworkExtendedTest();
     ViERenderExtendedTest();
     ViERtpRtcpExtendedTest();
 }
@@ -93,7 +91,6 @@
     ViEEncryptionAPITest();
     ViEFileAPITest();
     ViEImageProcessAPITest();
-    ViENetworkAPITest();
     ViERenderAPITest();
     ViERtpRtcpAPITest();
 }
diff --git a/video_engine/test/auto_test/source/vie_autotest_android.cc b/video_engine/test/auto_test/source/vie_autotest_android.cc
index d1622db..80d8d90 100644
--- a/video_engine/test/auto_test/source/vie_autotest_android.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_android.cc
@@ -162,21 +162,14 @@
           vieAutoTest.ViEImageProcessExtendedTest();
           break;
 
-        case 8: // network
-          vieAutoTest.ViENetworkExtendedTest();
-          break;
-
-        case 9: // Render
+        case 8: // Render
           vieAutoTest.ViERenderExtendedTest();
           break;
 
-        case 10: // RTP/RTCP
+        case 9: // RTP/RTCP
           vieAutoTest.ViERtpRtcpExtendedTest();
           break;
 
-        case 11:
-          break;
-
         default:
           break;
       }
diff --git a/video_engine/test/auto_test/source/vie_autotest_base.cc b/video_engine/test/auto_test/source/vie_autotest_base.cc
index e9d24f3..20e41df 100644
--- a/video_engine/test/auto_test/source/vie_autotest_base.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_base.cc
@@ -9,11 +9,12 @@
  */
 
 #include "webrtc/modules/video_capture/include/video_capture_factory.h"
-#include "video_engine/test/auto_test/interface/vie_autotest.h"
-#include "video_engine/test/auto_test/interface/vie_autotest_defines.h"
-#include "video_engine/test/auto_test/primitives/base_primitives.h"
-#include "video_engine/test/auto_test/primitives/general_primitives.h"
-#include "video_engine/test/libvietest/include/tb_interfaces.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
+#include "webrtc/video_engine/test/auto_test/primitives/base_primitives.h"
+#include "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
 
 void ViEAutoTest::ViEBaseStandardTest() {
   // ***************************************************************
@@ -150,20 +151,30 @@
   // Create a receive only channel and a send channel. Verify we can't send on
   // the receive only channel.
   EXPECT_EQ(0, vie_base->CreateReceiveChannel(video_channel2,
-                                                  video_channel));
+                                              video_channel));
   EXPECT_EQ(0, vie_base->CreateChannel(video_channel3, video_channel));
 
   const char* ip_address = "127.0.0.1\0";
   const int send_port = 1234;
+
   EXPECT_EQ(0, vie_rtp->SetLocalSSRC(video_channel, 1));
-  EXPECT_EQ(0, vie_network->SetSendDestination(video_channel, ip_address,
-                                               send_port));
   EXPECT_EQ(0, vie_rtp->SetLocalSSRC(video_channel, 2));
-  EXPECT_EQ(0, vie_network->SetSendDestination(video_channel2, ip_address,
-                                               send_port + 2));
   EXPECT_EQ(0, vie_rtp->SetLocalSSRC(video_channel, 3));
-  EXPECT_EQ(0, vie_network->SetSendDestination(video_channel3, ip_address,
-                                               send_port + 4));
+
+  webrtc::test::VideoChannelTransport* video_channel_transport_1 =
+      new webrtc::test::VideoChannelTransport(vie_network, video_channel);
+
+  ASSERT_EQ(0, video_channel_transport_1->SetSendDestination(ip_address,
+                                                             send_port));
+
+  webrtc::test::VideoChannelTransport* video_channel_transport_2 =
+      new webrtc::test::VideoChannelTransport(vie_network, video_channel2);
+
+  webrtc::test::VideoChannelTransport* video_channel_transport_3 =
+      new webrtc::test::VideoChannelTransport(vie_network, video_channel3);
+
+  ASSERT_EQ(0, video_channel_transport_3->SetSendDestination(ip_address,
+                                                             send_port + 4));
 
   EXPECT_EQ(0, vie_base->StartSend(video_channel));
   EXPECT_EQ(-1, vie_base->StartSend(video_channel2));
@@ -220,6 +231,9 @@
   EXPECT_FALSE(webrtc::VideoEngine::Delete(video_engine)) <<
       "Should fail since there are interfaces left.";
 
+  delete video_channel_transport_1;
+  delete video_channel_transport_2;
+  delete video_channel_transport_3;
   EXPECT_EQ(0, vie_base->Release());
   EXPECT_TRUE(webrtc::VideoEngine::Delete(video_engine));
 }
diff --git a/video_engine/test/auto_test/source/vie_autotest_codec.cc b/video_engine/test/auto_test/source/vie_autotest_codec.cc
index 87169a6..a1e0f8d 100644
--- a/video_engine/test/auto_test/source/vie_autotest_codec.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_codec.cc
@@ -8,21 +8,24 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "common_types.h"  // NOLINT
-#include "engine_configurations.h"  // NOLINT
-#include "video_engine/test/auto_test/interface/vie_autotest_defines.h"
-#include "video_engine/test/auto_test/interface/vie_autotest.h"
-#include "video_engine/test/libvietest/include/tb_capture_device.h"
-#include "video_engine/test/libvietest/include/tb_I420_codec.h"
-#include "video_engine/test/libvietest/include/tb_interfaces.h"
-#include "video_engine/test/libvietest/include/tb_video_channel.h"
-#include "video_engine/include/vie_base.h"
-#include "video_engine/include/vie_capture.h"
-#include "video_engine/include/vie_codec.h"
-#include "video_engine/include/vie_network.h"
-#include "video_engine/include/vie_render.h"
-#include "video_engine/include/vie_rtp_rtcp.h"
-#include "voice_engine/include/voe_base.h"
+#include "webrtc/common_types.h"
+#include "webrtc/engine_configurations.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_capture_device.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_I420_codec.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_video_channel.h"
+#include "webrtc/video_engine/include/vie_base.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "webrtc/video_engine/include/vie_codec.h"
+#include "webrtc/video_engine/include/vie_external_codec.h"
+#include "webrtc/video_engine/include/vie_network.h"
+#include "webrtc/video_engine/include/vie_render.h"
+#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
+#include "webrtc/voice_engine/include/voe_base.h"
 
 class TestCodecObserver
     : public webrtc::ViEEncoderObserver,
@@ -164,13 +167,18 @@
       break;
     }
   }
-
   const char* ip_address = "127.0.0.1";
   const uint16_t rtp_port = 6000;
-  EXPECT_EQ(0, network->SetLocalReceiver(video_channel, rtp_port));
+
+  webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+      video_channel_transport(
+          new webrtc::test::VideoChannelTransport(network, video_channel));
+
+  ASSERT_EQ(0, video_channel_transport->SetSendDestination(ip_address,
+                                                           rtp_port));
+  ASSERT_EQ(0, video_channel_transport->SetLocalReceiver(rtp_port));
+
   EXPECT_EQ(0, base->StartReceive(video_channel));
-  EXPECT_EQ(0, network->SetSendDestination(
-      video_channel, ip_address, rtp_port));
   EXPECT_EQ(0, base->StartSend(video_channel));
 
   // Make sure all codecs runs
@@ -300,11 +308,17 @@
 
     const char* ip_address = "127.0.0.1";
     const uint16_t rtp_port = 6000;
-    EXPECT_EQ(0, network->SetLocalReceiver(video_channel, rtp_port));
-    EXPECT_EQ(0, base->StartReceive(video_channel));
-    EXPECT_EQ(0, network->SetSendDestination(
-        video_channel, ip_address, rtp_port));
+
+    webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+        video_channel_transport(
+            new webrtc::test::VideoChannelTransport(network, video_channel));
+
+    ASSERT_EQ(0, video_channel_transport->SetSendDestination(ip_address,
+                                                             rtp_port));
+    ASSERT_EQ(0, video_channel_transport->SetLocalReceiver(rtp_port));
+
     EXPECT_EQ(0, base->StartSend(video_channel));
+    EXPECT_EQ(0, base->StartReceive(video_channel));
 
     // Codec specific tests
     memset(&video_codec, 0, sizeof(webrtc::VideoCodec));
@@ -329,6 +343,7 @@
     // the received streams.
     TbInterfaces video_engine("ViECodecExtendedTest2");
     TbCaptureDevice tb_capture(video_engine);
+    webrtc::ViENetwork* network = video_engine.network;
 
     // Create channel 1.
     int video_channel_1 = -1;
@@ -341,17 +356,27 @@
     EXPECT_NE(video_channel_1, video_channel_2)
         << "Channel 2 should be unique.";
 
+    const char* ip_address = "127.0.0.1";
     uint16_t rtp_port_1 = 12000;
     uint16_t rtp_port_2 = 13000;
-    EXPECT_EQ(0, video_engine.network->SetLocalReceiver(
-        video_channel_1, rtp_port_1));
-    EXPECT_EQ(0, video_engine.network->SetSendDestination(
-        video_channel_1, "127.0.0.1", rtp_port_1));
+
+    webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+        video_channel_transport_1(
+            new webrtc::test::VideoChannelTransport(network, video_channel_1));
+
+    ASSERT_EQ(0, video_channel_transport_1->SetSendDestination(ip_address,
+                                                               rtp_port_1));
+    ASSERT_EQ(0, video_channel_transport_1->SetLocalReceiver(rtp_port_1));
+
+    webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+        video_channel_transport_2(
+            new webrtc::test::VideoChannelTransport(network, video_channel_2));
+
+    ASSERT_EQ(0, video_channel_transport_2->SetSendDestination(ip_address,
+                                                               rtp_port_2));
+    ASSERT_EQ(0, video_channel_transport_2->SetLocalReceiver(rtp_port_2));
+
     EXPECT_EQ(0, video_engine.rtp_rtcp->SetLocalSSRC(video_channel_1, 1));
-    EXPECT_EQ(0, video_engine.network->SetLocalReceiver(
-        video_channel_2, rtp_port_2));
-    EXPECT_EQ(0, video_engine.network->SetSendDestination(
-        video_channel_2, "127.0.0.1", rtp_port_2));
     EXPECT_EQ(0, video_engine.rtp_rtcp->SetLocalSSRC(video_channel_2, 2));
     tb_capture.ConnectTo(video_channel_1);
     tb_capture.ConnectTo(video_channel_2);
@@ -483,9 +508,6 @@
   EXPECT_TRUE(webrtc::VideoEngine::Delete(video_engine));
 }
 
-#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
-#include "video_engine/include/vie_external_codec.h"
-#endif
 void ViEAutoTest::ViECodecExternalCodecTest() {
   ViETest::Log(" ");
   ViETest::Log("========================================");
diff --git a/video_engine/test/auto_test/source/vie_autotest_custom_call.cc b/video_engine/test/auto_test/source/vie_autotest_custom_call.cc
index b862b64..117cd6a 100644
--- a/video_engine/test/auto_test/source/vie_autotest_custom_call.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_custom_call.cc
@@ -15,12 +15,15 @@
 #include <algorithm>
 
 #include "gflags/gflags.h"
-#include "video_engine/test/auto_test/interface/vie_autotest.h"
-#include "video_engine/test/auto_test/interface/vie_autotest_defines.h"
-#include "video_engine/test/auto_test/primitives/choice_helpers.h"
-#include "video_engine/test/auto_test/primitives/general_primitives.h"
-#include "video_engine/test/auto_test/primitives/input_helpers.h"
-#include "video_engine/test/libvietest/include/vie_to_file_renderer.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
+#include "webrtc/video_engine/test/auto_test/primitives/choice_helpers.h"
+#include "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
+#include "webrtc/video_engine/test/auto_test/primitives/input_helpers.h"
+#include "webrtc/video_engine/test/libvietest/include/vie_to_file_renderer.h"
+#include "webrtc/voice_engine/include/voe_network.h"
 
 #define VCM_RED_PAYLOAD_TYPE                            96
 #define VCM_ULPFEC_PAYLOAD_TYPE                         97
@@ -202,6 +205,12 @@
                                          "ERROR: %s at line %d", __FUNCTION__,
                                          __LINE__);
 
+  webrtc::VoENetwork* voe_network=
+      webrtc::VoENetwork::GetInterface(voe);
+  number_of_errors += ViETest::TestError(voe_network != NULL,
+                                         "ERROR: %s at line %d", __FUNCTION__,
+                                         __LINE__);
+
   webrtc::VoEAudioProcessing* voe_apm =
       webrtc::VoEAudioProcessing::GetInterface(voe);
   number_of_errors += ViETest::TestError(voe_apm != NULL,
@@ -270,6 +279,10 @@
   int buffer_delay_ms = 0;
   bool is_image_scale_enabled = false;
   bool remb = true;
+  webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+      video_channel_transport;
+  webrtc::scoped_ptr<webrtc::test::VoiceChannelTransport>
+      voice_channel_transport;
 
   while (!start_call) {
     // Get the IP address to use from call.
@@ -340,13 +353,17 @@
   if (start_call == true) {
     // Configure audio channel first.
     audio_channel = voe_base->CreateChannel();
-    error = voe_base->SetSendDestination(audio_channel, audio_tx_port,
-                                         ip_address.c_str());
+
+    voice_channel_transport.reset(
+        new webrtc::test::VoiceChannelTransport(voe_network, audio_channel));
+
+    error = voice_channel_transport->SetSendDestination(ip_address.c_str(),
+                                                        audio_tx_port);
     number_of_errors += ViETest::TestError(error == 0,
                                            "ERROR: %s at line %d",
                                            __FUNCTION__, __LINE__);
 
-    error = voe_base->SetLocalReceiver(audio_channel, audio_rx_port);
+    error = voice_channel_transport->SetLocalReceiver(audio_rx_port);
     number_of_errors += ViETest::TestError(error == 0,
                                            "ERROR: %s at line %d",
                                            __FUNCTION__, __LINE__);
@@ -472,13 +489,17 @@
       file_renderer.PrepareForRendering(output_path, filename);
       RenderToFile(vie_renderer, video_channel, &file_renderer);
     }
-    error = vie_network->SetSendDestination(video_channel, ip_address.c_str(),
-                                                video_tx_port);
+
+    video_channel_transport.reset(
+        new webrtc::test::VideoChannelTransport(vie_network, video_channel));
+
+    error = video_channel_transport->SetSendDestination(ip_address.c_str(),
+                                                        video_tx_port);
     number_of_errors += ViETest::TestError(error == 0,
                                            "ERROR: %s at line %d",
                                            __FUNCTION__, __LINE__);
 
-    error = vie_network->SetLocalReceiver(video_channel, video_rx_port);
+    error = video_channel_transport->SetLocalReceiver(video_rx_port);
     number_of_errors += ViETest::TestError(error == 0,
                                            "ERROR: %s at line %d",
                                            __FUNCTION__, __LINE__);
@@ -912,6 +933,9 @@
     // Now tear down the ViE engine.
     error = vie_base->DisconnectAudioChannel(video_channel);
 
+    voice_channel_transport.reset(NULL);
+    video_channel_transport.reset(NULL);
+
     // If Encoder/Decoder Observer is running, delete them.
     if (codec_encoder_observer) {
       error = vie_codec->DeregisterEncoderObserver(video_channel);
diff --git a/video_engine/test/auto_test/source/vie_autotest_file.cc b/video_engine/test/auto_test/source/vie_autotest_file.cc
index 8083171..e790716 100644
--- a/video_engine/test/auto_test/source/vie_autotest_file.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_file.cc
@@ -18,6 +18,9 @@
 
 #include "voe_codec.h"
 
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+
 class ViEAutotestFileObserver: public webrtc::ViEFileObserver
 {
 public:
@@ -103,14 +106,19 @@
                 break;
             }
         }
-
-
         const char* ipAddress = "127.0.0.1";
         const unsigned short rtpPort = 6000;
-        EXPECT_EQ(0, ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort));
+
+        webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
+            video_channel_transport(
+                new webrtc::test::VideoChannelTransport(ptrViENetwork,
+                                                        videoChannel));
+
+        EXPECT_EQ(0, video_channel_transport->SetSendDestination(ipAddress,
+                                                                 rtpPort));
+        EXPECT_EQ(0, video_channel_transport->SetLocalReceiver(rtpPort));
+
         EXPECT_EQ(0, ptrViEBase->StartReceive(videoChannel));
-        EXPECT_EQ(0, ptrViENetwork->SetSendDestination(
-            videoChannel, ipAddress, rtpPort));
         EXPECT_EQ(0, ptrViEBase->StartSend(videoChannel));
         webrtc::ViEFile* ptrViEFile = webrtc::ViEFile::GetInterface(ptrViE);
         EXPECT_TRUE(ptrViEFile != NULL);
diff --git a/video_engine/test/auto_test/source/vie_autotest_loopback.cc b/video_engine/test/auto_test/source/vie_autotest_loopback.cc
index e150891..354535d 100644
--- a/video_engine/test/auto_test/source/vie_autotest_loopback.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_loopback.cc
@@ -34,6 +34,8 @@
 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
 #include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
 #include "webrtc/voice_engine/include/voe_base.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
 
 #define VCM_RED_PAYLOAD_TYPE        96
 #define VCM_ULPFEC_PAYLOAD_TYPE     97
@@ -495,6 +497,9 @@
     // Setting External transport
     TbExternalTransport extTransport(*(ptrViENetwork), videoChannel, NULL);
 
+    webrtc::test::VideoChannelTransport* video_channel_transport =
+        new webrtc::test::VideoChannelTransport(ptrViENetwork, videoChannel);
+
     int testMode = 0;
     std::cout << std::endl;
     std::cout << "Enter 1 for testing packet loss and delay with "
@@ -547,17 +552,17 @@
         std::cout << std::endl;
         std::cout << "Using rtp port: " << rtpPort << std::endl;
         std::cout << std::endl;
-        error = ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort);
+
+        error = video_channel_transport->SetLocalReceiver(rtpPort);
         if (error == -1)
         {
-            printf("ERROR in ViENetwork::SetLocalReceiver\n");
+            printf("ERROR in SetLocalReceiver\n");
             return -1;
         }
-        error = ptrViENetwork->SetSendDestination(videoChannel,
-                                                  ipAddress, rtpPort);
+        error = video_channel_transport->SetSendDestination(ipAddress, rtpPort);
         if (error == -1)
         {
-            printf("ERROR in ViENetwork::SetSendDestination\n");
+            printf("ERROR in SetSendDestination\n");
             return -1;
         }
     }
@@ -660,7 +665,7 @@
         printf("ERROR in ViEBase::DeleteChannel\n");
         return -1;
     }
-
+    delete video_channel_transport;
     int remainingInterfaces = 0;
     remainingInterfaces = ptrViECodec->Release();
     remainingInterfaces += ptrViECapture->Release();
diff --git a/video_engine/test/auto_test/source/vie_autotest_record.cc b/video_engine/test/auto_test/source/vie_autotest_record.cc
index 15b2a83..6e71e62 100644
--- a/video_engine/test/auto_test/source/vie_autotest_record.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_record.cc
@@ -17,20 +17,22 @@
 #include <stdio.h>
 #include <fstream>
 
-#include "common_types.h"
-#include "video_engine/test/libvietest/include/tb_external_transport.h"
-#include "voice_engine/include/voe_base.h"
-#include "video_engine/test/auto_test/interface/vie_autotest_defines.h"
-#include "video_engine/test/auto_test/interface/vie_autotest.h"
-#include "video_engine/include/vie_base.h"
-#include "video_engine/include/vie_capture.h"
-#include "video_engine/include/vie_codec.h"
-#include "video_engine/include/vie_file.h"
-#include "video_engine/include/vie_network.h"
-#include "video_engine/include/vie_render.h"
-#include "video_engine/include/vie_rtp_rtcp.h"
-#include "voice_engine/include/voe_rtp_rtcp.h"
-#include "system_wrappers/interface/tick_util.h"
+#include "webrtc/common_types.h"
+#include "webrtc/system_wrappers/interface/tick_util.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
+#include "webrtc/voice_engine/include/voe_base.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
+#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
+#include "webrtc/video_engine/include/vie_base.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "webrtc/video_engine/include/vie_codec.h"
+#include "webrtc/video_engine/include/vie_file.h"
+#include "webrtc/video_engine/include/vie_network.h"
+#include "webrtc/video_engine/include/vie_render.h"
+#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
+#include "webrtc/voice_engine/include/voe_network.h"
+#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
 
 #define VCM_RED_PAYLOAD_TYPE            96
 #define VCM_ULPFEC_PAYLOAD_TYPE         97
@@ -139,6 +141,8 @@
   webrtc::VoECodec* voe_codec = webrtc::VoECodec::GetInterface(voe);
   webrtc::VoEAudioProcessing* voe_apm =
        webrtc::VoEAudioProcessing::GetInterface(voe);
+  webrtc::VoENetwork* voe_network =
+    webrtc::VoENetwork::GetInterface(voe);
 
   // Get the audio device for the call.
   memset(audio_capture_device_name, 0, KMaxUniqueIdLength);
@@ -147,20 +151,24 @@
                   audio_capture_device_index, audio_playbackDeviceName,
                   audio_playback_device_index);
 
-
   // Get the audio codec for the call.
   memset(static_cast<void*>(&audio_codec), 0, sizeof(audio_codec));
   GetAudioCodecRecord(voe_codec, audio_codec);
 
   audio_channel = voe_base->CreateChannel();
-  error = voe_base->SetSendDestination(audio_channel, audio_tx_port,
-                                        ipAddress);
-  error = voe_base->SetLocalReceiver(audio_channel, audio_rx_port);
-  error = voe_hardware->SetRecordingDevice(audio_capture_device_index);
-  error = voe_hardware->SetPlayoutDevice(audio_playback_device_index);
-  error = voe_codec->SetSendCodec(audio_channel, audio_codec);
-  error = voe_apm->SetAgcStatus(true, webrtc::kAgcDefault);
-  error = voe_apm->SetNsStatus(true, webrtc::kNsHighSuppression);
+
+  webrtc::scoped_ptr<webrtc::test::VoiceChannelTransport>
+      voice_channel_transport(
+          new webrtc::test::VoiceChannelTransport(voe_network, audio_channel));
+
+  voice_channel_transport->SetSendDestination(ipAddress, audio_tx_port);
+  voice_channel_transport->SetLocalReceiver(audio_rx_port);
+
+  voe_hardware->SetRecordingDevice(audio_capture_device_index);
+  voe_hardware->SetPlayoutDevice(audio_playback_device_index);
+  voe_codec->SetSendCodec(audio_channel, audio_codec);
+  voe_apm->SetAgcStatus(true, webrtc::kAgcDefault);
+  voe_apm->SetNsStatus(true, webrtc::kNsHighSuppression);
 
   //
   // List available capture devices, allocate and connect.
@@ -352,18 +360,17 @@
     printf("ERROR in ViENetwork::GetInterface\n");
     return -1;
   }
+  webrtc::test::VideoChannelTransport* video_channel_transport =
+      new webrtc::test::VideoChannelTransport(ptrViENetwork, videoChannel);
 
-  // Setting External transport
-  TbExternalTransport extTransport(*(ptrViENetwork), videoChannel, NULL);
-  error = ptrViENetwork->SetLocalReceiver(videoChannel, rtpPort);
+  error = video_channel_transport->SetSendDestination(ipAddress, rtpPort);
   if (error == -1) {
-    printf("ERROR in ViENetwork::SetLocalReceiver\n");
+    printf("ERROR in SetSendDestination\n");
     return -1;
   }
-  error = ptrViENetwork->SetSendDestination(videoChannel,
-                                            ipAddress, rtpPort);
+  error = video_channel_transport->SetLocalReceiver(rtpPort);
   if (error == -1) {
-    printf("ERROR in ViENetwork::SetSendDestination\n");
+    printf("ERROR in SetLocalReceiver\n");
     return -1;
   }
 
@@ -520,6 +527,7 @@
     printf("ERROR in ViEBase::DeleteChannel\n");
     return -1;
   }
+  delete video_channel_transport;
 
   int remainingInterfaces = 0;
   remainingInterfaces = ptrViECodec->Release();
@@ -532,7 +540,6 @@
     printf("ERROR: Could not release all interfaces\n");
     return -1;
   }
-
   bool deleted = webrtc::VideoEngine::Delete(ptrViE);
   if (deleted == false) {
     printf("ERROR in VideoEngine::Delete\n");
@@ -564,7 +571,7 @@
 }
 
 bool GetAudioCodecRecord(webrtc::VoECodec* voe_codec,
-                       webrtc::CodecInst& audio_codec) {
+                         webrtc::CodecInst& audio_codec) {
   int error = 0;
   int number_of_errors = 0;
   memset(&audio_codec, 0, sizeof(webrtc::CodecInst));
diff --git a/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc b/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc
index a95eab3..b54b8f1 100644
--- a/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc
+++ b/video_engine/test/auto_test/source/vie_autotest_rtp_rtcp.cc
@@ -104,6 +104,7 @@
     TbExternalTransport myTransport(*(ViE.network), tbChannel.videoChannel,
                                     NULL);
 
+    ViE.network->DeregisterSendTransport(tbChannel.videoChannel);
     EXPECT_EQ(0, ViE.network->RegisterSendTransport(
         tbChannel.videoChannel, myTransport));
 
diff --git a/video_engine/test/auto_test/vie_auto_test.gypi b/video_engine/test/auto_test/vie_auto_test.gypi
index 984cc75..f899317 100644
--- a/video_engine/test/auto_test/vie_auto_test.gypi
+++ b/video_engine/test/auto_test/vie_auto_test.gypi
@@ -20,6 +20,7 @@
         '<(DEPTH)/third_party/google-gflags/google-gflags.gyp:google-gflags',
         '<(webrtc_root)/test/metrics.gyp:metrics',
         '<(webrtc_root)/test/test.gyp:test_support',
+        '<(webrtc_root)/test/channel_transport.gyp:channel_transport',
         '<(webrtc_root)/test/libtest/libtest.gyp:libtest',
         'video_engine_core',
         'libvietest',
@@ -81,7 +82,6 @@
         'source/vie_autotest_image_process.cc',
         'source/vie_autotest_loopback.cc',
         'source/vie_autotest_main.cc',
-        'source/vie_autotest_network.cc',
         'source/vie_autotest_render.cc',
         'source/vie_autotest_record.cc',
         'source/vie_autotest_rtp_rtcp.cc',
diff --git a/video_engine/test/libvietest/include/tb_video_channel.h b/video_engine/test/libvietest/include/tb_video_channel.h
index 5c7e6f8..0409cf3 100644
--- a/video_engine/test/libvietest/include/tb_video_channel.h
+++ b/video_engine/test/libvietest/include/tb_video_channel.h
@@ -11,32 +11,41 @@
 #ifndef WEBRTC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_INTERFACE_TB_VIDEO_CHANNEL_H_
 #define WEBRTC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_INTERFACE_TB_VIDEO_CHANNEL_H_
 
-#include "video_engine/test/libvietest/include/tb_interfaces.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
 
-class TbVideoChannel
-{
-public:
-    TbVideoChannel(TbInterfaces& Engine,
-                   webrtc::VideoCodecType sendCodec = webrtc::kVideoCodecVP8,
-                   int width = 352, int height = 288, int frameRate = 30,
-                   int startBitrate = 300);
+namespace webrtc {
+namespace test {
+class VideoChannelTransport;
+}  // namespace test
+}  // namespace webrtc
 
-    ~TbVideoChannel(void);
+class TbVideoChannel {
+ public:
+  TbVideoChannel(TbInterfaces& Engine,
+                 webrtc::VideoCodecType sendCodec = webrtc::kVideoCodecVP8,
+                 int width = 352, int height = 288, int frameRate = 30,
+                 int startBitrate = 300);
 
-    void SetFrameSettings(int width, int height, int frameRate);
+  ~TbVideoChannel(void);
 
-    void StartSend(const unsigned short rtpPort = 11000,
-                   const char* ipAddress = "127.0.0.1");
+  void SetFrameSettings(int width, int height, int frameRate);
 
-    void StopSend();
+  void StartSend(const unsigned short rtpPort = 11000,
+                 const char* ipAddress = "127.0.0.1");
 
-    void StartReceive(const unsigned short rtpPort = 11000);
+  void StopSend();
 
-    void StopReceive();
+  void StartReceive(const unsigned short rtpPort = 11000);
 
-    int videoChannel;
-private:
-    TbInterfaces& ViE;
+  void StopReceive();
+
+  int videoChannel;
+
+ private:
+  TbInterfaces& ViE;
+  webrtc::scoped_ptr<webrtc::test::VideoChannelTransport> channel_transport_;
 };
 
+
 #endif  // WEBRTC_VIDEO_ENGINE_MAIN_TEST_AUTOTEST_INTERFACE_TB_VIDEO_CHANNEL_H_
diff --git a/video_engine/test/libvietest/testbed/tb_video_channel.cc b/video_engine/test/libvietest/testbed/tb_video_channel.cc
index 3359f18..675d3bd 100644
--- a/video_engine/test/libvietest/testbed/tb_video_channel.cc
+++ b/video_engine/test/libvietest/testbed/tb_video_channel.cc
@@ -11,82 +11,73 @@
 #include "video_engine/test/libvietest/include/tb_video_channel.h"
 
 #include "gtest/gtest.h"
+#include "webrtc/test/channel_transport/include/channel_transport.h"
 
 TbVideoChannel::TbVideoChannel(TbInterfaces& Engine,
                                webrtc::VideoCodecType sendCodec, int width,
-                               int height, int frameRate, int startBitrate) :
-    videoChannel(-1),  ViE(Engine)
-{
-    EXPECT_EQ(0, ViE.base->CreateChannel(videoChannel));
+                               int height, int frameRate, int startBitrate)
+    : videoChannel(-1),
+      ViE(Engine) {
+  EXPECT_EQ(0, ViE.base->CreateChannel(videoChannel));
+  channel_transport_.reset(new webrtc::test::VideoChannelTransport(
+      ViE.network, videoChannel));
 
-    webrtc::VideoCodec videoCodec;
-    memset(&videoCodec, 0, sizeof(webrtc::VideoCodec));
-    bool sendCodecSet = false;
-    for (int idx = 0; idx < ViE.codec->NumberOfCodecs(); idx++)
-    {
-        EXPECT_EQ(0, ViE.codec->GetCodec(idx, videoCodec));
-        videoCodec.width = width;
-        videoCodec.height = height;
-        videoCodec.maxFramerate = frameRate;
-
-        if (videoCodec.codecType == sendCodec && sendCodecSet == false)
-        {
-            if(videoCodec.codecType != webrtc::kVideoCodecI420 )
-            {
-                videoCodec.startBitrate = startBitrate;
-                videoCodec.maxBitrate = startBitrate * 3;
-            }
-            EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
-            sendCodecSet = true;
-        }
-        if (videoCodec.codecType == webrtc::kVideoCodecVP8)
-        {
-            videoCodec.width = 352;
-            videoCodec.height = 288;
-        }
-        EXPECT_EQ(0, ViE.codec->SetReceiveCodec(videoChannel, videoCodec));
-    }
-    EXPECT_TRUE(sendCodecSet);
-}
-
-TbVideoChannel::~TbVideoChannel(void)
-{
-    EXPECT_EQ(0, ViE.base->DeleteChannel(videoChannel));
-}
-
-void TbVideoChannel::StartSend(const unsigned short rtpPort /*= 11000*/,
-                               const char* ipAddress /*= "127.0.0.1"*/)
-{
-    EXPECT_EQ(0, ViE.network->SetSendDestination(videoChannel, ipAddress,
-                                                 rtpPort));
-
-    EXPECT_EQ(0, ViE.base->StartSend(videoChannel));
-}
-
-void TbVideoChannel::SetFrameSettings(int width, int height, int frameRate)
-{
-    webrtc::VideoCodec videoCodec;
-    EXPECT_EQ(0, ViE.codec->GetSendCodec(videoChannel, videoCodec));
+  webrtc::VideoCodec videoCodec;
+  memset(&videoCodec, 0, sizeof(webrtc::VideoCodec));
+  bool sendCodecSet = false;
+  for (int idx = 0; idx < ViE.codec->NumberOfCodecs(); idx++) {
+    EXPECT_EQ(0, ViE.codec->GetCodec(idx, videoCodec));
     videoCodec.width = width;
     videoCodec.height = height;
     videoCodec.maxFramerate = frameRate;
 
-    EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
+    if (videoCodec.codecType == sendCodec && sendCodecSet == false) {
+      if (videoCodec.codecType != webrtc::kVideoCodecI420) {
+        videoCodec.startBitrate = startBitrate;
+        videoCodec.maxBitrate = startBitrate * 3;
+      }
+      EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
+      sendCodecSet = true;
+    }
+    if (videoCodec.codecType == webrtc::kVideoCodecVP8) {
+      videoCodec.width = 352;
+      videoCodec.height = 288;
+    }
     EXPECT_EQ(0, ViE.codec->SetReceiveCodec(videoChannel, videoCodec));
+  }
+  EXPECT_TRUE(sendCodecSet);
 }
 
-void TbVideoChannel::StopSend()
-{
-    EXPECT_EQ(0, ViE.base->StopSend(videoChannel));
+TbVideoChannel::~TbVideoChannel() {
+  EXPECT_EQ(0, ViE.base->DeleteChannel(videoChannel));
 }
 
-void TbVideoChannel::StartReceive(const unsigned short rtpPort /*= 11000*/)
-{
-    EXPECT_EQ(0, ViE.network->SetLocalReceiver(videoChannel, rtpPort));
-    EXPECT_EQ(0, ViE.base->StartReceive(videoChannel));
+void TbVideoChannel::StartSend(const unsigned short rtp_port,
+                               const char* ip_address) {
+  EXPECT_EQ(0, channel_transport_->SetSendDestination(ip_address, rtp_port));
+  EXPECT_EQ(0, ViE.base->StartSend(videoChannel));
 }
 
-void TbVideoChannel::StopReceive()
-{
-    EXPECT_EQ(0, ViE.base->StopReceive(videoChannel));
+void TbVideoChannel::SetFrameSettings(int width, int height, int frameRate) {
+  webrtc::VideoCodec videoCodec;
+  EXPECT_EQ(0, ViE.codec->GetSendCodec(videoChannel, videoCodec));
+  videoCodec.width = width;
+  videoCodec.height = height;
+  videoCodec.maxFramerate = frameRate;
+
+  EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
+  EXPECT_EQ(0, ViE.codec->SetReceiveCodec(videoChannel, videoCodec));
+}
+
+void TbVideoChannel::StopSend() {
+  EXPECT_EQ(0, ViE.base->StopSend(videoChannel));
+}
+
+void TbVideoChannel::StartReceive(unsigned short rtp_port) {
+  EXPECT_EQ(0, channel_transport_->SetLocalReceiver(rtp_port));
+  EXPECT_EQ(0, ViE.base->StartReceive(videoChannel));
+}
+
+void TbVideoChannel::StopReceive() {
+  EXPECT_EQ(0, ViE.base->StopReceive(videoChannel));
 }