| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <utility> | 12 #include <utility> |
| 13 | 13 |
| 14 #include "webrtc/api/video/i420_buffer.h" | 14 #include "webrtc/api/video/i420_buffer.h" |
| 15 #include "webrtc/base/logging.h" | 15 #include "webrtc/base/logging.h" |
| 16 #include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h" |
| 16 #include "webrtc/system_wrappers/include/metrics_default.h" | 17 #include "webrtc/system_wrappers/include/metrics_default.h" |
| 18 #include "webrtc/system_wrappers/include/sleep.h" |
| 17 #include "webrtc/test/encoder_settings.h" | 19 #include "webrtc/test/encoder_settings.h" |
| 18 #include "webrtc/test/fake_encoder.h" | 20 #include "webrtc/test/fake_encoder.h" |
| 19 #include "webrtc/test/frame_generator.h" | 21 #include "webrtc/test/frame_generator.h" |
| 22 #include "webrtc/test/gmock.h" |
| 20 #include "webrtc/test/gtest.h" | 23 #include "webrtc/test/gtest.h" |
| 21 #include "webrtc/video/send_statistics_proxy.h" | 24 #include "webrtc/video/send_statistics_proxy.h" |
| 22 #include "webrtc/video/vie_encoder.h" | 25 #include "webrtc/video/vie_encoder.h" |
| 23 | 26 |
| 24 namespace { | 27 namespace { |
| 25 #if defined(WEBRTC_ANDROID) | 28 #if defined(WEBRTC_ANDROID) |
| 26 // TODO(kthelgason): Lower this limit when better testing | 29 // TODO(kthelgason): Lower this limit when better testing |
| 27 // on MediaCodec and fallback implementations are in place. | 30 // on MediaCodec and fallback implementations are in place. |
| 28 const int kMinPixelsPerFrame = 320 * 180; | 31 const int kMinPixelsPerFrame = 320 * 180; |
| 29 #else | 32 #else |
| 30 const int kMinPixelsPerFrame = 120 * 90; | 33 const int kMinPixelsPerFrame = 120 * 90; |
| 31 #endif | 34 #endif |
| 32 } | 35 } |
| 33 | 36 |
| 34 namespace webrtc { | 37 namespace webrtc { |
| 35 | 38 |
| 36 using DegredationPreference = VideoSendStream::DegradationPreference; | 39 using DegredationPreference = VideoSendStream::DegradationPreference; |
| 37 using ScaleReason = ScalingObserverInterface::ScaleReason; | 40 using ScaleReason = ScalingObserverInterface::ScaleReason; |
| 41 using ::testing::_; |
| 42 using ::testing::Return; |
| 38 | 43 |
| 39 namespace { | 44 namespace { |
| 40 const size_t kMaxPayloadLength = 1440; | 45 const size_t kMaxPayloadLength = 1440; |
| 41 const int kTargetBitrateBps = 100000; | 46 const int kTargetBitrateBps = 100000; |
| 42 | 47 |
| 43 class TestBuffer : public webrtc::I420Buffer { | 48 class TestBuffer : public webrtc::I420Buffer { |
| 44 public: | 49 public: |
| 45 TestBuffer(rtc::Event* event, int width, int height) | 50 TestBuffer(rtc::Event* event, int width, int height) |
| 46 : I420Buffer(width, height), event_(event) {} | 51 : I420Buffer(width, height), event_(event) {} |
| 47 | 52 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 video_send_config_.encoder_settings.payload_name = payload_name; | 161 video_send_config_.encoder_settings.payload_name = payload_name; |
| 157 | 162 |
| 158 VideoEncoderConfig video_encoder_config; | 163 VideoEncoderConfig video_encoder_config; |
| 159 video_encoder_config.number_of_streams = num_streams; | 164 video_encoder_config.number_of_streams = num_streams; |
| 160 video_encoder_config.max_bitrate_bps = 1000000; | 165 video_encoder_config.max_bitrate_bps = 1000000; |
| 161 video_encoder_config.video_stream_factory = | 166 video_encoder_config.video_stream_factory = |
| 162 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers); | 167 new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers); |
| 163 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); | 168 ConfigureEncoder(std::move(video_encoder_config), nack_enabled); |
| 164 } | 169 } |
| 165 | 170 |
| 166 VideoFrame CreateFrame(int64_t ntp_ts, rtc::Event* destruction_event) const { | 171 VideoFrame CreateFrame(int64_t ntp_time_ms, |
| 172 rtc::Event* destruction_event) const { |
| 167 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( | 173 VideoFrame frame(new rtc::RefCountedObject<TestBuffer>( |
| 168 destruction_event, codec_width_, codec_height_), | 174 destruction_event, codec_width_, codec_height_), |
| 169 99, 99, kVideoRotation_0); | 175 99, 99, kVideoRotation_0); |
| 170 frame.set_ntp_time_ms(ntp_ts); | 176 frame.set_ntp_time_ms(ntp_time_ms); |
| 171 return frame; | 177 return frame; |
| 172 } | 178 } |
| 173 | 179 |
| 174 VideoFrame CreateFrame(int64_t ntp_ts, int width, int height) const { | 180 VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { |
| 175 VideoFrame frame( | 181 VideoFrame frame( |
| 176 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, | 182 new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99, |
| 177 kVideoRotation_0); | 183 kVideoRotation_0); |
| 178 frame.set_ntp_time_ms(ntp_ts); | 184 frame.set_ntp_time_ms(ntp_time_ms); |
| 179 return frame; | 185 return frame; |
| 180 } | 186 } |
| 181 | 187 |
| 182 class TestEncoder : public test::FakeEncoder { | 188 class TestEncoder : public test::FakeEncoder { |
| 183 public: | 189 public: |
| 184 TestEncoder() | 190 TestEncoder() |
| 185 : FakeEncoder(Clock::GetRealTimeClock()), | 191 : FakeEncoder(Clock::GetRealTimeClock()), |
| 186 continue_encode_event_(false, false) {} | 192 continue_encode_event_(false, false) {} |
| 187 | 193 |
| 188 VideoCodec codec_config() { | 194 VideoCodec codec_config() { |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 | 978 |
| 973 vie_encoder_->Stop(); | 979 vie_encoder_->Stop(); |
| 974 | 980 |
| 975 stats_proxy_.reset(); | 981 stats_proxy_.reset(); |
| 976 EXPECT_EQ(1, | 982 EXPECT_EQ(1, |
| 977 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); | 983 metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent")); |
| 978 EXPECT_EQ( | 984 EXPECT_EQ( |
| 979 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50)); | 985 1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50)); |
| 980 } | 986 } |
| 981 | 987 |
| 988 TEST_F(ViEEncoderTest, CallsBitrateObserver) { |
| 989 class MockBitrateObserver : public VideoBitrateAllocationObserver { |
| 990 public: |
| 991 MOCK_METHOD1(OnBitrateAllocationUpdated, void(const BitrateAllocation&)); |
| 992 } bitrate_observer; |
| 993 vie_encoder_->SetBitrateObserver(&bitrate_observer); |
| 994 |
| 995 const int kDefaultFps = 30; |
| 996 const BitrateAllocation expected_bitrate = |
| 997 DefaultVideoBitrateAllocator(fake_encoder_.codec_config()) |
| 998 .GetAllocation(kTargetBitrateBps, kDefaultFps); |
| 999 |
| 1000 // First called on bitrate updated, then again on first frame. |
| 1001 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) |
| 1002 .Times(2); |
| 1003 vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
| 1004 |
| 1005 const int64_t kStartTimeMs = 1; |
| 1006 video_source_.IncomingCapturedFrame( |
| 1007 CreateFrame(kStartTimeMs, codec_width_, codec_height_)); |
| 1008 sink_.WaitForEncodedFrame(kStartTimeMs); |
| 1009 |
| 1010 // Not called on second frame. |
| 1011 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) |
| 1012 .Times(0); |
| 1013 video_source_.IncomingCapturedFrame( |
| 1014 CreateFrame(kStartTimeMs + 1, codec_width_, codec_height_)); |
| 1015 sink_.WaitForEncodedFrame(kStartTimeMs + 1); |
| 1016 |
| 1017 // Called after a process interval. |
| 1018 const int64_t kProcessIntervalMs = |
| 1019 vcm::VCMProcessTimer::kDefaultProcessIntervalMs; |
| 1020 // TODO(sprang): ViEEncoder should die and/or get injectable clock. |
| 1021 // Sleep for one processing interval plus one frame to avoid flakiness. |
| 1022 SleepMs(kProcessIntervalMs + 1000 / kDefaultFps); |
| 1023 EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) |
| 1024 .Times(1); |
| 1025 video_source_.IncomingCapturedFrame(CreateFrame( |
| 1026 kStartTimeMs + kProcessIntervalMs, codec_width_, codec_height_)); |
| 1027 sink_.WaitForEncodedFrame(kStartTimeMs + kProcessIntervalMs); |
| 1028 |
| 1029 vie_encoder_->Stop(); |
| 1030 } |
| 1031 |
| 982 } // namespace webrtc | 1032 } // namespace webrtc |
| OLD | NEW |