| Index: webrtc/video/video_send_stream.cc
|
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
|
| index d55adf01252b5e4f368718c691e1571eb862c66a..ecb4f8da4d9fefab4b8646a491c9abaeca2748e7 100644
|
| --- a/webrtc/video/video_send_stream.cc
|
| +++ b/webrtc/video/video_send_stream.cc
|
| @@ -21,6 +21,8 @@
|
| #include "webrtc/system_wrappers/interface/logging.h"
|
| #include "webrtc/system_wrappers/interface/trace_event.h"
|
| #include "webrtc/video/video_capture_input.h"
|
| +#include "webrtc/video_engine/call_stats.h"
|
| +#include "webrtc/video_engine/payload_router.h"
|
| #include "webrtc/video_engine/vie_channel.h"
|
| #include "webrtc/video_engine/vie_channel_group.h"
|
| #include "webrtc/video_engine/vie_defines.h"
|
| @@ -28,6 +30,12 @@
|
| #include "webrtc/video_send_stream.h"
|
|
|
| namespace webrtc {
|
| +
|
| +class BitrateAllocator;
|
| +class PacedSender;
|
| +class RtcpIntraFrameObserver;
|
| +class TransportFeedbackObserver;
|
| +
|
| std::string
|
| VideoSendStream::Config::EncoderSettings::ToString() const {
|
| std::stringstream ss;
|
| @@ -114,15 +122,44 @@ VideoSendStream::VideoSendStream(
|
| suspended_ssrcs_(suspended_ssrcs),
|
| module_process_thread_(module_process_thread),
|
| channel_group_(channel_group),
|
| - channel_id_(channel_id),
|
| use_config_bitrate_(true),
|
| stats_proxy_(Clock::GetRealTimeClock(), config) {
|
| RTC_DCHECK(!config_.rtp.ssrcs.empty());
|
| - RTC_CHECK(channel_group->CreateSendChannel(
|
| - channel_id_, &transport_adapter_, &stats_proxy_,
|
| - config.pre_encode_callback, num_cpu_cores, config_));
|
| - vie_channel_ = channel_group_->GetChannel(channel_id_);
|
| - vie_encoder_ = channel_group_->GetEncoder(channel_id_);
|
| +
|
| + // Set up Call-wide sequence numbers, if configured for this send stream.
|
| + TransportFeedbackObserver* transport_feedback_observer = nullptr;
|
| + for (const RtpExtension& extension : config.rtp.extensions) {
|
| + if (extension.name == RtpExtension::kTransportSequenceNumber) {
|
| + transport_feedback_observer =
|
| + channel_group_->GetTransportFeedbackObserver();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs;
|
| +
|
| + vie_encoder_.reset(new ViEEncoder(
|
| + channel_id, num_cpu_cores, module_process_thread_, &stats_proxy_,
|
| + config.pre_encode_callback, channel_group_->pacer(),
|
| + channel_group_->bitrate_allocator()));
|
| + RTC_CHECK(vie_encoder_->Init());
|
| +
|
| + vie_channel_.reset(new ViEChannel(
|
| + num_cpu_cores, config.send_transport, module_process_thread_,
|
| + channel_group_->GetRtcpIntraFrameObserver(),
|
| + channel_group_->GetBitrateController()->CreateRtcpBandwidthObserver(),
|
| + transport_feedback_observer,
|
| + channel_group_->GetRemoteBitrateEstimator(),
|
| + channel_group_->GetCallStats()->rtcp_rtt_stats(), channel_group_->pacer(),
|
| + channel_group_->packet_router(), ssrcs.size(), true));
|
| + RTC_CHECK(vie_channel_->Init() == 0);
|
| +
|
| + vie_encoder_->StartThreadsAndSetSharedMembers(
|
| + vie_channel_->send_payload_router(),
|
| + vie_channel_->vcm_protection_callback());
|
| +
|
| + std::vector<uint32_t> first_ssrc(1, ssrcs[0]);
|
| + vie_encoder_->SetSsrcs(first_ssrc);
|
|
|
| for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) {
|
| const std::string& extension = config_.rtp.extensions[i].name;
|
| @@ -144,7 +181,7 @@ VideoSendStream::VideoSendStream(
|
| }
|
|
|
| // TODO(pbos): Consider configuring REMB in Call.
|
| - channel_group_->SetChannelRembStatus(true, false, vie_channel_);
|
| + channel_group_->SetChannelRembStatus(true, false, vie_channel_.get());
|
|
|
| // Enable NACK, FEC or both.
|
| const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
|
| @@ -161,7 +198,7 @@ VideoSendStream::VideoSendStream(
|
| vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str());
|
|
|
| input_.reset(new internal::VideoCaptureInput(
|
| - module_process_thread_, vie_encoder_, config_.local_renderer,
|
| + module_process_thread_, vie_encoder_.get(), config_.local_renderer,
|
| &stats_proxy_, this, config_.encoding_time_observer));
|
|
|
| // 28 to match packet overhead in ModuleRtpRtcpImpl.
|
| @@ -186,6 +223,8 @@ VideoSendStream::VideoSendStream(
|
| if (config_.suspend_below_min_bitrate)
|
| vie_encoder_->SuspendBelowMinBitrate();
|
|
|
| + channel_group_->AddEncoder(ssrcs, vie_encoder_.get());
|
| +
|
| vie_channel_->RegisterSendChannelRtcpStatisticsCallback(&stats_proxy_);
|
| vie_channel_->RegisterSendChannelRtpStatisticsCallback(&stats_proxy_);
|
| vie_channel_->RegisterRtcpPacketTypeCounterObserver(&stats_proxy_);
|
| @@ -207,7 +246,17 @@ VideoSendStream::~VideoSendStream() {
|
| vie_encoder_->DeRegisterExternalEncoder(
|
| config_.encoder_settings.payload_type);
|
|
|
| - channel_group_->DeleteChannel(channel_id_);
|
| + channel_group_->GetCallStats()->DeregisterStatsObserver(
|
| + vie_channel_->GetStatsObserver());
|
| + channel_group_->SetChannelRembStatus(false, false, vie_channel_.get());
|
| +
|
| + // Remove the feedback, stop all encoding threads and processing. This must be
|
| + // done before deleting the channel.
|
| + channel_group_->RemoveEncoder(vie_encoder_.get());
|
| + vie_encoder_->StopThreadsAndRemoveSharedMembers();
|
| +
|
| + uint32_t remote_ssrc = vie_channel_->GetRemoteSSRC();
|
| + channel_group_->GetRemoteBitrateEstimator()->RemoveStream(remote_ssrc);
|
| }
|
|
|
| VideoCaptureInput* VideoSendStream::Input() {
|
|
|