Added ViE API for getting overuse measure.

R=mflodman@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5141 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
asapersson@webrtc.org 2013-11-20 13:51:40 +00:00
parent d29d4e9c08
commit b24d33565c
8 changed files with 58 additions and 1 deletions

View File

@ -120,6 +120,11 @@ class WEBRTC_DLLEXPORT ViEBase {
virtual int RegisterCpuOveruseObserver(int channel, virtual int RegisterCpuOveruseObserver(int channel,
CpuOveruseObserver* observer) = 0; CpuOveruseObserver* observer) = 0;
// Gets the last cpu overuse measure.
// TODO(asapersson): Remove default implementation.
virtual int CpuOveruseMeasure(int channel,
int* capture_jitter_ms) { return -1; }
// Specifies the VoiceEngine and VideoEngine channel pair to use for // Specifies the VoiceEngine and VideoEngine channel pair to use for
// audio/video synchronization. // audio/video synchronization.
virtual int ConnectAudioChannel(const int video_channel, virtual int ConnectAudioChannel(const int video_channel,

View File

@ -116,7 +116,8 @@ OveruseFrameDetector::OveruseFrameDetector(Clock* clock,
last_rampup_time_(0), last_rampup_time_(0),
in_quick_rampup_(false), in_quick_rampup_(false),
current_rampup_delay_ms_(kStandardRampUpDelayMs), current_rampup_delay_ms_(kStandardRampUpDelayMs),
num_pixels_(0) {} num_pixels_(0),
last_capture_jitter_ms_(-1) {}
OveruseFrameDetector::~OveruseFrameDetector() { OveruseFrameDetector::~OveruseFrameDetector() {
} }
@ -144,6 +145,11 @@ void OveruseFrameDetector::FrameCaptured(int width, int height) {
last_capture_time_ = time; last_capture_time_ = time;
} }
int OveruseFrameDetector::last_capture_jitter_ms() {
CriticalSectionScoped cs(crit_.get());
return last_capture_jitter_ms_;
}
int32_t OveruseFrameDetector::TimeUntilNextProcess() { int32_t OveruseFrameDetector::TimeUntilNextProcess() {
CriticalSectionScoped cs(crit_.get()); CriticalSectionScoped cs(crit_.get());
return next_process_time_ - clock_->TimeInMilliseconds(); return next_process_time_ - clock_->TimeInMilliseconds();
@ -208,6 +214,7 @@ int32_t OveruseFrameDetector::Process() {
overuse_stddev_ms_, overuse_stddev_ms_,
normaluse_stddev_ms_); normaluse_stddev_ms_);
last_capture_jitter_ms_ = static_cast<int>(capture_deltas_.StdDev());
return 0; return 0;
} }

View File

@ -71,6 +71,8 @@ class OveruseFrameDetector : public Module {
// Called for each captured frame. // Called for each captured frame.
void FrameCaptured(int width, int height); void FrameCaptured(int width, int height);
int last_capture_jitter_ms();
// Implements Module. // Implements Module.
virtual int32_t TimeUntilNextProcess() OVERRIDE; virtual int32_t TimeUntilNextProcess() OVERRIDE;
virtual int32_t Process() OVERRIDE; virtual int32_t Process() OVERRIDE;
@ -105,6 +107,8 @@ class OveruseFrameDetector : public Module {
// Number of pixels of last captured frame. // Number of pixels of last captured frame.
int num_pixels_; int num_pixels_;
int last_capture_jitter_ms_;
DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector); DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
}; };

View File

@ -95,4 +95,10 @@ TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) {
TriggerOveruse(); TriggerOveruse();
} }
TEST_F(OveruseFrameDetectorTest, LastCaptureJitter) {
EXPECT_EQ(-1, overuse_detector_->last_capture_jitter_ms());
TriggerOveruse();
EXPECT_GT(overuse_detector_->last_capture_jitter_ms(), 0);
}
} // namespace webrtc } // namespace webrtc

View File

@ -117,6 +117,34 @@ int ViEBaseImpl::RegisterCpuOveruseObserver(int video_channel,
return 0; return 0;
} }
int ViEBaseImpl::CpuOveruseMeasure(int video_channel, int* capture_jitter_ms) {
ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
ViEChannel* vie_channel = cs.Channel(video_channel);
if (!vie_channel) {
WEBRTC_TRACE(kTraceError,
kTraceVideo,
ViEId(shared_data_.instance_id()),
"%s: channel %d doesn't exist",
__FUNCTION__,
video_channel);
shared_data_.SetLastError(kViEBaseInvalidChannelId);
return -1;
}
ViEEncoder* vie_encoder = cs.Encoder(video_channel);
assert(vie_encoder);
ViEInputManagerScoped is(*(shared_data_.input_manager()));
ViEFrameProviderBase* provider = is.FrameProvider(vie_encoder);
if (provider) {
ViECapturer* capturer = is.Capture(provider->Id());
if (capturer) {
*capture_jitter_ms = capturer->CpuOveruseMeasure();
return 0;
}
}
return -1;
}
int ViEBaseImpl::CreateChannel(int& video_channel) { // NOLINT int ViEBaseImpl::CreateChannel(int& video_channel) { // NOLINT
WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()), WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
"%s", __FUNCTION__); "%s", __FUNCTION__);

View File

@ -33,6 +33,7 @@ class ViEBaseImpl
virtual int SetVoiceEngine(VoiceEngine* voice_engine); virtual int SetVoiceEngine(VoiceEngine* voice_engine);
virtual int RegisterCpuOveruseObserver(int channel, virtual int RegisterCpuOveruseObserver(int channel,
CpuOveruseObserver* observer); CpuOveruseObserver* observer);
virtual int CpuOveruseMeasure(int channel, int* capture_jitter_ms);
virtual int CreateChannel(int& video_channel); // NOLINT virtual int CreateChannel(int& video_channel); // NOLINT
virtual int CreateChannel(int& video_channel, // NOLINT virtual int CreateChannel(int& video_channel, // NOLINT
int original_channel); int original_channel);

View File

@ -266,6 +266,10 @@ void ViECapturer::RegisterCpuOveruseObserver(CpuOveruseObserver* observer) {
overuse_detector_->SetObserver(observer); overuse_detector_->SetObserver(observer);
} }
int ViECapturer::CpuOveruseMeasure() {
return overuse_detector_->last_capture_jitter_ms();
}
int32_t ViECapturer::SetCaptureDelay(int32_t delay_ms) { int32_t ViECapturer::SetCaptureDelay(int32_t delay_ms) {
return capture_module_->SetCaptureDelay(delay_ms); return capture_module_->SetCaptureDelay(delay_ms);
} }

View File

@ -104,6 +104,8 @@ class ViECapturer
void RegisterCpuOveruseObserver(CpuOveruseObserver* observer); void RegisterCpuOveruseObserver(CpuOveruseObserver* observer);
int CpuOveruseMeasure();
protected: protected:
ViECapturer(int capture_id, ViECapturer(int capture_id,
int engine_id, int engine_id,