From c4188fd3c74688264621393fc622cb81c042c1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Bostr=C3=B6m?= Date: Fri, 24 Apr 2015 15:16:03 +0200 Subject: [PATCH] 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} --- talk/media/webrtc/fakewebrtcvideoengine.h | 1 - webrtc/video/call.cc | 10 ++---- webrtc/video/video_receive_stream.cc | 44 ++++++----------------- webrtc/video/video_receive_stream.h | 27 +++++--------- webrtc/video_engine/include/vie_base.h | 1 - webrtc/video_engine/vie_base_impl.cc | 4 --- webrtc/video_engine/vie_base_impl.h | 1 - webrtc/video_engine/vie_channel.cc | 14 ++++++++ webrtc/video_engine/vie_channel.h | 3 ++ webrtc/video_receive_stream.h | 2 +- 10 files changed, 40 insertions(+), 67 deletions(-) diff --git a/talk/media/webrtc/fakewebrtcvideoengine.h b/talk/media/webrtc/fakewebrtcvideoengine.h index 15e2ba0d07..43b1d2aa0a 100644 --- a/talk/media/webrtc/fakewebrtcvideoengine.h +++ b/talk/media/webrtc/fakewebrtcvideoengine.h @@ -718,7 +718,6 @@ class FakeWebRtcVideoEngine } 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 bdd873e06c..f28e075378 100644 --- a/webrtc/video/call.cc +++ b/webrtc/video/call.cc @@ -313,13 +313,9 @@ VideoReceiveStream* Call::CreateVideoReceiveStream( 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 fd04079f65..bcb42c6679 100644 --- a/webrtc/video/video_receive_stream.cc +++ b/webrtc/video/video_receive_stream.cc @@ -149,7 +149,6 @@ VideoReceiveStream::VideoReceiveStream(webrtc::VideoEngine* video_engine, 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 @@ VideoReceiveStream::VideoReceiveStream(webrtc::VideoEngine* video_engine, // 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 @@ VideoReceiveStream::~VideoReceiveStream() { 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 @@ VideoReceiveStream::~VideoReceiveStream() { 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 @@ void VideoReceiveStream::FrameCallback(I420VideoFrame* video_frame) { 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 @@ int VideoReceiveStream::DeliverI420Frame(const I420VideoFrame& video_frame) { 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 8e4a9e5f00..c506bb08d0 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 @@ namespace internal { class VideoReceiveStream : public webrtc::VideoReceiveStream, public I420FrameCallback, - public ExternalRenderer { + public VideoRenderCallback { public: VideoReceiveStream(webrtc::VideoEngine* video_engine, ChannelGroup* channel_group, @@ -62,23 +61,14 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, // 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 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, ChannelGroup* const channel_group_; ViEChannel* vie_channel_; - ViERenderManager* vie_render_manager_; - ViERenderer* vie_renderer_; + rtc::scoped_ptr 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 55bc5f5eb4..3be2e43b83 100644 --- a/webrtc/video_engine/include/vie_base.h +++ b/webrtc/video_engine/include/vie_base.h @@ -201,7 +201,6 @@ class WEBRTC_DLLEXPORT ViEBase { 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 7d25172ec4..6ea2d96763 100644 --- a/webrtc/video_engine/vie_base_impl.cc +++ b/webrtc/video_engine/vie_base_impl.cc @@ -214,10 +214,6 @@ ViEEncoder* ViEBaseImpl::GetEncoder(int channel_id) { 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 5df94901cf..fa1c250ff5 100644 --- a/webrtc/video_engine/vie_base_impl.h +++ b/webrtc/video_engine/vie_base_impl.h @@ -53,7 +53,6 @@ class ViEBaseImpl 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 0dbefc32c0..ab2c0d3526 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 @@ ViEChannel::ViEChannel(int32_t channel_id, 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 @@ int32_t ViEChannel::FrameToRender( } } + // 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 @@ void ViEChannel::ReceivedBWEPacket(int64_t arrival_time_ms, 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 4bd27de5e1..985ad88466 100644 --- a/webrtc/video_engine/vie_channel.h +++ b/webrtc/video_engine/vie_channel.h @@ -38,6 +38,7 @@ class Config; class CriticalSectionWrapper; class EncodedImageCallback; class I420FrameCallback; +class IncomingVideoStream; class PacedSender; class PacketRouter; class PayloadRouter; @@ -373,6 +374,7 @@ class ViEChannel 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 @@ class ViEChannel 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 0f2151df03..c24c62e4ff 100644 --- a/webrtc/video_receive_stream.h +++ b/webrtc/video_receive_stream.h @@ -77,7 +77,7 @@ class VideoReceiveStream { 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;