From 948d61724cbf47da6a3ef23e5ea50b8302155909 Mon Sep 17 00:00:00 2001 From: "mflodman@webrtc.org" Date: Tue, 10 Feb 2015 08:58:16 +0000 Subject: [PATCH] Create a separate thread for pacing. This CL moves the pacer out from the regular module process thread to instead use one thread per pacer. This is to get better accuracy for the paced packets and to avoid overusing the module process thread. BUG= TEST=existing tests R=stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/41839004 Cr-Commit-Position: refs/heads/master@{#8308} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8308 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/video_engine/vie_encoder.cc | 13 +++++++++---- webrtc/video_engine/vie_encoder.h | 15 ++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/webrtc/video_engine/vie_encoder.cc b/webrtc/video_engine/vie_encoder.cc index b86c259744..19aff0a6e7 100644 --- a/webrtc/video_engine/vie_encoder.cc +++ b/webrtc/video_engine/vie_encoder.cc @@ -155,6 +155,7 @@ ViEEncoder::ViEEncoder(int32_t engine_id, codec_observer_(NULL), effect_filter_(NULL), module_process_thread_(module_process_thread), + pacer_thread_(ProcessThread::Create()), has_received_sli_(false), picture_id_sli_(0), has_received_rpsi_(false), @@ -189,8 +190,11 @@ bool ViEEncoder::Init() { vpm_.EnableContentAnalysis(false); if (module_process_thread_.RegisterModule(&vcm_) != 0 || - module_process_thread_.RegisterModule(default_rtp_rtcp_.get()) != 0 || - module_process_thread_.RegisterModule(paced_sender_.get()) != 0) { + module_process_thread_.RegisterModule(default_rtp_rtcp_.get()) != 0) { + return false; + } + if (pacer_thread_->RegisterModule(paced_sender_.get()) != 0 || + pacer_thread_->Start() != 0) { return false; } if (qm_callback_) { @@ -241,10 +245,11 @@ ViEEncoder::~ViEEncoder() { if (bitrate_controller_) { bitrate_controller_->RemoveBitrateObserver(bitrate_observer_.get()); } + pacer_thread_->Stop(); + pacer_thread_->DeRegisterModule(paced_sender_.get()); module_process_thread_.DeRegisterModule(&vcm_); module_process_thread_.DeRegisterModule(&vpm_); module_process_thread_.DeRegisterModule(default_rtp_rtcp_.get()); - module_process_thread_.DeRegisterModule(paced_sender_.get()); VideoCodingModule::Destroy(&vcm_); VideoProcessingModule::Destroy(&vpm_); delete qm_callback_; @@ -559,7 +564,7 @@ void ViEEncoder::DeliverFrame(int id, if (effect_filter_) { size_t length = CalcBufferSize(kI420, video_frame->width(), video_frame->height()); - scoped_ptr video_buffer(new uint8_t[length]); + rtc::scoped_ptr video_buffer(new uint8_t[length]); ExtractBuffer(*video_frame, length, video_buffer.get()); effect_filter_->Transform(length, video_buffer.get(), diff --git a/webrtc/video_engine/vie_encoder.h b/webrtc/video_engine/vie_encoder.h index d1723bc8dc..3ed661ada0 100644 --- a/webrtc/video_engine/vie_encoder.h +++ b/webrtc/video_engine/vie_encoder.h @@ -15,13 +15,13 @@ #include #include +#include "webrtc/base/scoped_ptr.h" #include "webrtc/base/thread_annotations.h" #include "webrtc/common_types.h" #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" #include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/system_wrappers/interface/scoped_ptr.h" #include "webrtc/typedefs.h" #include "webrtc/frame_callback.h" #include "webrtc/video_engine/vie_defines.h" @@ -205,13 +205,13 @@ class ViEEncoder VideoCodingModule& vcm_; VideoProcessingModule& vpm_; - scoped_ptr default_rtp_rtcp_; + rtc::scoped_ptr default_rtp_rtcp_; PayloadRouter* send_payload_router_; - scoped_ptr callback_cs_; - scoped_ptr data_cs_; - scoped_ptr bitrate_observer_; - scoped_ptr paced_sender_; - scoped_ptr pacing_callback_; + rtc::scoped_ptr callback_cs_; + rtc::scoped_ptr data_cs_; + rtc::scoped_ptr bitrate_observer_; + rtc::scoped_ptr paced_sender_; + rtc::scoped_ptr pacing_callback_; BitrateController* bitrate_controller_; @@ -231,6 +231,7 @@ class ViEEncoder ViEEncoderObserver* codec_observer_ GUARDED_BY(callback_cs_); ViEEffectFilter* effect_filter_ GUARDED_BY(callback_cs_); ProcessThread& module_process_thread_; + rtc::scoped_ptr pacer_thread_; bool has_received_sli_ GUARDED_BY(data_cs_); uint8_t picture_id_sli_ GUARDED_BY(data_cs_);