• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 namespace webrtc {
15 
16 // Builds VP8 codec with 0 simulcast streams.
BuildVP8Codec(webrtc::VideoCodec * video_codec)17 void 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 
SetSimulcastSettings(webrtc::VideoCodec * video_codec)47 void 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.
TEST(ViECodecTest,TestCompareCodecs)62 TEST(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.
TEST(ViECodecTest,TestCompareVP8CodecSpecific)121 TEST(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.
TEST(ViECodecTest,TestCompareSimulcastStreams)181 TEST(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