Index: webrtc/video/video_receive_stream.cc |
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc |
index 670d92b2f20be29168506c3fe6c3ff8b2fd7c950..1753db5d48f60d3a4f487f7c266f0e790b313863 100644 |
--- a/webrtc/video/video_receive_stream.cc |
+++ b/webrtc/video/video_receive_stream.cc |
@@ -25,7 +25,6 @@ |
#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/video/call_stats.h" |
#include "webrtc/video/receive_statistics_proxy.h" |
-#include "webrtc/video/vie_remb.h" |
#include "webrtc/video_receive_stream.h" |
namespace webrtc { |
@@ -161,7 +160,6 @@ VideoReceiveStream::VideoReceiveStream( |
decode_thread_(DecodeThreadFunction, this, "DecodingThread"), |
congestion_controller_(congestion_controller), |
call_stats_(call_stats), |
- remb_(remb), |
video_receiver_(clock_, nullptr, this, this, this), |
incoming_video_stream_(config.disable_prerenderer_smoothing), |
stats_proxy_(config_, clock_), |
@@ -172,93 +170,28 @@ VideoReceiveStream::VideoReceiveStream( |
call_stats_->rtcp_rtt_stats(), |
congestion_controller_->pacer(), |
congestion_controller_->packet_router(), |
+ remb, |
config, |
- &stats_proxy_), |
+ &stats_proxy_, |
+ process_thread_), |
video_stream_decoder_(&video_receiver_, |
&rtp_stream_receiver_, |
&rtp_stream_receiver_, |
- config.rtp.nack.rtp_history_ms > 0, |
+ rtp_stream_receiver_.IsRetransmissionsEnabled(), |
+ rtp_stream_receiver_.IsFecEnabled(), |
&stats_proxy_, |
&incoming_video_stream_, |
this), |
- vie_sync_(&video_receiver_), |
- rtp_rtcp_(rtp_stream_receiver_.rtp_rtcp()) { |
+ vie_sync_(&video_receiver_) { |
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString(); |
RTC_DCHECK(process_thread_); |
RTC_DCHECK(congestion_controller_); |
RTC_DCHECK(call_stats_); |
- RTC_DCHECK(remb_); |
- RTC_DCHECK(config_.rtp.rtcp_mode != RtcpMode::kOff) |
- << "A stream should not be configured with RTCP disabled. This value is " |
- "reserved for internal usage."; |
// Register the channel to receive stats updates. |
call_stats_->RegisterStatsObserver(&video_stream_decoder_); |
- RTC_DCHECK(config_.rtp.remote_ssrc != 0); |
- // TODO(pbos): What's an appropriate local_ssrc for receive-only streams? |
- RTC_DCHECK(config_.rtp.local_ssrc != 0); |
- RTC_DCHECK(config_.rtp.remote_ssrc != config_.rtp.local_ssrc); |
- rtp_rtcp_->SetSSRC(config_.rtp.local_ssrc); |
- |
- // TODO(pbos): Support multiple RTX, per video payload. |
- for (const auto& kv : config_.rtp.rtx) { |
- RTC_DCHECK(kv.second.ssrc != 0); |
- RTC_DCHECK(kv.second.payload_type != 0); |
- |
- rtp_stream_receiver_.SetRtxSsrc(kv.second.ssrc); |
- rtp_stream_receiver_.SetRtxPayloadType(kv.second.payload_type, kv.first); |
- } |
- // TODO(holmer): When Chrome no longer depends on this being false by default, |
- // always use the mapping and remove this whole codepath. |
- rtp_stream_receiver_.SetUseRtxPayloadMappingOnRestore( |
- config_.rtp.use_rtx_payload_mapping_on_restore); |
- |
- if (config_.rtp.remb) { |
- rtp_rtcp_->SetREMBStatus(true); |
- remb_->AddReceiveChannel(rtp_rtcp_); |
- } |
- |
- for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { |
- const std::string& extension = config_.rtp.extensions[i].name; |
- int id = config_.rtp.extensions[i].id; |
- // One-byte-extension local identifiers are in the range 1-14 inclusive. |
- RTC_DCHECK_GE(id, 1); |
- RTC_DCHECK_LE(id, 14); |
- rtp_stream_receiver_.EnableReceiveRtpHeaderExtension(extension, id); |
- } |
- |
- if (config_.rtp.fec.ulpfec_payload_type != -1) { |
- // ULPFEC without RED doesn't make sense. |
- RTC_DCHECK(config_.rtp.fec.red_payload_type != -1); |
- VideoCodec codec; |
- memset(&codec, 0, sizeof(codec)); |
- codec.codecType = kVideoCodecULPFEC; |
- strncpy(codec.plName, "ulpfec", sizeof(codec.plName)); |
- codec.plType = config_.rtp.fec.ulpfec_payload_type; |
- RTC_CHECK(rtp_stream_receiver_.SetReceiveCodec(codec)); |
- } |
- if (config_.rtp.fec.red_payload_type != -1) { |
- VideoCodec codec; |
- memset(&codec, 0, sizeof(codec)); |
- codec.codecType = kVideoCodecRED; |
- strncpy(codec.plName, "red", sizeof(codec.plName)); |
- codec.plType = config_.rtp.fec.red_payload_type; |
- RTC_CHECK(rtp_stream_receiver_.SetReceiveCodec(codec)); |
- if (config_.rtp.fec.red_rtx_payload_type != -1) { |
- rtp_stream_receiver_.SetRtxPayloadType( |
- config_.rtp.fec.red_rtx_payload_type, |
- config_.rtp.fec.red_payload_type); |
- } |
- } |
- |
- if (config.rtp.rtcp_xr.receiver_reference_time_report) |
- rtp_rtcp_->SetRtcpXrRrtrStatus(true); |
- |
- // Stats callback for CNAME changes. |
- rtp_rtcp_->RegisterRtcpStatisticsCallback(&stats_proxy_); |
- |
RTC_DCHECK(!config_.decoders.empty()); |
std::set<int> decoder_payload_types; |
for (const Decoder& decoder : config_.decoders) { |
@@ -272,7 +205,6 @@ VideoReceiveStream::VideoReceiveStream( |
decoder.payload_type); |
VideoCodec codec = CreateDecoderVideoCodec(decoder); |
- |
RTC_CHECK(rtp_stream_receiver_.SetReceiveCodec(codec)); |
RTC_CHECK_EQ(VCM_OK, video_receiver_.RegisterReceiveCodec( |
&codec, num_cpu_cores, false)); |
@@ -282,8 +214,6 @@ VideoReceiveStream::VideoReceiveStream( |
incoming_video_stream_.SetExpectedRenderDelay(config.render_delay_ms); |
incoming_video_stream_.SetExternalCallback(this); |
- process_thread_->RegisterModule(rtp_stream_receiver_.GetReceiveStatistics()); |
- process_thread_->RegisterModule(rtp_stream_receiver_.rtp_rtcp()); |
process_thread_->RegisterModule(&video_receiver_); |
process_thread_->RegisterModule(&vie_sync_); |
} |
@@ -294,9 +224,6 @@ VideoReceiveStream::~VideoReceiveStream() { |
process_thread_->DeRegisterModule(&vie_sync_); |
process_thread_->DeRegisterModule(&video_receiver_); |
- process_thread_->DeRegisterModule(rtp_stream_receiver_.rtp_rtcp()); |
- process_thread_->DeRegisterModule( |
- rtp_stream_receiver_.GetReceiveStatistics()); |
// Deregister external decoders so they are no longer running during |
// destruction. This effectively stops the VCM since the decoder thread is |
@@ -306,16 +233,13 @@ VideoReceiveStream::~VideoReceiveStream() { |
video_receiver_.RegisterExternalDecoder(nullptr, decoder.payload_type); |
call_stats_->DeregisterStatsObserver(&video_stream_decoder_); |
- rtp_rtcp_->SetREMBStatus(false); |
- remb_->RemoveReceiveChannel(rtp_rtcp_); |
congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config_)) |
->RemoveStream(rtp_stream_receiver_.GetRemoteSsrc()); |
} |
void VideoReceiveStream::SignalNetworkState(NetworkState state) { |
- rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode |
- : RtcpMode::kOff); |
+ rtp_stream_receiver_.SignalNetworkState(state); |
} |
@@ -352,13 +276,14 @@ void VideoReceiveStream::SetSyncChannel(VoiceEngine* voice_engine, |
int audio_channel_id) { |
if (voice_engine && audio_channel_id != -1) { |
VoEVideoSync* voe_sync_interface = VoEVideoSync::GetInterface(voice_engine); |
- vie_sync_.ConfigureSync(audio_channel_id, voe_sync_interface, rtp_rtcp_, |
+ vie_sync_.ConfigureSync(audio_channel_id, voe_sync_interface, |
+ rtp_stream_receiver_.rtp_rtcp(), |
rtp_stream_receiver_.GetRtpReceiver()); |
voe_sync_interface->Release(); |
- return; |
+ } else { |
+ vie_sync_.ConfigureSync(-1, nullptr, rtp_stream_receiver_.rtp_rtcp(), |
+ rtp_stream_receiver_.GetRtpReceiver()); |
} |
- vie_sync_.ConfigureSync(-1, nullptr, rtp_rtcp_, |
- rtp_stream_receiver_.GetRtpReceiver()); |
} |
VideoReceiveStream::Stats VideoReceiveStream::GetStats() const { |
@@ -427,11 +352,11 @@ void VideoReceiveStream::Decode() { |
void VideoReceiveStream::SendNack( |
const std::vector<uint16_t>& sequence_numbers) { |
- rtp_rtcp_->SendNack(sequence_numbers); |
+ rtp_stream_receiver_.RequestPacketRetransmit(sequence_numbers); |
} |
void VideoReceiveStream::RequestKeyFrame() { |
- rtp_rtcp_->RequestKeyFrame(); |
+ rtp_stream_receiver_.RequestKeyFrame(); |
} |
} // namespace internal |