* Update the session layer to p4 37930
* Update the peerconnection_client in sync with updates on the libjingle side.
Review URL: http://webrtc-codereview.appspot.com/29008

git-svn-id: http://webrtc.googlecode.com/svn/trunk@34 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/peerconnection/samples/client/conductor.cc b/peerconnection/samples/client/conductor.cc
index 698ba48..e0c029f 100644
--- a/peerconnection/samples/client/conductor.cc
+++ b/peerconnection/samples/client/conductor.cc
@@ -12,6 +12,7 @@
 
 #include "peerconnection/samples/client/defaults.h"
 #include "talk/base/logging.h"
+#include "talk/session/phone/videorendererfactory.h"
 
 Conductor::Conductor(PeerConnectionClient* client, MainWnd* main_wnd)
   : handshake_(NONE),
@@ -70,6 +71,8 @@
 
 void Conductor::DeletePeerConnection() {
   peer_connection_.reset();
+  local_renderer_.reset();
+  remote_renderer_.reset();
   handshake_ = NONE;
 }
 
@@ -79,8 +82,14 @@
     main_wnd_->SwitchToStreamingUI();
 
     if (peer_connection_->SetVideoCapture("")) {
-      peer_connection_->SetVideoRenderer(-1, main_wnd_->handle(), 0,
-                                         0.7f, 0.7f, 0.95f, 0.95f);
+      if (!local_renderer_.get()) {
+        // The window will be resized according to the stream properties
+        // when streaming starts.
+        local_renderer_.reset(
+            cricket::VideoRendererFactory::CreateGuiVideoRenderer(100, 100));
+      }
+      if (local_renderer_.get())
+        peer_connection_->SetLocalVideoRenderer(local_renderer_.get());
     } else {
       ASSERT(false);
     }
@@ -130,8 +139,13 @@
     video_channel_ = channel_id;
     waiting_for_video_ = false;
     LOG(INFO) << "Setting video renderer for channel: " << channel_id;
-    bool ok = peer_connection_->SetVideoRenderer(channel_id,
-        main_wnd_->handle(), 1, 0.0f, 0.0f, 1.0f, 1.0f);
+    if (!remote_renderer_.get()) {
+      // The window size will be automatically corrected.
+      remote_renderer_.reset(
+          cricket::VideoRendererFactory::CreateGuiVideoRenderer(100, 100));
+    }
+    bool ok = peer_connection_->SetVideoRenderer(stream_id,
+                                                 remote_renderer_.get());
     ASSERT(ok);
   } else {
     ASSERT(audio_channel_ == -1);
diff --git a/peerconnection/samples/client/conductor.h b/peerconnection/samples/client/conductor.h
index ce968d7..3b9d471 100644
--- a/peerconnection/samples/client/conductor.h
+++ b/peerconnection/samples/client/conductor.h
@@ -19,6 +19,9 @@
 #include "talk/app/peerconnection.h"
 #include "talk/base/scoped_ptr.h"
 
+namespace cricket {
+class VideoRenderer;
+}  // namespace cricket
 
 class Conductor
   : public webrtc::PeerConnectionObserver,
@@ -112,6 +115,8 @@
   MainWnd* main_wnd_;
   int video_channel_;
   int audio_channel_;
+  talk_base::scoped_ptr<cricket::VideoRenderer> local_renderer_;
+  talk_base::scoped_ptr<cricket::VideoRenderer> remote_renderer_;
 };
 
 #endif  // PEERCONNECTION_SAMPLES_CLIENT_CONDUCTOR_H_
diff --git a/third_party_mods/libjingle/libjingle.gyp b/third_party_mods/libjingle/libjingle.gyp
index 42f34bb..bad09b5 100644
--- a/third_party_mods/libjingle/libjingle.gyp
+++ b/third_party_mods/libjingle/libjingle.gyp
@@ -466,7 +466,7 @@
         'source/talk/session/phone/devicemanager.cc',
         'source/talk/session/phone/devicemanager.h',
         'source/talk/session/phone/filemediaengine.cc',
-        'source/talk/session/phone/filemediaengine.h',       
+        'source/talk/session/phone/filemediaengine.h',   
         'source/talk/session/phone/mediachannel.h',
         'source/talk/session/phone/mediaengine.cc',
         'source/talk/session/phone/mediaengine.h',
@@ -494,9 +494,17 @@
         'source/talk/session/tunnel/tunnelsessionclient.cc',
         'source/talk/session/tunnel/tunnelsessionclient.h',
       ],
-      'conditions': [        
+      'conditions': [
+        ['OS=="win"', {
+          'sources': [
+            'source/talk/session/phone/gdivideorenderer.cc',
+            'source/talk/session/phone/gdivideorenderer.h',
+          ],
+        }],   
         ['OS=="linux"', {
           'sources': [
+            #'source/talk/session/phone/gtkvideorenderer.cc',
+            #'source/talk/session/phone/gtkvideorenderer.h', 
             'source/talk/session/phone/libudevsymboltable.cc',
             'source/talk/session/phone/libudevsymboltable.h',
             'source/talk/session/phone/v4llookup.cc',
@@ -539,8 +547,6 @@
         'source/talk/app/voicemediaengine.h',
         'source/talk/app/webrtc_json.cc',
         'source/talk/app/webrtc_json.h',
-        'source/talk/app/webrtcchannelmanager.cc',
-        'source/talk/app/webrtcchannelmanager.h',
         'source/talk/app/webrtcsession.cc',
         'source/talk/app/webrtcsession.h',
         'source/talk/app/webrtcsessionimpl.cc',
@@ -556,8 +562,8 @@
             ],
           },{
             'sources': [        
-	          'source/talk/app/p2p_transport_manager.cc',
-	          'source/talk/app/p2p_transport_manager.h',
+              'source/talk/app/p2p_transport_manager.cc',
+              'source/talk/app/p2p_transport_manager.h',
             ],
           }],
         ],
diff --git a/third_party_mods/libjingle/source/talk/app/peerconnection.cc b/third_party_mods/libjingle/source/talk/app/peerconnection.cc
index 4a1962f..87805c1 100644
--- a/third_party_mods/libjingle/source/talk/app/peerconnection.cc
+++ b/third_party_mods/libjingle/source/talk/app/peerconnection.cc
@@ -115,7 +115,7 @@
                              cricket::PORTALLOCATOR_DISABLE_RELAY);
 
   // create channel manager
-  channel_manager_.reset(new WebRtcChannelManager(media_thread_.get()));
+  channel_manager_.reset(new cricket::ChannelManager(media_thread_.get()));
 
   //start the media thread
   media_thread_->SetPriority(talk_base::PRIORITY_HIGH);
@@ -244,24 +244,22 @@
   return channel_manager_->SetAudioOptions(wave_in_device, wave_out_device, opts);
 }
 
+bool PeerConnection::SetLocalVideoRenderer(cricket::VideoRenderer* renderer) {
+  return channel_manager_->SetLocalRenderer(renderer);
+}
+
+bool PeerConnection::SetVideoRenderer(const std::string& stream_id,
+    cricket::VideoRenderer* renderer) {
+  ASSERT(session_ != NULL);
+  return session_->SetVideoRenderer(stream_id, renderer);
+}
+
 bool PeerConnection::SetVideoRenderer(const std::string& stream_id,
     ExternalRenderer* external_renderer) {
   ASSERT(session_ != NULL);
   return session_->SetVideoRenderer(stream_id, external_renderer);
 }
 
-bool PeerConnection::SetVideoRenderer(int channel_id,
-                                      void* window,
-                                      unsigned int zOrder,
-                                      float left,
-                                      float top,
-                                      float right,
-                                      float bottom) {
-  ASSERT(session_ != NULL);
-  return session_->SetVideoRenderer(channel_id, window, zOrder, left, top,
-                                    right, bottom);
-}
-
 bool PeerConnection::SetVideoCapture(const std::string& cam_device) {
   return channel_manager_->SetVideoOptions(cam_device);
 }
diff --git a/third_party_mods/libjingle/source/talk/app/peerconnection.h b/third_party_mods/libjingle/source/talk/app/peerconnection.h
index 9ab8da5..e39c88b 100644
--- a/third_party_mods/libjingle/source/talk/app/peerconnection.h
+++ b/third_party_mods/libjingle/source/talk/app/peerconnection.h
@@ -10,7 +10,7 @@
 #include "talk/base/thread.h"
 #include "talk/base/scoped_ptr.h"
 #include "talk/base/basicpacketsocketfactory.h"
-#include "talk/app/webrtcchannelmanager.h"
+#include "talk/session/phone/channelmanager.h"
 
 namespace Json {
 class Value;
@@ -18,6 +18,8 @@
 
 namespace cricket {
 class BasicPortAllocator;
+class ChannelManager;
+class VideoRenderer;
 }
 
 #ifdef PLATFORM_CHROMIUM
@@ -76,16 +78,13 @@
   bool SetAudioDevice(const std::string& wave_in_device,
                       const std::string& wave_out_device, int opts);
   // Set the video renderer
+  bool SetLocalVideoRenderer(cricket::VideoRenderer* renderer);
+  bool SetVideoRenderer(const std::string& stream_id,
+                        cricket::VideoRenderer* renderer);
+
   bool SetVideoRenderer(const std::string& stream_id,
                         ExternalRenderer* external_renderer);
-  // Set channel_id to -1 for the local preview
-  bool SetVideoRenderer(int channel_id,
-                        void* window,
-                        unsigned int zOrder,
-                        float left,
-                        float top,
-                        float right,
-                        float bottom);
+
   // Set video capture device
   // For Chromium the cam_device should use the capture session id.
   // For standalone app, cam_device is the camera name. It will try to
@@ -120,7 +119,7 @@
 
   std::string config_;
   talk_base::scoped_ptr<talk_base::Thread> media_thread_;
-  talk_base::scoped_ptr<WebRtcChannelManager> channel_manager_;
+  talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_;
   talk_base::scoped_ptr<talk_base::NetworkManager> network_manager_;
   talk_base::scoped_ptr<cricket::BasicPortAllocator> port_allocator_;
   talk_base::scoped_ptr<talk_base::BasicPacketSocketFactory> socket_factory_;
diff --git a/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc b/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
index 99af54e..e783bdf 100644
--- a/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
+++ b/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
@@ -20,6 +20,7 @@
 #include "talk/app/peerconnection.h"
 #include "talk/app/session_test/main_wnd.h"
 #include "talk/base/logging.h"
+#include "talk/session/phone/videorendererfactory.h"
 
 static const char kAudioLabel[] = "audio_label";
 static const char kVideoLabel[] = "video_label";
@@ -217,6 +218,7 @@
   }
 
   void OnConnect(talk_base::AsyncSocket* socket) {
+    ASSERT(!onconnect_data_.empty());
     int sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
     ASSERT(sent == onconnect_data_.length());
     onconnect_data_.clear();
@@ -385,8 +387,10 @@
       notification_data_.clear();
     }
 
-    if (hanging_get_.GetState() == talk_base::Socket::CS_CLOSED)
+    if (hanging_get_.GetState() == talk_base::Socket::CS_CLOSED &&
+        state_ == CONNECTED) {
       hanging_get_.Connect(server_address_);
+    }
   }
 
   // Parses a single line entry in the form "<name>,<id>,<connected>"
@@ -446,7 +450,9 @@
 
   void OnClose(talk_base::AsyncSocket* socket, int err) {
     LOG(INFO) << __FUNCTION__;
+
     socket->Close();
+
     if (err != WSAECONNREFUSED) {
       if (socket == &hanging_get_) {
         if (state_ == CONNECTED) {
@@ -553,6 +559,7 @@
 
   void DeletePeerConnection() {
     peer_connection_.reset();
+    handshake_ = NONE;
   }
 
   void StartCaptureDevice() {
@@ -561,8 +568,11 @@
       main_wnd_->SwitchToStreamingUI();
 
       if (peer_connection_->SetVideoCapture("")) {
-        peer_connection_->SetVideoRenderer(-1, main_wnd_->handle(), 0,
-                                           0.7f, 0.7f, 0.95f, 0.95f);
+        if (!local_renderer_.get()) {
+          local_renderer_.reset(
+              cricket::VideoRendererFactory::CreateGuiVideoRenderer(176, 144));
+        }
+        peer_connection_->SetLocalVideoRenderer(local_renderer_.get());
       } else {
         ASSERT(false);
       }
@@ -612,8 +622,12 @@
       video_channel_ = channel_id;
       waiting_for_video_ = false;
       LOG(INFO) << "Setting video renderer for channel: " << channel_id;
-      bool ok = peer_connection_->SetVideoRenderer(channel_id,
-          main_wnd_->handle(), 1, 0.0f, 0.0f, 1.0f, 1.0f);
+      if (!remote_renderer_.get()) {
+          remote_renderer_.reset(
+              cricket::VideoRendererFactory::CreateGuiVideoRenderer(352, 288));
+      }
+      bool ok = peer_connection_->SetVideoRenderer(stream_id,
+                                                   remote_renderer_.get());
       ASSERT(ok);
     } else {
       ASSERT(audio_channel_ == -1);
@@ -774,7 +788,6 @@
       LOG(INFO) << "PEER_CONNECTION_CLOSED";
       DeletePeerConnection();
       ::InvalidateRect(main_wnd_->handle(), NULL, TRUE);
-      handshake_ = NONE;
       waiting_for_audio_ = false;
       waiting_for_video_ = false;
       peer_id_ = -1;
@@ -790,7 +803,12 @@
         DisconnectFromServer();
       }
     } else if (msg == SEND_MESSAGE_TO_PEER) {
-      client_->SendToPeer(peer_id_, *reinterpret_cast<std::string*>(lp));
+      bool ok = client_->SendToPeer(peer_id_,
+                                    *reinterpret_cast<std::string*>(lp));
+      if (!ok) {
+        LOG(LS_ERROR) << "SendToPeer failed";
+        DisconnectFromServer();
+      }
     } else {
       ret = false;
     }
@@ -808,6 +826,8 @@
   MainWnd* main_wnd_;
   int video_channel_;
   int audio_channel_;
+  scoped_ptr<cricket::VideoRenderer> local_renderer_;
+  scoped_ptr<cricket::VideoRenderer> remote_renderer_;
 };
 
 int PASCAL wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
diff --git a/third_party_mods/libjingle/source/talk/app/videoengine.h b/third_party_mods/libjingle/source/talk/app/videoengine.h
index aa7fb62..3b724bb 100644
--- a/third_party_mods/libjingle/source/talk/app/videoengine.h
+++ b/third_party_mods/libjingle/source/talk/app/videoengine.h
@@ -31,6 +31,7 @@
 
 #include "talk/base/common.h"
 #include "common_types.h"
+#include "modules/interface/module_common_types.h"
 #include "video_engine/main/interface/vie_base.h"
 #include "video_engine/main/interface/vie_capture.h"
 #include "video_engine/main/interface/vie_codec.h"
diff --git a/third_party_mods/libjingle/source/talk/app/videomediaengine.cc b/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
index dd5bdde..95387bf 100644
--- a/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
+++ b/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
@@ -14,6 +14,7 @@
 #include "talk/app/voicemediaengine.h"
 
 #include "modules/video_capture/main/interface/video_capture.h"
+#include "vplib.h"
 
 #ifndef ARRAYSIZE
 #define ARRAYSIZE(a)  (sizeof(a) / sizeof((a)[0]))
@@ -25,6 +26,213 @@
 static const int kStartVideoBitrate = 300;
 static const int kMaxVideoBitrate = 1000;
 
+CricketWebRTCVideoFrame::CricketWebRTCVideoFrame() {
+}
+
+CricketWebRTCVideoFrame::~CricketWebRTCVideoFrame() {
+  // TODO(ronghuawu): should the CricketWebRTCVideoFrame owns the buffer?
+  WebRtc_UWord8* newMemory = NULL;
+  WebRtc_UWord32 newLength = 0;
+  WebRtc_UWord32 newSize = 0;
+  video_frame_.Swap(newMemory, newLength, newSize);
+}
+
+void CricketWebRTCVideoFrame::Attach(unsigned char* buffer, int bufferSize,
+                                     int w, int h) {
+  WebRtc_UWord8* newMemory = buffer;
+  WebRtc_UWord32 newLength = bufferSize;
+  WebRtc_UWord32 newSize = bufferSize;
+  video_frame_.Swap(newMemory, newLength, newSize);
+  video_frame_.SetWidth(w);
+  video_frame_.SetHeight(h);
+}
+
+size_t CricketWebRTCVideoFrame::GetWidth() const { 
+  return video_frame_.Width();
+}
+size_t CricketWebRTCVideoFrame::GetHeight() const { 
+  return video_frame_.Height();
+}
+
+const uint8* CricketWebRTCVideoFrame::GetYPlane() const {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  return buffer;
+}
+
+const uint8* CricketWebRTCVideoFrame::GetUPlane() const {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  if (buffer)
+    buffer += (video_frame_.Width() * video_frame_.Height());
+  return buffer;
+}
+
+const uint8* CricketWebRTCVideoFrame::GetVPlane() const {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  if (buffer)
+    buffer += (video_frame_.Width() * video_frame_.Height() * 5 / 4);
+  return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetYPlane() {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetUPlane() {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  if (buffer)
+    buffer += (video_frame_.Width() * video_frame_.Height());
+  return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetVPlane() {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  if (buffer)
+    buffer += (video_frame_.Width() * video_frame_.Height() * 3 / 2);
+  return buffer;
+}
+
+cricket::VideoFrame* CricketWebRTCVideoFrame::Copy() const {
+  WebRtc_UWord8* buffer = video_frame_.Buffer();
+  if (buffer) {
+    int new_buffer_size = video_frame_.Length();
+    unsigned char* new_buffer = new unsigned char[new_buffer_size];
+    memcpy(new_buffer, buffer, new_buffer_size);
+    CricketWebRTCVideoFrame* copy = new CricketWebRTCVideoFrame();
+    copy->Attach(new_buffer, new_buffer_size,
+                 video_frame_.Width(), video_frame_.Height());
+    copy->SetTimeStamp(video_frame_.TimeStamp());
+    copy->SetElapsedTime(elapsed_time_);
+    return copy;
+  }
+  return NULL;
+}
+
+size_t CricketWebRTCVideoFrame::CopyToBuffer(
+    uint8* buffer, size_t size) const {
+  if (!video_frame_.Buffer()) {
+    return 0;
+  }
+
+  size_t needed = video_frame_.Length();
+  if (needed <= size) {
+    memcpy(buffer, video_frame_.Buffer(), needed);
+  }
+  return needed;
+}
+
+size_t CricketWebRTCVideoFrame::ConvertToRgbBuffer(uint32 to_fourcc,
+                                                   uint8* buffer,
+                                                   size_t size,
+                                                   size_t pitch_rgb) const {
+  if (!video_frame_.Buffer()) {
+    return 0;
+  }
+
+  size_t width = video_frame_.Width();
+  size_t height = video_frame_.Height();
+  // See http://www.virtualdub.org/blog/pivot/entry.php?id=190 for a good
+  // explanation of pitch and why this is the amount of space we need.
+  size_t needed = pitch_rgb * (height - 1) + 4 * width;
+
+  if (needed > size) {
+    LOG(LS_WARNING) << "RGB buffer is not large enough";
+    return needed;
+  }
+
+  VideoType outgoingVideoType = kUnknown;
+  switch (to_fourcc) {
+    case cricket::FOURCC_ARGB:
+      outgoingVideoType = kARGB;
+      break;
+    default:
+      LOG(LS_WARNING) << "RGB type not supported: " << to_fourcc;
+      break;
+  }
+
+  if (outgoingVideoType != kUnknown)
+    ConvertFromI420(outgoingVideoType, video_frame_.Buffer(),
+                    width, height, buffer);
+
+  return needed;
+}
+
+// TODO(ronghuawu): Implement StretchToPlanes
+void CricketWebRTCVideoFrame::StretchToPlanes(
+    uint8* y, uint8* u, uint8* v,
+    int32 dst_pitch_y, int32 dst_pitch_u, int32 dst_pitch_v,
+    size_t width, size_t height, bool interpolate, bool crop) const {
+}
+
+size_t CricketWebRTCVideoFrame::StretchToBuffer(size_t w, size_t h,
+                                                uint8* buffer, size_t size,
+                                                bool interpolate,
+                                                bool crop) const {
+  if (!video_frame_.Buffer()) {
+    return 0;
+  }
+
+  size_t needed = video_frame_.Length();
+
+  if (needed <= size) {
+    uint8* bufy = buffer;
+    uint8* bufu = bufy + w * h;
+    uint8* bufv = bufu + ((w + 1) >> 1) * ((h + 1) >> 1);
+    StretchToPlanes(bufy, bufu, bufv, w, (w + 1) >> 1, (w + 1) >> 1, w, h,
+                    interpolate, crop);
+  }
+  return needed;
+}
+
+void CricketWebRTCVideoFrame::StretchToFrame(cricket::VideoFrame *target,
+                                             bool interpolate, bool crop) const {
+  if (!target) return;
+
+  StretchToPlanes(target->GetYPlane(),
+                  target->GetUPlane(),
+                  target->GetVPlane(),
+                  target->GetYPitch(),
+                  target->GetUPitch(),
+                  target->GetVPitch(),
+                  target->GetWidth(),
+                  target->GetHeight(),
+                  interpolate, crop);
+  target->SetElapsedTime(GetElapsedTime());
+  target->SetTimeStamp(GetTimeStamp());
+}
+
+cricket::VideoFrame* CricketWebRTCVideoFrame::Stretch(size_t w, size_t h,
+                                                      bool interpolate, bool crop) const {
+  // TODO(ronghuawu): implement
+  CricketWebRTCVideoFrame* frame = new CricketWebRTCVideoFrame();
+  return frame;
+}
+
+CricketWebRTCVideoRenderer::CricketWebRTCVideoRenderer
+    (cricket::VideoRenderer* renderer)
+  :renderer_(renderer) {
+}
+
+CricketWebRTCVideoRenderer::~CricketWebRTCVideoRenderer() {
+}
+
+int CricketWebRTCVideoRenderer::FrameSizeChange(unsigned int width,
+                                                unsigned int height,
+                                                unsigned int numberOfStreams) {
+  ASSERT(renderer_ != NULL);
+  width_ = width;
+  height_ = height;
+  number_of_streams_ = numberOfStreams;
+  return renderer_->SetSize(width_, height_, 0) ? 0 : -1;
+}
+
+int CricketWebRTCVideoRenderer::DeliverFrame(unsigned char* buffer,
+                                             int bufferSize) {
+  ASSERT(renderer_ != NULL);
+  video_frame_.Attach(buffer, bufferSize, width_, height_);
+  return renderer_->RenderFrame(&video_frame_) ? 0 : -1;
+}
+
 const RtcVideoEngine::VideoCodecPref RtcVideoEngine::kVideoCodecPrefs[] = {
     {"VP8", 104, 0},
     {"H264", 105, 1}
@@ -231,29 +439,23 @@
   return (capture_id_ != -1);
 }
 
-bool RtcVideoEngine::SetVideoRenderer(int channel_id,
-                                      void* window,
-                                      unsigned int zOrder,
-                                      float left,
-                                      float top,
-                                      float right,
-                                      float bottom) {
-  int ret;
-  if (channel_id == -1)
-    channel_id = capture_id_;
-  ret = video_engine_->render()->AddRenderer(
-      channel_id, window, zOrder, left, top, right, bottom);
-  if (ret !=0 )
-    return false;
-  ret = video_engine_->render()->StartRender(channel_id);
-  if (ret !=0 )
-      return false;
-  return true;
-}
-
 bool RtcVideoEngine::SetLocalRenderer(cricket::VideoRenderer* renderer) {
-  LOG(LS_WARNING) << "Not required call SetLocalRenderer for webrtc";
-  return false;
+  if (!local_renderer_.get()) {
+    local_renderer_.reset(new CricketWebRTCVideoRenderer(renderer));
+  } else {
+    // Renderer already set
+    return true;
+  }
+
+  int ret;
+  ret = video_engine_->render()->AddRenderer(capture_id_,
+                                             kVideoI420,
+                                             local_renderer_.get());
+  if (ret != 0)
+    return false;
+  ret = video_engine_->render()->StartRender(capture_id_);
+
+  return (ret == 0);
 }
 
 cricket::CaptureResult RtcVideoEngine::SetCapture(bool capture) {
@@ -565,7 +767,22 @@
 
 bool RtcVideoMediaChannel::SetRenderer(
     uint32 ssrc, cricket::VideoRenderer* renderer) {
-  return false;
+  if (!remote_renderer_.get()) {
+    remote_renderer_.reset(new CricketWebRTCVideoRenderer(renderer));
+  } else {
+    // Renderer already set
+    return true;
+  }
+
+  int ret;
+  ret = engine_->video_engine()->render()->AddRenderer(video_channel_,
+                                                       kVideoI420,
+                                                       remote_renderer_.get());
+  if (ret != 0)
+    return false;
+  ret = engine_->video_engine()->render()->StartRender(video_channel_);
+
+  return (ret == 0);
 }
 
 bool RtcVideoMediaChannel::SetExternalRenderer(uint32 ssrc, void* renderer)
@@ -575,12 +792,11 @@
       video_channel_,
       kVideoI420,
       static_cast<ExternalRenderer*>(renderer));
-  if (ret !=0 )
+  if (ret != 0)
     return false;
   ret = engine_->video_engine()->render()->StartRender(video_channel_);
-  if (ret !=0 )
-      return false;
-  return true;
+
+  return (ret == 0);
 }
 
 bool RtcVideoMediaChannel::GetStats(cricket::VideoMediaInfo* info) {
diff --git a/third_party_mods/libjingle/source/talk/app/videomediaengine.h b/third_party_mods/libjingle/source/talk/app/videomediaengine.h
index a5e9fce..4fdb629 100644
--- a/third_party_mods/libjingle/source/talk/app/videomediaengine.h
+++ b/third_party_mods/libjingle/source/talk/app/videomediaengine.h
@@ -49,6 +49,74 @@
 class RtcVoiceEngine;
 class ExternalRenderer;
 
+// CricketWebRTCVideoFrame only supports I420
+class CricketWebRTCVideoFrame : public cricket::VideoFrame {
+ public:
+  CricketWebRTCVideoFrame();
+  ~CricketWebRTCVideoFrame();
+
+  void Attach(unsigned char* buffer, int bufferSize, int w, int h);
+
+  virtual size_t GetWidth() const;
+  virtual size_t GetHeight() const;
+  virtual const uint8* GetYPlane() const;
+  virtual const uint8* GetUPlane() const;
+  virtual const uint8* GetVPlane() const;
+  virtual uint8* GetYPlane();
+  virtual uint8* GetUPlane();
+  virtual uint8* GetVPlane();
+  virtual int32 GetYPitch() const { return video_frame_.Width(); }
+  virtual int32 GetUPitch() const { return video_frame_.Width() / 2; }
+  virtual int32 GetVPitch() const { return video_frame_.Width() / 2; }
+
+  virtual size_t GetPixelWidth() const { return 1; }
+  virtual size_t GetPixelHeight() const { return 1; }
+  virtual int64 GetElapsedTime() const { return elapsed_time_; }
+  virtual int64 GetTimeStamp() const { return video_frame_.TimeStamp(); }
+  virtual void SetElapsedTime(int64 elapsed_time) {
+    elapsed_time_ = elapsed_time;
+  }
+  virtual void SetTimeStamp(int64 time_stamp) {
+    video_frame_.SetTimeStamp(time_stamp);
+  }
+
+  virtual VideoFrame* Copy() const;
+  virtual size_t CopyToBuffer(uint8* buffer, size_t size) const;
+  virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8* buffer,
+                                    size_t size, size_t pitch_rgb) const;
+  virtual void StretchToPlanes(uint8* y, uint8* u, uint8* v,
+                               int32 pitchY, int32 pitchU, int32 pitchV,
+                               size_t width, size_t height,
+                               bool interpolate, bool crop) const;
+  virtual size_t StretchToBuffer(size_t w, size_t h, uint8* buffer, size_t size,
+                                 bool interpolate, bool crop) const;
+  virtual void StretchToFrame(VideoFrame* target, bool interpolate,
+                              bool crop) const;
+  virtual VideoFrame* Stretch(size_t w, size_t h, bool interpolate,
+                              bool crop) const;
+
+ private:
+  webrtc::VideoFrame video_frame_;
+  int64 elapsed_time_;
+};
+
+class CricketWebRTCVideoRenderer : public ExternalRenderer {
+ public:
+  CricketWebRTCVideoRenderer(cricket::VideoRenderer* renderer);
+
+  virtual int FrameSizeChange(unsigned int width, unsigned int height,
+                              unsigned int numberOfStreams);
+  virtual int DeliverFrame(unsigned char* buffer, int bufferSize);
+  virtual ~CricketWebRTCVideoRenderer();
+
+ private:
+  cricket::VideoRenderer*  renderer_;
+  CricketWebRTCVideoFrame  video_frame_;
+  unsigned int width_;
+  unsigned int height_;
+  unsigned int number_of_streams_;
+};
+
 class RtcVideoEngine : public ViEBaseObserver, public TraceCallback {
  public:
   RtcVideoEngine();
@@ -72,13 +140,6 @@
   bool SetOptions(int options);
   //TODO - need to change this interface for webrtc
   bool SetCaptureDevice(const cricket::Device* device);
-  bool SetVideoRenderer(int channel_id,
-                        void* window,
-                        unsigned int zOrder,
-                        float left,
-                        float top,
-                        float right,
-                        float bottom);
   bool SetLocalRenderer(cricket::VideoRenderer* renderer);
   cricket::CaptureResult SetCapture(bool capture);
   const std::vector<cricket::VideoCodec>& codecs() const;
@@ -133,6 +194,7 @@
   cricket::VideoEncoderConfig default_encoder_config_;
   cricket::VideoCodec default_codec_;
   bool capture_started_;
+  talk_base::scoped_ptr<CricketWebRTCVideoRenderer> local_renderer_;
 };
 
 class RtcVideoMediaChannel: public cricket::VideoMediaChannel,
@@ -188,6 +250,7 @@
   bool sending_;
   bool render_started_;
   webrtc::VideoCodec send_codec_;
+  talk_base::scoped_ptr<CricketWebRTCVideoRenderer> remote_renderer_;
 };
 
 }
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc b/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc
deleted file mode 100644
index 8b624fd..0000000
--- a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-// Author: mallinath@google.com (Mallinath Bareddy)
-
-#include "talk/app/webrtcchannelmanager.h"
-
-namespace webrtc {
-
-struct VideoCaptureDeviceParams : public talk_base::MessageData {
-  VideoCaptureDeviceParams(const std::string& cam_device)
-      : cam_device(cam_device),
-        result(false) {}
-  const std::string cam_device;
-  bool result;
-};
-
-struct RenderParams : public talk_base::MessageData {
-  RenderParams(int channel_id,
-               void* window,
-               unsigned int zOrder,
-               float left,
-               float top,
-               float right,
-               float bottom)
-  :channel_id(channel_id)
-  ,window(window)
-  ,zOrder(zOrder)
-  ,left(left)
-  ,top(top)
-  ,right(right)
-  ,bottom(bottom) {}
-
-  int channel_id;
-  void* window;
-  unsigned int zOrder;
-  float left;
-  float top;
-  float right;
-  float bottom;
-  bool result;
-};
-
-bool WebRtcChannelManager::Init() {
-  return MaybeInit();
-}
-
-cricket::VoiceChannel* WebRtcChannelManager::CreateVoiceChannel(
-    cricket::BaseSession* s, const std::string& content_name, bool rtcp) {
-  return (MaybeInit()) ?
-      ChannelManager::CreateVoiceChannel(s, content_name, rtcp) : NULL;
-}
-
-cricket::VideoChannel* WebRtcChannelManager::CreateVideoChannel(
-    cricket::BaseSession* s, const std::string& content_name, bool rtcp,
-    cricket::VoiceChannel* vc) {
-  return (MaybeInit()) ?
-      ChannelManager::CreateVideoChannel(s, content_name, rtcp, vc) : NULL;
-
-}
-
-cricket::Soundclip* WebRtcChannelManager::CreateSoundclip() {
-  return (MaybeInit()) ? ChannelManager::CreateSoundclip() : NULL;
-}
-void WebRtcChannelManager::DestroyVoiceChannel(cricket::VoiceChannel* vc) {
-  ChannelManager::DestroyVoiceChannel(vc);
-  MaybeTerm();
-}
-void WebRtcChannelManager::DestroyVideoChannel(cricket::VideoChannel* vc) {
-  ChannelManager::DestroyVideoChannel(vc);
-  MaybeTerm();
-}
-void WebRtcChannelManager::DestroySoundclip(cricket::Soundclip* s) {
-  ChannelManager::DestroySoundclip(s);
-  MaybeTerm();
-}
-
-bool WebRtcChannelManager::MaybeInit() {
-  bool ret = initialized();
-  if (!ret) {
-    ret = ChannelManager::Init();
-  }
-  return ret;
-}
-
-void WebRtcChannelManager::MaybeTerm() {
-  if (initialized() && !has_channels()) {
-    Terminate();
-  }
-}
-
-bool WebRtcChannelManager::SetVideoRenderer(int channel_id,
-                                            void* window,
-                                            unsigned int zOrder,
-                                            float left,
-                                            float top,
-                                            float right,
-                                            float bottom) {
-  if (MaybeInit()) {
-    RenderParams params(channel_id, window, zOrder, left, top, right, bottom);
-    return cricket::ChannelManager::Send(MSG_SETRTC_VIDEORENDERER, &params);
-  } else {
-    return false;
-  }
-}
-
-void WebRtcChannelManager::SetVideoRenderer_w(int channel_id,
-                                              void* window,
-                                              unsigned int zOrder,
-                                              float left,
-                                              float top,
-                                              float right,
-                                              float bottom) {
-  ASSERT(worker_thread() == talk_base::Thread::Current());
-  ASSERT(initialized());
-  media_engine()->SetVideoRenderer(channel_id, window, zOrder, left, top, right, bottom);
-}
-
-void WebRtcChannelManager::OnMessage(talk_base::Message *message) {
-  talk_base::MessageData* data = message->pdata;
-  switch(message->message_id) {
-    case MSG_SETRTC_VIDEORENDERER: {
-      RenderParams* p = static_cast<RenderParams*>(data);
-      SetVideoRenderer_w(p->channel_id,
-                         p->window,
-                         p->zOrder,
-                         p->left,
-                         p->top,
-                         p->right,
-                         p->bottom);
-      break;
-    }
-    default: {
-      ChannelManager::OnMessage(message);
-    }
-  }
-}
-
-} // namespace webrtc
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h b/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h
deleted file mode 100644
index b8f15a8..0000000
--- a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-// Author: mallinath@google.com (Mallinath Bareddy)
-
-
-#ifndef TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_
-#define TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_
-
-#include "talk/session/phone/channelmanager.h"
-
-namespace webrtc {
-
-class AudioDeviceModule;
-
-enum {
-  MSG_SETRTC_VIDEORENDERER = 21, // Set internal video renderer
-};
-
-// WebRtcChannelManager automatically takes care of initialization and
-// cricket::ChannelManager. Terminates when not needed
-
-class WebRtcChannelManager : public cricket::ChannelManager {
- public:
-  WebRtcChannelManager(talk_base::Thread* worker_thread)
-      : ChannelManager(worker_thread) {
-  }
-
-  WebRtcChannelManager(cricket::MediaEngine* me, cricket::DeviceManager* dm,
-                       talk_base::Thread* worker_thread)
-      : ChannelManager(me, dm, worker_thread) {
-  }
-
-  bool Init();
-  cricket::VoiceChannel* CreateVoiceChannel(
-      cricket::BaseSession* s, const std::string& content_name, bool rtcp);
-  cricket::VideoChannel* CreateVideoChannel(
-      cricket::BaseSession* s, const std::string& content_name, bool rtcp,
-      cricket::VoiceChannel* vc);
-  cricket::Soundclip* CreateSoundclip();
-  void DestroyVoiceChannel(cricket::VoiceChannel* vc);
-  void DestroyVideoChannel(cricket::VideoChannel* vc);
-  void DestroySoundclip(cricket::Soundclip* s);
-
-  bool SetVideoRenderer(int channel_id,
-                        void* window,
-                        unsigned int zOrder,
-                        float left,
-                        float top,
-                        float right,
-                        float bottom);
-
- private:
-  bool MaybeInit();
-  void MaybeTerm();
-  void SetExternalAdm_w(AudioDeviceModule* external_adm);
-  void SetVideoRenderer_w(int channel_id,
-                          void* window,
-                          unsigned int zOrder,
-                          float left,
-                          float top,
-                          float right,
-                          float bottom);
-  void OnMessage(talk_base::Message *message);
-};
-
-} // namespace webrtc
-
-
-#endif /* TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_ */
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
index 7c916c9..f71f6aa 100644
--- a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
+++ b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
@@ -29,20 +29,19 @@
 #include <string>
 #include <vector>
 
+#include "talk/app/pc_transport_impl.h"
+#include "talk/app/peerconnection.h"
+#include "talk/app/webrtc_json.h"
 #include "talk/base/common.h"
 #include "talk/base/json.h"
 #include "talk/base/scoped_ptr.h"
 #include "talk/p2p/base/constants.h"
 #include "talk/p2p/base/sessiondescription.h"
 #include "talk/p2p/base/p2ptransport.h"
-#include "talk/session/phone/mediasessionclient.h"
 #include "talk/session/phone/channel.h"
-#include "talk/session/phone/voicechannel.h"
 #include "talk/session/phone/channelmanager.h"
-#include "talk/app/webrtc_json.h"
-#include "talk/app/webrtcchannelmanager.h"
-#include "talk/app/peerconnection.h"
-#include "talk/app/pc_transport_impl.h"
+#include "talk/session/phone/mediasessionclient.h"
+#include "talk/session/phone/voicechannel.h"
 
 using namespace cricket;
 
@@ -55,7 +54,7 @@
   MSG_RTC_SETVIDEOCAPTURE = 4,
   MSG_RTC_CANDIDATETIMEOUT = 5,
   MSG_RTC_SETEXTERNALRENDERER = 6,
-  MSG_RTC_SETRENDERER = 7,
+  MSG_RTC_SETCRICKETRENDERER = 7,
   MSG_RTC_CHANNELENABLE = 8,
   MSG_RTC_SIGNALONWRITABLESTATE = 9,
   MSG_RTC_DESTROYVOICECHANNEL = 10,
@@ -107,29 +106,15 @@
   bool result;
 };
 
-struct RenderParams : public talk_base::MessageData {
-  RenderParams(int channel_id,
-               void* window,
-               unsigned int zOrder,
-               float left,
-               float top,
-               float right,
-               float bottom)
-  :channel_id(channel_id)
-  ,window(window)
-  ,zOrder(zOrder)
-  ,left(left)
-  ,top(top)
-  ,right(right)
-  ,bottom(bottom) {}
+struct CricketRenderParams : public talk_base::MessageData {
+  CricketRenderParams(const std::string& stream_id,
+                      cricket::VideoRenderer* renderer)
+      : stream_id(stream_id),
+        renderer(renderer),
+        result(false) {}
 
-  int channel_id;
-  void* window;
-  unsigned int zOrder;
-  float left;
-  float top;
-  float right;
-  float bottom;
+  const std::string stream_id;
+  cricket::VideoRenderer* renderer;
   bool result;
 };
 
@@ -159,7 +144,7 @@
     const std::string& id,
     const std::string& direction,
     cricket::PortAllocator* allocator,
-    WebRtcChannelManager* channelmgr,
+    cricket::ChannelManager* channelmgr,
     PeerConnection* connection,
     talk_base::Thread* signaling_thread)
   : WebRTCSession(id, direction, allocator, connection, signaling_thread),
@@ -203,7 +188,7 @@
       this, &WebRTCSessionImpl::OnVoiceChannelCreated);
 
   signaling_thread_->Post(this, MSG_RTC_CREATEAUDIOCHANNEL,
-                          new CreateChannelParams(stream_id, false, NULL));
+                          new CreateChannelParams(stream_id, true, NULL));
   return true;
 }
 
@@ -255,7 +240,7 @@
       this, &WebRTCSessionImpl::OnVideoChannelCreated);
 
   signaling_thread_->Post(this, MSG_RTC_CREATEVIDEOCHANNEL,
-                          new CreateChannelParams(stream_id, false, NULL));
+                          new CreateChannelParams(stream_id, true, NULL));
   return true;
 }
 
@@ -304,6 +289,33 @@
 }
 
 bool WebRTCSessionImpl::SetVideoRenderer(const std::string& stream_id,
+    cricket::VideoRenderer* renderer) {
+  if(signaling_thread_ != talk_base::Thread::Current()) {
+    signaling_thread_->Post(this, MSG_RTC_SETCRICKETRENDERER,
+                            new CricketRenderParams(stream_id, renderer),
+                            true);
+    return true;
+  }
+
+  ASSERT(signaling_thread_ == talk_base::Thread::Current());
+
+  bool ret = false;
+  StreamMap::iterator iter;
+  for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
+    StreamInfo* stream_info = (*iter);
+    if (stream_info->stream_id.compare(stream_id) == 0) {
+      ASSERT(stream_info->channel != NULL);
+      ASSERT(stream_info->video);
+      cricket::VideoChannel* channel = static_cast<cricket::VideoChannel*>(
+          stream_info->channel);
+      ret = channel->SetRenderer(0, renderer);
+      break;
+    }
+  }
+  return ret;
+}
+
+bool WebRTCSessionImpl::SetVideoRenderer(const std::string& stream_id,
     ExternalRenderer* external_renderer) {
   if(signaling_thread_ != talk_base::Thread::Current()) {
     signaling_thread_->Post(this, MSG_RTC_SETEXTERNALRENDERER,
@@ -330,30 +342,6 @@
   return ret;
 }
 
-bool WebRTCSessionImpl::SetVideoRenderer(int channel_id,
-                                         void* window,
-                                         unsigned int zOrder,
-                                         float left,
-                                         float top,
-                                         float right,
-                                         float bottom) {
-  signaling_thread_->Post(this, MSG_RTC_SETRENDERER,
-                          new RenderParams(channel_id, window, zOrder, left, top, right, bottom),
-                          true);
-  return true;
-}
-
-bool WebRTCSessionImpl::SetVideoRenderer_w(int channel_id,
-                                           void* window,
-                                           unsigned int zOrder,
-                                           float left,
-                                           float top,
-                                           float right,
-                                           float bottom) {
-  ASSERT(signaling_thread_ == talk_base::Thread::Current());
-  return channel_manager_->SetVideoRenderer(channel_id, window, zOrder, left, top, right, bottom);
-}
-
 void WebRTCSessionImpl::OnMessage(talk_base::Message* message) {
   using talk_base::TypedMessageData;
   talk_base::MessageData* data = message->pdata;
@@ -420,31 +408,25 @@
       break;
     }
     case MSG_RTC_SETVIDEOCAPTURE : {
-      CaptureParams* p = static_cast<CaptureParams*>(data);
+      CaptureParams* p = reinterpret_cast<CaptureParams*>(data);
       p->result = SetVideoCapture_w(p->capture);
       delete p;
       break;
     }
     case MSG_RTC_SETEXTERNALRENDERER : {
-      ExternalRenderParams* p = static_cast<ExternalRenderParams*> (data);
+      ExternalRenderParams* p = reinterpret_cast<ExternalRenderParams*>(data);
       p->result = SetVideoRenderer(p->stream_id, p->external_renderer);
       delete p;
       break;
     }
-    case MSG_RTC_SETRENDERER : {
-      RenderParams* p = static_cast<RenderParams*> (data);
-      p->result = SetVideoRenderer_w(p->channel_id,
-                                     p->window,
-                                     p->zOrder,
-                                     p->left,
-                                     p->top,
-                                     p->right,
-                                     p->bottom);
+    case MSG_RTC_SETCRICKETRENDERER : {
+      CricketRenderParams* p = reinterpret_cast<CricketRenderParams*>(data);
+      p->result = SetVideoRenderer(p->stream_id, p->renderer);
       delete p;
       break;
     }
     case MSG_RTC_CHANNELENABLE : {
-      ChannelEnableParams* p = static_cast<ChannelEnableParams*> (data);
+      ChannelEnableParams* p = reinterpret_cast<ChannelEnableParams*>(data);
       ChannelEnable_w(p->channel, p->enable);
       delete p;
       break;
@@ -707,8 +689,6 @@
       break;
     }
   }
-
-  ASSERT(found);
 }
 
 void WebRTCSessionImpl::DestroyVoiceChannel_w(
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
index 20a141a..95db057 100644
--- a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
+++ b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
@@ -79,7 +79,6 @@
 
 class ExternalRenderer;
 class PeerConnection;
-class WebRtcChannelManager;
 
 class WebRTCSessionImpl: public WebRTCSession {
 
@@ -88,7 +87,7 @@
   WebRTCSessionImpl(const std::string& id,
                     const std::string& direction,
                     cricket::PortAllocator* allocator,
-                    WebRtcChannelManager* channelmgr,
+                    cricket::ChannelManager* channelmgr,
                     PeerConnection* connection,
                     talk_base::Thread* signaling_thread);
 
@@ -131,14 +130,10 @@
                      cricket::TransportChannel* channel);
   void OnMessageReceived(const char* data, size_t data_size);
   bool SetVideoRenderer(const std::string& stream_id,
+                        cricket::VideoRenderer* renderer);
+  bool SetVideoRenderer(const std::string& stream_id,
                         ExternalRenderer* external_renderer);
-  bool SetVideoRenderer(int channel_id,
-                        void* window,
-                        unsigned int zOrder,
-                        float left,
-                        float top,
-                        float right,
-                        float bottom);
+
   sigslot::signal2<cricket::VideoChannel*, std::string&> SignalVideoChannel;
   sigslot::signal2<cricket::VoiceChannel*, std::string&> SignalVoiceChannel;
   sigslot::signal1<WebRTCSessionImpl*> SignalOnRemoveStream;
@@ -155,13 +150,6 @@
   }
 
  private:
-  bool SetVideoRenderer_w(int channel_id,
-                          void* window,
-                          unsigned int zOrder,
-                          float left,
-                          float top,
-                          float right,
-                          float bottom);
   void ChannelEnable_w(cricket::BaseChannel* channel, bool enable);
 
   void OnVoiceChannelError(cricket::VoiceChannel* voice_channel, uint32 ssrc,
@@ -232,7 +220,7 @@
 
   void SendLocalDescription_w();
 
-  WebRtcChannelManager* channel_manager_;
+  cricket::ChannelManager* channel_manager_;
   std::vector<StreamInfo*> streams_;
   TransportChannelMap transport_channels_;
   bool all_writable_;
diff --git a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc b/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc
deleted file mode 100644
index 1c76f02..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc
+++ /dev/null
@@ -1,798 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2008, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "talk/session/phone/channelmanager.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <algorithm>
-
-#include "talk/base/common.h"
-#include "talk/base/logging.h"
-#include "talk/base/sigslotrepeater.h"
-#include "talk/base/stringencode.h"
-#include "talk/session/phone/mediaengine.h"
-#include "talk/session/phone/soundclip.h"
-
-namespace cricket {
-
-enum {
-  MSG_CREATEVOICECHANNEL = 1,
-  MSG_DESTROYVOICECHANNEL = 2,
-  MSG_SETAUDIOOPTIONS = 3,
-  MSG_GETOUTPUTVOLUME = 4,
-  MSG_SETOUTPUTVOLUME = 5,
-  MSG_SETLOCALMONITOR = 6,
-  MSG_SETVOICELOGGING = 7,
-  MSG_CREATEVIDEOCHANNEL = 11,
-  MSG_DESTROYVIDEOCHANNEL = 12,
-  MSG_SETVIDEOOPTIONS = 13,
-  MSG_SETLOCALRENDERER = 14,
-  MSG_SETDEFAULTVIDEOENCODERCONFIG = 15,
-  MSG_SETVIDEOLOGGING = 16,
-  MSG_CREATESOUNDCLIP = 17,
-  MSG_DESTROYSOUNDCLIP = 18,
-  MSG_CAMERASTARTED = 19,
-  MSG_SETVIDEOCAPTURE = 20,
-};
-
-struct CreationParams : public talk_base::MessageData {
-  CreationParams(BaseSession* session, const std::string& content_name,
-                 bool rtcp, VoiceChannel* voice_channel)
-      : session(session),
-        content_name(content_name),
-        rtcp(rtcp),
-        voice_channel(voice_channel),
-        video_channel(NULL) {}
-  BaseSession* session;
-  std::string content_name;
-  bool rtcp;
-  VoiceChannel* voice_channel;
-  VideoChannel* video_channel;
-};
-
-struct AudioOptions : public talk_base::MessageData {
-  AudioOptions(int o, const Device* in, const Device* out)
-      : options(o), in_device(in), out_device(out) {}
-  int options;
-  const Device* in_device;
-  const Device* out_device;
-  bool result;
-};
-
-struct VolumeLevel : public talk_base::MessageData {
-  VolumeLevel() : level(-1), result(false) {}
-  explicit VolumeLevel(int l) : level(l), result(false) {}
-  int level;
-  bool result;
-};
-
-struct VideoOptions : public talk_base::MessageData {
-  explicit VideoOptions(const Device* d) : cam_device(d), result(false) {}
-  const Device* cam_device;
-  bool result;
-};
-
-struct DefaultVideoEncoderConfig : public talk_base::MessageData {
-  explicit DefaultVideoEncoderConfig(const VideoEncoderConfig& c)
-      : config(c), result(false) {}
-  VideoEncoderConfig config;
-  bool result;
-};
-
-struct LocalMonitor : public talk_base::MessageData {
-  explicit LocalMonitor(bool e) : enable(e), result(false) {}
-  bool enable;
-  bool result;
-};
-
-struct LocalRenderer : public talk_base::MessageData {
-  explicit LocalRenderer(VideoRenderer* r) : renderer(r), result(false) {}
-  VideoRenderer* renderer;
-  bool result;
-};
-
-struct LoggingOptions : public talk_base::MessageData {
-  explicit LoggingOptions(int lev, const char* f) : level(lev), filter(f) {}
-  int level;
-  std::string filter;
-};
-
-struct CaptureParams : public talk_base::MessageData {
-  explicit CaptureParams(bool c) : capture(c), result(CR_FAILURE) {}
-
-  bool capture;
-  CaptureResult result;
-};
-
-ChannelManager::ChannelManager(talk_base::Thread* worker_thread)
-    : media_engine_(MediaEngine::Create()),
-      device_manager_(new DeviceManager()),
-      initialized_(false),
-      main_thread_(talk_base::Thread::Current()),
-      worker_thread_(worker_thread),
-      audio_in_device_(DeviceManager::kDefaultDeviceName),
-      audio_out_device_(DeviceManager::kDefaultDeviceName),
-      audio_options_(MediaEngine::DEFAULT_AUDIO_OPTIONS),
-      local_renderer_(NULL),
-      capturing_(false),
-      monitoring_(false) {
-  Construct();
-}
-
-ChannelManager::ChannelManager(MediaEngine* me, DeviceManager* dm,
-                               talk_base::Thread* worker_thread)
-    : media_engine_(me),
-      device_manager_(dm),
-      initialized_(false),
-      main_thread_(talk_base::Thread::Current()),
-      worker_thread_(worker_thread),
-      audio_in_device_(DeviceManager::kDefaultDeviceName),
-      audio_out_device_(DeviceManager::kDefaultDeviceName),
-      audio_options_(MediaEngine::DEFAULT_AUDIO_OPTIONS),
-      local_renderer_(NULL),
-      capturing_(false),
-      monitoring_(false) {
-  Construct();
-}
-
-void ChannelManager::Construct() {
-  // Init the device manager immediately, and set up our default video device.
-  SignalDevicesChange.repeat(device_manager_->SignalDevicesChange);
-  device_manager_->Init();
-  // Set camera_device_ to the name of the default video capturer.
-  SetVideoOptions(DeviceManager::kDefaultDeviceName);
-
-  // Camera is started asynchronously, request callbacks when startup
-  // completes to be able to forward them to the rendering manager.
-  media_engine_->SignalVideoCaptureResult.connect(
-      this, &ChannelManager::OnVideoCaptureResult);
-}
-
-ChannelManager::~ChannelManager() {
-  if (initialized_)
-    Terminate();
-}
-
-int ChannelManager::GetCapabilities() {
-  return media_engine_->GetCapabilities() & device_manager_->GetCapabilities();
-}
-
-void ChannelManager::GetSupportedAudioCodecs(
-    std::vector<AudioCodec>* codecs) const {
-  codecs->clear();
-
-  for (std::vector<AudioCodec>::const_iterator it =
-           media_engine_->audio_codecs().begin();
-      it != media_engine_->audio_codecs().end(); ++it) {
-    codecs->push_back(*it);
-  }
-}
-
-void ChannelManager::GetSupportedVideoCodecs(
-    std::vector<VideoCodec>* codecs) const {
-  codecs->clear();
-
-  std::vector<VideoCodec>::const_iterator it;
-  for (it = media_engine_->video_codecs().begin();
-      it != media_engine_->video_codecs().end(); ++it) {
-    codecs->push_back(*it);
-  }
-}
-
-bool ChannelManager::Init() {
-  ASSERT(!initialized_);
-  if (initialized_) {
-    return false;
-  }
-
-  ASSERT(worker_thread_ != NULL);
-  if (worker_thread_ && worker_thread_->started()) {
-    if (media_engine_->Init()) {
-      initialized_ = true;
-      // Now that we're initialized, apply any stored preferences. A preferred
-      // device might have been unplugged. In this case, we fallback to the
-      // default device but keep the user preferences. The preferences are
-      // changed only when the Javascript FE changes them.
-      const std::string preferred_audio_in_device = audio_in_device_;
-      const std::string preferred_audio_out_device = audio_out_device_;
-      const std::string preferred_camera_device = camera_device_;
-      Device device;
-      if (!device_manager_->GetAudioInputDevice(audio_in_device_, &device)) {
-        LOG(LS_WARNING) << "The preferred microphone '" << audio_in_device_
-                        << "' is unavailable. Fall back to the default.";
-        audio_in_device_ = DeviceManager::kDefaultDeviceName;
-      }
-      if (!device_manager_->GetAudioOutputDevice(audio_out_device_, &device)) {
-        LOG(LS_WARNING) << "The preferred speaker '" << audio_out_device_
-                        << "' is unavailable. Fall back to the default.";
-        audio_out_device_ = DeviceManager::kDefaultDeviceName;
-      }
-      if (!device_manager_->GetVideoCaptureDevice(camera_device_, &device)) {
-        if (!camera_device_.empty()) {
-          LOG(LS_WARNING) << "The preferred camera '" << camera_device_
-                          << "' is unavailable. Fall back to the default.";
-        }
-        camera_device_ = DeviceManager::kDefaultDeviceName;
-      }
-
-      if (!SetAudioOptions(audio_in_device_, audio_out_device_,
-                           audio_options_)) {
-        LOG(LS_WARNING) << "Failed to SetAudioOptions with"
-                        << " microphone: " << audio_in_device_
-                        << " speaker: " << audio_out_device_
-                        << " options: " << audio_options_;
-      }
-      if (!SetVideoOptions(camera_device_) && !camera_device_.empty()) {
-        LOG(LS_WARNING) << "Failed to SetVideoOptions with camera: "
-                        << camera_device_;
-      }
-
-      // Restore the user preferences.
-      audio_in_device_ = preferred_audio_in_device;
-      audio_out_device_ = preferred_audio_out_device;
-      camera_device_ = preferred_camera_device;
-
-      // Now apply the default video codec that has been set earlier.
-      if (default_video_encoder_config_.max_codec.id != 0) {
-        SetDefaultVideoEncoderConfig(default_video_encoder_config_);
-      }
-      // And the local renderer.
-      if (local_renderer_) {
-        SetLocalRenderer(local_renderer_);
-      }
-    }
-
-  }
-  return initialized_;
-}
-
-void ChannelManager::Terminate() {
-  ASSERT(initialized_);
-  if (!initialized_) {
-    return;
-  }
-
-  // Need to destroy the voice/video channels
-  while (!video_channels_.empty()) {
-    DestroyVideoChannel_w(video_channels_.back());
-  }
-  while (!voice_channels_.empty()) {
-    DestroyVoiceChannel_w(voice_channels_.back());
-  }
-  while (!soundclips_.empty()) {
-    DestroySoundclip_w(soundclips_.back());
-  }
-
-  media_engine_->Terminate();
-  initialized_ = false;
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel(
-    BaseSession* session, const std::string& content_name, bool rtcp) {
-  CreationParams params(session, content_name, rtcp, NULL);
-  return (Send(MSG_CREATEVOICECHANNEL, &params)) ? params.voice_channel : NULL;
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel_w(
-    BaseSession* session, const std::string& content_name, bool rtcp) {
-  talk_base::CritScope cs(&crit_);
-
-  // This is ok to alloc from a thread other than the worker thread
-  ASSERT(initialized_);
-  VoiceMediaChannel* media_channel = media_engine_->CreateChannel();
-  if (media_channel == NULL)
-    return NULL;
-
-  VoiceChannel* voice_channel = new VoiceChannel(
-      worker_thread_, media_engine_.get(), media_channel,
-      session, content_name, rtcp);
-  voice_channels_.push_back(voice_channel);
-  return voice_channel;
-}
-
-void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
-  if (voice_channel) {
-    talk_base::TypedMessageData<VoiceChannel *> data(voice_channel);
-    Send(MSG_DESTROYVOICECHANNEL, &data);
-  }
-}
-
-void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
-  talk_base::CritScope cs(&crit_);
-  // Destroy voice channel.
-  ASSERT(initialized_);
-  VoiceChannels::iterator it = std::find(voice_channels_.begin(),
-      voice_channels_.end(), voice_channel);
-  ASSERT(it != voice_channels_.end());
-  if (it == voice_channels_.end())
-    return;
-
-  voice_channels_.erase(it);
-  delete voice_channel;
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel(
-    BaseSession* session, const std::string& content_name, bool rtcp,
-    VoiceChannel* voice_channel) {
-  CreationParams params(session, content_name, rtcp, voice_channel);
-  return (Send(MSG_CREATEVIDEOCHANNEL, &params)) ? params.video_channel : NULL;
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel_w(
-    BaseSession* session, const std::string& content_name, bool rtcp,
-    VoiceChannel* voice_channel) {
-  talk_base::CritScope cs(&crit_);
-
-  // This is ok to alloc from a thread other than the worker thread
-  ASSERT(initialized_);
-  VideoMediaChannel* media_channel =
-      // voice_channel can be NULL in case of NullVoiceEngine.
-      media_engine_->CreateVideoChannel(voice_channel ?
-          voice_channel->media_channel() : NULL);
-  if (media_channel == NULL)
-    return NULL;
-
-  VideoChannel* video_channel = new VideoChannel(
-      worker_thread_, media_engine_.get(), media_channel,
-      session, content_name, rtcp, voice_channel);
-  video_channels_.push_back(video_channel);
-  return video_channel;
-}
-
-void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
-  if (video_channel) {
-    talk_base::TypedMessageData<VideoChannel *> data(video_channel);
-    Send(MSG_DESTROYVIDEOCHANNEL, &data);
-  }
-}
-
-void ChannelManager::DestroyVideoChannel_w(VideoChannel *video_channel) {
-  talk_base::CritScope cs(&crit_);
-  // Destroy voice channel.
-  ASSERT(initialized_);
-  VideoChannels::iterator it = std::find(video_channels_.begin(),
-      video_channels_.end(), video_channel);
-  if (it == video_channels_.end())
-    return;
-
-  video_channels_.erase(it);
-  delete video_channel;
-}
-
-Soundclip* ChannelManager::CreateSoundclip() {
-  talk_base::TypedMessageData<Soundclip*> data(NULL);
-  Send(MSG_CREATESOUNDCLIP, &data);
-  return data.data();
-}
-
-Soundclip* ChannelManager::CreateSoundclip_w() {
-  talk_base::CritScope cs(&crit_);
-
-  ASSERT(initialized_);
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-
-  SoundclipMedia* soundclip_media = media_engine_->CreateSoundclip();
-  if (!soundclip_media) {
-    return NULL;
-  }
-
-  Soundclip* soundclip = new Soundclip(worker_thread_, soundclip_media);
-  soundclips_.push_back(soundclip);
-  return soundclip;
-}
-
-void ChannelManager::DestroySoundclip(Soundclip* soundclip) {
-  if (soundclip) {
-    talk_base::TypedMessageData<Soundclip*> data(soundclip);
-    Send(MSG_DESTROYSOUNDCLIP, &data);
-  }
-}
-
-void ChannelManager::DestroySoundclip_w(Soundclip* soundclip) {
-  talk_base::CritScope cs(&crit_);
-  // Destroy soundclip.
-  ASSERT(initialized_);
-  Soundclips::iterator it = std::find(soundclips_.begin(),
-      soundclips_.end(), soundclip);
-  ASSERT(it != soundclips_.end());
-  if (it == soundclips_.end())
-    return;
-
-  soundclips_.erase(it);
-  delete soundclip;
-}
-
-bool ChannelManager::GetAudioOptions(std::string* in_name,
-                                     std::string* out_name, int* opts) {
-  *in_name = audio_in_device_;
-  *out_name = audio_out_device_;
-  *opts = audio_options_;
-  return true;
-}
-
-bool ChannelManager::SetAudioOptions(const std::string& in_name,
-                                     const std::string& out_name, int opts) {
-  // Get device ids from DeviceManager.
-  Device in_dev, out_dev;
-  if (!device_manager_->GetAudioInputDevice(in_name, &in_dev)) {
-    LOG(LS_WARNING) << "Failed to GetAudioInputDevice: " << in_name;
-    return false;
-  }
-  if (!device_manager_->GetAudioOutputDevice(out_name, &out_dev)) {
-    LOG(LS_WARNING) << "Failed to GetAudioOutputDevice: " << out_name;
-    return false;
-  }
-
-  // If we're initialized, pass the settings to the media engine.
-  bool ret = true;
-  if (initialized_) {
-    AudioOptions options(opts, &in_dev, &out_dev);
-    ret = (Send(MSG_SETAUDIOOPTIONS, &options) && options.result);
-  }
-
-  // If all worked well, save the values for use in GetAudioOptions.
-  if (ret) {
-    audio_options_ = opts;
-    audio_in_device_ = in_name;
-    audio_out_device_ = out_name;
-  }
-  return ret;
-}
-
-bool ChannelManager::SetAudioOptions_w(int opts, const Device* in_dev,
-    const Device* out_dev) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-
-  // Set audio options
-  bool ret = media_engine_->SetAudioOptions(opts);
-
-  // Set the audio devices
-  if (ret) {
-    talk_base::CritScope cs(&crit_);
-    ret = media_engine_->SetSoundDevices(in_dev, out_dev);
-  }
-
-  return ret;
-}
-
-bool ChannelManager::GetOutputVolume(int* level) {
-  VolumeLevel volume;
-  if (!Send(MSG_GETOUTPUTVOLUME, &volume) || !volume.result) {
-    return false;
-  }
-
-  *level = volume.level;
-  return true;
-}
-
-bool ChannelManager::GetOutputVolume_w(int* level) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->GetOutputVolume(level);
-}
-
-bool ChannelManager::SetOutputVolume(int level) {
-  VolumeLevel volume(level);
-  return (Send(MSG_SETOUTPUTVOLUME, &volume) && volume.result);
-}
-
-bool ChannelManager::SetOutputVolume_w(int level) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->SetOutputVolume(level);
-}
-
-bool ChannelManager::GetVideoOptions(std::string* cam_name) {
-  *cam_name = camera_device_;
-  return true;
-}
-
-bool ChannelManager::SetVideoOptions(const std::string& cam_name) {
-  Device device;
-  if (!device_manager_->GetVideoCaptureDevice(cam_name, &device)) {
-    if (!cam_name.empty()) {
-      LOG(LS_WARNING) << "Device manager can't find camera: " << cam_name;
-    }
-    return false;
-  }
-
-  // If we're running, tell the media engine about it.
-  bool ret = true;
-  if (initialized_) {
-    VideoOptions options(&device);
-    ret = (Send(MSG_SETVIDEOOPTIONS, &options) && options.result);
-  }
-
-  // If everything worked, retain the name of the selected camera.
-  if (ret) {
-    camera_device_ = device.name;
-  }
-  return ret;
-}
-
-bool ChannelManager::SetVideoOptions_w(const Device* cam_device) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-
-  // Set the video input device
-  return media_engine_->SetVideoCaptureDevice(cam_device);
-}
-
-bool ChannelManager::SetDefaultVideoEncoderConfig(const VideoEncoderConfig& c) {
-  bool ret = true;
-  if (initialized_) {
-    DefaultVideoEncoderConfig config(c);
-    ret = Send(MSG_SETDEFAULTVIDEOENCODERCONFIG, &config) && config.result;
-  }
-  if (ret) {
-    default_video_encoder_config_ = c;
-  }
-  return ret;
-}
-
-bool ChannelManager::SetDefaultVideoEncoderConfig_w(
-    const VideoEncoderConfig& c) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->SetDefaultVideoEncoderConfig(c);
-}
-
-bool ChannelManager::SetLocalMonitor(bool enable) {
-  LocalMonitor monitor(enable);
-  bool ret = Send(MSG_SETLOCALMONITOR, &monitor) && monitor.result;
-  if (ret) {
-    monitoring_ = enable;
-  }
-  return ret;
-}
-
-bool ChannelManager::SetLocalMonitor_w(bool enable) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->SetLocalMonitor(enable);
-}
-
-bool ChannelManager::SetLocalRenderer(VideoRenderer* renderer) {
-  bool ret = true;
-  if (initialized_) {
-    LocalRenderer local(renderer);
-    ret = (Send(MSG_SETLOCALRENDERER, &local) && local.result);
-  }
-  if (ret) {
-    local_renderer_ = renderer;
-  }
-  return ret;
-}
-
-bool ChannelManager::SetLocalRenderer_w(VideoRenderer* renderer) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->SetLocalRenderer(renderer);
-}
-
-CaptureResult ChannelManager::SetVideoCapture(bool capture) {
-  bool ret;
-  CaptureParams capture_params(capture);
-  ret = (Send(MSG_SETVIDEOCAPTURE, &capture_params) &&
-         (capture_params.result != CR_FAILURE));
-  if (ret) {
-    capturing_ = capture;
-  }
-  return capture_params.result;
-}
-
-CaptureResult ChannelManager::SetVideoCapture_w(bool capture) {
-  ASSERT(worker_thread_ == talk_base::Thread::Current());
-  ASSERT(initialized_);
-  return media_engine_->SetVideoCapture(capture);
-}
-
-void ChannelManager::SetVoiceLogging(int level, const char* filter) {
-  SetMediaLogging(false, level, filter);
-}
-
-void ChannelManager::SetVideoLogging(int level, const char* filter) {
-  SetMediaLogging(true, level, filter);
-}
-
-void ChannelManager::SetMediaLogging(bool video, int level,
-                                     const char* filter) {
-  // Can be called before initialization; in this case, the worker function
-  // is simply called on the main thread.
-  if (initialized_) {
-    LoggingOptions options(level, filter);
-    Send((video) ? MSG_SETVIDEOLOGGING : MSG_SETVOICELOGGING, &options);
-  } else {
-    SetMediaLogging_w(video, level, filter);
-  }
-}
-
-void ChannelManager::SetMediaLogging_w(bool video, int level,
-                                       const char* filter) {
-  // Can be called before initialization
-  ASSERT(worker_thread_ == talk_base::Thread::Current() || !initialized_);
-  if (video) {
-    media_engine_->SetVideoLogging(level, filter);
-  } else {
-    media_engine_->SetVoiceLogging(level, filter);
-  }
-}
-
-bool ChannelManager::Send(uint32 id, talk_base::MessageData* data) {
-  if (!worker_thread_ || !initialized_) return false;
-  worker_thread_->Send(this, id, data);
-  return true;
-}
-
-void ChannelManager::OnVideoCaptureResult(CaptureResult result) {
-  capturing_ = result == CR_SUCCESS;
-  main_thread_->Post(this, MSG_CAMERASTARTED,
-                     new talk_base::TypedMessageData<CaptureResult>(result));
-}
-
-void ChannelManager::OnMessage(talk_base::Message* message) {
-  talk_base::MessageData* data = message->pdata;
-  switch (message->message_id) {
-    case MSG_CREATEVOICECHANNEL: {
-      CreationParams* p = static_cast<CreationParams*>(data);
-      p->voice_channel =
-          CreateVoiceChannel_w(p->session, p->content_name, p->rtcp);
-      break;
-    }
-    case MSG_DESTROYVOICECHANNEL: {
-      VoiceChannel* p = static_cast<talk_base::TypedMessageData<VoiceChannel*>*>
-          (data)->data();
-      DestroyVoiceChannel_w(p);
-      break;
-    }
-    case MSG_CREATEVIDEOCHANNEL: {
-      CreationParams* p = static_cast<CreationParams*>(data);
-      p->video_channel = CreateVideoChannel_w(p->session, p->content_name,
-                                              p->rtcp, p->voice_channel);
-      break;
-    }
-    case MSG_DESTROYVIDEOCHANNEL: {
-      VideoChannel* p = static_cast<talk_base::TypedMessageData<VideoChannel*>*>
-          (data)->data();
-      DestroyVideoChannel_w(p);
-      break;
-    }
-    case MSG_CREATESOUNDCLIP: {
-      talk_base::TypedMessageData<Soundclip*> *p =
-          static_cast<talk_base::TypedMessageData<Soundclip*>*>(data);
-      p->data() = CreateSoundclip_w();
-      break;
-    }
-    case MSG_DESTROYSOUNDCLIP: {
-      talk_base::TypedMessageData<Soundclip*> *p =
-          static_cast<talk_base::TypedMessageData<Soundclip*>*>(data);
-      DestroySoundclip_w(p->data());
-      break;
-    }
-    case MSG_SETAUDIOOPTIONS: {
-      AudioOptions* p = static_cast<AudioOptions*>(data);
-      p->result = SetAudioOptions_w(p->options,
-                                    p->in_device, p->out_device);
-      break;
-    }
-    case MSG_GETOUTPUTVOLUME: {
-      VolumeLevel* p = static_cast<VolumeLevel*>(data);
-      p->result = GetOutputVolume_w(&p->level);
-      break;
-    }
-    case MSG_SETOUTPUTVOLUME: {
-      VolumeLevel* p = static_cast<VolumeLevel*>(data);
-      p->result = SetOutputVolume_w(p->level);
-      break;
-    }
-    case MSG_SETLOCALMONITOR: {
-      LocalMonitor* p = static_cast<LocalMonitor*>(data);
-      p->result = SetLocalMonitor_w(p->enable);
-      break;
-    }
-    case MSG_SETVIDEOOPTIONS: {
-      VideoOptions* p = static_cast<VideoOptions*>(data);
-      p->result = SetVideoOptions_w(p->cam_device);
-      break;
-    }
-    case MSG_SETDEFAULTVIDEOENCODERCONFIG: {
-      DefaultVideoEncoderConfig* p =
-          static_cast<DefaultVideoEncoderConfig*>(data);
-      p->result = SetDefaultVideoEncoderConfig_w(p->config);
-      break;
-    }
-    case MSG_SETLOCALRENDERER: {
-      LocalRenderer* p = static_cast<LocalRenderer*>(data);
-      p->result = SetLocalRenderer_w(p->renderer);
-      break;
-    }
-    case MSG_SETVIDEOCAPTURE: {
-      CaptureParams* p = static_cast<CaptureParams*>(data);
-      p->result = SetVideoCapture_w(p->capture);
-      break;
-    }
-    case MSG_SETVOICELOGGING:
-    case MSG_SETVIDEOLOGGING: {
-      LoggingOptions* p = static_cast<LoggingOptions*>(data);
-      bool video = (message->message_id == MSG_SETVIDEOLOGGING);
-      SetMediaLogging_w(video, p->level, p->filter.c_str());
-      break;
-    }
-    case MSG_CAMERASTARTED: {
-      talk_base::TypedMessageData<CaptureResult>* data =
-          static_cast<talk_base::TypedMessageData<CaptureResult>*>(
-              message->pdata);
-      SignalVideoCaptureResult(data->data());
-      delete data;
-      break;
-    }
-  }
-}
-
-static void GetDeviceNames(const std::vector<Device>& devs,
-                           std::vector<std::string>* names) {
-  names->clear();
-  for (size_t i = 0; i < devs.size(); ++i) {
-    names->push_back(devs[i].name);
-  }
-}
-
-bool ChannelManager::GetAudioInputDevices(std::vector<std::string>* names) {
-  names->clear();
-  std::vector<Device> devs;
-  bool ret = device_manager_->GetAudioInputDevices(&devs);
-  if (ret)
-    GetDeviceNames(devs, names);
-
-  return ret;
-}
-
-bool ChannelManager::GetAudioOutputDevices(std::vector<std::string>* names) {
-  names->clear();
-  std::vector<Device> devs;
-  bool ret = device_manager_->GetAudioOutputDevices(&devs);
-  if (ret)
-    GetDeviceNames(devs, names);
-
-  return ret;
-}
-
-bool ChannelManager::GetVideoCaptureDevices(std::vector<std::string>* names) {
-  names->clear();
-  std::vector<Device> devs;
-  bool ret = device_manager_->GetVideoCaptureDevices(&devs);
-  if (ret)
-    GetDeviceNames(devs, names);
-
-  return ret;
-}
-
-}  // namespace cricket
diff --git a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h b/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h
deleted file mode 100644
index bfdf5d5..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2008, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TALK_SESSION_PHONE_CHANNELMANAGER_H_
-#define TALK_SESSION_PHONE_CHANNELMANAGER_H_
-
-#include <string>
-#include <vector>
-
-#include "talk/base/criticalsection.h"
-#include "talk/base/sigslotrepeater.h"
-#include "talk/base/thread.h"
-#include "talk/p2p/base/session.h"
-#include "talk/session/phone/voicechannel.h"
-#include "talk/session/phone/mediaengine.h"
-#include "talk/session/phone/devicemanager.h"
-
-namespace cricket {
-
-class Soundclip;
-class VoiceChannel;
-
-// ChannelManager allows the MediaEngine to run on a separate thread, and takes
-// care of marshalling calls between threads. It also creates and keeps track of
-// voice and video channels; by doing so, it can temporarily pause all the
-// channels when a new audio or video device is chosen. The voice and video
-// channels are stored in separate vectors, to easily allow operations on just
-// voice or just video channels.
-// ChannelManager also allows the application to discover what devices it has
-// using device manager.
-class ChannelManager : public talk_base::MessageHandler,
-                       public sigslot::has_slots<> {
- public:
-  // Creates the channel manager, and specifies the worker thread to use.
-  explicit ChannelManager(talk_base::Thread* worker);
-  // For testing purposes. Allows the media engine and dev manager to be mocks.
-  // The ChannelManager takes ownership of these objects.
-  ChannelManager(MediaEngine* me, DeviceManager* dm, talk_base::Thread* worker);
-  ~ChannelManager();
-
-  // Accessors for the worker thread, allowing it to be set after construction,
-  // but before Init. set_worker_thread will return false if called after Init.
-  talk_base::Thread* worker_thread() const { return worker_thread_; }
-  bool set_worker_thread(talk_base::Thread* thread) {
-    if (initialized_) return false;
-    worker_thread_ = thread;
-    return true;
-  }
-
-  // Gets capabilities. Can be called prior to starting the media engine.
-  int GetCapabilities();
-
-  // Retrieves the list of supported audio & video codec types.
-  // Can be called before starting the media engine.
-  void GetSupportedAudioCodecs(std::vector<AudioCodec>* codecs) const;
-  void GetSupportedVideoCodecs(std::vector<VideoCodec>* codecs) const;
-
-  // Indicates whether the media engine is started.
-  bool initialized() const { return initialized_; }
-  // Starts up the media engine.
-  bool Init();
-  // TODO: Remove this temporary API once Flute is updated.
-  bool Init(talk_base::Thread* thread) {
-    return set_worker_thread(thread) && Init();
-  }
-  // Shuts down the media engine.
-  void Terminate();
-
-  // The operations below all occur on the worker thread.
-
-  // Creates a voice channel, to be associated with the specified session.
-  VoiceChannel* CreateVoiceChannel(
-      BaseSession* session, const std::string& content_name, bool rtcp);
-  // Destroys a voice channel created with the Create API.
-  void DestroyVoiceChannel(VoiceChannel* voice_channel);
-  // Creates a video channel, synced with the specified voice channel, and
-  // associated with the specified session.
-  VideoChannel* CreateVideoChannel(
-      BaseSession* session, const std::string& content_name, bool rtcp,
-      VoiceChannel* voice_channel);
-  // Destroys a video channel created with the Create API.
-  void DestroyVideoChannel(VideoChannel* video_channel);
-
-  // Creates a soundclip.
-  Soundclip* CreateSoundclip();
-  // Destroys a soundclip created with the Create API.
-  void DestroySoundclip(Soundclip* soundclip);
-
-  // Indicates whether any channels exist.
-  bool has_channels() const {
-    return (!voice_channels_.empty() || !video_channels_.empty() ||
-            !soundclips_.empty());
-  }
-
-  // Configures the audio and video devices.
-  bool GetAudioOptions(std::string* wave_in_device,
-                       std::string* wave_out_device, int* opts);
-  bool SetAudioOptions(const std::string& wave_in_device,
-                       const std::string& wave_out_device, int opts);
-  bool GetOutputVolume(int* level);
-  bool SetOutputVolume(int level);
-  bool GetVideoOptions(std::string* cam_device);
-  bool SetVideoOptions(const std::string& cam_device);
-  bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config);
-
-  // Starts/stops the local microphone and enables polling of the input level.
-  bool SetLocalMonitor(bool enable);
-  bool monitoring() const { return monitoring_; }
-  // Sets the local renderer where to renderer the local camera.
-  bool SetLocalRenderer(VideoRenderer* renderer);
-  // Starts and stops the local camera and renders it to the local renderer.
-  CaptureResult SetVideoCapture(bool capture);
-  bool capturing() const { return capturing_; }
-
-  // Configures the logging output of the mediaengine(s).
-  void SetVoiceLogging(int level, const char* filter);
-  void SetVideoLogging(int level, const char* filter);
-
-  // The operations below occur on the main thread.
-
-  bool GetAudioInputDevices(std::vector<std::string>* names);
-  bool GetAudioOutputDevices(std::vector<std::string>* names);
-  bool GetVideoCaptureDevices(std::vector<std::string>* names);
-  sigslot::repeater0<> SignalDevicesChange;
-  sigslot::signal1<CaptureResult> SignalVideoCaptureResult;
-
- protected:
-  bool Send(uint32 id, talk_base::MessageData* pdata);
-  void OnMessage(talk_base::Message *message);
-  MediaEngine* media_engine() { return media_engine_.get(); }
-
- private:
-  typedef std::vector<VoiceChannel*> VoiceChannels;
-  typedef std::vector<VideoChannel*> VideoChannels;
-  typedef std::vector<Soundclip*> Soundclips;
-
-  void Construct();
-  VoiceChannel* CreateVoiceChannel_w(
-      BaseSession* session, const std::string& content_name, bool rtcp);
-  void DestroyVoiceChannel_w(VoiceChannel* voice_channel);
-  VideoChannel* CreateVideoChannel_w(
-      BaseSession* session, const std::string& content_name, bool rtcp,
-      VoiceChannel* voice_channel);
-  void DestroyVideoChannel_w(VideoChannel* video_channel);
-  Soundclip* CreateSoundclip_w();
-  void DestroySoundclip_w(Soundclip* soundclip);
-  bool SetAudioOptions_w(int opts, const Device* in_dev,
-                         const Device* out_dev);
-  bool GetOutputVolume_w(int* level);
-  bool SetOutputVolume_w(int level);
-  bool SetLocalMonitor_w(bool enable);
-  bool SetVideoOptions_w(const Device* cam_device);
-  bool SetDefaultVideoEncoderConfig_w(const VideoEncoderConfig& config);
-  bool SetLocalRenderer_w(VideoRenderer* renderer);
-  CaptureResult SetVideoCapture_w(bool capture);
-  void SetMediaLogging(bool video, int level, const char* filter);
-  void SetMediaLogging_w(bool video, int level, const char* filter);
-  void OnVideoCaptureResult(CaptureResult result);
-
-  talk_base::CriticalSection crit_;
-  talk_base::scoped_ptr<MediaEngine> media_engine_;
-  talk_base::scoped_ptr<DeviceManager> device_manager_;
-  bool initialized_;
-  talk_base::Thread* main_thread_;
-  talk_base::Thread* worker_thread_;
-
-  VoiceChannels voice_channels_;
-  VideoChannels video_channels_;
-  Soundclips soundclips_;
-
-  std::string audio_in_device_;
-  std::string audio_out_device_;
-  int audio_options_;
-  std::string camera_device_;
-  VideoEncoderConfig default_video_encoder_config_;
-  VideoRenderer* local_renderer_;
-
-  bool capturing_;
-  bool monitoring_;
-};
-
-}  // namespace cricket
-
-#endif  // TALK_SESSION_PHONE_CHANNELMANAGER_H_
diff --git a/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h b/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h
deleted file mode 100644
index 05f0821..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2007, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TALK_SESSION_PHONE_MEDIAENGINE_H_
-#define TALK_SESSION_PHONE_MEDIAENGINE_H_
-
-#ifdef OSX
-#include <CoreAudio/CoreAudio.h>
-#endif
-
-#include <string>
-#include <vector>
-
-#include "talk/base/sigslotrepeater.h"
-#include "talk/session/phone/codec.h"
-#include "talk/session/phone/devicemanager.h"
-#include "talk/session/phone/mediachannel.h"
-#include "talk/session/phone/videocommon.h"
-
-namespace cricket {
-
-// A class for playing out soundclips.
-class SoundclipMedia {
- public:
-  enum SoundclipFlags {
-    SF_LOOP = 1,
-  };
-
-  virtual ~SoundclipMedia() {}
-
-  // Plays a sound out to the speakers with the given audio stream. The stream
-  // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing
-  // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played.
-  // Returns whether it was successful.
-  virtual bool PlaySound(const char *clip, int len, int flags) = 0;
-};
-
-// MediaEngine is an abstraction of a media engine which can be subclassed
-// to support different media componentry backends. It supports voice and
-// video operations in the same class to facilitate proper synchronization
-// between both media types.
-class MediaEngine {
- public:
-  // TODO: Move this to a global location (also used in DeviceManager)
-  // Capabilities of the media engine.
-  enum Capabilities {
-    AUDIO_RECV = 1 << 0,
-    AUDIO_SEND = 1 << 1,
-    VIDEO_RECV = 1 << 2,
-    VIDEO_SEND = 1 << 3,
-  };
-
-  // Bitmask flags for options that may be supported by the media engine
-  // implementation
-  enum AudioOptions {
-    ECHO_CANCELLATION = 1 << 0,
-    AUTO_GAIN_CONTROL = 1 << 1,
-    DEFAULT_AUDIO_OPTIONS = ECHO_CANCELLATION | AUTO_GAIN_CONTROL
-  };
-  enum VideoOptions {
-  };
-
-  virtual ~MediaEngine() {}
-  static MediaEngine* Create();
-
-  // Initialization
-  // Starts the engine.
-  virtual bool Init() = 0;
-  // Shuts down the engine.
-  virtual void Terminate() = 0;
-  // Returns what the engine is capable of, as a set of Capabilities, above.
-  virtual int GetCapabilities() = 0;
-
-  // MediaChannel creation
-  // Creates a voice media channel. Returns NULL on failure.
-  virtual VoiceMediaChannel *CreateChannel() = 0;
-  // Creates a video media channel, paired with the specified voice channel.
-  // Returns NULL on failure.
-  virtual VideoMediaChannel *CreateVideoChannel(
-      VoiceMediaChannel* voice_media_channel) = 0;
-
-  // Creates a soundclip object for playing sounds on. Returns NULL on failure.
-  virtual SoundclipMedia *CreateSoundclip() = 0;
-
-  // Configuration
-  // Sets global audio options. "options" are from AudioOptions, above.
-  virtual bool SetAudioOptions(int options) = 0;
-  // Sets global video options. "options" are from VideoOptions, above.
-  virtual bool SetVideoOptions(int options) = 0;
-  // Sets the default (maximum) codec/resolution and encoder option to capture
-  // and encode video.
-  virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config)
-      = 0;
-
-  // Device selection
-  // TODO: Add method for selecting the soundclip device.
-  virtual bool SetSoundDevices(const Device* in_device,
-                               const Device* out_device) = 0;
-  virtual bool SetVideoCaptureDevice(const Device* cam_device) = 0;
-  virtual bool SetVideoRenderer(int channel_id,
-                                void* window,
-                                unsigned int zOrder,
-                                float left,
-                                float top,
-                                float right,
-                                float bottom) = 0;
-
-  // Device configuration
-  // Gets the current speaker volume, as a value between 0 and 255.
-  virtual bool GetOutputVolume(int* level) = 0;
-  // Sets the current speaker volume, as a value between 0 and 255.
-  virtual bool SetOutputVolume(int level) = 0;
-
-  // Local monitoring
-  // Gets the current microphone level, as a value between 0 and 10.
-  virtual int GetInputLevel() = 0;
-  // Starts or stops the local microphone. Useful if local mic info is needed
-  // prior to a call being connected; the mic will be started automatically
-  // when a VoiceMediaChannel starts sending.
-  virtual bool SetLocalMonitor(bool enable) = 0;
-  // Installs a callback for raw frames from the local camera.
-  virtual bool SetLocalRenderer(VideoRenderer* renderer) = 0;
-  // Starts/stops local camera.
-  virtual CaptureResult SetVideoCapture(bool capture) = 0;
-
-  virtual const std::vector<AudioCodec>& audio_codecs() = 0;
-  virtual const std::vector<VideoCodec>& video_codecs() = 0;
-
-  // Logging control
-  virtual void SetVoiceLogging(int min_sev, const char* filter) = 0;
-  virtual void SetVideoLogging(int min_sev, const char* filter) = 0;
-
-  sigslot::repeater1<CaptureResult> SignalVideoCaptureResult;
-};
-
-// CompositeMediaEngine constructs a MediaEngine from separate
-// voice and video engine classes.
-template<class VOICE, class VIDEO>
-class CompositeMediaEngine : public MediaEngine {
- public:
-  CompositeMediaEngine() {}
-  virtual ~CompositeMediaEngine() {}
-  virtual bool Init() {
-    if (!voice_.Init())
-      return false;
-    if (!video_.Init()) {
-      voice_.Terminate();
-      return false;
-    }
-    SignalVideoCaptureResult.repeat(video_.SignalCaptureResult);
-    return true;
-  }
-  virtual void Terminate() {
-    video_.Terminate();
-    voice_.Terminate();
-  }
-
-  virtual int GetCapabilities() {
-    return (voice_.GetCapabilities() | video_.GetCapabilities());
-  }
-  virtual VoiceMediaChannel *CreateChannel() {
-    return voice_.CreateChannel();
-  }
-  virtual VideoMediaChannel *CreateVideoChannel(VoiceMediaChannel* channel) {
-    return video_.CreateChannel(channel);
-  }
-  virtual SoundclipMedia *CreateSoundclip() {
-    return voice_.CreateSoundclip();
-  }
-
-  virtual bool SetAudioOptions(int o) {
-    return voice_.SetOptions(o);
-  }
-  virtual bool SetVideoOptions(int o) {
-    return video_.SetOptions(o);
-  }
-  virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) {
-    return video_.SetDefaultEncoderConfig(config);
-  }
-
-  virtual bool SetSoundDevices(const Device* in_device,
-                               const Device* out_device) {
-    return voice_.SetDevices(in_device, out_device);
-  }
-
-  virtual bool SetVideoCaptureDevice(const Device* cam_device) {
-    return video_.SetCaptureDevice(cam_device);
-  }
-
-  virtual bool SetVideoRenderer(int channel_id,
-                                void* window,
-                                unsigned int zOrder,
-                                float left,
-                                float top,
-                                float right,
-                                float bottom) {
-    return video_.SetVideoRenderer(channel_id,
-                                   window,
-                                   zOrder,
-                                   left,
-                                   top,
-                                   right,
-                                   bottom);
-  }
-
-  virtual bool GetOutputVolume(int* level) {
-    return voice_.GetOutputVolume(level);
-  }
-
-  virtual bool SetOutputVolume(int level) {
-    return voice_.SetOutputVolume(level);
-  }
-
-  virtual int GetInputLevel() {
-    return voice_.GetInputLevel();
-  }
-  virtual bool SetLocalMonitor(bool enable) {
-    return voice_.SetLocalMonitor(enable);
-  }
-  virtual bool SetLocalRenderer(VideoRenderer* renderer) {
-    return video_.SetLocalRenderer(renderer);
-  }
-  virtual CaptureResult SetVideoCapture(bool capture) {
-    return video_.SetCapture(capture);
-  }
-
-  virtual const std::vector<AudioCodec>& audio_codecs() {
-    return voice_.codecs();
-  }
-  virtual const std::vector<VideoCodec>& video_codecs() {
-    return video_.codecs();
-  }
-
-  virtual void SetVoiceLogging(int min_sev, const char* filter) {
-    return voice_.SetLogging(min_sev, filter);
-  }
-  virtual void SetVideoLogging(int min_sev, const char* filter) {
-    return video_.SetLogging(min_sev, filter);
-  }
-
- protected:
-  VOICE voice_;
-  VIDEO video_;
-};
-
-// NullVoiceEngine can be used with CompositeMediaEngine in the case where only
-// a video engine is desired.
-class NullVoiceEngine {
- public:
-  bool Init() { return true; }
-  void Terminate() {}
-  int GetCapabilities() { return 0; }
-  // If you need this to return an actual channel, use FakeMediaEngine instead.
-  VoiceMediaChannel* CreateChannel() {
-    return NULL;
-  }
-  SoundclipMedia* CreateSoundclip() {
-    return NULL;
-  }
-  bool SetOptions(int opts) { return true; }
-  bool SetDevices(const Device* in_device, const Device* out_device) {
-    return true;
-  }
-  bool GetOutputVolume(int* level) { *level = 0; return true; }
-  bool SetOutputVolume(int level) { return true; }
-  int GetInputLevel() { return 0; }
-  bool SetLocalMonitor(bool enable) { return true; }
-  const std::vector<AudioCodec>& codecs() { return codecs_; }
-  void SetLogging(int min_sev, const char* filter) {}
- private:
-  std::vector<AudioCodec> codecs_;
-};
-
-// NullVideoEngine can be used with CompositeMediaEngine in the case where only
-// a voice engine is desired.
-class NullVideoEngine {
- public:
-  bool Init() { return true; }
-  void Terminate() {}
-  int GetCapabilities() { return 0; }
-  // If you need this to return an actual channel, use FakeMediaEngine instead.
-  VideoMediaChannel* CreateChannel(
-      VoiceMediaChannel* voice_media_channel) {
-    return NULL;
-  }
-  bool SetOptions(int opts) { return true; }
-  bool SetDefaultEncoderConfig(const VideoEncoderConfig& config) {
-    return true;
-  }
-  bool SetCaptureDevice(const Device* cam_device) { return true; }
-  bool SetLocalRenderer(VideoRenderer* renderer) { return true; }
-  CaptureResult SetCapture(bool capture) { return CR_SUCCESS;  }
-  const std::vector<VideoCodec>& codecs() { return codecs_; }
-  void SetLogging(int min_sev, const char* filter) {}
-  sigslot::signal1<CaptureResult> SignalCaptureResult;
- private:
-  std::vector<VideoCodec> codecs_;
-};
-
-typedef CompositeMediaEngine<NullVoiceEngine, NullVideoEngine> NullMediaEngine;
-
-}  // namespace cricket
-
-#endif  // TALK_SESSION_PHONE_MEDIAENGINE_H_