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:
parent
f955b5d3f5
commit
c4188fd3c7
@ -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);
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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_;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user