1 /* 2 * libjingle 3 * Copyright 2009 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "talk/base/gunit.h" 29 #include "talk/media/base/codec.h" 30 31 using cricket::AudioCodec; 32 using cricket::Codec; 33 using cricket::DataCodec; 34 using cricket::FeedbackParam; 35 using cricket::VideoCodec; 36 using cricket::VideoEncoderConfig; 37 38 class CodecTest : public testing::Test { 39 public: 40 CodecTest() {} 41 }; 42 43 TEST_F(CodecTest, TestAudioCodecOperators) { 44 AudioCodec c0(96, "A", 44100, 20000, 2, 3); 45 AudioCodec c1(95, "A", 44100, 20000, 2, 3); 46 AudioCodec c2(96, "x", 44100, 20000, 2, 3); 47 AudioCodec c3(96, "A", 48000, 20000, 2, 3); 48 AudioCodec c4(96, "A", 44100, 10000, 2, 3); 49 AudioCodec c5(96, "A", 44100, 20000, 1, 3); 50 AudioCodec c6(96, "A", 44100, 20000, 2, 1); 51 EXPECT_TRUE(c0 != c1); 52 EXPECT_TRUE(c0 != c2); 53 EXPECT_TRUE(c0 != c3); 54 EXPECT_TRUE(c0 != c4); 55 EXPECT_TRUE(c0 != c5); 56 EXPECT_TRUE(c0 != c6); 57 58 AudioCodec c7; 59 AudioCodec c8(0, "", 0, 0, 0, 0); 60 AudioCodec c9 = c0; 61 EXPECT_TRUE(c8 == c7); 62 EXPECT_TRUE(c9 != c7); 63 EXPECT_TRUE(c9 == c0); 64 65 AudioCodec c10(c0); 66 AudioCodec c11(c0); 67 AudioCodec c12(c0); 68 AudioCodec c13(c0); 69 c10.params["x"] = "abc"; 70 c11.params["x"] = "def"; 71 c12.params["y"] = "abc"; 72 c13.params["x"] = "abc"; 73 EXPECT_TRUE(c10 != c0); 74 EXPECT_TRUE(c11 != c0); 75 EXPECT_TRUE(c11 != c10); 76 EXPECT_TRUE(c12 != c0); 77 EXPECT_TRUE(c12 != c10); 78 EXPECT_TRUE(c12 != c11); 79 EXPECT_TRUE(c13 == c10); 80 } 81 82 TEST_F(CodecTest, TestAudioCodecMatches) { 83 // Test a codec with a static payload type. 84 AudioCodec c0(95, "A", 44100, 20000, 1, 3); 85 EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 1, 0))); 86 EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 0, 0))); 87 EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 0, 0, 0))); 88 EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 0, 0, 0, 0))); 89 EXPECT_FALSE(c0.Matches(AudioCodec(96, "", 44100, 20000, 1, 0))); 90 EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 20000, 1, 0))); 91 EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 30000, 1, 0))); 92 EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 20000, 2, 0))); 93 EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 30000, 2, 0))); 94 95 // Test a codec with a dynamic payload type. 96 AudioCodec c1(96, "A", 44100, 20000, 1, 3); 97 EXPECT_TRUE(c1.Matches(AudioCodec(96, "A", 0, 0, 0, 0))); 98 EXPECT_TRUE(c1.Matches(AudioCodec(97, "A", 0, 0, 0, 0))); 99 EXPECT_TRUE(c1.Matches(AudioCodec(96, "a", 0, 0, 0, 0))); 100 EXPECT_TRUE(c1.Matches(AudioCodec(97, "a", 0, 0, 0, 0))); 101 EXPECT_FALSE(c1.Matches(AudioCodec(95, "A", 0, 0, 0, 0))); 102 EXPECT_FALSE(c1.Matches(AudioCodec(96, "", 44100, 20000, 2, 0))); 103 EXPECT_FALSE(c1.Matches(AudioCodec(96, "A", 55100, 30000, 1, 0))); 104 105 // Test a codec with a dynamic payload type, and auto bitrate. 106 AudioCodec c2(97, "A", 16000, 0, 1, 3); 107 // Use default bitrate. 108 EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 1, 0))); 109 EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 0, 0))); 110 // Use explicit bitrate. 111 EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 32000, 1, 0))); 112 // Backward compatibility with clients that might send "-1" (for default). 113 EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, -1, 1, 0))); 114 115 // Stereo doesn't match channels = 0. 116 AudioCodec c3(96, "A", 44100, 20000, 2, 3); 117 EXPECT_TRUE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 2, 3))); 118 EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 1, 3))); 119 EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 0, 3))); 120 } 121 122 TEST_F(CodecTest, TestVideoCodecOperators) { 123 VideoCodec c0(96, "V", 320, 200, 30, 3); 124 VideoCodec c1(95, "V", 320, 200, 30, 3); 125 VideoCodec c2(96, "x", 320, 200, 30, 3); 126 VideoCodec c3(96, "V", 120, 200, 30, 3); 127 VideoCodec c4(96, "V", 320, 100, 30, 3); 128 VideoCodec c5(96, "V", 320, 200, 10, 3); 129 VideoCodec c6(96, "V", 320, 200, 30, 1); 130 EXPECT_TRUE(c0 != c1); 131 EXPECT_TRUE(c0 != c2); 132 EXPECT_TRUE(c0 != c3); 133 EXPECT_TRUE(c0 != c4); 134 EXPECT_TRUE(c0 != c5); 135 EXPECT_TRUE(c0 != c6); 136 137 VideoCodec c7; 138 VideoCodec c8(0, "", 0, 0, 0, 0); 139 VideoCodec c9 = c0; 140 EXPECT_TRUE(c8 == c7); 141 EXPECT_TRUE(c9 != c7); 142 EXPECT_TRUE(c9 == c0); 143 144 VideoCodec c10(c0); 145 VideoCodec c11(c0); 146 VideoCodec c12(c0); 147 VideoCodec c13(c0); 148 c10.params["x"] = "abc"; 149 c11.params["x"] = "def"; 150 c12.params["y"] = "abc"; 151 c13.params["x"] = "abc"; 152 EXPECT_TRUE(c10 != c0); 153 EXPECT_TRUE(c11 != c0); 154 EXPECT_TRUE(c11 != c10); 155 EXPECT_TRUE(c12 != c0); 156 EXPECT_TRUE(c12 != c10); 157 EXPECT_TRUE(c12 != c11); 158 EXPECT_TRUE(c13 == c10); 159 } 160 161 TEST_F(CodecTest, TestVideoCodecMatches) { 162 // Test a codec with a static payload type. 163 VideoCodec c0(95, "V", 320, 200, 30, 3); 164 EXPECT_TRUE(c0.Matches(VideoCodec(95, "", 640, 400, 15, 0))); 165 EXPECT_FALSE(c0.Matches(VideoCodec(96, "", 320, 200, 30, 0))); 166 167 // Test a codec with a dynamic payload type. 168 VideoCodec c1(96, "V", 320, 200, 30, 3); 169 EXPECT_TRUE(c1.Matches(VideoCodec(96, "V", 640, 400, 15, 0))); 170 EXPECT_TRUE(c1.Matches(VideoCodec(97, "V", 640, 400, 15, 0))); 171 EXPECT_TRUE(c1.Matches(VideoCodec(96, "v", 640, 400, 15, 0))); 172 EXPECT_TRUE(c1.Matches(VideoCodec(97, "v", 640, 400, 15, 0))); 173 EXPECT_FALSE(c1.Matches(VideoCodec(96, "", 320, 200, 30, 0))); 174 EXPECT_FALSE(c1.Matches(VideoCodec(95, "V", 640, 400, 15, 0))); 175 } 176 177 TEST_F(CodecTest, TestVideoEncoderConfigOperators) { 178 VideoEncoderConfig c1(VideoCodec( 179 96, "SVC", 320, 200, 30, 3), 1, 2); 180 VideoEncoderConfig c2(VideoCodec( 181 95, "SVC", 320, 200, 30, 3), 1, 2); 182 VideoEncoderConfig c3(VideoCodec( 183 96, "xxx", 320, 200, 30, 3), 1, 2); 184 VideoEncoderConfig c4(VideoCodec( 185 96, "SVC", 120, 200, 30, 3), 1, 2); 186 VideoEncoderConfig c5(VideoCodec( 187 96, "SVC", 320, 100, 30, 3), 1, 2); 188 VideoEncoderConfig c6(VideoCodec( 189 96, "SVC", 320, 200, 10, 3), 1, 2); 190 VideoEncoderConfig c7(VideoCodec( 191 96, "SVC", 320, 200, 30, 1), 1, 2); 192 VideoEncoderConfig c8(VideoCodec( 193 96, "SVC", 320, 200, 30, 3), 0, 2); 194 VideoEncoderConfig c9(VideoCodec( 195 96, "SVC", 320, 200, 30, 3), 1, 1); 196 EXPECT_TRUE(c1 != c2); 197 EXPECT_TRUE(c1 != c2); 198 EXPECT_TRUE(c1 != c3); 199 EXPECT_TRUE(c1 != c4); 200 EXPECT_TRUE(c1 != c5); 201 EXPECT_TRUE(c1 != c6); 202 EXPECT_TRUE(c1 != c7); 203 EXPECT_TRUE(c1 != c8); 204 EXPECT_TRUE(c1 != c9); 205 206 VideoEncoderConfig c10; 207 VideoEncoderConfig c11(VideoCodec( 208 0, "", 0, 0, 0, 0)); 209 VideoEncoderConfig c12(VideoCodec( 210 0, "", 0, 0, 0, 0), 211 VideoEncoderConfig::kDefaultMaxThreads, 212 VideoEncoderConfig::kDefaultCpuProfile); 213 VideoEncoderConfig c13 = c1; 214 VideoEncoderConfig c14(VideoCodec( 215 0, "", 0, 0, 0, 0), 0, 0); 216 217 EXPECT_TRUE(c11 == c10); 218 EXPECT_TRUE(c12 == c10); 219 EXPECT_TRUE(c13 != c10); 220 EXPECT_TRUE(c13 == c1); 221 EXPECT_TRUE(c14 != c11); 222 EXPECT_TRUE(c14 != c12); 223 } 224 225 TEST_F(CodecTest, TestDataCodecMatches) { 226 // Test a codec with a static payload type. 227 DataCodec c0(95, "D", 0); 228 EXPECT_TRUE(c0.Matches(DataCodec(95, "", 0))); 229 EXPECT_FALSE(c0.Matches(DataCodec(96, "", 0))); 230 231 // Test a codec with a dynamic payload type. 232 DataCodec c1(96, "D", 3); 233 EXPECT_TRUE(c1.Matches(DataCodec(96, "D", 0))); 234 EXPECT_TRUE(c1.Matches(DataCodec(97, "D", 0))); 235 EXPECT_TRUE(c1.Matches(DataCodec(96, "d", 0))); 236 EXPECT_TRUE(c1.Matches(DataCodec(97, "d", 0))); 237 EXPECT_FALSE(c1.Matches(DataCodec(96, "", 0))); 238 EXPECT_FALSE(c1.Matches(DataCodec(95, "D", 0))); 239 } 240 241 TEST_F(CodecTest, TestDataCodecOperators) { 242 DataCodec c0(96, "D", 3); 243 DataCodec c1(95, "D", 3); 244 DataCodec c2(96, "x", 3); 245 DataCodec c3(96, "D", 1); 246 EXPECT_TRUE(c0 != c1); 247 EXPECT_TRUE(c0 != c2); 248 EXPECT_TRUE(c0 != c3); 249 250 DataCodec c4; 251 DataCodec c5(0, "", 0); 252 DataCodec c6 = c0; 253 EXPECT_TRUE(c5 == c4); 254 EXPECT_TRUE(c6 != c4); 255 EXPECT_TRUE(c6 == c0); 256 } 257 258 TEST_F(CodecTest, TestSetParamAndGetParam) { 259 AudioCodec codec; 260 codec.SetParam("a", "1"); 261 codec.SetParam("b", "x"); 262 263 int int_value = 0; 264 EXPECT_TRUE(codec.GetParam("a", &int_value)); 265 EXPECT_EQ(1, int_value); 266 EXPECT_FALSE(codec.GetParam("b", &int_value)); 267 EXPECT_FALSE(codec.GetParam("c", &int_value)); 268 269 std::string str_value; 270 EXPECT_TRUE(codec.GetParam("a", &str_value)); 271 EXPECT_EQ("1", str_value); 272 EXPECT_TRUE(codec.GetParam("b", &str_value)); 273 EXPECT_EQ("x", str_value); 274 EXPECT_FALSE(codec.GetParam("c", &str_value)); 275 } 276 277 TEST_F(CodecTest, TestIntersectFeedbackParams) { 278 const FeedbackParam a1("a", "1"); 279 const FeedbackParam b2("b", "2"); 280 const FeedbackParam b3("b", "3"); 281 const FeedbackParam c3("c", "3"); 282 Codec c1; 283 c1.AddFeedbackParam(a1); // Only match with c2. 284 c1.AddFeedbackParam(b2); // Same param different values. 285 c1.AddFeedbackParam(c3); // Not in c2. 286 Codec c2; 287 c2.AddFeedbackParam(a1); 288 c2.AddFeedbackParam(b3); 289 290 c1.IntersectFeedbackParams(c2); 291 EXPECT_TRUE(c1.HasFeedbackParam(a1)); 292 EXPECT_FALSE(c1.HasFeedbackParam(b2)); 293 EXPECT_FALSE(c1.HasFeedbackParam(c3)); 294 } 295