Add OveruseFrameDetector tests with random inter-frame intervals

This is a reland of the tests added in the reverted cl
https://webrtc-review.googlesource.com/c/src/+/23720, with
expectations relaxed to make tests pass also with the current (old)
estimator.

Bug: webrtc:8504
Change-Id: I69fd8cc7e87e05b24be75b146f1cac91c5f96f46
Reviewed-on: https://webrtc-review.googlesource.com/30142
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21243}
This commit is contained in:
Niels Möller 2017-12-13 13:03:10 +01:00 committed by Commit Bot
parent e7e51f0b99
commit e541be78f9

View File

@ -15,6 +15,7 @@
#include "modules/video_coding/utility/quality_scaler.h"
#include "rtc_base/event.h"
#include "rtc_base/fakeclock.h"
#include "rtc_base/random.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "video/overuse_frame_detector.h"
@ -22,6 +23,7 @@
namespace webrtc {
using ::testing::InvokeWithoutArgs;
using ::testing::_;
namespace {
const int kWidth = 640;
@ -108,6 +110,33 @@ class OveruseFrameDetectorTest : public ::testing::Test,
}
}
void InsertAndSendFramesWithRandomInterval(int num_frames,
int min_interval_us,
int max_interval_us,
int width,
int height,
int delay_us) {
webrtc::Random random(17);
VideoFrame frame(I420Buffer::Create(width, height),
webrtc::kVideoRotation_0, 0);
uint32_t timestamp = 0;
while (num_frames-- > 0) {
frame.set_timestamp(timestamp);
int interval_us = random.Rand(min_interval_us, max_interval_us);
overuse_detector_->FrameCaptured(frame, rtc::TimeMicros());
clock_.AdvanceTimeMicros(delay_us);
overuse_detector_->FrameSent(timestamp, rtc::TimeMicros());
overuse_detector_->CheckForOveruse();
// Avoid turning clock backwards.
if (interval_us > delay_us)
clock_.AdvanceTimeMicros(interval_us - delay_us);
timestamp += interval_us * 90 / 1000;
}
}
void ForceUpdate(int width, int height) {
// Insert one frame, wait a second and then put in another to force update
// the usage. From the tests where these are used, adding another sample
@ -478,4 +507,63 @@ TEST_F(OveruseFrameDetectorTest, LimitsMaxFrameInterval) {
}
}
// Models screencast, with irregular arrival of frames which are heavy
// to encode.
TEST_F(OveruseFrameDetectorTest, NoOveruseForLargeRandomFrameInterval) {
// TODO(bugs.webrtc.org/8504): When new estimator is relanded,
// behavior is improved in this scenario, with only AdaptUp events,
// and estimated load closer to the true average.
// EXPECT_CALL(*(observer_.get()), AdaptDown(_)).Times(0);
// EXPECT_CALL(*(observer_.get()), AdaptUp(reason_))
// .Times(testing::AtLeast(1));
const int kNumFrames = 500;
const int kEncodeTimeUs = 100 * rtc::kNumMicrosecsPerMillisec;
const int kMinIntervalUs = 30 * rtc::kNumMicrosecsPerMillisec;
const int kMaxIntervalUs = 1000 * rtc::kNumMicrosecsPerMillisec;
const int kTargetFramerate = 5;
overuse_detector_->OnTargetFramerateUpdated(kTargetFramerate);
InsertAndSendFramesWithRandomInterval(kNumFrames,
kMinIntervalUs, kMaxIntervalUs,
kWidth, kHeight, kEncodeTimeUs);
// Average usage 19%. Check that estimate is in the right ball park.
// EXPECT_NEAR(UsagePercent(), 20, 10);
EXPECT_NEAR(UsagePercent(), 20, 35);
}
// Models screencast, with irregular arrival of frames, often
// exceeding the timeout interval.
TEST_F(OveruseFrameDetectorTest, NoOveruseForRandomFrameIntervalWithReset) {
// TODO(bugs.webrtc.org/8504): When new estimator is relanded,
// behavior is improved in this scenario, and we get AdaptUp events.
EXPECT_CALL(*(observer_.get()), AdaptDown(_)).Times(0);
// EXPECT_CALL(*(observer_.get()), AdaptUp(reason_))
// .Times(testing::AtLeast(1));
const int kNumFrames = 500;
const int kEncodeTimeUs = 100 * rtc::kNumMicrosecsPerMillisec;
const int kMinIntervalUs = 30 * rtc::kNumMicrosecsPerMillisec;
const int kMaxIntervalUs = 3000 * rtc::kNumMicrosecsPerMillisec;
const int kTargetFramerate = 5;
overuse_detector_->OnTargetFramerateUpdated(kTargetFramerate);
InsertAndSendFramesWithRandomInterval(kNumFrames,
kMinIntervalUs, kMaxIntervalUs,
kWidth, kHeight, kEncodeTimeUs);
// Average usage 6.6%, but since the frame_timeout_interval_ms is
// only 1500 ms, we often reset the estimate to the initial value.
// Check that estimate is in the right ball park.
EXPECT_GE(UsagePercent(), 1);
EXPECT_LE(UsagePercent(), InitialUsage() + 5);
}
} // namespace webrtc