Untangle ViEChannel and ViEEncoder.
Extracts shared members outside the two objects, removing PayloadRouter from receivers and the VCM for ViEChannel from senders. Removes Start/StopThreadsAndSetSharedMembers that was used to set the shared state between them. Also adding DCHECKs to document what's only used by the sender/receiver side. BUG=webrtc:5494 R=stefan@webrtc.org Review URL: https://codereview.webrtc.org/1654913002 . Cr-Commit-Position: refs/heads/master@{#11500}
This commit is contained in:
@ -75,8 +75,6 @@ class VideoCodingModule : public Module {
|
|||||||
|
|
||||||
static VideoCodingModule* Create(Clock* clock, EventFactory* event_factory);
|
static VideoCodingModule* Create(Clock* clock, EventFactory* event_factory);
|
||||||
|
|
||||||
static void Destroy(VideoCodingModule* module);
|
|
||||||
|
|
||||||
// Get supported codec settings using codec type
|
// Get supported codec settings using codec type
|
||||||
//
|
//
|
||||||
// Input:
|
// Input:
|
||||||
|
@ -310,9 +310,4 @@ VideoCodingModule* VideoCodingModule::Create(Clock* clock,
|
|||||||
nullptr);
|
nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoCodingModule::Destroy(VideoCodingModule* module) {
|
|
||||||
if (module != NULL) {
|
|
||||||
delete static_cast<VideoCodingModuleImpl*>(module);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
@ -35,7 +35,7 @@ class VCMRobustnessTest : public ::testing::Test {
|
|||||||
virtual void SetUp() {
|
virtual void SetUp() {
|
||||||
clock_.reset(new SimulatedClock(0));
|
clock_.reset(new SimulatedClock(0));
|
||||||
ASSERT_TRUE(clock_.get() != NULL);
|
ASSERT_TRUE(clock_.get() != NULL);
|
||||||
vcm_ = VideoCodingModule::Create(clock_.get(), &event_factory_);
|
vcm_.reset(VideoCodingModule::Create(clock_.get(), &event_factory_));
|
||||||
ASSERT_TRUE(vcm_ != NULL);
|
ASSERT_TRUE(vcm_ != NULL);
|
||||||
const size_t kMaxNackListSize = 250;
|
const size_t kMaxNackListSize = 250;
|
||||||
const int kMaxPacketAgeToNack = 450;
|
const int kMaxPacketAgeToNack = 450;
|
||||||
@ -47,7 +47,7 @@ class VCMRobustnessTest : public ::testing::Test {
|
|||||||
vcm_->RegisterExternalDecoder(&decoder_, video_codec_.plType);
|
vcm_->RegisterExternalDecoder(&decoder_, video_codec_.plType);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void TearDown() { VideoCodingModule::Destroy(vcm_); }
|
virtual void TearDown() { vcm_.reset(); }
|
||||||
|
|
||||||
void InsertPacket(uint32_t timestamp,
|
void InsertPacket(uint32_t timestamp,
|
||||||
uint16_t seq_no,
|
uint16_t seq_no,
|
||||||
@ -69,7 +69,7 @@ class VCMRobustnessTest : public ::testing::Test {
|
|||||||
ASSERT_EQ(VCM_OK, vcm_->IncomingPacket(payload, kPayloadLen, rtp_info));
|
ASSERT_EQ(VCM_OK, vcm_->IncomingPacket(payload, kPayloadLen, rtp_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoCodingModule* vcm_;
|
rtc::scoped_ptr<VideoCodingModule> vcm_;
|
||||||
VideoCodec video_codec_;
|
VideoCodec video_codec_;
|
||||||
MockVCMFrameTypeCallback frame_type_callback_;
|
MockVCMFrameTypeCallback frame_type_callback_;
|
||||||
MockPacketRequestCallback request_callback_;
|
MockPacketRequestCallback request_callback_;
|
||||||
|
@ -37,6 +37,7 @@ class MockVieEncoder : public ViEEncoder {
|
|||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
pacer,
|
pacer,
|
||||||
|
nullptr,
|
||||||
nullptr) {}
|
nullptr) {}
|
||||||
~MockVieEncoder() {}
|
~MockVieEncoder() {}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "webrtc/base/logging.h"
|
#include "webrtc/base/logging.h"
|
||||||
#include "webrtc/call/congestion_controller.h"
|
#include "webrtc/call/congestion_controller.h"
|
||||||
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
||||||
|
#include "webrtc/modules/utility/include/process_thread.h"
|
||||||
#include "webrtc/system_wrappers/include/clock.h"
|
#include "webrtc/system_wrappers/include/clock.h"
|
||||||
#include "webrtc/video/call_stats.h"
|
#include "webrtc/video/call_stats.h"
|
||||||
#include "webrtc/video/receive_statistics_proxy.h"
|
#include "webrtc/video/receive_statistics_proxy.h"
|
||||||
@ -148,9 +149,11 @@ VideoReceiveStream::VideoReceiveStream(
|
|||||||
: transport_adapter_(config.rtcp_send_transport),
|
: transport_adapter_(config.rtcp_send_transport),
|
||||||
encoded_frame_proxy_(config.pre_decode_callback),
|
encoded_frame_proxy_(config.pre_decode_callback),
|
||||||
config_(config),
|
config_(config),
|
||||||
|
process_thread_(process_thread),
|
||||||
clock_(Clock::GetRealTimeClock()),
|
clock_(Clock::GetRealTimeClock()),
|
||||||
congestion_controller_(congestion_controller),
|
congestion_controller_(congestion_controller),
|
||||||
call_stats_(call_stats) {
|
call_stats_(call_stats),
|
||||||
|
vcm_(VideoCodingModule::Create(clock_, nullptr, nullptr)) {
|
||||||
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString();
|
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString();
|
||||||
|
|
||||||
bool send_side_bwe =
|
bool send_side_bwe =
|
||||||
@ -160,10 +163,10 @@ VideoReceiveStream::VideoReceiveStream(
|
|||||||
congestion_controller_->GetRemoteBitrateEstimator(send_side_bwe);
|
congestion_controller_->GetRemoteBitrateEstimator(send_side_bwe);
|
||||||
|
|
||||||
vie_channel_.reset(new ViEChannel(
|
vie_channel_.reset(new ViEChannel(
|
||||||
num_cpu_cores, &transport_adapter_, process_thread, nullptr,
|
num_cpu_cores, &transport_adapter_, process_thread, nullptr, vcm_.get(),
|
||||||
nullptr, nullptr, bitrate_estimator, call_stats_->rtcp_rtt_stats(),
|
nullptr, nullptr, nullptr, bitrate_estimator,
|
||||||
congestion_controller_->pacer(), congestion_controller_->packet_router(),
|
call_stats_->rtcp_rtt_stats(), congestion_controller_->pacer(),
|
||||||
1, false));
|
congestion_controller_->packet_router(), 1, false));
|
||||||
|
|
||||||
RTC_CHECK(vie_channel_->Init() == 0);
|
RTC_CHECK(vie_channel_->Init() == 0);
|
||||||
|
|
||||||
@ -284,11 +287,14 @@ VideoReceiveStream::VideoReceiveStream(
|
|||||||
|
|
||||||
vie_channel_->RegisterPreDecodeImageCallback(this);
|
vie_channel_->RegisterPreDecodeImageCallback(this);
|
||||||
vie_channel_->RegisterPreRenderCallback(this);
|
vie_channel_->RegisterPreRenderCallback(this);
|
||||||
|
|
||||||
|
process_thread_->RegisterModule(vcm_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoReceiveStream::~VideoReceiveStream() {
|
VideoReceiveStream::~VideoReceiveStream() {
|
||||||
LOG(LS_INFO) << "~VideoReceiveStream: " << config_.ToString();
|
LOG(LS_INFO) << "~VideoReceiveStream: " << config_.ToString();
|
||||||
incoming_video_stream_->Stop();
|
incoming_video_stream_->Stop();
|
||||||
|
process_thread_->DeRegisterModule(vcm_.get());
|
||||||
vie_channel_->RegisterPreRenderCallback(nullptr);
|
vie_channel_->RegisterPreRenderCallback(nullptr);
|
||||||
vie_channel_->RegisterPreDecodeImageCallback(nullptr);
|
vie_channel_->RegisterPreDecodeImageCallback(nullptr);
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "webrtc/modules/video_render/video_render_defines.h"
|
#include "webrtc/modules/video_render/video_render_defines.h"
|
||||||
#include "webrtc/system_wrappers/include/clock.h"
|
#include "webrtc/system_wrappers/include/clock.h"
|
||||||
#include "webrtc/video/encoded_frame_callback_adapter.h"
|
#include "webrtc/video/encoded_frame_callback_adapter.h"
|
||||||
|
#include "webrtc/video/payload_router.h"
|
||||||
#include "webrtc/video/receive_statistics_proxy.h"
|
#include "webrtc/video/receive_statistics_proxy.h"
|
||||||
#include "webrtc/video/vie_channel.h"
|
#include "webrtc/video/vie_channel.h"
|
||||||
#include "webrtc/video/vie_encoder.h"
|
#include "webrtc/video/vie_encoder.h"
|
||||||
@ -80,11 +81,13 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream,
|
|||||||
TransportAdapter transport_adapter_;
|
TransportAdapter transport_adapter_;
|
||||||
EncodedFrameCallbackAdapter encoded_frame_proxy_;
|
EncodedFrameCallbackAdapter encoded_frame_proxy_;
|
||||||
const VideoReceiveStream::Config config_;
|
const VideoReceiveStream::Config config_;
|
||||||
|
ProcessThread* const process_thread_;
|
||||||
Clock* const clock_;
|
Clock* const clock_;
|
||||||
|
|
||||||
CongestionController* const congestion_controller_;
|
CongestionController* const congestion_controller_;
|
||||||
CallStats* const call_stats_;
|
CallStats* const call_stats_;
|
||||||
|
|
||||||
|
rtc::scoped_ptr<VideoCodingModule> vcm_;
|
||||||
rtc::scoped_ptr<IncomingVideoStream> incoming_video_stream_;
|
rtc::scoped_ptr<IncomingVideoStream> incoming_video_stream_;
|
||||||
rtc::scoped_ptr<ReceiveStatisticsProxy> stats_proxy_;
|
rtc::scoped_ptr<ReceiveStatisticsProxy> stats_proxy_;
|
||||||
rtc::scoped_ptr<ViEChannel> vie_channel_;
|
rtc::scoped_ptr<ViEChannel> vie_channel_;
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include "webrtc/modules/utility/include/process_thread.h"
|
#include "webrtc/modules/utility/include/process_thread.h"
|
||||||
#include "webrtc/video/call_stats.h"
|
#include "webrtc/video/call_stats.h"
|
||||||
#include "webrtc/video/encoder_state_feedback.h"
|
#include "webrtc/video/encoder_state_feedback.h"
|
||||||
#include "webrtc/video/payload_router.h"
|
|
||||||
#include "webrtc/video/video_capture_input.h"
|
#include "webrtc/video/video_capture_input.h"
|
||||||
#include "webrtc/video/vie_channel.h"
|
#include "webrtc/video/vie_channel.h"
|
||||||
#include "webrtc/video/vie_encoder.h"
|
#include "webrtc/video/vie_encoder.h"
|
||||||
@ -163,28 +162,27 @@ VideoSendStream::VideoSendStream(
|
|||||||
|
|
||||||
const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs;
|
const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs;
|
||||||
|
|
||||||
vie_encoder_.reset(
|
vie_encoder_.reset(new ViEEncoder(
|
||||||
new ViEEncoder(num_cpu_cores, module_process_thread_, &stats_proxy_,
|
num_cpu_cores, module_process_thread_, &stats_proxy_,
|
||||||
config.pre_encode_callback, &overuse_detector_,
|
config.pre_encode_callback, &overuse_detector_,
|
||||||
congestion_controller_->pacer(), bitrate_allocator));
|
congestion_controller_->pacer(), &payload_router_, bitrate_allocator));
|
||||||
|
vcm_ = vie_encoder_->vcm();
|
||||||
RTC_CHECK(vie_encoder_->Init());
|
RTC_CHECK(vie_encoder_->Init());
|
||||||
|
|
||||||
vie_channel_.reset(new ViEChannel(
|
vie_channel_.reset(new ViEChannel(
|
||||||
num_cpu_cores, config.send_transport, module_process_thread_,
|
num_cpu_cores, config.send_transport, module_process_thread_,
|
||||||
encoder_feedback_->GetRtcpIntraFrameObserver(),
|
&payload_router_, nullptr, encoder_feedback_->GetRtcpIntraFrameObserver(),
|
||||||
congestion_controller_->GetBitrateController()->
|
congestion_controller_->GetBitrateController()
|
||||||
CreateRtcpBandwidthObserver(),
|
->CreateRtcpBandwidthObserver(),
|
||||||
transport_feedback_observer,
|
transport_feedback_observer,
|
||||||
congestion_controller_->GetRemoteBitrateEstimator(false),
|
congestion_controller_->GetRemoteBitrateEstimator(false),
|
||||||
call_stats_->rtcp_rtt_stats(), congestion_controller_->pacer(),
|
call_stats_->rtcp_rtt_stats(), congestion_controller_->pacer(),
|
||||||
congestion_controller_->packet_router(), ssrcs.size(), true));
|
congestion_controller_->packet_router(), ssrcs.size(), true));
|
||||||
RTC_CHECK(vie_channel_->Init() == 0);
|
RTC_CHECK(vie_channel_->Init() == 0);
|
||||||
|
|
||||||
call_stats_->RegisterStatsObserver(vie_channel_->GetStatsObserver());
|
vcm_->RegisterProtectionCallback(vie_channel_->vcm_protection_callback());
|
||||||
|
|
||||||
vie_encoder_->StartThreadsAndSetSharedMembers(
|
call_stats_->RegisterStatsObserver(vie_channel_->GetStatsObserver());
|
||||||
vie_channel_->send_payload_router(),
|
|
||||||
vie_channel_->vcm_protection_callback());
|
|
||||||
|
|
||||||
std::vector<uint32_t> first_ssrc(1, ssrcs[0]);
|
std::vector<uint32_t> first_ssrc(1, ssrcs[0]);
|
||||||
vie_encoder_->SetSsrcs(first_ssrc);
|
vie_encoder_->SetSsrcs(first_ssrc);
|
||||||
@ -266,6 +264,10 @@ VideoSendStream::VideoSendStream(
|
|||||||
VideoSendStream::~VideoSendStream() {
|
VideoSendStream::~VideoSendStream() {
|
||||||
LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString();
|
LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString();
|
||||||
module_process_thread_->DeRegisterModule(&overuse_detector_);
|
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_->RegisterSendFrameCountObserver(nullptr);
|
||||||
vie_channel_->RegisterSendBitrateObserver(nullptr);
|
vie_channel_->RegisterSendBitrateObserver(nullptr);
|
||||||
vie_channel_->RegisterRtcpPacketTypeCounterObserver(nullptr);
|
vie_channel_->RegisterRtcpPacketTypeCounterObserver(nullptr);
|
||||||
@ -287,7 +289,6 @@ VideoSendStream::~VideoSendStream() {
|
|||||||
// done before deleting the channel.
|
// done before deleting the channel.
|
||||||
congestion_controller_->RemoveEncoder(vie_encoder_.get());
|
congestion_controller_->RemoveEncoder(vie_encoder_.get());
|
||||||
encoder_feedback_->RemoveEncoder(vie_encoder_.get());
|
encoder_feedback_->RemoveEncoder(vie_encoder_.get());
|
||||||
vie_encoder_->StopThreadsAndRemoveSharedMembers();
|
|
||||||
|
|
||||||
uint32_t remote_ssrc = vie_channel_->GetRemoteSSRC();
|
uint32_t remote_ssrc = vie_channel_->GetRemoteSSRC();
|
||||||
congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream(
|
congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream(
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
||||||
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
||||||
#include "webrtc/video/encoded_frame_callback_adapter.h"
|
#include "webrtc/video/encoded_frame_callback_adapter.h"
|
||||||
|
#include "webrtc/video/payload_router.h"
|
||||||
#include "webrtc/video/send_statistics_proxy.h"
|
#include "webrtc/video/send_statistics_proxy.h"
|
||||||
#include "webrtc/video/video_capture_input.h"
|
#include "webrtc/video/video_capture_input.h"
|
||||||
#include "webrtc/video_receive_stream.h"
|
#include "webrtc/video_receive_stream.h"
|
||||||
@ -88,8 +89,12 @@ class VideoSendStream : public webrtc::VideoSendStream,
|
|||||||
|
|
||||||
OveruseFrameDetector overuse_detector_;
|
OveruseFrameDetector overuse_detector_;
|
||||||
rtc::scoped_ptr<VideoCaptureInput> input_;
|
rtc::scoped_ptr<VideoCaptureInput> input_;
|
||||||
rtc::scoped_ptr<ViEChannel> vie_channel_;
|
PayloadRouter payload_router_;
|
||||||
rtc::scoped_ptr<ViEEncoder> vie_encoder_;
|
rtc::scoped_ptr<ViEEncoder> vie_encoder_;
|
||||||
|
rtc::scoped_ptr<ViEChannel> vie_channel_;
|
||||||
|
// TODO(pbos): Make proper const.
|
||||||
|
// const after construction.
|
||||||
|
VideoCodingModule* vcm_;
|
||||||
rtc::scoped_ptr<EncoderStateFeedback> encoder_feedback_;
|
rtc::scoped_ptr<EncoderStateFeedback> encoder_feedback_;
|
||||||
|
|
||||||
// Used as a workaround to indicate that we should be using the configured
|
// Used as a workaround to indicate that we should be using the configured
|
||||||
|
@ -80,6 +80,8 @@ class ViEChannelProtectionCallback : public VCMProtectionCallback {
|
|||||||
ViEChannel::ViEChannel(uint32_t number_of_cores,
|
ViEChannel::ViEChannel(uint32_t number_of_cores,
|
||||||
Transport* transport,
|
Transport* transport,
|
||||||
ProcessThread* module_process_thread,
|
ProcessThread* module_process_thread,
|
||||||
|
PayloadRouter* send_payload_router,
|
||||||
|
VideoCodingModule* vcm,
|
||||||
RtcpIntraFrameObserver* intra_frame_observer,
|
RtcpIntraFrameObserver* intra_frame_observer,
|
||||||
RtcpBandwidthObserver* bandwidth_observer,
|
RtcpBandwidthObserver* bandwidth_observer,
|
||||||
TransportFeedbackObserver* transport_feedback_observer,
|
TransportFeedbackObserver* transport_feedback_observer,
|
||||||
@ -92,11 +94,9 @@ ViEChannel::ViEChannel(uint32_t number_of_cores,
|
|||||||
: number_of_cores_(number_of_cores),
|
: number_of_cores_(number_of_cores),
|
||||||
sender_(sender),
|
sender_(sender),
|
||||||
module_process_thread_(module_process_thread),
|
module_process_thread_(module_process_thread),
|
||||||
send_payload_router_(new PayloadRouter()),
|
send_payload_router_(send_payload_router),
|
||||||
vcm_protection_callback_(new ViEChannelProtectionCallback(this)),
|
vcm_protection_callback_(new ViEChannelProtectionCallback(this)),
|
||||||
vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(),
|
vcm_(vcm),
|
||||||
nullptr,
|
|
||||||
nullptr)),
|
|
||||||
vie_receiver_(vcm_, remote_bitrate_estimator, this),
|
vie_receiver_(vcm_, remote_bitrate_estimator, this),
|
||||||
vie_sync_(vcm_),
|
vie_sync_(vcm_),
|
||||||
stats_observer_(new ChannelStatsObserver(this)),
|
stats_observer_(new ChannelStatsObserver(this)),
|
||||||
@ -135,7 +135,14 @@ ViEChannel::ViEChannel(uint32_t number_of_cores,
|
|||||||
max_rtp_streams)),
|
max_rtp_streams)),
|
||||||
num_active_rtp_rtcp_modules_(1) {
|
num_active_rtp_rtcp_modules_(1) {
|
||||||
vie_receiver_.SetRtpRtcpModule(rtp_rtcp_modules_[0]);
|
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() {
|
int32_t ViEChannel::Init() {
|
||||||
@ -155,18 +162,16 @@ int32_t ViEChannel::Init() {
|
|||||||
std::list<RtpRtcp*> send_rtp_modules(1, rtp_rtcp_modules_[0]);
|
std::list<RtpRtcp*> send_rtp_modules(1, rtp_rtcp_modules_[0]);
|
||||||
send_payload_router_->SetSendingRtpModules(send_rtp_modules);
|
send_payload_router_->SetSendingRtpModules(send_rtp_modules);
|
||||||
RTC_DCHECK(!send_payload_router_->active());
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,9 +180,11 @@ ViEChannel::~ViEChannel() {
|
|||||||
// Make sure we don't get more callbacks from the RTP module.
|
// Make sure we don't get more callbacks from the RTP module.
|
||||||
module_process_thread_->DeRegisterModule(
|
module_process_thread_->DeRegisterModule(
|
||||||
vie_receiver_.GetReceiveStatistics());
|
vie_receiver_.GetReceiveStatistics());
|
||||||
module_process_thread_->DeRegisterModule(vcm_);
|
if (sender_) {
|
||||||
module_process_thread_->DeRegisterModule(&vie_sync_);
|
send_payload_router_->SetSendingRtpModules(std::list<RtpRtcp*>());
|
||||||
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)
|
for (size_t i = 0; i < num_active_rtp_rtcp_modules_; ++i)
|
||||||
packet_router_->RemoveRtpModule(rtp_rtcp_modules_[i], sender_);
|
packet_router_->RemoveRtpModule(rtp_rtcp_modules_[i], sender_);
|
||||||
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
|
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
|
||||||
@ -186,8 +193,6 @@ ViEChannel::~ViEChannel() {
|
|||||||
}
|
}
|
||||||
if (!sender_)
|
if (!sender_)
|
||||||
StopDecodeThread();
|
StopDecodeThread();
|
||||||
// Release modules.
|
|
||||||
VideoCodingModule::Destroy(vcm_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViEChannel::UpdateHistograms() {
|
void ViEChannel::UpdateHistograms() {
|
||||||
@ -441,15 +446,8 @@ int32_t ViEChannel::ReceiveCodecStatistics(uint32_t* num_key_frames,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ViEChannel::DiscardedPackets() const {
|
|
||||||
return vcm_->DiscardedPackets();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ViEChannel::ReceiveDelay() const {
|
|
||||||
return vcm_->Delay();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViEChannel::SetExpectedRenderDelay(int delay_ms) {
|
void ViEChannel::SetExpectedRenderDelay(int delay_ms) {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
vcm_->SetRenderDelay(delay_ms);
|
vcm_->SetRenderDelay(delay_ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -483,7 +481,8 @@ void ViEChannel::SetProtectionMode(bool enable_nack,
|
|||||||
protection_method = kProtectionNone;
|
protection_method = kProtectionNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
vcm_->SetVideoProtection(protection_method, true);
|
if (!sender_)
|
||||||
|
vcm_->SetVideoProtection(protection_method, true);
|
||||||
|
|
||||||
// Set NACK.
|
// Set NACK.
|
||||||
ProcessNACKRequest(enable_nack);
|
ProcessNACKRequest(enable_nack);
|
||||||
@ -506,19 +505,21 @@ void ViEChannel::ProcessNACKRequest(const bool enable) {
|
|||||||
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
||||||
rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_);
|
rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_);
|
||||||
|
|
||||||
vcm_->RegisterPacketRequestCallback(this);
|
if (!sender_) {
|
||||||
// Don't introduce errors when NACK is enabled.
|
vcm_->RegisterPacketRequestCallback(this);
|
||||||
vcm_->SetDecodeErrorMode(kNoErrors);
|
// Don't introduce errors when NACK is enabled.
|
||||||
|
vcm_->SetDecodeErrorMode(kNoErrors);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
vcm_->RegisterPacketRequestCallback(NULL);
|
if (!sender_) {
|
||||||
if (paced_sender_ == nullptr) {
|
vcm_->RegisterPacketRequestCallback(nullptr);
|
||||||
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
||||||
rtp_rtcp->SetStorePacketsStatus(false, 0);
|
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_);
|
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) {
|
for (size_t i = 0; i < num_active_rtp_rtcp_modules_; ++i) {
|
||||||
RtpRtcp* rtp_rtcp = 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);
|
rtp_rtcp->SetSendingStatus(true);
|
||||||
}
|
}
|
||||||
send_payload_router_->set_active(true);
|
if (sender_)
|
||||||
|
send_payload_router_->set_active(true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ViEChannel::StopSend() {
|
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_)
|
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
|
||||||
rtp_rtcp->SetSendingMediaStatus(false);
|
rtp_rtcp->SetSendingMediaStatus(false);
|
||||||
|
|
||||||
@ -940,10 +944,6 @@ RtpRtcp* ViEChannel::rtp_rtcp() {
|
|||||||
return rtp_rtcp_modules_[0];
|
return rtp_rtcp_modules_[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc::scoped_refptr<PayloadRouter> ViEChannel::send_payload_router() {
|
|
||||||
return send_payload_router_;
|
|
||||||
}
|
|
||||||
|
|
||||||
VCMProtectionCallback* ViEChannel::vcm_protection_callback() {
|
VCMProtectionCallback* ViEChannel::vcm_protection_callback() {
|
||||||
return vcm_protection_callback_.get();
|
return vcm_protection_callback_.get();
|
||||||
}
|
}
|
||||||
@ -1038,12 +1038,14 @@ bool ViEChannel::ChannelDecodeThreadFunction(void* obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ViEChannel::ChannelDecodeProcess() {
|
bool ViEChannel::ChannelDecodeProcess() {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
vcm_->Decode(kMaxDecodeWaitTimeMs);
|
vcm_->Decode(kMaxDecodeWaitTimeMs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViEChannel::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
|
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_);
|
rtc::CritScope lock(&crit_);
|
||||||
if (time_of_first_rtt_ms_ == -1)
|
if (time_of_first_rtt_ms_ == -1)
|
||||||
@ -1137,6 +1139,7 @@ void ViEChannel::StartDecodeThread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViEChannel::StopDecodeThread() {
|
void ViEChannel::StopDecodeThread() {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
vcm_->TriggerDecoderShutdown();
|
vcm_->TriggerDecoderShutdown();
|
||||||
|
|
||||||
decode_thread_.Stop();
|
decode_thread_.Stop();
|
||||||
@ -1144,12 +1147,14 @@ void ViEChannel::StopDecodeThread() {
|
|||||||
|
|
||||||
int32_t ViEChannel::SetVoiceChannel(int32_t ve_channel_id,
|
int32_t ViEChannel::SetVoiceChannel(int32_t ve_channel_id,
|
||||||
VoEVideoSync* ve_sync_interface) {
|
VoEVideoSync* ve_sync_interface) {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
return vie_sync_.ConfigureSync(ve_channel_id, ve_sync_interface,
|
return vie_sync_.ConfigureSync(ve_channel_id, ve_sync_interface,
|
||||||
rtp_rtcp_modules_[0],
|
rtp_rtcp_modules_[0],
|
||||||
vie_receiver_.GetRtpReceiver());
|
vie_receiver_.GetRtpReceiver());
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ViEChannel::VoiceChannel() {
|
int32_t ViEChannel::VoiceChannel() {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
return vie_sync_.VoiceChannel();
|
return vie_sync_.VoiceChannel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1161,6 +1166,7 @@ void ViEChannel::RegisterPreRenderCallback(
|
|||||||
|
|
||||||
void ViEChannel::RegisterPreDecodeImageCallback(
|
void ViEChannel::RegisterPreDecodeImageCallback(
|
||||||
EncodedImageCallback* pre_decode_callback) {
|
EncodedImageCallback* pre_decode_callback) {
|
||||||
|
RTC_DCHECK(!sender_);
|
||||||
vcm_->RegisterPreDecodeImageCallback(pre_decode_callback);
|
vcm_->RegisterPreDecodeImageCallback(pre_decode_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +68,8 @@ class ViEChannel : public VCMFrameTypeCallback,
|
|||||||
ViEChannel(uint32_t number_of_cores,
|
ViEChannel(uint32_t number_of_cores,
|
||||||
Transport* transport,
|
Transport* transport,
|
||||||
ProcessThread* module_process_thread,
|
ProcessThread* module_process_thread,
|
||||||
|
PayloadRouter* send_payload_router,
|
||||||
|
VideoCodingModule* vcm,
|
||||||
RtcpIntraFrameObserver* intra_frame_observer,
|
RtcpIntraFrameObserver* intra_frame_observer,
|
||||||
RtcpBandwidthObserver* bandwidth_observer,
|
RtcpBandwidthObserver* bandwidth_observer,
|
||||||
TransportFeedbackObserver* transport_feedback_observer,
|
TransportFeedbackObserver* transport_feedback_observer,
|
||||||
@ -89,11 +91,6 @@ class ViEChannel : public VCMFrameTypeCallback,
|
|||||||
void RegisterExternalDecoder(const uint8_t pl_type, VideoDecoder* decoder);
|
void RegisterExternalDecoder(const uint8_t pl_type, VideoDecoder* decoder);
|
||||||
int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
|
int32_t ReceiveCodecStatistics(uint32_t* num_key_frames,
|
||||||
uint32_t* num_delta_frames);
|
uint32_t* num_delta_frames);
|
||||||
uint32_t DiscardedPackets() const;
|
|
||||||
|
|
||||||
// Returns the estimated delay in milliseconds.
|
|
||||||
int ReceiveDelay() const;
|
|
||||||
|
|
||||||
void SetExpectedRenderDelay(int delay_ms);
|
void SetExpectedRenderDelay(int delay_ms);
|
||||||
|
|
||||||
void SetRTCPMode(const RtcpMode rtcp_mode);
|
void SetRTCPMode(const RtcpMode rtcp_mode);
|
||||||
@ -214,7 +211,6 @@ class ViEChannel : public VCMFrameTypeCallback,
|
|||||||
|
|
||||||
// Gets the modules used by the channel.
|
// Gets the modules used by the channel.
|
||||||
RtpRtcp* rtp_rtcp();
|
RtpRtcp* rtp_rtcp();
|
||||||
rtc::scoped_refptr<PayloadRouter> send_payload_router();
|
|
||||||
VCMProtectionCallback* vcm_protection_callback();
|
VCMProtectionCallback* vcm_protection_callback();
|
||||||
|
|
||||||
|
|
||||||
@ -401,12 +397,12 @@ class ViEChannel : public VCMFrameTypeCallback,
|
|||||||
const bool sender_;
|
const bool sender_;
|
||||||
|
|
||||||
ProcessThread* const module_process_thread_;
|
ProcessThread* const module_process_thread_;
|
||||||
|
PayloadRouter* const send_payload_router_;
|
||||||
|
|
||||||
// Used for all registered callbacks except rendering.
|
// Used for all registered callbacks except rendering.
|
||||||
rtc::CriticalSection crit_;
|
rtc::CriticalSection crit_;
|
||||||
|
|
||||||
// Owned modules/classes.
|
// Owned modules/classes.
|
||||||
rtc::scoped_refptr<PayloadRouter> send_payload_router_;
|
|
||||||
rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_;
|
rtc::scoped_ptr<ViEChannelProtectionCallback> vcm_protection_callback_;
|
||||||
|
|
||||||
VideoCodingModule* const vcm_;
|
VideoCodingModule* const vcm_;
|
||||||
|
@ -110,6 +110,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
|
|||||||
I420FrameCallback* pre_encode_callback,
|
I420FrameCallback* pre_encode_callback,
|
||||||
OveruseFrameDetector* overuse_detector,
|
OveruseFrameDetector* overuse_detector,
|
||||||
PacedSender* pacer,
|
PacedSender* pacer,
|
||||||
|
PayloadRouter* payload_router,
|
||||||
BitrateAllocator* bitrate_allocator)
|
BitrateAllocator* bitrate_allocator)
|
||||||
: number_of_cores_(number_of_cores),
|
: number_of_cores_(number_of_cores),
|
||||||
vp_(VideoProcessing::Create()),
|
vp_(VideoProcessing::Create()),
|
||||||
@ -117,11 +118,11 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
|
|||||||
vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(),
|
vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(),
|
||||||
this,
|
this,
|
||||||
qm_callback_.get())),
|
qm_callback_.get())),
|
||||||
send_payload_router_(NULL),
|
|
||||||
stats_proxy_(stats_proxy),
|
stats_proxy_(stats_proxy),
|
||||||
pre_encode_callback_(pre_encode_callback),
|
pre_encode_callback_(pre_encode_callback),
|
||||||
overuse_detector_(overuse_detector),
|
overuse_detector_(overuse_detector),
|
||||||
pacer_(pacer),
|
pacer_(pacer),
|
||||||
|
send_payload_router_(payload_router),
|
||||||
bitrate_allocator_(bitrate_allocator),
|
bitrate_allocator_(bitrate_allocator),
|
||||||
time_of_last_frame_activity_ms_(0),
|
time_of_last_frame_activity_ms_(0),
|
||||||
encoder_config_(),
|
encoder_config_(),
|
||||||
@ -138,6 +139,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
|
|||||||
picture_id_rpsi_(0),
|
picture_id_rpsi_(0),
|
||||||
video_suspended_(false) {
|
video_suspended_(false) {
|
||||||
bitrate_observer_.reset(new ViEBitrateObserver(this));
|
bitrate_observer_.reset(new ViEBitrateObserver(this));
|
||||||
|
module_process_thread_->RegisterModule(vcm_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ViEEncoder::Init() {
|
bool ViEEncoder::Init() {
|
||||||
@ -155,23 +157,14 @@ bool ViEEncoder::Init() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViEEncoder::StartThreadsAndSetSharedMembers(
|
VideoCodingModule* ViEEncoder::vcm() const {
|
||||||
rtc::scoped_refptr<PayloadRouter> send_payload_router,
|
return vcm_.get();
|
||||||
VCMProtectionCallback* vcm_protection_callback) {
|
|
||||||
RTC_DCHECK(send_payload_router_ == NULL);
|
|
||||||
|
|
||||||
send_payload_router_ = send_payload_router;
|
|
||||||
vcm_->RegisterProtectionCallback(vcm_protection_callback);
|
|
||||||
module_process_thread_->RegisterModule(vcm_.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void ViEEncoder::StopThreadsAndRemoveSharedMembers() {
|
|
||||||
if (bitrate_allocator_)
|
|
||||||
bitrate_allocator_->RemoveBitrateObserver(bitrate_observer_.get());
|
|
||||||
module_process_thread_->DeRegisterModule(vcm_.get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ViEEncoder::~ViEEncoder() {
|
ViEEncoder::~ViEEncoder() {
|
||||||
|
module_process_thread_->DeRegisterModule(vcm_.get());
|
||||||
|
if (bitrate_allocator_)
|
||||||
|
bitrate_allocator_->RemoveBitrateObserver(bitrate_observer_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViEEncoder::SetNetworkTransmissionState(bool is_transmitting) {
|
void ViEEncoder::SetNetworkTransmissionState(bool is_transmitting) {
|
||||||
@ -338,7 +331,6 @@ void ViEEncoder::TraceFrameDropEnd() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViEEncoder::DeliverFrame(VideoFrame video_frame) {
|
void ViEEncoder::DeliverFrame(VideoFrame video_frame) {
|
||||||
RTC_DCHECK(send_payload_router_ != NULL);
|
|
||||||
if (!send_payload_router_->active()) {
|
if (!send_payload_router_->active()) {
|
||||||
// We've paused or we have no channels attached, don't waste resources on
|
// We've paused or we have no channels attached, don't waste resources on
|
||||||
// encoding.
|
// encoding.
|
||||||
|
@ -57,22 +57,13 @@ class ViEEncoder : public RtcpIntraFrameObserver,
|
|||||||
I420FrameCallback* pre_encode_callback,
|
I420FrameCallback* pre_encode_callback,
|
||||||
OveruseFrameDetector* overuse_detector,
|
OveruseFrameDetector* overuse_detector,
|
||||||
PacedSender* pacer,
|
PacedSender* pacer,
|
||||||
|
PayloadRouter* payload_router,
|
||||||
BitrateAllocator* bitrate_allocator);
|
BitrateAllocator* bitrate_allocator);
|
||||||
~ViEEncoder();
|
~ViEEncoder();
|
||||||
|
|
||||||
bool Init();
|
bool Init();
|
||||||
|
|
||||||
// This function is assumed to be called before any frames are delivered and
|
VideoCodingModule* vcm() const;
|
||||||
// only once.
|
|
||||||
// Ideally this would be done in Init, but the dependencies between ViEEncoder
|
|
||||||
// and ViEChannel makes it really hard to do in a good way.
|
|
||||||
void StartThreadsAndSetSharedMembers(
|
|
||||||
rtc::scoped_refptr<PayloadRouter> send_payload_router,
|
|
||||||
VCMProtectionCallback* vcm_protection_callback);
|
|
||||||
|
|
||||||
// This function must be called before the corresponding ViEChannel is
|
|
||||||
// deleted.
|
|
||||||
void StopThreadsAndRemoveSharedMembers();
|
|
||||||
|
|
||||||
void SetNetworkTransmissionState(bool is_transmitting);
|
void SetNetworkTransmissionState(bool is_transmitting);
|
||||||
|
|
||||||
@ -158,7 +149,6 @@ class ViEEncoder : public RtcpIntraFrameObserver,
|
|||||||
const rtc::scoped_ptr<VideoProcessing> vp_;
|
const rtc::scoped_ptr<VideoProcessing> vp_;
|
||||||
const rtc::scoped_ptr<QMVideoSettingsCallback> qm_callback_;
|
const rtc::scoped_ptr<QMVideoSettingsCallback> qm_callback_;
|
||||||
const rtc::scoped_ptr<VideoCodingModule> vcm_;
|
const rtc::scoped_ptr<VideoCodingModule> vcm_;
|
||||||
rtc::scoped_refptr<PayloadRouter> send_payload_router_;
|
|
||||||
|
|
||||||
rtc::CriticalSection data_cs_;
|
rtc::CriticalSection data_cs_;
|
||||||
rtc::scoped_ptr<BitrateObserver> bitrate_observer_;
|
rtc::scoped_ptr<BitrateObserver> bitrate_observer_;
|
||||||
@ -167,6 +157,7 @@ class ViEEncoder : public RtcpIntraFrameObserver,
|
|||||||
I420FrameCallback* const pre_encode_callback_;
|
I420FrameCallback* const pre_encode_callback_;
|
||||||
OveruseFrameDetector* const overuse_detector_;
|
OveruseFrameDetector* const overuse_detector_;
|
||||||
PacedSender* const pacer_;
|
PacedSender* const pacer_;
|
||||||
|
PayloadRouter* const send_payload_router_;
|
||||||
BitrateAllocator* const bitrate_allocator_;
|
BitrateAllocator* const bitrate_allocator_;
|
||||||
|
|
||||||
// The time we last received an input frame or encoded frame. This is used to
|
// The time we last received an input frame or encoded frame. This is used to
|
||||||
|
@ -232,6 +232,7 @@ int ViEReceiver::ReceivedRTCPPacket(const void* rtcp_packet,
|
|||||||
int32_t ViEReceiver::OnReceivedPayloadData(const uint8_t* payload_data,
|
int32_t ViEReceiver::OnReceivedPayloadData(const uint8_t* payload_data,
|
||||||
const size_t payload_size,
|
const size_t payload_size,
|
||||||
const WebRtcRTPHeader* rtp_header) {
|
const WebRtcRTPHeader* rtp_header) {
|
||||||
|
RTC_DCHECK(vcm_);
|
||||||
WebRtcRTPHeader rtp_header_with_ntp = *rtp_header;
|
WebRtcRTPHeader rtp_header_with_ntp = *rtp_header;
|
||||||
rtp_header_with_ntp.ntp_time_ms =
|
rtp_header_with_ntp.ntp_time_ms =
|
||||||
ntp_estimator_->Estimate(rtp_header->header.timestamp);
|
ntp_estimator_->Estimate(rtp_header->header.timestamp);
|
||||||
|
Reference in New Issue
Block a user