1cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel/* 2cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 3cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * 4cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * Use of this source code is governed by a BSD-style license 5cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * that can be found in the LICENSE file in the root of the source 6cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * tree. An additional intellectual property rights grant can be found 7cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * in the file PATENTS. All contributing project authors may 8cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel * be found in the AUTHORS file in the root of the source tree. 9cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel */ 10cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 11cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include <limits> 12cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 13cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "testing/gtest/include/gtest/gtest.h" 14cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "vpx/vp8cx.h" 15cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "webrtc/base/logging.h" 16cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h" 17cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "webrtc/modules/video_coding/codecs/vp9/vp9_impl.h" 18cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel#include "webrtc/system_wrappers/include/clock.h" 19cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 20cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelnamespace webrtc { 21cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 22cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipeltypedef VP9EncoderImpl::SuperFrameRefSettings Settings; 23cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 24cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelconst uint32_t kTickFrequency = 90000; 25cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 26cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelclass ScreenshareLayerTestVP9 : public ::testing::Test { 27cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel protected: 28cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ScreenshareLayerTestVP9() : clock_(0) {} 29cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel virtual ~ScreenshareLayerTestVP9() {} 30cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 31cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void InitScreenshareLayers(int layers) { 32cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel layers_.reset(new ScreenshareLayersVP9(layers)); 33cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 34cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 35cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void ConfigureBitrateForLayer(int kbps, uint8_t layer_id) { 36cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel layers_->ConfigureBitrate(kbps, layer_id); 37cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 38cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 39cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void AdvanceTime(int64_t milliseconds) { 40cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel clock_.AdvanceTimeMilliseconds(milliseconds); 41cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 42cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 43cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void AddKilobitsToLayer(int kilobits, uint8_t layer_id) { 44cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel layers_->LayerFrameEncoded(kilobits * 1000 / 8, layer_id); 45cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 46cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 47cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void EqualRefsForLayer(const Settings& actual, uint8_t layer_id) { 48cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.layer[layer_id].upd_buf, 49cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel actual.layer[layer_id].upd_buf); 50cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.layer[layer_id].ref_buf1, 51cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel actual.layer[layer_id].ref_buf1); 52cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.layer[layer_id].ref_buf2, 53cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel actual.layer[layer_id].ref_buf2); 54cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.layer[layer_id].ref_buf3, 55cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel actual.layer[layer_id].ref_buf3); 56cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 57cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 58cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void EqualRefs(const Settings& actual) { 59cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (unsigned int layer_id = 0; layer_id < kMaxVp9NumberOfSpatialLayers; 60cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ++layer_id) { 61cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualRefsForLayer(actual, layer_id); 62cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 63cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 64cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 65cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void EqualStartStopKeyframe(const Settings& actual) { 66cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.start_layer, actual.start_layer); 67cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.stop_layer, actual.stop_layer); 68cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EXPECT_EQ(expected_.is_keyframe, actual.is_keyframe); 69cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 70cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 71cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Check that the settings returned by GetSuperFrameSettings() is 72cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // equal to the expected_ settings. 73cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel void EqualToExpected() { 74cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel uint32_t frame_timestamp_ = 75cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel clock_.TimeInMilliseconds() * (kTickFrequency / 1000); 76cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel Settings actual = 77cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel layers_->GetSuperFrameSettings(frame_timestamp_, expected_.is_keyframe); 78cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualRefs(actual); 79cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualStartStopKeyframe(actual); 80cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 81cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 82cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel Settings expected_; 83cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel SimulatedClock clock_; 84cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel rtc::scoped_ptr<ScreenshareLayersVP9> layers_; 85cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel}; 86cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 87cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, NoRefsOnKeyFrame) { 88cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel const int kNumLayers = kMaxVp9NumberOfSpatialLayers; 89cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(kNumLayers); 90cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 91cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = kNumLayers - 1; 92cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 93cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < kNumLayers; ++l) { 94cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].upd_buf = l; 95cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 96cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = true; 97cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 98cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 99cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < kNumLayers; ++l) { 100cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].ref_buf1 = l; 101cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 102cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = false; 103cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 104cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 105cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 106cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// Test if it is possible to send at a high bitrate (over the threshold) 107cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// after a longer period of low bitrate. This should not be possible. 108cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, DontAccumelateAvailableBitsOverTime) { 109cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(2); 110cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, 0); 111cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 112cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].upd_buf = 0; 113cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = 0; 114cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].upd_buf = 1; 115cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = 1; 116cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 117cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = 1; 118cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 119cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Send 10 frames at a low bitrate (50 kbps) 120cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int i = 0; i < 10; ++i) { 121cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 122cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 123cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(10, 0); 124cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 125cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 126cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 127cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 128cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(301, 0); 129cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 130cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Send 10 frames at a high bitrate (200 kbps) 131cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 132cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int i = 0; i < 10; ++i) { 133cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 134cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 135cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(40, 1); 136cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 137cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 138cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 139cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// Test if used bits are accumelated over layers, as they should; 140cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, AccumelateUsedBitsOverLayers) { 141cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel const int kNumLayers = kMaxVp9NumberOfSpatialLayers; 142cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(kNumLayers); 143cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < kNumLayers - 1; ++l) 144cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, l); 145cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < kNumLayers; ++l) { 146cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].upd_buf = l; 147cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].ref_buf1 = l; 148cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 149cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 150cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 151cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = kNumLayers - 1; 152cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 153cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 154cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int layer = 0; layer < kNumLayers - 1; ++layer) { 155cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = layer; 156cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 157cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(101, layer); 158cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 159cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 160cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 161cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// General testing of the bitrate controller. 162cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, 2LayerBitrate) { 163cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(2); 164cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, 0); 165cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 166cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].upd_buf = 0; 167cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].upd_buf = 1; 168cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = -1; 169cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = -1; 170cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 171cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = 1; 172cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 173cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = true; 174cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 175cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 0); 176cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 177cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = 0; 178cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = 1; 179cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = false; 180cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(199); 181cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 182cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 0); 183cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 184cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 185cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int frame = 0; frame < 3; ++frame) { 186cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 187cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 188cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 1); 189cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 190cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 191cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just before enough bits become available for L0 @0.999 seconds. 192cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(199); 193cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 194cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 1); 195cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 196cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just after enough bits become available for L0 @1.0001 seconds. 197cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 198cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(2); 199cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 200cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 0); 201cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 202cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Keyframes always encode all layers, even if it is over budget. 203cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = -1; 204cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = -1; 205cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = true; 206cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(499); 207cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 208cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = 0; 209cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = 1; 210cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 211cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = false; 212cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 213cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 0); 214cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 215cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // 400 kb in L0 --> @3 second mark to fall below the threshold.. 216cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // just before @2.999 seconds. 217cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = false; 218cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(1499); 219cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 220cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 1); 221cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 222cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // just after @3.001 seconds. 223cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 224cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(2); 225cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 226cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(100, 0); 227cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 228cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 229cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// General testing of the bitrate controller. 230cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, 3LayerBitrate) { 231cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(3); 232cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, 0); 233cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, 1); 234cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 235cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < 3; ++l) { 236cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].upd_buf = l; 237cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].ref_buf1 = l; 238cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel } 239cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 240cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = 2; 241cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 242cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 243cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(105, 0); 244cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(30, 1); 245cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 246cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(199); 247cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 248cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(105, 0); 249cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(30, 1); 250cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 251cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 252cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 253cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 254cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(130, 1); 255cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 256cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 2; 257cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 258cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 259cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 260cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // 400 kb in L1 --> @1.0 second mark to fall below threshold. 261cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // 210 kb in L0 --> @1.1 second mark to fall below threshold. 262cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just before L1 @0.999 seconds. 263cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(399); 264cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 265cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 266cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just after L1 @1.001 seconds. 267cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 268cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(2); 269cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 270cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 271cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just before L0 @1.099 seconds. 272cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(99); 273cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 274cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 275cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Just after L0 @1.101 seconds. 276cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 277cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(2); 278cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 279cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 280cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // @1.1 seconds 281cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(99); 282cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 283cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(200, 1); 284cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 285cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = true; 286cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < 3; ++l) 287cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].ref_buf1 = -1; 288cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 289cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 290cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 291cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.is_keyframe = false; 292cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 2; 293cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel for (int l = 0; l < 3; ++l) 294cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[l].ref_buf1 = l; 295cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(200); 296cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 297cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 298cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 299cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// Test that the bitrate calculations are 300cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel// correct when the timestamp wrap. 301cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipelTEST_F(ScreenshareLayerTestVP9, TimestampWrap) { 302cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel InitScreenshareLayers(2); 303cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel ConfigureBitrateForLayer(100, 0); 304cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 305cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].upd_buf = 0; 306cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[0].ref_buf1 = 0; 307cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].upd_buf = 1; 308cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.layer[1].ref_buf1 = 1; 309cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 0; 310cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.stop_layer = 1; 311cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 312cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Advance time to just before the timestamp wraps. 313cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(std::numeric_limits<uint32_t>::max() / (kTickFrequency / 1000)); 314cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 315cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AddKilobitsToLayer(200, 0); 316cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 317cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel // Wrap 318cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel expected_.start_layer = 1; 319cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel AdvanceTime(1); 320cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel EqualToExpected(); 321cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} 322cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel 323cfc319be1d6afec77bd41eeb70d3e7886dd524dbphilipel} // namespace webrtc 324