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}
This commit is contained in:
Peter Boström 2015-04-24 15:16:03 +02:00
parent f955b5d3f5
commit c4188fd3c7
10 changed files with 40 additions and 67 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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);

View File

@ -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<IncomingVideoStream> incoming_video_stream_;
ViEBase* video_engine_base_;

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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_;

View File

@ -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;