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