1/*
2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
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
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "testing/gtest/include/gtest/gtest.h"
12#include "webrtc/common_types.h"
13
14namespace webrtc {
15
16// Builds VP8 codec with 0 simulcast streams.
17void BuildVP8Codec(webrtc::VideoCodec* video_codec) {
18  video_codec->codecType = kVideoCodecVP8;
19  strncpy(video_codec->plName, "VP8", 4);
20  video_codec->plType = 100;
21  video_codec->width = 1280;
22  video_codec->height = 720;
23
24  video_codec->startBitrate = 1000;  // kbps
25  video_codec->maxBitrate = 2000;  // kbps
26  video_codec->minBitrate = 1000;  // kbps
27  video_codec->maxFramerate = 30;
28
29  video_codec->qpMax = 50;
30  video_codec->numberOfSimulcastStreams = 0;
31  video_codec->mode = kRealtimeVideo;
32
33  // Set VP8 codec specific info.
34  video_codec->codecSpecific.VP8.pictureLossIndicationOn = true;
35  video_codec->codecSpecific.VP8.feedbackModeOn = true;
36  video_codec->codecSpecific.VP8.complexity = kComplexityNormal;
37  video_codec->codecSpecific.VP8.resilience = kResilienceOff;
38  video_codec->codecSpecific.VP8.numberOfTemporalLayers = 0;
39  video_codec->codecSpecific.VP8.denoisingOn = true;
40  video_codec->codecSpecific.VP8.errorConcealmentOn = true;
41  video_codec->codecSpecific.VP8.automaticResizeOn = true;
42  video_codec->codecSpecific.VP8.frameDroppingOn = true;
43  video_codec->codecSpecific.VP8.keyFrameInterval = 200;
44}
45
46
47void SetSimulcastSettings(webrtc::VideoCodec* video_codec) {
48  // Simulcast settings.
49  video_codec->numberOfSimulcastStreams = 1;
50  video_codec->simulcastStream[0].width = 320;
51  video_codec->simulcastStream[0].height = 180;
52  video_codec->simulcastStream[0].numberOfTemporalLayers = 0;
53  video_codec->simulcastStream[0].maxBitrate = 100;
54  video_codec->simulcastStream[0].targetBitrate = 100;
55  video_codec->simulcastStream[0].minBitrate = 0;
56  video_codec->simulcastStream[0].qpMax = video_codec->qpMax;
57}
58
59
60// This test compares two VideoCodecInst objects except codec specific and
61// simulcast streams.
62TEST(ViECodecTest, TestCompareCodecs) {
63  VideoCodec codec1, codec2;
64  memset(&codec1, 0, sizeof(VideoCodec));
65  memset(&codec2, 0, sizeof(VideoCodec));
66
67  BuildVP8Codec(&codec1);
68  BuildVP8Codec(&codec2);
69
70  EXPECT_TRUE(codec1 == codec2);
71  EXPECT_FALSE(codec1 != codec2);
72
73  // plname is case insensitive.
74  strncpy(codec2.plName, "vp8", 4);
75  EXPECT_TRUE(codec1 == codec2);
76
77  codec2.codecType = kVideoCodecUnknown;
78  EXPECT_FALSE(codec1 == codec2);
79
80  // Modify pltype.
81  BuildVP8Codec(&codec2);
82  codec2.plType = 101;
83  EXPECT_FALSE(codec1 == codec2);
84
85  // Modifing height and width.
86  BuildVP8Codec(&codec2);
87  codec2.width = 640;
88  codec2.height = 480;
89  EXPECT_FALSE(codec1 == codec2);
90
91  // Modify framerate, default value is 30.
92  BuildVP8Codec(&codec2);
93  codec2.maxFramerate = 15;
94  EXPECT_FALSE(codec1 == codec2);
95
96  // Modifying startBitrate, default value is 1000 kbps.
97  BuildVP8Codec(&codec2);
98  codec2.startBitrate = 2000;
99  EXPECT_FALSE(codec1 == codec2);
100  // maxBitrate
101  BuildVP8Codec(&codec2);
102  codec2.startBitrate = 3000;
103  EXPECT_FALSE(codec1 == codec2);
104  // minBirate
105  BuildVP8Codec(&codec2);
106  codec2.startBitrate = 500;
107  EXPECT_FALSE(codec1 == codec2);
108
109  // Modify qpMax.
110  BuildVP8Codec(&codec2);
111  codec2.qpMax = 100;
112  EXPECT_FALSE(codec1 == codec2);
113
114  // Modify mode
115  BuildVP8Codec(&codec2);
116  codec2.mode = kScreensharing;
117  EXPECT_FALSE(codec1 == codec2);
118}
119
120// Test VP8 specific comparision.
121TEST(ViECodecTest, TestCompareVP8CodecSpecific) {
122  VideoCodec codec1, codec2;
123  memset(&codec1, 0, sizeof(VideoCodec));
124  memset(&codec2, 0, sizeof(VideoCodec));
125
126  BuildVP8Codec(&codec1);
127  BuildVP8Codec(&codec2);
128  EXPECT_TRUE(codec1 == codec2);
129
130  // pictureLossIndicationOn
131  codec2.codecSpecific.VP8.pictureLossIndicationOn = false;
132  EXPECT_FALSE(codec1 == codec2);
133
134  // feedbackModeOn
135  BuildVP8Codec(&codec2);
136  codec2.codecSpecific.VP8.feedbackModeOn = false;
137  EXPECT_FALSE(codec1 == codec2);
138
139  // complexity
140  BuildVP8Codec(&codec2);
141  codec2.codecSpecific.VP8.complexity = kComplexityHigh;
142  EXPECT_FALSE(codec1 == codec2);
143
144  // resilience
145  BuildVP8Codec(&codec2);
146  codec2.codecSpecific.VP8.resilience = kResilientStream;
147  EXPECT_FALSE(codec1 == codec2);
148
149  // numberOfTemporalLayers
150  BuildVP8Codec(&codec2);
151  codec2.codecSpecific.VP8.numberOfTemporalLayers = 2;
152  EXPECT_FALSE(codec1 == codec2);
153
154  // denoisingOn
155  BuildVP8Codec(&codec2);
156  codec2.codecSpecific.VP8.denoisingOn = false;
157  EXPECT_FALSE(codec1 == codec2);
158
159  // errorConcealmentOn
160  BuildVP8Codec(&codec2);
161  codec2.codecSpecific.VP8.errorConcealmentOn = false;
162  EXPECT_FALSE(codec1 == codec2);
163
164  // pictureLossIndicationOn
165  BuildVP8Codec(&codec2);
166  codec2.codecSpecific.VP8.automaticResizeOn = false;
167  EXPECT_FALSE(codec1 == codec2);
168
169  // frameDroppingOn
170  BuildVP8Codec(&codec2);
171  codec2.codecSpecific.VP8.frameDroppingOn = false;
172  EXPECT_FALSE(codec1 == codec2);
173
174  // keyFrameInterval
175  BuildVP8Codec(&codec2);
176  codec2.codecSpecific.VP8.keyFrameInterval = 100;
177  EXPECT_FALSE(codec1 == codec2);
178}
179
180// This test compares simulcast stream information in VideoCodec.
181TEST(ViECodecTest, TestCompareSimulcastStreams) {
182  VideoCodec codec1, codec2;
183  memset(&codec1, 0, sizeof(VideoCodec));
184  memset(&codec2, 0, sizeof(VideoCodec));
185
186  BuildVP8Codec(&codec1);
187  BuildVP8Codec(&codec2);
188  // Set simulacast settings.
189  SetSimulcastSettings(&codec1);
190  SetSimulcastSettings(&codec2);
191  EXPECT_TRUE(codec1 == codec2);
192
193  // Modify number of streams.
194  codec2.numberOfSimulcastStreams = 2;
195  EXPECT_FALSE(codec1 == codec2);
196
197  // Resetting steram count.
198  codec2.numberOfSimulcastStreams = 1;
199  // Modify height and width in codec2.
200  codec2.simulcastStream[0].width = 640;
201  codec2.simulcastStream[0].height = 480;
202  EXPECT_FALSE(codec1 == codec2);
203
204  // numberOfTemporalLayers
205  SetSimulcastSettings(&codec2);
206  codec2.simulcastStream[0].numberOfTemporalLayers = 2;
207  EXPECT_FALSE(codec1 == codec2);
208
209  // maxBitrate
210  SetSimulcastSettings(&codec2);
211  codec2.simulcastStream[0].maxBitrate = 1000;
212  EXPECT_FALSE(codec1 == codec2);
213
214  // targetBitrate
215  SetSimulcastSettings(&codec2);
216  codec2.simulcastStream[0].targetBitrate = 1000;
217  EXPECT_FALSE(codec1 == codec2);
218
219  // minBitrate
220  SetSimulcastSettings(&codec2);
221  codec2.simulcastStream[0].minBitrate = 50;
222  EXPECT_FALSE(codec1 == codec2);
223
224  // qpMax
225  SetSimulcastSettings(&codec2);
226  codec2.simulcastStream[0].qpMax = 100;
227  EXPECT_FALSE(codec1 == codec2);
228}
229
230}  // namespace webrtc
231