Currently there is a hard limit for the estimated captured frame interval of 45ms. As the encoder utilization is calculated as (input frame interval)/(encode time), overuse signals can be triggered even though there is plenty of time to go around if the fps is low. However, in order to avoid falsly estimating low encode usage in case the capturer has a dynamic frame rate, set the frame interval based on the actual current max framerate. BUG=webrtc:4172 Review-Url: https://codereview.webrtc.org/2918143003 Cr-Commit-Position: refs/heads/master@{#18610}
81 lines
2.7 KiB
C++
81 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "webrtc/video/encoder_rtcp_feedback.h"
|
|
|
|
#include <memory>
|
|
|
|
#include "webrtc/modules/utility/include/mock/mock_process_thread.h"
|
|
#include "webrtc/test/gmock.h"
|
|
#include "webrtc/test/gtest.h"
|
|
#include "webrtc/video/send_statistics_proxy.h"
|
|
#include "webrtc/video/vie_encoder.h"
|
|
|
|
using ::testing::NiceMock;
|
|
|
|
namespace webrtc {
|
|
|
|
class MockVieEncoder : public ViEEncoder {
|
|
public:
|
|
explicit MockVieEncoder(SendStatisticsProxy* send_stats_proxy)
|
|
: ViEEncoder(1,
|
|
send_stats_proxy,
|
|
VideoSendStream::Config::EncoderSettings("fake", 0, nullptr),
|
|
nullptr,
|
|
nullptr,
|
|
std::unique_ptr<OveruseFrameDetector>()) {}
|
|
~MockVieEncoder() { Stop(); }
|
|
|
|
MOCK_METHOD1(OnReceivedIntraFrameRequest, void(size_t));
|
|
};
|
|
|
|
class VieKeyRequestTest : public ::testing::Test {
|
|
public:
|
|
VieKeyRequestTest()
|
|
: simulated_clock_(123456789),
|
|
send_stats_proxy_(&simulated_clock_,
|
|
VideoSendStream::Config(nullptr),
|
|
VideoEncoderConfig::ContentType::kRealtimeVideo),
|
|
encoder_(&send_stats_proxy_),
|
|
encoder_rtcp_feedback_(
|
|
&simulated_clock_,
|
|
std::vector<uint32_t>(1, VieKeyRequestTest::kSsrc),
|
|
&encoder_) {}
|
|
|
|
protected:
|
|
const uint32_t kSsrc = 1234;
|
|
|
|
SimulatedClock simulated_clock_;
|
|
SendStatisticsProxy send_stats_proxy_;
|
|
MockVieEncoder encoder_;
|
|
EncoderRtcpFeedback encoder_rtcp_feedback_;
|
|
};
|
|
|
|
TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) {
|
|
EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
}
|
|
|
|
TEST_F(VieKeyRequestTest, TooManyOnReceivedIntraFrameRequest) {
|
|
EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
simulated_clock_.AdvanceTimeMilliseconds(10);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
|
|
EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
|
|
simulated_clock_.AdvanceTimeMilliseconds(300);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
|
|
}
|
|
|
|
} // namespace webrtc
|