Index: webrtc/video/vie_channel.cc |
diff --git a/webrtc/video/vie_channel.cc b/webrtc/video/vie_channel.cc |
index 28cc1d4ad72f0f3e57eb60db0c723d22d66f12f3..8c67b50c9ed2b5a1d3ad100b07332bb9c7d9f76b 100644 |
--- a/webrtc/video/vie_channel.cc |
+++ b/webrtc/video/vie_channel.cc |
@@ -80,6 +80,8 @@ class ViEChannelProtectionCallback : public VCMProtectionCallback { |
ViEChannel::ViEChannel(uint32_t number_of_cores, |
Transport* transport, |
ProcessThread* module_process_thread, |
+ PayloadRouter* send_payload_router, |
+ VideoCodingModule* vcm, |
RtcpIntraFrameObserver* intra_frame_observer, |
RtcpBandwidthObserver* bandwidth_observer, |
TransportFeedbackObserver* transport_feedback_observer, |
@@ -92,11 +94,9 @@ ViEChannel::ViEChannel(uint32_t number_of_cores, |
: number_of_cores_(number_of_cores), |
sender_(sender), |
module_process_thread_(module_process_thread), |
- send_payload_router_(new PayloadRouter()), |
+ send_payload_router_(send_payload_router), |
vcm_protection_callback_(new ViEChannelProtectionCallback(this)), |
- vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(), |
- nullptr, |
- nullptr)), |
+ vcm_(vcm), |
vie_receiver_(vcm_, remote_bitrate_estimator, this), |
vie_sync_(vcm_), |
stats_observer_(new ChannelStatsObserver(this)), |
@@ -135,7 +135,14 @@ ViEChannel::ViEChannel(uint32_t number_of_cores, |
max_rtp_streams)), |
num_active_rtp_rtcp_modules_(1) { |
vie_receiver_.SetRtpRtcpModule(rtp_rtcp_modules_[0]); |
- vcm_->SetNackSettings(kMaxNackListSize, max_nack_reordering_threshold_, 0); |
+ if (sender_) { |
+ RTC_DCHECK(send_payload_router_); |
+ RTC_DCHECK(!vcm_); |
+ } else { |
+ RTC_DCHECK(!send_payload_router_); |
+ RTC_DCHECK(vcm_); |
+ vcm_->SetNackSettings(kMaxNackListSize, max_nack_reordering_threshold_, 0); |
+ } |
} |
int32_t ViEChannel::Init() { |
@@ -155,18 +162,16 @@ int32_t ViEChannel::Init() { |
std::list<RtpRtcp*> send_rtp_modules(1, rtp_rtcp_modules_[0]); |
send_payload_router_->SetSendingRtpModules(send_rtp_modules); |
RTC_DCHECK(!send_payload_router_->active()); |
+ } else { |
+ if (vcm_->RegisterReceiveCallback(this) != 0) { |
+ return -1; |
+ } |
+ vcm_->RegisterFrameTypeCallback(this); |
+ vcm_->RegisterReceiveStatisticsCallback(this); |
+ vcm_->RegisterDecoderTimingCallback(this); |
+ vcm_->SetRenderDelay(kDefaultRenderDelayMs); |
+ module_process_thread_->RegisterModule(&vie_sync_); |
} |
- if (vcm_->RegisterReceiveCallback(this) != 0) { |
- return -1; |
- } |
- vcm_->RegisterFrameTypeCallback(this); |
- vcm_->RegisterReceiveStatisticsCallback(this); |
- vcm_->RegisterDecoderTimingCallback(this); |
- vcm_->SetRenderDelay(kDefaultRenderDelayMs); |
- |
- module_process_thread_->RegisterModule(vcm_); |
- module_process_thread_->RegisterModule(&vie_sync_); |
- |
return 0; |
} |
@@ -175,9 +180,11 @@ ViEChannel::~ViEChannel() { |
// Make sure we don't get more callbacks from the RTP module. |
module_process_thread_->DeRegisterModule( |
vie_receiver_.GetReceiveStatistics()); |
- module_process_thread_->DeRegisterModule(vcm_); |
- module_process_thread_->DeRegisterModule(&vie_sync_); |
- send_payload_router_->SetSendingRtpModules(std::list<RtpRtcp*>()); |
+ if (sender_) { |
+ send_payload_router_->SetSendingRtpModules(std::list<RtpRtcp*>()); |
+ } else { |
+ module_process_thread_->DeRegisterModule(&vie_sync_); |
+ } |
for (size_t i = 0; i < num_active_rtp_rtcp_modules_; ++i) |
packet_router_->RemoveRtpModule(rtp_rtcp_modules_[i], sender_); |
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
@@ -186,8 +193,6 @@ ViEChannel::~ViEChannel() { |
} |
if (!sender_) |
StopDecodeThread(); |
- // Release modules. |
- VideoCodingModule::Destroy(vcm_); |
} |
void ViEChannel::UpdateHistograms() { |
@@ -441,15 +446,8 @@ int32_t ViEChannel::ReceiveCodecStatistics(uint32_t* num_key_frames, |
return 0; |
} |
-uint32_t ViEChannel::DiscardedPackets() const { |
- return vcm_->DiscardedPackets(); |
-} |
- |
-int ViEChannel::ReceiveDelay() const { |
- return vcm_->Delay(); |
-} |
- |
void ViEChannel::SetExpectedRenderDelay(int delay_ms) { |
+ RTC_DCHECK(!sender_); |
vcm_->SetRenderDelay(delay_ms); |
} |
@@ -483,7 +481,8 @@ void ViEChannel::SetProtectionMode(bool enable_nack, |
protection_method = kProtectionNone; |
} |
- vcm_->SetVideoProtection(protection_method, true); |
+ if (!sender_) |
+ vcm_->SetVideoProtection(protection_method, true); |
// Set NACK. |
ProcessNACKRequest(enable_nack); |
@@ -506,19 +505,21 @@ void ViEChannel::ProcessNACKRequest(const bool enable) { |
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_); |
- vcm_->RegisterPacketRequestCallback(this); |
- // Don't introduce errors when NACK is enabled. |
- vcm_->SetDecodeErrorMode(kNoErrors); |
+ if (!sender_) { |
+ vcm_->RegisterPacketRequestCallback(this); |
+ // Don't introduce errors when NACK is enabled. |
+ vcm_->SetDecodeErrorMode(kNoErrors); |
+ } |
} else { |
- vcm_->RegisterPacketRequestCallback(NULL); |
- if (paced_sender_ == nullptr) { |
+ if (!sender_) { |
+ vcm_->RegisterPacketRequestCallback(nullptr); |
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
rtp_rtcp->SetStorePacketsStatus(false, 0); |
+ // When NACK is off, allow decoding with errors. Otherwise, the video |
+ // will freeze, and will only recover with a complete key frame. |
+ vcm_->SetDecodeErrorMode(kWithErrors); |
} |
vie_receiver_.SetNackStatus(false, max_nack_reordering_threshold_); |
- // When NACK is off, allow decoding with errors. Otherwise, the video |
- // will freeze, and will only recover with a complete key frame. |
- vcm_->SetDecodeErrorMode(kWithErrors); |
} |
} |
@@ -880,15 +881,18 @@ int32_t ViEChannel::StartSend() { |
for (size_t i = 0; i < num_active_rtp_rtcp_modules_; ++i) { |
RtpRtcp* rtp_rtcp = rtp_rtcp_modules_[i]; |
- rtp_rtcp->SetSendingMediaStatus(true); |
+ // Only have senders send media. |
+ rtp_rtcp->SetSendingMediaStatus(sender_); |
rtp_rtcp->SetSendingStatus(true); |
} |
- send_payload_router_->set_active(true); |
+ if (sender_) |
+ send_payload_router_->set_active(true); |
return 0; |
} |
int32_t ViEChannel::StopSend() { |
- send_payload_router_->set_active(false); |
+ if (sender_) |
+ send_payload_router_->set_active(false); |
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
rtp_rtcp->SetSendingMediaStatus(false); |
@@ -940,10 +944,6 @@ RtpRtcp* ViEChannel::rtp_rtcp() { |
return rtp_rtcp_modules_[0]; |
} |
-rtc::scoped_refptr<PayloadRouter> ViEChannel::send_payload_router() { |
- return send_payload_router_; |
-} |
- |
VCMProtectionCallback* ViEChannel::vcm_protection_callback() { |
return vcm_protection_callback_.get(); |
} |
@@ -1038,12 +1038,14 @@ bool ViEChannel::ChannelDecodeThreadFunction(void* obj) { |
} |
bool ViEChannel::ChannelDecodeProcess() { |
+ RTC_DCHECK(!sender_); |
vcm_->Decode(kMaxDecodeWaitTimeMs); |
return true; |
} |
void ViEChannel::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
- vcm_->SetReceiveChannelParameters(max_rtt_ms); |
+ if (!sender_) |
+ vcm_->SetReceiveChannelParameters(max_rtt_ms); |
rtc::CritScope lock(&crit_); |
if (time_of_first_rtt_ms_ == -1) |
@@ -1137,6 +1139,7 @@ void ViEChannel::StartDecodeThread() { |
} |
void ViEChannel::StopDecodeThread() { |
+ RTC_DCHECK(!sender_); |
vcm_->TriggerDecoderShutdown(); |
decode_thread_.Stop(); |
@@ -1144,12 +1147,14 @@ void ViEChannel::StopDecodeThread() { |
int32_t ViEChannel::SetVoiceChannel(int32_t ve_channel_id, |
VoEVideoSync* ve_sync_interface) { |
+ RTC_DCHECK(!sender_); |
return vie_sync_.ConfigureSync(ve_channel_id, ve_sync_interface, |
rtp_rtcp_modules_[0], |
vie_receiver_.GetRtpReceiver()); |
} |
int32_t ViEChannel::VoiceChannel() { |
+ RTC_DCHECK(!sender_); |
return vie_sync_.VoiceChannel(); |
} |
@@ -1161,6 +1166,7 @@ void ViEChannel::RegisterPreRenderCallback( |
void ViEChannel::RegisterPreDecodeImageCallback( |
EncodedImageCallback* pre_decode_callback) { |
+ RTC_DCHECK(!sender_); |
vcm_->RegisterPreDecodeImageCallback(pre_decode_callback); |
} |