| Index: webrtc/video/vie_encoder_unittest.cc
|
| diff --git a/webrtc/video/vie_encoder_unittest.cc b/webrtc/video/vie_encoder_unittest.cc
|
| index c42825d05c5cd8fc7ef52c4d7a5955514c3cfa6a..dec20968810bb161a74d60945683d9c3e06455f0 100644
|
| --- a/webrtc/video/vie_encoder_unittest.cc
|
| +++ b/webrtc/video/vie_encoder_unittest.cc
|
| @@ -13,10 +13,13 @@
|
|
|
| #include "webrtc/api/video/i420_buffer.h"
|
| #include "webrtc/base/logging.h"
|
| +#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
|
| #include "webrtc/system_wrappers/include/metrics_default.h"
|
| +#include "webrtc/system_wrappers/include/sleep.h"
|
| #include "webrtc/test/encoder_settings.h"
|
| #include "webrtc/test/fake_encoder.h"
|
| #include "webrtc/test/frame_generator.h"
|
| +#include "webrtc/test/gmock.h"
|
| #include "webrtc/test/gtest.h"
|
| #include "webrtc/video/send_statistics_proxy.h"
|
| #include "webrtc/video/vie_encoder.h"
|
| @@ -35,6 +38,8 @@ namespace webrtc {
|
|
|
| using DegredationPreference = VideoSendStream::DegradationPreference;
|
| using ScaleReason = ScalingObserverInterface::ScaleReason;
|
| +using ::testing::_;
|
| +using ::testing::Return;
|
|
|
| namespace {
|
| const size_t kMaxPayloadLength = 1440;
|
| @@ -163,19 +168,20 @@ class ViEEncoderTest : public ::testing::Test {
|
| ConfigureEncoder(std::move(video_encoder_config), nack_enabled);
|
| }
|
|
|
| - VideoFrame CreateFrame(int64_t ntp_ts, rtc::Event* destruction_event) const {
|
| + VideoFrame CreateFrame(int64_t ntp_time_ms,
|
| + rtc::Event* destruction_event) const {
|
| VideoFrame frame(new rtc::RefCountedObject<TestBuffer>(
|
| destruction_event, codec_width_, codec_height_),
|
| 99, 99, kVideoRotation_0);
|
| - frame.set_ntp_time_ms(ntp_ts);
|
| + frame.set_ntp_time_ms(ntp_time_ms);
|
| return frame;
|
| }
|
|
|
| - VideoFrame CreateFrame(int64_t ntp_ts, int width, int height) const {
|
| + VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const {
|
| VideoFrame frame(
|
| new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99,
|
| kVideoRotation_0);
|
| - frame.set_ntp_time_ms(ntp_ts);
|
| + frame.set_ntp_time_ms(ntp_time_ms);
|
| return frame;
|
| }
|
|
|
| @@ -979,4 +985,48 @@ TEST_F(ViEEncoderTest, UMACpuLimitedResolutionInPercent) {
|
| 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
|
| }
|
|
|
| +TEST_F(ViEEncoderTest, CallsBitrateObserver) {
|
| + class MockBitrateObserver : public VideoBitrateAllocationObserver {
|
| + public:
|
| + MOCK_METHOD1(OnBitrateAllocationUpdated, void(const BitrateAllocation&));
|
| + } bitrate_observer;
|
| + vie_encoder_->SetBitrateObserver(&bitrate_observer);
|
| +
|
| + const int kDefaultFps = 30;
|
| + const BitrateAllocation expected_bitrate =
|
| + DefaultVideoBitrateAllocator(fake_encoder_.codec_config())
|
| + .GetAllocation(kTargetBitrateBps, kDefaultFps);
|
| +
|
| + // First called on bitrate updated, then again on first frame.
|
| + EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
|
| + .Times(2);
|
| + vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
|
| +
|
| + const int64_t kStartTimeMs = 1;
|
| + video_source_.IncomingCapturedFrame(
|
| + CreateFrame(kStartTimeMs, codec_width_, codec_height_));
|
| + sink_.WaitForEncodedFrame(kStartTimeMs);
|
| +
|
| + // Not called on second frame.
|
| + EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
|
| + .Times(0);
|
| + video_source_.IncomingCapturedFrame(
|
| + CreateFrame(kStartTimeMs + 1, codec_width_, codec_height_));
|
| + sink_.WaitForEncodedFrame(kStartTimeMs + 1);
|
| +
|
| + // Called after a process interval.
|
| + const int64_t kProcessIntervalMs =
|
| + vcm::VCMProcessTimer::kDefaultProcessIntervalMs;
|
| + // TODO(sprang): ViEEncoder should die and/or get injectable clock.
|
| + // Sleep for one processing interval plus one frame to avoid flakiness.
|
| + SleepMs(kProcessIntervalMs + 1000 / kDefaultFps);
|
| + EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
|
| + .Times(1);
|
| + video_source_.IncomingCapturedFrame(CreateFrame(
|
| + kStartTimeMs + kProcessIntervalMs, codec_width_, codec_height_));
|
| + sink_.WaitForEncodedFrame(kStartTimeMs + kProcessIntervalMs);
|
| +
|
| + vie_encoder_->Stop();
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|