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;