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:
parent
e7e51f0b99
commit
e541be78f9
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user