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. 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 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. 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. 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. 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