Move frame input (ViECapturer) to webrtc/video/.

Renames ViECapturer to VideoCaptureInput and initializes several
parameters on construction instead of setters.

Also removes an old deadlock suppression.

BUG=1695, 2999
R=asapersson@webrtc.org, mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/53559004.

Cr-Commit-Position: refs/heads/master@{#9508}
This commit is contained in:
Peter Boström
2015-06-26 06:58:16 +02:00
parent ebe7422372
commit 4b91bd0897
27 changed files with 221 additions and 331 deletions

View File

@@ -145,7 +145,7 @@ bool FakeVideoSendStream::ReconfigureVideoEncoder(
return true; return true;
} }
webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() { webrtc::VideoCaptureInput* FakeVideoSendStream::Input() {
return this; return this;
} }

View File

@@ -55,7 +55,7 @@ class FakeAudioReceiveStream : public webrtc::AudioReceiveStream {
}; };
class FakeVideoSendStream : public webrtc::VideoSendStream, class FakeVideoSendStream : public webrtc::VideoSendStream,
public webrtc::VideoSendStreamInput { public webrtc::VideoCaptureInput {
public: public:
FakeVideoSendStream(const webrtc::VideoSendStream::Config& config, FakeVideoSendStream(const webrtc::VideoSendStream::Config& config,
const webrtc::VideoEncoderConfig& encoder_config); const webrtc::VideoEncoderConfig& encoder_config);
@@ -79,7 +79,7 @@ class FakeVideoSendStream : public webrtc::VideoSendStream,
bool ReconfigureVideoEncoder( bool ReconfigureVideoEncoder(
const webrtc::VideoEncoderConfig& config) override; const webrtc::VideoEncoderConfig& config) override;
webrtc::VideoSendStreamInput* Input() override; webrtc::VideoCaptureInput* Input() override;
void Start() override; void Start() override;
void Stop() override; void Stop() override;

View File

@@ -56,8 +56,6 @@ static const int kMaxVideoBitrate = 1000;
// renderer for a channel or it is adding a renderer for a capturer. // renderer for a channel or it is adding a renderer for a capturer.
static const int kViEChannelIdBase = 0; static const int kViEChannelIdBase = 0;
static const int kViEChannelIdMax = 1000; static const int kViEChannelIdMax = 1000;
static const int kViECaptureIdBase = 10000; // Make sure there is a gap.
static const int kViECaptureIdMax = 11000;
// Fake class for mocking out webrtc::VideoDecoder // Fake class for mocking out webrtc::VideoDecoder
class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder { class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder {

View File

@@ -132,19 +132,6 @@
... ...
fun:_ZN3rtc41unstarted_task_test_DoNotDeleteTask2_Test8TestBodyEv fun:_ZN3rtc41unstarted_task_test_DoNotDeleteTask2_Test8TestBodyEv
} }
{
bug_716
Memcheck:Leak
fun:_Znw*
fun:_ZN6webrtc11ThreadPosix6CreateEPFbPvES1_NS_14ThreadPriorityEPKc
fun:_ZN6webrtc13ThreadWrapper12CreateThreadEPFbPvES1_NS_14ThreadPriorityEPKc
fun:_ZN6webrtc18videocapturemodule22VideoCaptureModuleV4L212StartCaptureERKNS_22VideoCaptureCapabilityE
fun:_ZN6webrtc11ViECapturer5StartERKNS_17CaptureCapabilityE
fun:_ZN6webrtc14ViECaptureImpl12StartCaptureEiRKNS_17CaptureCapabilityE
fun:_ZN15TbCaptureDeviceC1ER12TbInterfaces
fun:_ZN12_GLOBAL__N_114ViERtpFuzzTest5SetUpEv
}
{ {
bug_329_1 bug_329_1
Memcheck:Unaddressable Memcheck:Unaddressable
@@ -160,16 +147,6 @@
fun:StartThread fun:StartThread
} }
{
bug_329_2
Memcheck:Leak
fun:_Znw*
fun:_ZN6webrtc18videocapturemodule16VideoCaptureImpl16CreateDeviceInfoEi
fun:_ZN6webrtc19VideoCaptureFactory16CreateDeviceInfoEi
fun:_ZN11ViEAutoTest22ViECaptureStandardTestEv
fun:_ZN12_GLOBAL__N_160ViEStandardIntegrationTest_RunsCaptureTestWithoutErrors_Test8TestBodyEv
}
{ {
bug_329_3 bug_329_3
Memcheck:Unaddressable Memcheck:Unaddressable

View File

@@ -73,7 +73,6 @@ char kTSanDefaultSuppressions[] =
"deadlock:webrtc::RTCPReceiver::SetSsrcs\n" "deadlock:webrtc::RTCPReceiver::SetSsrcs\n"
"deadlock:webrtc::test::UdpSocketManagerPosixImpl::RemoveSocket\n" "deadlock:webrtc::test::UdpSocketManagerPosixImpl::RemoveSocket\n"
"deadlock:webrtc::vcm::VideoReceiver::RegisterPacketRequestCallback\n" "deadlock:webrtc::vcm::VideoReceiver::RegisterPacketRequestCallback\n"
"deadlock:webrtc::ViECaptureImpl::ConnectCaptureDevice\n"
"deadlock:webrtc::ViEChannel::StartSend\n" "deadlock:webrtc::ViEChannel::StartSend\n"
"deadlock:webrtc::ViEEncoder::OnLocalSsrcChanged\n" "deadlock:webrtc::ViEEncoder::OnLocalSsrcChanged\n"

View File

@@ -21,8 +21,7 @@
namespace webrtc { namespace webrtc {
namespace test { namespace test {
FrameGeneratorCapturer* FrameGeneratorCapturer::Create( FrameGeneratorCapturer* FrameGeneratorCapturer::Create(VideoCaptureInput* input,
VideoSendStreamInput* input,
size_t width, size_t width,
size_t height, size_t height,
int target_fps, int target_fps,
@@ -39,7 +38,7 @@ FrameGeneratorCapturer* FrameGeneratorCapturer::Create(
} }
FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile( FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile(
VideoSendStreamInput* input, VideoCaptureInput* input,
const std::string& file_name, const std::string& file_name,
size_t width, size_t width,
size_t height, size_t height,
@@ -59,7 +58,7 @@ FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile(
} }
FrameGeneratorCapturer::FrameGeneratorCapturer(Clock* clock, FrameGeneratorCapturer::FrameGeneratorCapturer(Clock* clock,
VideoSendStreamInput* input, VideoCaptureInput* input,
FrameGenerator* frame_generator, FrameGenerator* frame_generator,
int target_fps) int target_fps)
: VideoCapturer(input), : VideoCapturer(input),

View File

@@ -29,13 +29,13 @@ class FrameGenerator;
class FrameGeneratorCapturer : public VideoCapturer { class FrameGeneratorCapturer : public VideoCapturer {
public: public:
static FrameGeneratorCapturer* Create(VideoSendStreamInput* input, static FrameGeneratorCapturer* Create(VideoCaptureInput* input,
size_t width, size_t width,
size_t height, size_t height,
int target_fps, int target_fps,
Clock* clock); Clock* clock);
static FrameGeneratorCapturer* CreateFromYuvFile(VideoSendStreamInput* input, static FrameGeneratorCapturer* CreateFromYuvFile(VideoCaptureInput* input,
const std::string& file_name, const std::string& file_name,
size_t width, size_t width,
size_t height, size_t height,
@@ -49,7 +49,7 @@ class FrameGeneratorCapturer : public VideoCapturer {
int64_t first_frame_capture_time() const { return first_frame_capture_time_; } int64_t first_frame_capture_time() const { return first_frame_capture_time_; }
FrameGeneratorCapturer(Clock* clock, FrameGeneratorCapturer(Clock* clock,
VideoSendStreamInput* input, VideoCaptureInput* input,
FrameGenerator* frame_generator, FrameGenerator* frame_generator,
int target_fps); int target_fps);
bool Init(); bool Init();

View File

@@ -16,8 +16,9 @@
namespace webrtc { namespace webrtc {
namespace test { namespace test {
VcmCapturer::VcmCapturer(webrtc::VideoSendStreamInput* input) VcmCapturer::VcmCapturer(webrtc::VideoCaptureInput* input)
: VideoCapturer(input), started_(false), vcm_(NULL) {} : VideoCapturer(input), started_(false), vcm_(NULL) {
}
bool VcmCapturer::Init(size_t width, size_t height, size_t target_fps) { bool VcmCapturer::Init(size_t width, size_t height, size_t target_fps) {
VideoCaptureModule::DeviceInfo* device_info = VideoCaptureModule::DeviceInfo* device_info =
@@ -53,8 +54,9 @@ bool VcmCapturer::Init(size_t width, size_t height, size_t target_fps) {
return true; return true;
} }
VcmCapturer* VcmCapturer::Create(VideoSendStreamInput* input, VcmCapturer* VcmCapturer::Create(VideoCaptureInput* input,
size_t width, size_t height, size_t width,
size_t height,
size_t target_fps) { size_t target_fps) {
VcmCapturer* vcm__capturer = new VcmCapturer(input); VcmCapturer* vcm__capturer = new VcmCapturer(input);
if (!vcm__capturer->Init(width, height, target_fps)) { if (!vcm__capturer->Init(width, height, target_fps)) {

View File

@@ -20,8 +20,10 @@ namespace test {
class VcmCapturer : public VideoCapturer, public VideoCaptureDataCallback { class VcmCapturer : public VideoCapturer, public VideoCaptureDataCallback {
public: public:
static VcmCapturer* Create(VideoSendStreamInput* input, size_t width, static VcmCapturer* Create(VideoCaptureInput* input,
size_t height, size_t target_fps); size_t width,
size_t height,
size_t target_fps);
virtual ~VcmCapturer(); virtual ~VcmCapturer();
void Start() override; void Start() override;
@@ -32,7 +34,7 @@ class VcmCapturer : public VideoCapturer, public VideoCaptureDataCallback {
void OnCaptureDelayChanged(const int32_t id, const int32_t delay) override; void OnCaptureDelayChanged(const int32_t id, const int32_t delay) override;
private: private:
explicit VcmCapturer(VideoSendStreamInput* input); explicit VcmCapturer(VideoCaptureInput* input);
bool Init(size_t width, size_t height, size_t target_fps); bool Init(size_t width, size_t height, size_t target_fps);
void Destroy(); void Destroy();

View File

@@ -26,10 +26,10 @@ class NullCapturer : public VideoCapturer {
virtual void Stop() {} virtual void Stop() {}
}; };
VideoCapturer::VideoCapturer(VideoSendStreamInput* input) VideoCapturer::VideoCapturer(VideoCaptureInput* input) : input_(input) {
: input_(input) {} }
VideoCapturer* VideoCapturer::Create(VideoSendStreamInput* input, VideoCapturer* VideoCapturer::Create(VideoCaptureInput* input,
size_t width, size_t width,
size_t height, size_t height,
int fps, int fps,

View File

@@ -16,13 +16,13 @@ namespace webrtc {
class Clock; class Clock;
class VideoSendStreamInput; class VideoCaptureInput;
namespace test { namespace test {
class VideoCapturer { class VideoCapturer {
public: public:
static VideoCapturer* Create(VideoSendStreamInput* input, static VideoCapturer* Create(VideoCaptureInput* input,
size_t width, size_t width,
size_t height, size_t height,
int fps, int fps,
@@ -33,8 +33,8 @@ class VideoCapturer {
virtual void Stop() = 0; virtual void Stop() = 0;
protected: protected:
explicit VideoCapturer(VideoSendStreamInput* input); explicit VideoCapturer(VideoCaptureInput* input);
VideoSendStreamInput* input_; VideoCaptureInput* input_;
}; };
} // test } // test
} // webrtc } // webrtc

View File

@@ -22,8 +22,6 @@ source_set("video") {
"../video_engine/report_block_stats.h", "../video_engine/report_block_stats.h",
"../video_engine/stream_synchronization.cc", "../video_engine/stream_synchronization.cc",
"../video_engine/stream_synchronization.h", "../video_engine/stream_synchronization.h",
"../video_engine/vie_capturer.cc",
"../video_engine/vie_capturer.h",
"../video_engine/vie_channel.cc", "../video_engine/vie_channel.cc",
"../video_engine/vie_channel.h", "../video_engine/vie_channel.h",
"../video_engine/vie_channel_group.cc", "../video_engine/vie_channel_group.cc",
@@ -48,6 +46,8 @@ source_set("video") {
"send_statistics_proxy.h", "send_statistics_proxy.h",
"transport_adapter.cc", "transport_adapter.cc",
"transport_adapter.h", "transport_adapter.h",
"video_capture_input.cc",
"video_capture_input.h",
"video_decoder.cc", "video_decoder.cc",
"video_encoder.cc", "video_encoder.cc",
"video_receive_stream.cc", "video_receive_stream.cc",

View File

@@ -63,9 +63,9 @@ class FullStackTest : public test::CallTest {
class VideoAnalyzer : public PacketReceiver, class VideoAnalyzer : public PacketReceiver,
public newapi::Transport, public newapi::Transport,
public VideoRenderer, public VideoRenderer,
public VideoSendStreamInput { public VideoCaptureInput {
public: public:
VideoAnalyzer(VideoSendStreamInput* input, VideoAnalyzer(VideoCaptureInput* input,
Transport* transport, Transport* transport,
const char* test_label, const char* test_label,
double avg_psnr_threshold, double avg_psnr_threshold,
@@ -224,7 +224,7 @@ class VideoAnalyzer : public PacketReceiver,
} }
} }
VideoSendStreamInput* input_; VideoCaptureInput* input_;
Transport* transport_; Transport* transport_;
PacketReceiver* receiver_; PacketReceiver* receiver_;

View File

@@ -8,10 +8,9 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "webrtc/video_engine/vie_capturer.h" #include "webrtc/video/video_capture_input.h"
#include "webrtc/base/checks.h" #include "webrtc/base/checks.h"
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/modules/interface/module_common_types.h" #include "webrtc/modules/interface/module_common_types.h"
#include "webrtc/modules/utility/interface/process_thread.h" #include "webrtc/modules/utility/interface/process_thread.h"
#include "webrtc/modules/video_capture/include/video_capture_factory.h" #include "webrtc/modules/video_capture/include/video_capture_factory.h"
@@ -23,48 +22,27 @@
#include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/logging.h"
#include "webrtc/system_wrappers/interface/tick_util.h" #include "webrtc/system_wrappers/interface/tick_util.h"
#include "webrtc/system_wrappers/interface/trace_event.h" #include "webrtc/system_wrappers/interface/trace_event.h"
#include "webrtc/video/send_statistics_proxy.h"
#include "webrtc/video_engine/overuse_frame_detector.h" #include "webrtc/video_engine/overuse_frame_detector.h"
#include "webrtc/video_engine/vie_defines.h"
#include "webrtc/video_engine/vie_encoder.h" #include "webrtc/video_engine/vie_encoder.h"
namespace webrtc { namespace webrtc {
const int kThreadWaitTimeMs = 100; namespace internal {
VideoCaptureInput::VideoCaptureInput(ProcessThread* module_process_thread,
class RegistrableCpuOveruseMetricsObserver : public CpuOveruseMetricsObserver { VideoCaptureCallback* frame_callback,
public: VideoRenderer* local_renderer,
void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override { SendStatisticsProxy* stats_proxy,
rtc::CritScope lock(&crit_); CpuOveruseObserver* overuse_observer)
if (observer_)
observer_->CpuOveruseMetricsUpdated(metrics);
metrics_ = metrics;
}
CpuOveruseMetrics GetCpuOveruseMetrics() const {
rtc::CritScope lock(&crit_);
return metrics_;
}
void Set(CpuOveruseMetricsObserver* observer) {
rtc::CritScope lock(&crit_);
observer_ = observer;
}
private:
mutable rtc::CriticalSection crit_;
CpuOveruseMetricsObserver* observer_ GUARDED_BY(crit_) = nullptr;
CpuOveruseMetrics metrics_ GUARDED_BY(crit_);
};
ViECapturer::ViECapturer(ProcessThread* module_process_thread,
ViEFrameCallback* frame_callback)
: capture_cs_(CriticalSectionWrapper::CreateCriticalSection()), : capture_cs_(CriticalSectionWrapper::CreateCriticalSection()),
module_process_thread_(module_process_thread), module_process_thread_(module_process_thread),
frame_callback_(frame_callback), frame_callback_(frame_callback),
local_renderer_(local_renderer),
stats_proxy_(stats_proxy),
incoming_frame_cs_(CriticalSectionWrapper::CreateCriticalSection()), incoming_frame_cs_(CriticalSectionWrapper::CreateCriticalSection()),
capture_thread_(ThreadWrapper::CreateThread(ViECaptureThreadFunction, capture_thread_(ThreadWrapper::CreateThread(CaptureThreadFunction,
this, this,
"ViECaptureThread")), "CaptureThread")),
capture_event_(*EventWrapper::Create()), capture_event_(*EventWrapper::Create()),
deliver_event_(*EventWrapper::Create()), deliver_event_(*EventWrapper::Create()),
stop_(0), stop_(0),
@@ -72,16 +50,16 @@ ViECapturer::ViECapturer(ProcessThread* module_process_thread,
delta_ntp_internal_ms_( delta_ntp_internal_ms_(
Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() - Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() -
TickTime::MillisecondTimestamp()), TickTime::MillisecondTimestamp()),
cpu_overuse_metrics_observer_(new RegistrableCpuOveruseMetricsObserver()), overuse_detector_(new OveruseFrameDetector(Clock::GetRealTimeClock(),
overuse_detector_( CpuOveruseOptions(),
new OveruseFrameDetector(Clock::GetRealTimeClock(), overuse_observer,
cpu_overuse_metrics_observer_.get())) { stats_proxy)) {
capture_thread_->Start(); capture_thread_->Start();
capture_thread_->SetPriority(kHighPriority); capture_thread_->SetPriority(kHighPriority);
module_process_thread_->RegisterModule(overuse_detector_.get()); module_process_thread_->RegisterModule(overuse_detector_.get());
} }
ViECapturer::~ViECapturer() { VideoCaptureInput::~VideoCaptureInput() {
module_process_thread_->DeRegisterModule(overuse_detector_.get()); module_process_thread_->DeRegisterModule(overuse_detector_.get());
// Stop the thread. // Stop the thread.
@@ -94,35 +72,33 @@ ViECapturer::~ViECapturer() {
delete &deliver_event_; delete &deliver_event_;
} }
void ViECapturer::RegisterCpuOveruseObserver(CpuOveruseObserver* observer) { void VideoCaptureInput::IncomingCapturedFrame(const VideoFrame& video_frame) {
overuse_detector_->SetObserver(observer); // TODO(pbos): Remove local rendering, it should be handled by the client code
} // if required.
if (local_renderer_)
local_renderer_->RenderFrame(video_frame, 0);
void ViECapturer::RegisterCpuOveruseMetricsObserver( stats_proxy_->OnIncomingFrame();
CpuOveruseMetricsObserver* observer) {
cpu_overuse_metrics_observer_->Set(observer);
}
void ViECapturer::IncomingFrame(const VideoFrame& video_frame) {
VideoFrame incoming_frame = video_frame; VideoFrame incoming_frame = video_frame;
if (incoming_frame.ntp_time_ms() != 0) { if (incoming_frame.ntp_time_ms() != 0) {
// If a NTP time stamp is set, this is the time stamp we will use. // If a NTP time stamp is set, this is the time stamp we will use.
incoming_frame.set_render_time_ms( incoming_frame.set_render_time_ms(incoming_frame.ntp_time_ms() -
incoming_frame.ntp_time_ms() - delta_ntp_internal_ms_); delta_ntp_internal_ms_);
} else { // NTP time stamp not set. } else { // NTP time stamp not set.
int64_t render_time = incoming_frame.render_time_ms() != 0 ? int64_t render_time = incoming_frame.render_time_ms() != 0
incoming_frame.render_time_ms() : TickTime::MillisecondTimestamp(); ? incoming_frame.render_time_ms()
: TickTime::MillisecondTimestamp();
incoming_frame.set_render_time_ms(render_time); incoming_frame.set_render_time_ms(render_time);
incoming_frame.set_ntp_time_ms( incoming_frame.set_ntp_time_ms(render_time + delta_ntp_internal_ms_);
render_time + delta_ntp_internal_ms_);
} }
// Convert NTP time, in ms, to RTP timestamp. // Convert NTP time, in ms, to RTP timestamp.
const int kMsToRtpTimestamp = 90; const int kMsToRtpTimestamp = 90;
incoming_frame.set_timestamp(kMsToRtpTimestamp * incoming_frame.set_timestamp(
static_cast<uint32_t>(incoming_frame.ntp_time_ms())); kMsToRtpTimestamp * static_cast<uint32_t>(incoming_frame.ntp_time_ms()));
CriticalSectionScoped cs(capture_cs_.get()); CriticalSectionScoped cs(capture_cs_.get());
if (incoming_frame.ntp_time_ms() <= last_captured_timestamp_) { if (incoming_frame.ntp_time_ms() <= last_captured_timestamp_) {
@@ -144,11 +120,12 @@ void ViECapturer::IncomingFrame(const VideoFrame& video_frame) {
capture_event_.Set(); capture_event_.Set();
} }
bool ViECapturer::ViECaptureThreadFunction(void* obj) { bool VideoCaptureInput::CaptureThreadFunction(void* obj) {
return static_cast<ViECapturer*>(obj)->ViECaptureProcess(); return static_cast<VideoCaptureInput*>(obj)->CaptureProcess();
} }
bool ViECapturer::ViECaptureProcess() { bool VideoCaptureInput::CaptureProcess() {
static const int kThreadWaitTimeMs = 100;
int64_t capture_time = -1; int64_t capture_time = -1;
if (capture_event_.Wait(kThreadWaitTimeMs) == kEventSignaled) { if (capture_event_.Wait(kThreadWaitTimeMs) == kEventSignaled) {
if (rtc::AtomicOps::Load(&stop_)) if (rtc::AtomicOps::Load(&stop_))
@@ -182,4 +159,5 @@ bool ViECapturer::ViECaptureProcess() {
return true; return true;
} }
} // namespace internal
} // namespace webrtc } // namespace webrtc

View File

@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_ #ifndef WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_
#define WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_ #define WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_
#include <vector> #include <vector>
@@ -26,6 +26,7 @@
#include "webrtc/system_wrappers/interface/thread_wrapper.h" #include "webrtc/system_wrappers/interface/thread_wrapper.h"
#include "webrtc/typedefs.h" #include "webrtc/typedefs.h"
#include "webrtc/video_engine/vie_defines.h" #include "webrtc/video_engine/vie_defines.h"
#include "webrtc/video_send_stream.h"
namespace webrtc { namespace webrtc {
@@ -37,44 +38,41 @@ class EventWrapper;
class OveruseFrameDetector; class OveruseFrameDetector;
class ProcessThread; class ProcessThread;
class RegistrableCpuOveruseMetricsObserver; class RegistrableCpuOveruseMetricsObserver;
class ViEEffectFilter; class SendStatisticsProxy;
class VideoRenderer;
class ViEFrameCallback { class VideoCaptureCallback {
public: public:
virtual ~ViEFrameCallback() {} virtual ~VideoCaptureCallback() {}
virtual void DeliverFrame(VideoFrame video_frame) = 0; virtual void DeliverFrame(VideoFrame video_frame) = 0;
}; };
class ViECapturer { namespace internal {
class VideoCaptureInput : public webrtc::VideoCaptureInput {
public: public:
ViECapturer(ProcessThread* module_process_thread, VideoCaptureInput(ProcessThread* module_process_thread,
ViEFrameCallback* frame_callback); VideoCaptureCallback* frame_callback,
~ViECapturer(); VideoRenderer* local_renderer,
SendStatisticsProxy* send_stats_proxy,
CpuOveruseObserver* overuse_observer);
~VideoCaptureInput();
void IncomingFrame(const VideoFrame& frame); void IncomingCapturedFrame(const VideoFrame& video_frame) override;
void RegisterCpuOveruseObserver(CpuOveruseObserver* observer);
void RegisterCpuOveruseMetricsObserver(CpuOveruseMetricsObserver* observer);
protected:
// Help function used for keeping track of VideoImageProcesingModule.
// Creates the module if it is needed, returns 0 on success and guarantees
// that the image proc module exist.
int32_t IncImageProcRefCount();
int32_t DecImageProcRefCount();
// Thread functions for deliver captured frames to receivers.
static bool ViECaptureThreadFunction(void* obj);
bool ViECaptureProcess();
private: private:
// Thread functions for deliver captured frames to receivers.
static bool CaptureThreadFunction(void* obj);
bool CaptureProcess();
void DeliverI420Frame(VideoFrame* video_frame); void DeliverI420Frame(VideoFrame* video_frame);
rtc::scoped_ptr<CriticalSectionWrapper> capture_cs_; rtc::scoped_ptr<CriticalSectionWrapper> capture_cs_;
ProcessThread* const module_process_thread_; ProcessThread* const module_process_thread_;
ViEFrameCallback* const frame_callback_; VideoCaptureCallback* const frame_callback_;
VideoRenderer* const local_renderer_;
SendStatisticsProxy* const stats_proxy_;
// Frame used in IncomingFrameI420. // Frame used in IncomingFrameI420.
rtc::scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_; rtc::scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_;
@@ -94,12 +92,10 @@ class ViECapturer {
// Delta used for translating between NTP and internal timestamps. // Delta used for translating between NTP and internal timestamps.
const int64_t delta_ntp_internal_ms_; const int64_t delta_ntp_internal_ms_;
// Must be declared before overuse_detector_ where it's registered.
const rtc::scoped_ptr<RegistrableCpuOveruseMetricsObserver>
cpu_overuse_metrics_observer_;
rtc::scoped_ptr<OveruseFrameDetector> overuse_detector_; rtc::scoped_ptr<OveruseFrameDetector> overuse_detector_;
}; };
} // namespace internal
} // namespace webrtc } // namespace webrtc
#endif // WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_ #endif // WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_

View File

@@ -7,10 +7,7 @@
* in the file PATENTS. All contributing project authors may * in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "webrtc/video/video_capture_input.h"
// This file includes unit tests for ViECapturer.
#include "webrtc/video_engine/vie_capturer.h"
#include <vector> #include <vector>
@@ -25,6 +22,7 @@
#include "webrtc/system_wrappers/interface/ref_count.h" #include "webrtc/system_wrappers/interface/ref_count.h"
#include "webrtc/system_wrappers/interface/scoped_vector.h" #include "webrtc/system_wrappers/interface/scoped_vector.h"
#include "webrtc/test/fake_texture_frame.h" #include "webrtc/test/fake_texture_frame.h"
#include "webrtc/video/send_statistics_proxy.h"
using ::testing::_; using ::testing::_;
using ::testing::Invoke; using ::testing::Invoke;
@@ -37,7 +35,7 @@ using ::testing::WithArg;
namespace webrtc { namespace webrtc {
class MockViEFrameCallback : public ViEFrameCallback { class MockVideoCaptureCallback : public VideoCaptureCallback {
public: public:
MOCK_METHOD1(DeliverFrame, void(VideoFrame video_frame)); MOCK_METHOD1(DeliverFrame, void(VideoFrame video_frame));
}; };
@@ -49,31 +47,35 @@ bool EqualFramesVector(const ScopedVector<VideoFrame>& frames1,
const ScopedVector<VideoFrame>& frames2); const ScopedVector<VideoFrame>& frames2);
VideoFrame* CreateVideoFrame(uint8_t length); VideoFrame* CreateVideoFrame(uint8_t length);
class ViECapturerTest : public ::testing::Test { class VideoCaptureInputTest : public ::testing::Test {
protected: protected:
ViECapturerTest() VideoCaptureInputTest()
: mock_process_thread_(new NiceMock<MockProcessThread>), : mock_process_thread_(new NiceMock<MockProcessThread>),
mock_frame_callback_(new NiceMock<MockViEFrameCallback>), mock_frame_callback_(new NiceMock<MockVideoCaptureCallback>),
output_frame_event_(EventWrapper::Create()) {} output_frame_event_(EventWrapper::Create()),
stats_proxy_(Clock::GetRealTimeClock(),
webrtc::VideoSendStream::Config()) {}
virtual void SetUp() { virtual void SetUp() {
EXPECT_CALL(*mock_frame_callback_, DeliverFrame(_)) EXPECT_CALL(*mock_frame_callback_, DeliverFrame(_))
.WillRepeatedly( .WillRepeatedly(
WithArg<0>(Invoke(this, &ViECapturerTest::AddOutputFrame))); WithArg<0>(Invoke(this, &VideoCaptureInputTest::AddOutputFrame)));
Config config; Config config;
vie_capturer_.reset(new ViECapturer(mock_process_thread_.get(), input_.reset(new internal::VideoCaptureInput(
mock_frame_callback_.get())); mock_process_thread_.get(), mock_frame_callback_.get(), nullptr,
&stats_proxy_, nullptr));
} }
virtual void TearDown() { virtual void TearDown() {
// ViECapturer accesses |mock_process_thread_| in destructor and should // VideoCaptureInput accesses |mock_process_thread_| in destructor and
// should
// be deleted first. // be deleted first.
vie_capturer_.reset(); input_.reset();
} }
void AddInputFrame(VideoFrame* frame) { void AddInputFrame(VideoFrame* frame) {
vie_capturer_->IncomingFrame(*frame); input_->IncomingCapturedFrame(*frame);
} }
void AddOutputFrame(const VideoFrame& frame) { void AddOutputFrame(const VideoFrame& frame) {
@@ -88,31 +90,33 @@ class ViECapturerTest : public ::testing::Test {
} }
rtc::scoped_ptr<MockProcessThread> mock_process_thread_; rtc::scoped_ptr<MockProcessThread> mock_process_thread_;
rtc::scoped_ptr<MockViEFrameCallback> mock_frame_callback_; rtc::scoped_ptr<MockVideoCaptureCallback> mock_frame_callback_;
// Used to send input capture frames to ViECapturer. // Used to send input capture frames to VideoCaptureInput.
rtc::scoped_ptr<ViECapturer> vie_capturer_; rtc::scoped_ptr<internal::VideoCaptureInput> input_;
// Input capture frames of ViECapturer. // Input capture frames of VideoCaptureInput.
ScopedVector<VideoFrame> input_frames_; ScopedVector<VideoFrame> input_frames_;
// Indicate an output frame has arrived. // Indicate an output frame has arrived.
rtc::scoped_ptr<EventWrapper> output_frame_event_; rtc::scoped_ptr<EventWrapper> output_frame_event_;
// Output delivered frames of ViECaptuer. // Output delivered frames of VideoCaptureInput.
ScopedVector<VideoFrame> output_frames_; ScopedVector<VideoFrame> output_frames_;
// The pointers of Y plane buffers of output frames. This is used to verify // The pointers of Y plane buffers of output frames. This is used to verify
// the frame are swapped and not copied. // the frame are swapped and not copied.
std::vector<const uint8_t*> output_frame_ybuffers_; std::vector<const uint8_t*> output_frame_ybuffers_;
SendStatisticsProxy stats_proxy_;
}; };
TEST_F(ViECapturerTest, DoesNotRetainHandleNorCopyBuffer) { TEST_F(VideoCaptureInputTest, DoesNotRetainHandleNorCopyBuffer) {
// Indicate an output frame has arrived. // Indicate an output frame has arrived.
rtc::scoped_ptr<EventWrapper> frame_destroyed_event(EventWrapper::Create()); rtc::scoped_ptr<EventWrapper> frame_destroyed_event(EventWrapper::Create());
class TestBuffer : public webrtc::I420Buffer { class TestBuffer : public webrtc::I420Buffer {
public: public:
TestBuffer(EventWrapper* event) : I420Buffer(5, 5), event_(event) {} explicit TestBuffer(EventWrapper* event)
: I420Buffer(5, 5), event_(event) {}
private: private:
friend class rtc::RefCountedObject<TestBuffer>; friend class rtc::RefCountedObject<TestBuffer>;
@@ -134,7 +138,7 @@ TEST_F(ViECapturerTest, DoesNotRetainHandleNorCopyBuffer) {
EXPECT_EQ(kEventSignaled, frame_destroyed_event->Wait(FRAME_TIMEOUT_MS)); EXPECT_EQ(kEventSignaled, frame_destroyed_event->Wait(FRAME_TIMEOUT_MS));
} }
TEST_F(ViECapturerTest, TestNtpTimeStampSetIfRenderTimeSet) { TEST_F(VideoCaptureInputTest, TestNtpTimeStampSetIfRenderTimeSet) {
input_frames_.push_back(CreateVideoFrame(static_cast<uint8_t>(0))); input_frames_.push_back(CreateVideoFrame(static_cast<uint8_t>(0)));
input_frames_[0]->set_render_time_ms(5); input_frames_[0]->set_render_time_ms(5);
input_frames_[0]->set_ntp_time_ms(0); input_frames_[0]->set_ntp_time_ms(0);
@@ -145,7 +149,7 @@ TEST_F(ViECapturerTest, TestNtpTimeStampSetIfRenderTimeSet) {
input_frames_[0]->render_time_ms()); input_frames_[0]->render_time_ms());
} }
TEST_F(ViECapturerTest, TestRtpTimeStampSet) { TEST_F(VideoCaptureInputTest, TestRtpTimeStampSet) {
input_frames_.push_back(CreateVideoFrame(static_cast<uint8_t>(0))); input_frames_.push_back(CreateVideoFrame(static_cast<uint8_t>(0)));
input_frames_[0]->set_render_time_ms(0); input_frames_[0]->set_render_time_ms(0);
input_frames_[0]->set_ntp_time_ms(1); input_frames_[0]->set_ntp_time_ms(1);
@@ -157,7 +161,7 @@ TEST_F(ViECapturerTest, TestRtpTimeStampSet) {
input_frames_[0]->ntp_time_ms() * 90); input_frames_[0]->ntp_time_ms() * 90);
} }
TEST_F(ViECapturerTest, TestTextureFrames) { TEST_F(VideoCaptureInputTest, TestTextureFrames) {
const int kNumFrame = 3; const int kNumFrame = 3;
for (int i = 0 ; i < kNumFrame; ++i) { for (int i = 0 ; i < kNumFrame; ++i) {
test::FakeNativeHandle* dummy_handle = new test::FakeNativeHandle(); test::FakeNativeHandle* dummy_handle = new test::FakeNativeHandle();
@@ -172,7 +176,7 @@ TEST_F(ViECapturerTest, TestTextureFrames) {
EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_)); EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_));
} }
TEST_F(ViECapturerTest, TestI420Frames) { TEST_F(VideoCaptureInputTest, TestI420Frames) {
const int kNumFrame = 4; const int kNumFrame = 4;
std::vector<const uint8_t*> ybuffer_pointers; std::vector<const uint8_t*> ybuffer_pointers;
for (int i = 0; i < kNumFrame; ++i) { for (int i = 0; i < kNumFrame; ++i) {
@@ -189,7 +193,7 @@ TEST_F(ViECapturerTest, TestI420Frames) {
EXPECT_EQ(ybuffer_pointers[i], output_frame_ybuffers_[i]); EXPECT_EQ(ybuffer_pointers[i], output_frame_ybuffers_[i]);
} }
TEST_F(ViECapturerTest, TestI420FrameAfterTextureFrame) { TEST_F(VideoCaptureInputTest, TestI420FrameAfterTextureFrame) {
test::FakeNativeHandle* dummy_handle = new test::FakeNativeHandle(); test::FakeNativeHandle* dummy_handle = new test::FakeNativeHandle();
input_frames_.push_back(new VideoFrame(test::CreateFakeNativeHandleFrame( input_frames_.push_back(new VideoFrame(test::CreateFakeNativeHandleFrame(
dummy_handle, 1, 1, 1, 1, webrtc::kVideoRotation_0))); dummy_handle, 1, 1, 1, 1, webrtc::kVideoRotation_0)));
@@ -204,7 +208,7 @@ TEST_F(ViECapturerTest, TestI420FrameAfterTextureFrame) {
EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_)); EXPECT_TRUE(EqualFramesVector(input_frames_, output_frames_));
} }
TEST_F(ViECapturerTest, TestTextureFrameAfterI420Frame) { TEST_F(VideoCaptureInputTest, TestTextureFrameAfterI420Frame) {
input_frames_.push_back(CreateVideoFrame(1)); input_frames_.push_back(CreateVideoFrame(1));
AddInputFrame(input_frames_[0]); AddInputFrame(input_frames_[0]);
WaitOutputFrame(); WaitOutputFrame();
@@ -267,9 +271,8 @@ VideoFrame* CreateVideoFrame(uint8_t data) {
const int kSizeY = width * height * 2; const int kSizeY = width * height * 2;
uint8_t buffer[kSizeY]; uint8_t buffer[kSizeY];
memset(buffer, data, kSizeY); memset(buffer, data, kSizeY);
frame->CreateFrame( frame->CreateFrame(buffer, buffer, buffer, width, height, width, width / 2,
buffer, buffer, buffer, width, height, width, width / 2);
width / 2, width / 2);
frame->set_render_time_ms(data); frame->set_render_time_ms(data);
return frame; return frame;
} }

View File

@@ -19,8 +19,8 @@
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/logging.h"
#include "webrtc/system_wrappers/interface/trace_event.h" #include "webrtc/system_wrappers/interface/trace_event.h"
#include "webrtc/video/video_capture_input.h"
#include "webrtc/video_engine/encoder_state_feedback.h" #include "webrtc/video_engine/encoder_state_feedback.h"
#include "webrtc/video_engine/vie_capturer.h"
#include "webrtc/video_engine/vie_channel.h" #include "webrtc/video_engine/vie_channel.h"
#include "webrtc/video_engine/vie_channel_group.h" #include "webrtc/video_engine/vie_channel_group.h"
#include "webrtc/video_engine/vie_defines.h" #include "webrtc/video_engine/vie_defines.h"
@@ -174,7 +174,9 @@ VideoSendStream::VideoSendStream(
vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str()); vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str());
vie_capturer_ = new ViECapturer(module_process_thread_, vie_encoder_); input_.reset(new internal::VideoCaptureInput(
module_process_thread_, vie_encoder_, config_.local_renderer,
&stats_proxy_, overuse_observer));
// 28 to match packet overhead in ModuleRtpRtcpImpl. // 28 to match packet overhead in ModuleRtpRtcpImpl.
DCHECK_LE(config_.rtp.max_packet_size, static_cast<size_t>(0xFFFF - 28)); DCHECK_LE(config_.rtp.max_packet_size, static_cast<size_t>(0xFFFF - 28));
@@ -190,12 +192,6 @@ VideoSendStream::VideoSendStream(
CHECK(ReconfigureVideoEncoder(encoder_config)); CHECK(ReconfigureVideoEncoder(encoder_config));
if (overuse_observer) {
vie_capturer_->RegisterCpuOveruseObserver(overuse_observer);
}
// Registered regardless of monitoring, used for stats.
vie_capturer_->RegisterCpuOveruseMetricsObserver(&stats_proxy_);
vie_channel_->RegisterSendSideDelayObserver(&stats_proxy_); vie_channel_->RegisterSendSideDelayObserver(&stats_proxy_);
vie_encoder_->RegisterSendStatisticsProxy(&stats_proxy_); vie_encoder_->RegisterSendStatisticsProxy(&stats_proxy_);
@@ -233,8 +229,9 @@ VideoSendStream::~VideoSendStream() {
vie_encoder_->RegisterPreEncodeCallback(nullptr); vie_encoder_->RegisterPreEncodeCallback(nullptr);
vie_encoder_->RegisterPostEncodeImageCallback(nullptr); vie_encoder_->RegisterPostEncodeImageCallback(nullptr);
vie_capturer_->RegisterCpuOveruseObserver(nullptr); // Remove capture input (thread) so that it's not running after the current
delete vie_capturer_; // channel is deleted.
input_.reset();
vie_encoder_->DeRegisterExternalEncoder( vie_encoder_->DeRegisterExternalEncoder(
config_.encoder_settings.payload_type); config_.encoder_settings.payload_type);
@@ -242,17 +239,10 @@ VideoSendStream::~VideoSendStream() {
channel_group_->DeleteChannel(channel_id_); channel_group_->DeleteChannel(channel_id_);
} }
void VideoSendStream::IncomingCapturedFrame(const VideoFrame& frame) { VideoCaptureInput* VideoSendStream::Input() {
// TODO(pbos): Local rendering should not be done on the capture thread. return input_.get();
if (config_.local_renderer != nullptr)
config_.local_renderer->RenderFrame(frame, 0);
stats_proxy_.OnIncomingFrame();
vie_capturer_->IncomingFrame(frame);
} }
VideoSendStreamInput* VideoSendStream::Input() { return this; }
void VideoSendStream::Start() { void VideoSendStream::Start() {
transport_adapter_.Enable(); transport_adapter_.Enable();
vie_encoder_->Pause(); vie_encoder_->Pause();

View File

@@ -20,6 +20,7 @@
#include "webrtc/video/encoded_frame_callback_adapter.h" #include "webrtc/video/encoded_frame_callback_adapter.h"
#include "webrtc/video/send_statistics_proxy.h" #include "webrtc/video/send_statistics_proxy.h"
#include "webrtc/video/transport_adapter.h" #include "webrtc/video/transport_adapter.h"
#include "webrtc/video/video_capture_input.h"
#include "webrtc/video_receive_stream.h" #include "webrtc/video_receive_stream.h"
#include "webrtc/video_send_stream.h" #include "webrtc/video_send_stream.h"
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
@@ -29,14 +30,12 @@ namespace webrtc {
class ChannelGroup; class ChannelGroup;
class CpuOveruseObserver; class CpuOveruseObserver;
class ProcessThread; class ProcessThread;
class ViECapturer;
class ViEChannel; class ViEChannel;
class ViEEncoder; class ViEEncoder;
namespace internal { namespace internal {
class VideoSendStream : public webrtc::VideoSendStream, class VideoSendStream : public webrtc::VideoSendStream {
public VideoSendStreamInput {
public: public:
VideoSendStream(newapi::Transport* transport, VideoSendStream(newapi::Transport* transport,
CpuOveruseObserver* overuse_observer, CpuOveruseObserver* overuse_observer,
@@ -50,6 +49,8 @@ class VideoSendStream : public webrtc::VideoSendStream,
virtual ~VideoSendStream(); virtual ~VideoSendStream();
VideoCaptureInput* Input() override;
void Start() override; void Start() override;
void Stop() override; void Stop() override;
@@ -59,12 +60,6 @@ class VideoSendStream : public webrtc::VideoSendStream,
bool DeliverRtcp(const uint8_t* packet, size_t length); bool DeliverRtcp(const uint8_t* packet, size_t length);
// From VideoSendStreamInput.
void IncomingCapturedFrame(const VideoFrame& frame) override;
// From webrtc::VideoSendStream.
VideoSendStreamInput* Input() override;
typedef std::map<uint32_t, RtpState> RtpStateMap; typedef std::map<uint32_t, RtpState> RtpStateMap;
RtpStateMap GetRtpStates() const; RtpStateMap GetRtpStates() const;
@@ -85,9 +80,9 @@ class VideoSendStream : public webrtc::VideoSendStream,
ChannelGroup* const channel_group_; ChannelGroup* const channel_group_;
const int channel_id_; const int channel_id_;
rtc::scoped_ptr<VideoCaptureInput> input_;
ViEChannel* vie_channel_; ViEChannel* vie_channel_;
ViEEncoder* vie_encoder_; ViEEncoder* vie_encoder_;
ViECapturer* vie_capturer_;
// 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
// start bitrate initially, instead of the one reported by VideoEngine (which // start bitrate initially, instead of the one reported by VideoEngine (which

View File

@@ -33,6 +33,8 @@
'video/send_statistics_proxy.h', 'video/send_statistics_proxy.h',
'video/transport_adapter.cc', 'video/transport_adapter.cc',
'video/transport_adapter.h', 'video/transport_adapter.h',
'video/video_capture_input.cc',
'video/video_capture_input.h',
'video/video_decoder.cc', 'video/video_decoder.cc',
'video/video_encoder.cc', 'video/video_encoder.cc',
'video/video_receive_stream.cc', 'video/video_receive_stream.cc',
@@ -51,8 +53,6 @@
'video_engine/report_block_stats.h', 'video_engine/report_block_stats.h',
'video_engine/stream_synchronization.cc', 'video_engine/stream_synchronization.cc',
'video_engine/stream_synchronization.h', 'video_engine/stream_synchronization.h',
'video_engine/vie_capturer.cc',
'video_engine/vie_capturer.h',
'video_engine/vie_channel.cc', 'video_engine/vie_channel.cc',
'video_engine/vie_channel.h', 'video_engine/vie_channel.h',
'video_engine/vie_channel_group.cc', 'video_engine/vie_channel_group.cc',

View File

@@ -52,18 +52,15 @@ const float kMaxExp = 7.0f;
} // namespace } // namespace
// TODO(asapersson): Remove this class. Not used. // TODO(asapersson): Remove this class. Not used.
Statistics::Statistics() : Statistics::Statistics(const CpuOveruseOptions& options)
sum_(0.0), : sum_(0.0),
count_(0), count_(0),
options_(options),
filtered_samples_(new rtc::ExpFilter(kWeightFactorMean)), filtered_samples_(new rtc::ExpFilter(kWeightFactorMean)),
filtered_variance_(new rtc::ExpFilter(kWeightFactor)) { filtered_variance_(new rtc::ExpFilter(kWeightFactor)) {
Reset(); Reset();
} }
void Statistics::SetOptions(const CpuOveruseOptions& options) {
options_ = options;
}
void Statistics::Reset() { void Statistics::Reset() {
sum_ = 0.0; sum_ = 0.0;
count_ = 0; count_ = 0;
@@ -143,22 +140,19 @@ class OveruseFrameDetector::EncodeTimeAvg {
// captured frames). // captured frames).
class OveruseFrameDetector::SendProcessingUsage { class OveruseFrameDetector::SendProcessingUsage {
public: public:
SendProcessingUsage() explicit SendProcessingUsage(const CpuOveruseOptions& options)
: kWeightFactorFrameDiff(0.998f), : kWeightFactorFrameDiff(0.998f),
kWeightFactorProcessing(0.995f), kWeightFactorProcessing(0.995f),
kInitialSampleDiffMs(40.0f), kInitialSampleDiffMs(40.0f),
kMaxSampleDiffMs(45.0f), kMaxSampleDiffMs(45.0f),
count_(0), count_(0),
options_(options),
filtered_processing_ms_(new rtc::ExpFilter(kWeightFactorProcessing)), filtered_processing_ms_(new rtc::ExpFilter(kWeightFactorProcessing)),
filtered_frame_diff_ms_(new rtc::ExpFilter(kWeightFactorFrameDiff)) { filtered_frame_diff_ms_(new rtc::ExpFilter(kWeightFactorFrameDiff)) {
Reset(); Reset();
} }
~SendProcessingUsage() {} ~SendProcessingUsage() {}
void SetOptions(const CpuOveruseOptions& options) {
options_ = options;
}
void Reset() { void Reset() {
count_ = 0; count_ = 0;
filtered_frame_diff_ms_->Reset(kWeightFactorFrameDiff); filtered_frame_diff_ms_->Reset(kWeightFactorFrameDiff);
@@ -207,7 +201,7 @@ class OveruseFrameDetector::SendProcessingUsage {
const float kInitialSampleDiffMs; const float kInitialSampleDiffMs;
const float kMaxSampleDiffMs; const float kMaxSampleDiffMs;
uint64_t count_; uint64_t count_;
CpuOveruseOptions options_; const CpuOveruseOptions options_;
rtc::scoped_ptr<rtc::ExpFilter> filtered_processing_ms_; rtc::scoped_ptr<rtc::ExpFilter> filtered_processing_ms_;
rtc::scoped_ptr<rtc::ExpFilter> filtered_frame_diff_ms_; rtc::scoped_ptr<rtc::ExpFilter> filtered_frame_diff_ms_;
}; };
@@ -319,12 +313,16 @@ class OveruseFrameDetector::CaptureQueueDelay {
OveruseFrameDetector::OveruseFrameDetector( OveruseFrameDetector::OveruseFrameDetector(
Clock* clock, Clock* clock,
const CpuOveruseOptions& options,
CpuOveruseObserver* observer,
CpuOveruseMetricsObserver* metrics_observer) CpuOveruseMetricsObserver* metrics_observer)
: observer_(NULL), : options_(options),
observer_(observer),
metrics_observer_(metrics_observer), metrics_observer_(metrics_observer),
clock_(clock), clock_(clock),
next_process_time_(clock_->TimeInMilliseconds()), next_process_time_(clock_->TimeInMilliseconds()),
num_process_times_(0), num_process_times_(0),
capture_deltas_(options),
last_capture_time_(0), last_capture_time_(0),
last_overuse_time_(0), last_overuse_time_(0),
checks_above_threshold_(0), checks_above_threshold_(0),
@@ -335,34 +333,21 @@ OveruseFrameDetector::OveruseFrameDetector(
num_pixels_(0), num_pixels_(0),
last_encode_sample_ms_(0), last_encode_sample_ms_(0),
encode_time_(new EncodeTimeAvg()), encode_time_(new EncodeTimeAvg()),
usage_(new SendProcessingUsage()), usage_(new SendProcessingUsage(options)),
frame_queue_(new FrameQueue()), frame_queue_(new FrameQueue()),
last_sample_time_ms_(0), last_sample_time_ms_(0),
capture_queue_delay_(new CaptureQueueDelay()) { capture_queue_delay_(new CaptureQueueDelay()) {
DCHECK(metrics_observer != nullptr); DCHECK(metrics_observer != nullptr);
// Make sure stats are initially up-to-date. This simplifies unit testing
// since we don't have to trigger an update using one of the methods which
// would also alter the overuse state.
UpdateCpuOveruseMetrics();
processing_thread_.DetachFromThread(); processing_thread_.DetachFromThread();
} }
OveruseFrameDetector::~OveruseFrameDetector() { OveruseFrameDetector::~OveruseFrameDetector() {
} }
void OveruseFrameDetector::SetObserver(CpuOveruseObserver* observer) {
rtc::CritScope cs(&crit_);
observer_ = observer;
}
void OveruseFrameDetector::SetOptions(const CpuOveruseOptions& options) {
assert(options.min_frame_samples > 0);
rtc::CritScope cs(&crit_);
if (options_.Equals(options)) {
return;
}
options_ = options;
capture_deltas_.SetOptions(options);
usage_->SetOptions(options);
ResetAll(num_pixels_);
}
int OveruseFrameDetector::CaptureQueueDelayMsPerS() const { int OveruseFrameDetector::CaptureQueueDelayMsPerS() const {
rtc::CritScope cs(&crit_); rtc::CritScope cs(&crit_);
return capture_queue_delay_->delay_ms(); return capture_queue_delay_->delay_ms();

View File

@@ -129,11 +129,10 @@ class CpuOveruseMetricsObserver {
// TODO(pbos): Move this somewhere appropriate. // TODO(pbos): Move this somewhere appropriate.
class Statistics { class Statistics {
public: public:
Statistics(); explicit Statistics(const CpuOveruseOptions& options);
void AddSample(float sample_ms); void AddSample(float sample_ms);
void Reset(); void Reset();
void SetOptions(const CpuOveruseOptions& options);
float Mean() const; float Mean() const;
float StdDev() const; float StdDev() const;
@@ -145,7 +144,7 @@ class Statistics {
float sum_; float sum_;
uint64_t count_; uint64_t count_;
CpuOveruseOptions options_; const CpuOveruseOptions options_;
rtc::scoped_ptr<rtc::ExpFilter> filtered_samples_; rtc::scoped_ptr<rtc::ExpFilter> filtered_samples_;
rtc::scoped_ptr<rtc::ExpFilter> filtered_variance_; rtc::scoped_ptr<rtc::ExpFilter> filtered_variance_;
}; };
@@ -154,16 +153,11 @@ class Statistics {
class OveruseFrameDetector : public Module { class OveruseFrameDetector : public Module {
public: public:
OveruseFrameDetector(Clock* clock, OveruseFrameDetector(Clock* clock,
const CpuOveruseOptions& options,
CpuOveruseObserver* overuse_observer,
CpuOveruseMetricsObserver* metrics_observer); CpuOveruseMetricsObserver* metrics_observer);
~OveruseFrameDetector(); ~OveruseFrameDetector();
// Registers an observer receiving overuse and underuse callbacks. Set
// 'observer' to NULL to disable callbacks.
void SetObserver(CpuOveruseObserver* observer);
// Sets options for overuse detection.
void SetOptions(const CpuOveruseOptions& options);
// Called for each captured frame. // Called for each captured frame.
void FrameCaptured(int width, int height, int64_t capture_time_ms); void FrameCaptured(int width, int height, int64_t capture_time_ms);
@@ -215,10 +209,10 @@ class OveruseFrameDetector : public Module {
// processing contends with reading stats and the processing thread. // processing contends with reading stats and the processing thread.
mutable rtc::CriticalSection crit_; mutable rtc::CriticalSection crit_;
// Observer getting overuse reports. const CpuOveruseOptions options_;
CpuOveruseObserver* observer_ GUARDED_BY(crit_);
CpuOveruseOptions options_ GUARDED_BY(crit_); // Observer getting overuse reports.
CpuOveruseObserver* const observer_;
// Stats metrics. // Stats metrics.
CpuOveruseMetricsObserver* const metrics_observer_; CpuOveruseMetricsObserver* const metrics_observer_;

View File

@@ -53,13 +53,15 @@ class OveruseFrameDetectorTest : public ::testing::Test,
virtual void SetUp() { virtual void SetUp() {
clock_.reset(new SimulatedClock(1234)); clock_.reset(new SimulatedClock(1234));
observer_.reset(new MockCpuOveruseObserver()); observer_.reset(new MockCpuOveruseObserver());
overuse_detector_.reset(new OveruseFrameDetector(clock_.get(), this));
options_.low_capture_jitter_threshold_ms = 10.0f; options_.low_capture_jitter_threshold_ms = 10.0f;
options_.high_capture_jitter_threshold_ms = 15.0f; options_.high_capture_jitter_threshold_ms = 15.0f;
options_.min_process_count = 0; options_.min_process_count = 0;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
overuse_detector_->SetObserver(observer_.get()); }
void ReinitializeOveruseDetector() {
overuse_detector_.reset(new OveruseFrameDetector(clock_.get(), options_,
observer_.get(), this));
} }
void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override { void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override {
@@ -149,7 +151,7 @@ TEST_F(OveruseFrameDetectorTest, TriggerOveruse) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// capture_jitter > high => overuse // capture_jitter > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
@@ -159,7 +161,7 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecover) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// capture_jitter > high => overuse // capture_jitter > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
@@ -172,8 +174,8 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithNoObserver) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); overuse_detector_.reset(
overuse_detector_->SetObserver(NULL); new OveruseFrameDetector(clock_.get(), options_, nullptr, this));
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0);
@@ -184,7 +186,7 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithMethodDisabled) {
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0);
@@ -195,7 +197,7 @@ TEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(2); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(2);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
TriggerOveruse(options_.high_threshold_consecutive_count); TriggerOveruse(options_.high_threshold_consecutive_count);
@@ -207,23 +209,23 @@ TEST_F(OveruseFrameDetectorTest, TriggerUnderuseWithMinProcessCount) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
CpuOveruseObserverImpl overuse_observer_;
overuse_detector_->SetObserver(&overuse_observer_);
options_.min_process_count = 1; options_.min_process_count = 1;
overuse_detector_->SetOptions(options_); CpuOveruseObserverImpl overuse_observer;
overuse_detector_.reset(new OveruseFrameDetector(clock_.get(), options_,
&overuse_observer, this));
InsertFramesWithInterval(1200, kFrameInterval33ms, kWidth, kHeight); InsertFramesWithInterval(1200, kFrameInterval33ms, kWidth, kHeight);
overuse_detector_->Process(); overuse_detector_->Process();
EXPECT_EQ(0, overuse_observer_.normaluse_); EXPECT_EQ(0, overuse_observer.normaluse_);
clock_->AdvanceTimeMilliseconds(kProcessIntervalMs); clock_->AdvanceTimeMilliseconds(kProcessIntervalMs);
overuse_detector_->Process(); overuse_detector_->Process();
EXPECT_EQ(1, overuse_observer_.normaluse_); EXPECT_EQ(1, overuse_observer.normaluse_);
} }
TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) { TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) {
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0);
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(64); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(64);
for(size_t i = 0; i < 64; ++i) { for(size_t i = 0; i < 64; ++i) {
@@ -232,22 +234,22 @@ TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) {
} }
TEST_F(OveruseFrameDetectorTest, ConsecutiveCountTriggersOveruse) { TEST_F(OveruseFrameDetectorTest, ConsecutiveCountTriggersOveruse) {
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
options_.high_threshold_consecutive_count = 2; options_.high_threshold_consecutive_count = 2;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
TriggerOveruse(2); TriggerOveruse(2);
} }
TEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) { TEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) {
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
options_.enable_capture_jitter_method = true; options_.enable_capture_jitter_method = true;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
options_.high_threshold_consecutive_count = 2; options_.high_threshold_consecutive_count = 2;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
TriggerOveruse(1); TriggerOveruse(1);
} }
@@ -279,19 +281,9 @@ TEST_F(OveruseFrameDetectorTest, CaptureJitterResetAfterFrameTimeout) {
EXPECT_EQ(InitialJitter(), CaptureJitterMs()); EXPECT_EQ(InitialJitter(), CaptureJitterMs());
} }
TEST_F(OveruseFrameDetectorTest, CaptureJitterResetAfterChangingThreshold) {
EXPECT_EQ(InitialJitter(), CaptureJitterMs());
options_.high_capture_jitter_threshold_ms = 90.0f;
overuse_detector_->SetOptions(options_);
EXPECT_EQ(InitialJitter(), CaptureJitterMs());
options_.low_capture_jitter_threshold_ms = 30.0f;
overuse_detector_->SetOptions(options_);
EXPECT_EQ(InitialJitter(), CaptureJitterMs());
}
TEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdatingCaptureJitter) { TEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdatingCaptureJitter) {
options_.min_frame_samples = 40; options_.min_frame_samples = 40;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
InsertFramesWithInterval(40, kFrameInterval33ms, kWidth, kHeight); InsertFramesWithInterval(40, kFrameInterval33ms, kWidth, kHeight);
EXPECT_EQ(InitialJitter(), CaptureJitterMs()); EXPECT_EQ(InitialJitter(), CaptureJitterMs());
} }
@@ -351,7 +343,7 @@ TEST_F(OveruseFrameDetectorTest, CaptureQueueDelayNoMatchingCapturedFrame) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrameDisabled) { TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrameDisabled) {
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs = 100; const int kProcessingTimeMs = 100;
overuse_detector_->FrameCaptured(kWidth, kHeight, 33); overuse_detector_->FrameCaptured(kWidth, kHeight, 33);
clock_->AdvanceTimeMilliseconds(kProcessingTimeMs); clock_->AdvanceTimeMilliseconds(kProcessingTimeMs);
@@ -361,7 +353,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrameDisabled) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrame) { TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrame) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs = 100; const int kProcessingTimeMs = 100;
overuse_detector_->FrameCaptured(kWidth, kHeight, 33); overuse_detector_->FrameCaptured(kWidth, kHeight, 33);
clock_->AdvanceTimeMilliseconds(kProcessingTimeMs); clock_->AdvanceTimeMilliseconds(kProcessingTimeMs);
@@ -373,7 +365,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_OneFrame) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_TwoFrames) { TEST_F(OveruseFrameDetectorTest, FrameDelay_TwoFrames) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs1 = 100; const int kProcessingTimeMs1 = 100;
const int kProcessingTimeMs2 = 50; const int kProcessingTimeMs2 = 50;
const int kTimeBetweenFramesMs = 200; const int kTimeBetweenFramesMs = 200;
@@ -390,7 +382,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_TwoFrames) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_MaxQueueSize) { TEST_F(OveruseFrameDetectorTest, FrameDelay_MaxQueueSize) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kMaxQueueSize = 91; const int kMaxQueueSize = 91;
for (int i = 0; i < kMaxQueueSize * 2; ++i) { for (int i = 0; i < kMaxQueueSize * 2; ++i) {
overuse_detector_->FrameCaptured(kWidth, kHeight, i); overuse_detector_->FrameCaptured(kWidth, kHeight, i);
@@ -400,7 +392,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_MaxQueueSize) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_NonProcessedFramesRemoved) { TEST_F(OveruseFrameDetectorTest, FrameDelay_NonProcessedFramesRemoved) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs = 100; const int kProcessingTimeMs = 100;
overuse_detector_->FrameCaptured(kWidth, kHeight, 33); overuse_detector_->FrameCaptured(kWidth, kHeight, 33);
clock_->AdvanceTimeMilliseconds(kProcessingTimeMs); clock_->AdvanceTimeMilliseconds(kProcessingTimeMs);
@@ -423,7 +415,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_NonProcessedFramesRemoved) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_ResetClearsFrames) { TEST_F(OveruseFrameDetectorTest, FrameDelay_ResetClearsFrames) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs = 100; const int kProcessingTimeMs = 100;
overuse_detector_->FrameCaptured(kWidth, kHeight, 33); overuse_detector_->FrameCaptured(kWidth, kHeight, 33);
EXPECT_EQ(1, overuse_detector_->FramesInQueue()); EXPECT_EQ(1, overuse_detector_->FramesInQueue());
@@ -439,7 +431,7 @@ TEST_F(OveruseFrameDetectorTest, FrameDelay_ResetClearsFrames) {
TEST_F(OveruseFrameDetectorTest, FrameDelay_NonMatchingSendFrameIgnored) { TEST_F(OveruseFrameDetectorTest, FrameDelay_NonMatchingSendFrameIgnored) {
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
const int kProcessingTimeMs = 100; const int kProcessingTimeMs = 100;
overuse_detector_->FrameCaptured(kWidth, kHeight, 33); overuse_detector_->FrameCaptured(kWidth, kHeight, 33);
clock_->AdvanceTimeMilliseconds(kProcessingTimeMs); clock_->AdvanceTimeMilliseconds(kProcessingTimeMs);
@@ -470,16 +462,6 @@ TEST_F(OveruseFrameDetectorTest, ProcessingUsage) {
EXPECT_EQ(kProcessingTimeMs * 100 / kFrameInterval33ms, UsagePercent()); EXPECT_EQ(kProcessingTimeMs * 100 / kFrameInterval33ms, UsagePercent());
} }
TEST_F(OveruseFrameDetectorTest, ProcessingUsageResetAfterChangingThreshold) {
EXPECT_EQ(InitialUsage(), UsagePercent());
options_.high_encode_usage_threshold_percent = 100;
overuse_detector_->SetOptions(options_);
EXPECT_EQ(InitialUsage(), UsagePercent());
options_.low_encode_usage_threshold_percent = 20;
overuse_detector_->SetOptions(options_);
EXPECT_EQ(InitialUsage(), UsagePercent());
}
// enable_encode_usage_method = true; // enable_encode_usage_method = true;
// UsagePercent() > high_encode_usage_threshold_percent => overuse. // UsagePercent() > high_encode_usage_threshold_percent => overuse.
// UsagePercent() < low_encode_usage_threshold_percent => underuse. // UsagePercent() < low_encode_usage_threshold_percent => underuse.
@@ -487,7 +469,7 @@ TEST_F(OveruseFrameDetectorTest, TriggerOveruseWithProcessingUsage) {
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = true; options_.enable_encode_usage_method = true;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);
@@ -497,7 +479,7 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithProcessingUsage) {
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = true; options_.enable_encode_usage_method = true;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);
@@ -511,7 +493,7 @@ TEST_F(OveruseFrameDetectorTest,
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = false; options_.enable_extended_processing_usage = false;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);
@@ -528,7 +510,7 @@ TEST_F(OveruseFrameDetectorTest, TriggerOveruseWithExtendedProcessingUsage) {
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = true; options_.enable_encode_usage_method = true;
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);
@@ -538,7 +520,7 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithExtendedProcessingUsage) {
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = true; options_.enable_encode_usage_method = true;
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);
@@ -552,7 +534,7 @@ TEST_F(OveruseFrameDetectorTest,
options_.enable_capture_jitter_method = false; options_.enable_capture_jitter_method = false;
options_.enable_encode_usage_method = false; options_.enable_encode_usage_method = false;
options_.enable_extended_processing_usage = true; options_.enable_extended_processing_usage = true;
overuse_detector_->SetOptions(options_); ReinitializeOveruseDetector();
// usage > high => overuse // usage > high => overuse
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count); TriggerOveruseWithProcessingUsage(options_.high_threshold_consecutive_count);

View File

@@ -29,7 +29,6 @@
'payload_router_unittest.cc', 'payload_router_unittest.cc',
'report_block_stats_unittest.cc', 'report_block_stats_unittest.cc',
'stream_synchronization_unittest.cc', 'stream_synchronization_unittest.cc',
'vie_capturer_unittest.cc',
'vie_codec_unittest.cc', 'vie_codec_unittest.cc',
'vie_remb_unittest.cc', 'vie_remb_unittest.cc',
], ],

View File

@@ -36,13 +36,6 @@ enum { kViEMinKeyRequestIntervalMs = 300 };
// ViEBase // ViEBase
enum { kViEMaxNumberOfChannels = 64 }; enum { kViEMaxNumberOfChannels = 64 };
// ViECapture
enum { kViEMaxCaptureDevices = 256 };
enum { kViECaptureDefaultWidth = 352 };
enum { kViECaptureDefaultHeight = 288 };
enum { kViECaptureDefaultFramerate = 30 };
enum { kViECaptureMaxSnapshotWaitTimeMs = 500 };
// ViECodec // ViECodec
enum { kViEMaxCodecWidth = 4096 }; enum { kViEMaxCodecWidth = 4096 };
enum { kViEMaxCodecHeight = 3072 }; enum { kViEMaxCodecHeight = 3072 };
@@ -72,8 +65,6 @@ enum { kMaxNackListSize = 250 };
enum { enum {
kViEChannelIdBase = 0x0, kViEChannelIdBase = 0x0,
kViEChannelIdMax = 0xFF, kViEChannelIdMax = 0xFF,
kViECaptureIdBase = 0x1001,
kViECaptureIdMax = 0x10FF,
kViEDummyChannelId = 0xFFFF kViEDummyChannelId = 0xFFFF
}; };

View File

@@ -25,7 +25,7 @@
#include "webrtc/modules/video_coding/main/interface/video_coding_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/modules/video_processing/main/interface/video_processing.h"
#include "webrtc/typedefs.h" #include "webrtc/typedefs.h"
#include "webrtc/video_engine/vie_capturer.h" #include "webrtc/video/video_capture_input.h"
#include "webrtc/video_engine/vie_defines.h" #include "webrtc/video_engine/vie_defines.h"
namespace webrtc { namespace webrtc {
@@ -63,12 +63,11 @@ class ViEEncoderObserver {
virtual ~ViEEncoderObserver() {} virtual ~ViEEncoderObserver() {}
}; };
class ViEEncoder class ViEEncoder : public RtcpIntraFrameObserver,
: public RtcpIntraFrameObserver,
public VideoEncoderRateObserver, public VideoEncoderRateObserver,
public VCMPacketizationCallback, public VCMPacketizationCallback,
public VCMSendStatisticsCallback, public VCMSendStatisticsCallback,
public ViEFrameCallback { public VideoCaptureCallback {
public: public:
friend class ViEBitrateObserver; friend class ViEBitrateObserver;
@@ -122,7 +121,7 @@ class ViEEncoder
// Scale or crop/pad image. // Scale or crop/pad image.
int32_t ScaleInputImage(bool enable); int32_t ScaleInputImage(bool enable);
// Implementing ViEFrameCallback. // Implementing VideoCaptureCallback.
void DeliverFrame(VideoFrame video_frame) override; void DeliverFrame(VideoFrame video_frame) override;
int32_t SendKeyFrame(); int32_t SendKeyFrame();

View File

@@ -24,7 +24,7 @@ namespace webrtc {
class VideoEncoder; class VideoEncoder;
// Class to deliver captured frame to the video send stream. // Class to deliver captured frame to the video send stream.
class VideoSendStreamInput { class VideoCaptureInput {
public: public:
// These methods do not lock internally and must be called sequentially. // These methods do not lock internally and must be called sequentially.
// If your application switches input sources synchronization must be done // If your application switches input sources synchronization must be done
@@ -32,7 +32,7 @@ class VideoSendStreamInput {
virtual void IncomingCapturedFrame(const VideoFrame& video_frame) = 0; virtual void IncomingCapturedFrame(const VideoFrame& video_frame) = 0;
protected: protected:
virtual ~VideoSendStreamInput() {} virtual ~VideoCaptureInput() {}
}; };
class VideoSendStream { class VideoSendStream {
@@ -138,7 +138,7 @@ class VideoSendStream {
// Gets interface used to insert captured frames. Valid as long as the // Gets interface used to insert captured frames. Valid as long as the
// VideoSendStream is valid. // VideoSendStream is valid.
virtual VideoSendStreamInput* Input() = 0; virtual VideoCaptureInput* Input() = 0;
virtual void Start() = 0; virtual void Start() = 0;
virtual void Stop() = 0; virtual void Stop() = 0;

View File

@@ -150,6 +150,7 @@
'video/bitrate_estimator_tests.cc', 'video/bitrate_estimator_tests.cc',
'video/end_to_end_tests.cc', 'video/end_to_end_tests.cc',
'video/send_statistics_proxy_unittest.cc', 'video/send_statistics_proxy_unittest.cc',
'video/video_capture_input_unittest.cc',
'video/video_decoder_unittest.cc', 'video/video_decoder_unittest.cc',
'video/video_encoder_unittest.cc', 'video/video_encoder_unittest.cc',
'video/video_send_stream_tests.cc', 'video/video_send_stream_tests.cc',