Index: webrtc/video/video_send_stream.cc |
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc |
index 254805ff238cc8cdeadb28b6b18d96cdf966f62f..c7280ed40fa74018eef9018a65917fc7a40c3663 100644 |
--- a/webrtc/video/video_send_stream.cc |
+++ b/webrtc/video/video_send_stream.cc |
@@ -25,7 +25,6 @@ |
#include "webrtc/modules/utility/include/process_thread.h" |
#include "webrtc/video/call_stats.h" |
#include "webrtc/video/encoder_state_feedback.h" |
-#include "webrtc/video/payload_router.h" |
#include "webrtc/video/video_capture_input.h" |
#include "webrtc/video/vie_channel.h" |
#include "webrtc/video/vie_encoder.h" |
@@ -163,28 +162,27 @@ VideoSendStream::VideoSendStream( |
const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs; |
- vie_encoder_.reset( |
- new ViEEncoder(num_cpu_cores, module_process_thread_, &stats_proxy_, |
- config.pre_encode_callback, &overuse_detector_, |
- congestion_controller_->pacer(), bitrate_allocator)); |
+ vie_encoder_.reset(new ViEEncoder( |
+ num_cpu_cores, module_process_thread_, &stats_proxy_, |
+ config.pre_encode_callback, &overuse_detector_, |
+ congestion_controller_->pacer(), &payload_router_, bitrate_allocator)); |
+ vcm_ = vie_encoder_->vcm(); |
RTC_CHECK(vie_encoder_->Init()); |
vie_channel_.reset(new ViEChannel( |
num_cpu_cores, config.send_transport, module_process_thread_, |
- encoder_feedback_->GetRtcpIntraFrameObserver(), |
- congestion_controller_->GetBitrateController()-> |
- CreateRtcpBandwidthObserver(), |
+ &payload_router_, nullptr, encoder_feedback_->GetRtcpIntraFrameObserver(), |
+ congestion_controller_->GetBitrateController() |
+ ->CreateRtcpBandwidthObserver(), |
transport_feedback_observer, |
congestion_controller_->GetRemoteBitrateEstimator(false), |
call_stats_->rtcp_rtt_stats(), congestion_controller_->pacer(), |
congestion_controller_->packet_router(), ssrcs.size(), true)); |
RTC_CHECK(vie_channel_->Init() == 0); |
- call_stats_->RegisterStatsObserver(vie_channel_->GetStatsObserver()); |
+ vcm_->RegisterProtectionCallback(vie_channel_->vcm_protection_callback()); |
- vie_encoder_->StartThreadsAndSetSharedMembers( |
- vie_channel_->send_payload_router(), |
- vie_channel_->vcm_protection_callback()); |
+ call_stats_->RegisterStatsObserver(vie_channel_->GetStatsObserver()); |
std::vector<uint32_t> first_ssrc(1, ssrcs[0]); |
vie_encoder_->SetSsrcs(first_ssrc); |
@@ -266,6 +264,10 @@ VideoSendStream::VideoSendStream( |
VideoSendStream::~VideoSendStream() { |
LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString(); |
module_process_thread_->DeRegisterModule(&overuse_detector_); |
+ // Remove vcm_protection_callback (part of vie_channel_) before destroying |
+ // ViEChannel. vcm_ is owned by ViEEncoder and the registered callback does |
+ // not outlive it. |
+ vcm_->RegisterProtectionCallback(nullptr); |
vie_channel_->RegisterSendFrameCountObserver(nullptr); |
vie_channel_->RegisterSendBitrateObserver(nullptr); |
vie_channel_->RegisterRtcpPacketTypeCounterObserver(nullptr); |
@@ -287,7 +289,6 @@ VideoSendStream::~VideoSendStream() { |
// done before deleting the channel. |
congestion_controller_->RemoveEncoder(vie_encoder_.get()); |
encoder_feedback_->RemoveEncoder(vie_encoder_.get()); |
- vie_encoder_->StopThreadsAndRemoveSharedMembers(); |
uint32_t remote_ssrc = vie_channel_->GetRemoteSSRC(); |
congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream( |