Use IncomingVideoStream in VideoReceiveStream.

Decouples VideoReceiveStream further from webrtc/video_engine/ as well
as most of webrtc/modules/video_render/ resulting in a simpler setup.

BUG=1695
R=mflodman@webrtc.org, stefan@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#9080}
diff --git a/talk/media/webrtc/fakewebrtcvideoengine.h b/talk/media/webrtc/fakewebrtcvideoengine.h
index 15e2ba0..43b1d2a 100644
--- a/talk/media/webrtc/fakewebrtcvideoengine.h
+++ b/talk/media/webrtc/fakewebrtcvideoengine.h
@@ -718,7 +718,6 @@
   }
   webrtc::ViEChannel* GetChannel(int channel_id) override { return nullptr; }
   webrtc::ViEEncoder* GetEncoder(int channel_id) override { return nullptr; }
-  webrtc::ViERenderManager* GetRenderManager() override { return nullptr; }
 
   WEBRTC_FUNC(CreateReceiveChannel, (int& channel, int original_channel)) {
     return CreateChannel(channel, original_channel);
diff --git a/webrtc/video/call.cc b/webrtc/video/call.cc
index bdd873e..f28e075 100644
--- a/webrtc/video/call.cc
+++ b/webrtc/video/call.cc
@@ -313,13 +313,9 @@
     const VideoReceiveStream::Config& config) {
   TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream");
   LOG(LS_INFO) << "CreateVideoReceiveStream: " << config.ToString();
-  VideoReceiveStream* receive_stream =
-      new VideoReceiveStream(video_engine_,
-                             channel_group_,
-                             config,
-                             config_.send_transport,
-                             config_.voice_engine,
-                             base_channel_id_);
+  VideoReceiveStream* receive_stream = new VideoReceiveStream(
+      video_engine_, channel_group_, config, config_.send_transport,
+      config_.voice_engine, base_channel_id_);
 
   // This needs to be taken before receive_crit_ as both locks need to be held
   // while changing network state.
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index fd04079..bcb42c6 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -149,7 +149,6 @@
   DCHECK(channel_ != -1);
 
   vie_channel_ = video_engine_base_->GetChannel(channel_);
-  vie_render_manager_ = video_engine_base_->GetRenderManager();
 
   // TODO(pbos): This is not fine grained enough...
   vie_channel_->SetNACKStatus(config_.rtp.nack.rtp_history_ms > 0);
@@ -248,10 +247,10 @@
   // Register a renderer without a window handle, at depth 0, that covers the
   // entire rendered area (0->1 both axes). This registers a renderer that
   // renders the entire video.
-  vie_renderer_ = vie_render_manager_->AddRenderStream(channel_, nullptr, 0,
-                                                       0.0f, 0.0f, 1.0f, 1.0f);
-  vie_renderer_->SetExternalRenderer(channel_, kVideoI420, this);
-  vie_channel_->RegisterFrameCallback(channel_, vie_renderer_);
+  incoming_video_stream_.reset(new IncomingVideoStream(channel_));
+  incoming_video_stream_->SetExpectedRenderDelay(config.render_delay_ms);
+  incoming_video_stream_->SetExternalCallback(this);
+  vie_channel_->SetIncomingVideoStream(incoming_video_stream_.get());
 
   if (voice_engine && config_.audio_channel_id != -1) {
     voe_sync_interface_ = VoEVideoSync::GetInterface(voice_engine);
@@ -267,9 +266,6 @@
   vie_channel_->RegisterPreRenderCallback(nullptr);
   vie_channel_->RegisterPreDecodeImageCallback(nullptr);
 
-  vie_channel_->DeregisterFrameCallback(vie_renderer_);
-  vie_render_manager_->RemoveRenderStream(channel_);
-
   for (size_t i = 0; i < config_.decoders.size(); ++i)
     vie_channel_->DeRegisterExternalDecoder(config_.decoders[i].payload_type);
 
@@ -289,12 +285,12 @@
 
 void VideoReceiveStream::Start() {
   transport_adapter_.Enable();
-  vie_renderer_->StartRender();
+  incoming_video_stream_->Start();
   vie_channel_->StartReceive();
 }
 
 void VideoReceiveStream::Stop() {
-  vie_renderer_->StopRender();
+  incoming_video_stream_->Stop();
   vie_channel_->StopReceive();
   transport_adapter_.Disable();
 }
@@ -318,24 +314,12 @@
     config_.pre_render_callback->FrameCallback(video_frame);
 }
 
-int VideoReceiveStream::FrameSizeChange(unsigned int width,
-                                        unsigned int height,
-                                        unsigned int number_of_streams) {
-  return 0;
-}
+int VideoReceiveStream::RenderFrame(const uint32_t /*stream_id*/,
+                                    const I420VideoFrame& video_frame) {
+  // TODO(pbos): Wire up config_.render->IsTextureSupported() and convert if not
+  // supported. Or provide methods for converting a texture frame in
+  // I420VideoFrame.
 
-int VideoReceiveStream::DeliverFrame(unsigned char* buffer,
-                                     size_t buffer_size,
-                                     uint32_t timestamp,
-                                     int64_t ntp_time_ms,
-                                     int64_t render_time_ms,
-                                     void* handle) {
-  CHECK(false) << "Renderer should be configured as kVideoI420 and never "
-                  "receive callbacks on DeliverFrame.";
-  return 0;
-}
-
-int VideoReceiveStream::DeliverI420Frame(const I420VideoFrame& video_frame) {
   if (config_.renderer != nullptr)
     config_.renderer->RenderFrame(
         video_frame,
@@ -346,12 +330,6 @@
   return 0;
 }
 
-bool VideoReceiveStream::IsTextureSupported() {
-  if (config_.renderer == nullptr)
-    return false;
-  return config_.renderer->IsTextureSupported();
-}
-
 void VideoReceiveStream::SignalNetworkState(Call::NetworkState state) {
   if (state == Call::kNetworkUp)
     SetRtcpMode(config_.rtp.rtcp_mode);
diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h
index 8e4a9e5..c506bb0 100644
--- a/webrtc/video/video_receive_stream.h
+++ b/webrtc/video/video_receive_stream.h
@@ -17,6 +17,7 @@
 #include "webrtc/call.h"
 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
 #include "webrtc/modules/video_render/include/video_render_defines.h"
+#include "webrtc/modules/video_render/incoming_video_stream.h"
 #include "webrtc/system_wrappers/interface/clock.h"
 #include "webrtc/video/encoded_frame_callback_adapter.h"
 #include "webrtc/video/receive_statistics_proxy.h"
@@ -25,8 +26,6 @@
 #include "webrtc/video_engine/vie_channel.h"
 #include "webrtc/video_engine/vie_channel_group.h"
 #include "webrtc/video_engine/vie_encoder.h"
-#include "webrtc/video_engine/vie_render_manager.h"
-#include "webrtc/video_engine/vie_renderer.h"
 #include "webrtc/video_receive_stream.h"
 
 namespace webrtc {
@@ -45,7 +44,7 @@
 
 class VideoReceiveStream : public webrtc::VideoReceiveStream,
                            public I420FrameCallback,
-                           public ExternalRenderer {
+                           public VideoRenderCallback {
  public:
   VideoReceiveStream(webrtc::VideoEngine* video_engine,
                      ChannelGroup* channel_group,
@@ -62,23 +61,14 @@
   // Overrides I420FrameCallback.
   void FrameCallback(I420VideoFrame* video_frame) override;
 
-  // Overrides ExternalRenderer.
-  int FrameSizeChange(unsigned int width,
-                      unsigned int height,
-                      unsigned int number_of_streams) override;
-  int DeliverFrame(unsigned char* buffer,
-                   size_t buffer_size,
-                   uint32_t timestamp,
-                   int64_t ntp_time_ms,
-                   int64_t render_time_ms,
-                   void* handle) override;
-  int DeliverI420Frame(const I420VideoFrame& webrtc_frame) override;
-  bool IsTextureSupported() override;
+  // Overrides VideoRenderCallback.
+  int RenderFrame(const uint32_t /*stream_id*/,
+                  const I420VideoFrame& video_frame) override;
 
   void SignalNetworkState(Call::NetworkState state);
 
-  virtual bool DeliverRtcp(const uint8_t* packet, size_t length);
-  virtual bool DeliverRtp(const uint8_t* packet, size_t length);
+  bool DeliverRtcp(const uint8_t* packet, size_t length);
+  bool DeliverRtp(const uint8_t* packet, size_t length);
 
  private:
   void SetRtcpMode(newapi::RtcpMode mode);
@@ -90,8 +80,7 @@
 
   ChannelGroup* const channel_group_;
   ViEChannel* vie_channel_;
-  ViERenderManager* vie_render_manager_;
-  ViERenderer* vie_renderer_;
+  rtc::scoped_ptr<IncomingVideoStream> incoming_video_stream_;
 
   ViEBase* video_engine_base_;
 
diff --git a/webrtc/video_engine/include/vie_base.h b/webrtc/video_engine/include/vie_base.h
index 55bc5f5..3be2e43 100644
--- a/webrtc/video_engine/include/vie_base.h
+++ b/webrtc/video_engine/include/vie_base.h
@@ -201,7 +201,6 @@
   virtual ChannelGroup* GetChannelGroup(int channel_id) = 0;
   virtual ViEChannel* GetChannel(int channel_id) = 0;
   virtual ViEEncoder* GetEncoder(int channel_id) = 0;
-  virtual ViERenderManager* GetRenderManager() = 0;
 
   // Creates a new channel grouped together with |original_channel|. The channel
   // can only receive video and it is assumed the remote end-point is the same
diff --git a/webrtc/video_engine/vie_base_impl.cc b/webrtc/video_engine/vie_base_impl.cc
index 7d25172..6ea2d96 100644
--- a/webrtc/video_engine/vie_base_impl.cc
+++ b/webrtc/video_engine/vie_base_impl.cc
@@ -214,10 +214,6 @@
   return vie_encoder;
 }
 
-ViERenderManager* ViEBaseImpl::GetRenderManager() {
-  return shared_data_.render_manager();
-}
-
 int ViEBaseImpl::CreateReceiveChannel(int& video_channel,  // NOLINT
                                       int original_channel) {
   return CreateChannel(video_channel, original_channel, false, true);
diff --git a/webrtc/video_engine/vie_base_impl.h b/webrtc/video_engine/vie_base_impl.h
index 5df9490..fa1c250 100644
--- a/webrtc/video_engine/vie_base_impl.h
+++ b/webrtc/video_engine/vie_base_impl.h
@@ -53,7 +53,6 @@
   ChannelGroup* GetChannelGroup(int channel_id) override;
   ViEChannel* GetChannel(int channel_id) override;
   ViEEncoder* GetEncoder(int channel_id) override;
-  ViERenderManager* GetRenderManager() override;
 
   virtual int CreateReceiveChannel(int& video_channel,  // NOLINT
                                    int original_channel);
diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc
index 0dbefc3..ab2c0d3 100644
--- a/webrtc/video_engine/vie_channel.cc
+++ b/webrtc/video_engine/vie_channel.cc
@@ -26,6 +26,7 @@
 #include "webrtc/modules/video_coding/main/interface/video_coding.h"
 #include "webrtc/modules/video_processing/main/interface/video_processing.h"
 #include "webrtc/modules/video_render/include/video_render_defines.h"
+#include "webrtc/modules/video_render/incoming_video_stream.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 #include "webrtc/system_wrappers/interface/metrics.h"
@@ -112,6 +113,7 @@
       vie_sync_(vcm_, this),
       stats_observer_(new ChannelStatsObserver(this)),
       vcm_receive_stats_callback_(NULL),
+      incoming_video_stream_(nullptr),
       module_process_thread_(module_process_thread),
       codec_observer_(NULL),
       do_key_frame_callbackRequest_(false),
@@ -1689,6 +1691,12 @@
     }
   }
 
+  // New API bypass.
+  if (incoming_video_stream_) {
+    incoming_video_stream_->RenderFrame(channel_id_, video_frame);
+    return 0;
+  }
+
   uint32_t arr_ofCSRC[kRtpCsrcSize];
   int32_t no_of_csrcs = vie_receiver_.GetCsrcs(arr_ofCSRC);
   if (no_of_csrcs <= 0) {
@@ -1994,4 +2002,10 @@
                                    const RTPHeader& header) {
   vie_receiver_.ReceivedBWEPacket(arrival_time_ms, payload_size, header);
 }
+
+void ViEChannel::SetIncomingVideoStream(
+    IncomingVideoStream* incoming_video_stream) {
+  CriticalSectionScoped cs(callback_cs_.get());
+  incoming_video_stream_ = incoming_video_stream;
+}
 }  // namespace webrtc
diff --git a/webrtc/video_engine/vie_channel.h b/webrtc/video_engine/vie_channel.h
index 4bd27de..985ad88 100644
--- a/webrtc/video_engine/vie_channel.h
+++ b/webrtc/video_engine/vie_channel.h
@@ -38,6 +38,7 @@
 class CriticalSectionWrapper;
 class EncodedImageCallback;
 class I420FrameCallback;
+class IncomingVideoStream;
 class PacedSender;
 class PacketRouter;
 class PayloadRouter;
@@ -373,6 +374,7 @@
       ReceiveStatisticsProxy* receive_statistics_proxy);
   void ReceivedBWEPacket(int64_t arrival_time_ms, size_t payload_size,
                          const RTPHeader& header);
+  void SetIncomingVideoStream(IncomingVideoStream* incoming_video_stream);
 
  protected:
   static bool ChannelDecodeThreadFunction(void* obj);
@@ -522,6 +524,7 @@
   VCMReceiveStatisticsCallback* vcm_receive_stats_callback_
       GUARDED_BY(callback_cs_);
   FrameCounts receive_frame_counts_ GUARDED_BY(callback_cs_);
+  IncomingVideoStream* incoming_video_stream_ GUARDED_BY(callback_cs_);
   ProcessThread& module_process_thread_;
   ViEDecoderObserver* codec_observer_;
   bool do_key_frame_callbackRequest_;
diff --git a/webrtc/video_receive_stream.h b/webrtc/video_receive_stream.h
index 0f2151d..c24c62e 100644
--- a/webrtc/video_receive_stream.h
+++ b/webrtc/video_receive_stream.h
@@ -77,7 +77,7 @@
     int target_delay_ms = 0;
     int jitter_buffer_ms = 0;
     int min_playout_delay_ms = 0;
-    int render_delay_ms = 0;
+    int render_delay_ms = 10;
 
     int total_bitrate_bps = 0;
     int discarded_packets = 0;