Implement I420FrameCallbacks in Call.

BUG=2425
R=mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/2393004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5005 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video_engine/internal/video_receive_stream.cc b/webrtc/video_engine/internal/video_receive_stream.cc
index c92cc8d..a6a5875 100644
--- a/webrtc/video_engine/internal/video_receive_stream.cc
+++ b/webrtc/video_engine/internal/video_receive_stream.cc
@@ -19,6 +19,7 @@
 #include "webrtc/video_engine/include/vie_capture.h"
 #include "webrtc/video_engine/include/vie_codec.h"
 #include "webrtc/video_engine/include/vie_external_codec.h"
+#include "webrtc/video_engine/include/vie_image_process.h"
 #include "webrtc/video_engine/include/vie_network.h"
 #include "webrtc/video_engine/include/vie_render.h"
 #include "webrtc/video_engine/include/vie_rtp_rtcp.h"
@@ -86,21 +87,28 @@
   render_ = webrtc::ViERender::GetInterface(video_engine);
   assert(render_ != NULL);
 
-  if (render_->AddRenderer(channel_, kVideoI420, this) != 0) {
-    abort();
-  }
+  render_->AddRenderer(channel_, kVideoI420, this);
+
+  image_process_ = ViEImageProcess::GetInterface(video_engine);
+  image_process_->RegisterPreRenderCallback(channel_,
+                                            config_.pre_render_callback);
 
   clock_ = Clock::GetRealTimeClock();
 }
 
 VideoReceiveStream::~VideoReceiveStream() {
+  image_process_->DeRegisterPreEncodeCallback(channel_);
+
   render_->RemoveRenderer(channel_);
+
   for (size_t i = 0; i < config_.external_decoders.size(); ++i) {
     external_codec_->DeRegisterExternalReceiveCodec(
         channel_, config_.external_decoders[i].payload_type);
   }
+
   network_->DeregisterSendTransport(channel_);
 
+  image_process_->Release();
   video_engine_base_->Release();
   external_codec_->Release();
   codec_->Release();
@@ -170,15 +178,8 @@
   video_frame.set_timestamp(timestamp);
   video_frame.set_render_time_ms(render_time);
 
-  if (config_.post_decode_callback != NULL) {
-    config_.post_decode_callback->FrameCallback(&video_frame);
-  }
-
-  if (config_.renderer != NULL) {
-    // TODO(pbos): Add timing to RenderFrame call
-    config_.renderer->RenderFrame(video_frame,
-                                  render_time - clock_->TimeInMilliseconds());
-  }
+  config_.renderer->RenderFrame(video_frame,
+                                render_time - clock_->TimeInMilliseconds());
 
   return 0;
 }
diff --git a/webrtc/video_engine/internal/video_receive_stream.h b/webrtc/video_engine/internal/video_receive_stream.h
index b6b5319..b5d095c 100644
--- a/webrtc/video_engine/internal/video_receive_stream.h
+++ b/webrtc/video_engine/internal/video_receive_stream.h
@@ -25,6 +25,7 @@
 class ViEBase;
 class ViECodec;
 class ViEExternalCodec;
+class ViEImageProcess;
 class ViENetwork;
 class ViERender;
 class ViERTP_RTCP;
@@ -66,6 +67,7 @@
   ViENetwork* network_;
   ViERender* render_;
   ViERTP_RTCP* rtp_rtcp_;
+  ViEImageProcess* image_process_;
 
   int channel_;
 
diff --git a/webrtc/video_engine/internal/video_send_stream.cc b/webrtc/video_engine/internal/video_send_stream.cc
index 55921c2..d238b95 100644
--- a/webrtc/video_engine/internal/video_send_stream.cc
+++ b/webrtc/video_engine/internal/video_send_stream.cc
@@ -19,6 +19,7 @@
 #include "webrtc/video_engine/include/vie_capture.h"
 #include "webrtc/video_engine/include/vie_codec.h"
 #include "webrtc/video_engine/include/vie_external_codec.h"
+#include "webrtc/video_engine/include/vie_image_process.h"
 #include "webrtc/video_engine/include/vie_network.h"
 #include "webrtc/video_engine/include/vie_rtp_rtcp.h"
 #include "webrtc/video_engine/new_include/video_send_stream.h"
@@ -190,11 +191,16 @@
     video_engine_base_->RegisterCpuOveruseObserver(channel_,
                                                    overuse_observer_.get());
   }
+
+  image_process_ = ViEImageProcess::GetInterface(video_engine);
+  image_process_->RegisterPreEncodeCallback(channel_,
+                                            config_.pre_encode_callback);
 }
 
 VideoSendStream::~VideoSendStream() {
+  image_process_->DeRegisterPreEncodeCallback(channel_);
+
   network_->DeregisterSendTransport(channel_);
-  video_engine_base_->DeleteChannel(channel_);
 
   capture_->DisconnectCaptureDevice(channel_);
   capture_->ReleaseCaptureDevice(capture_id_);
@@ -204,6 +210,9 @@
                                                  config_.codec.plType);
   }
 
+  video_engine_base_->DeleteChannel(channel_);
+
+  image_process_->Release();
   video_engine_base_->Release();
   capture_->Release();
   codec_->Release();
@@ -220,10 +229,6 @@
   I420VideoFrame frame_copy;
   frame_copy.CopyFrame(frame);
 
-  if (config_.pre_encode_callback != NULL) {
-    config_.pre_encode_callback->FrameCallback(&frame_copy);
-  }
-
   ViEVideoFrameI420 vf;
 
   // TODO(pbos): This represents a memcpy step and is only required because
diff --git a/webrtc/video_engine/internal/video_send_stream.h b/webrtc/video_engine/internal/video_send_stream.h
index 1241b48..27027ef 100644
--- a/webrtc/video_engine/internal/video_send_stream.h
+++ b/webrtc/video_engine/internal/video_send_stream.h
@@ -26,6 +26,7 @@
 class ViECodec;
 class ViEExternalCapture;
 class ViEExternalCodec;
+class ViEImageProcess;
 class ViENetwork;
 class ViERTP_RTCP;
 
@@ -72,6 +73,7 @@
   ViEExternalCodec* external_codec_;
   ViENetwork* network_;
   ViERTP_RTCP* rtp_rtcp_;
+  ViEImageProcess* image_process_;
 
   int channel_;
   int capture_id_;