xref: /aosp_15_r20/external/webrtc/media/base/codec_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2009 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "media/base/codec.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <tuple>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/av1_profile.h"
16*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/h264_profile_level_id.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/vp9_profile.h"
18*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/codecs/h264/include/h264.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/gunit.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker using cricket::AudioCodec;
22*d9f75844SAndroid Build Coastguard Worker using cricket::Codec;
23*d9f75844SAndroid Build Coastguard Worker using cricket::FeedbackParam;
24*d9f75844SAndroid Build Coastguard Worker using cricket::kCodecParamAssociatedPayloadType;
25*d9f75844SAndroid Build Coastguard Worker using cricket::kCodecParamMaxBitrate;
26*d9f75844SAndroid Build Coastguard Worker using cricket::kCodecParamMinBitrate;
27*d9f75844SAndroid Build Coastguard Worker using cricket::VideoCodec;
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker class TestCodec : public Codec {
30*d9f75844SAndroid Build Coastguard Worker  public:
TestCodec(int id,const std::string & name,int clockrate)31*d9f75844SAndroid Build Coastguard Worker   TestCodec(int id, const std::string& name, int clockrate)
32*d9f75844SAndroid Build Coastguard Worker       : Codec(id, name, clockrate) {}
TestCodec()33*d9f75844SAndroid Build Coastguard Worker   TestCodec() : Codec() {}
34*d9f75844SAndroid Build Coastguard Worker   TestCodec(const TestCodec& c) = default;
35*d9f75844SAndroid Build Coastguard Worker   TestCodec& operator=(const TestCodec& c) = default;
36*d9f75844SAndroid Build Coastguard Worker };
37*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestCodecOperators)38*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestCodecOperators) {
39*d9f75844SAndroid Build Coastguard Worker   TestCodec c0(96, "D", 1000);
40*d9f75844SAndroid Build Coastguard Worker   c0.SetParam("a", 1);
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker   TestCodec c1 = c0;
43*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1 == c0);
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   int param_value0;
46*d9f75844SAndroid Build Coastguard Worker   int param_value1;
47*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.GetParam("a", &param_value0));
48*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.GetParam("a", &param_value1));
49*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(param_value0, param_value1);
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker   c1.id = 86;
52*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c1);
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   c1 = c0;
55*d9f75844SAndroid Build Coastguard Worker   c1.name = "x";
56*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c1);
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker   c1 = c0;
59*d9f75844SAndroid Build Coastguard Worker   c1.clockrate = 2000;
60*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c1);
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker   c1 = c0;
63*d9f75844SAndroid Build Coastguard Worker   c1.SetParam("a", 2);
64*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c1);
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker   TestCodec c5;
67*d9f75844SAndroid Build Coastguard Worker   TestCodec c6(0, "", 0);
68*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c5 == c6);
69*d9f75844SAndroid Build Coastguard Worker }
70*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestAudioCodecOperators)71*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestAudioCodecOperators) {
72*d9f75844SAndroid Build Coastguard Worker   AudioCodec c0(96, "A", 44100, 20000, 2);
73*d9f75844SAndroid Build Coastguard Worker   AudioCodec c1(95, "A", 44100, 20000, 2);
74*d9f75844SAndroid Build Coastguard Worker   AudioCodec c2(96, "x", 44100, 20000, 2);
75*d9f75844SAndroid Build Coastguard Worker   AudioCodec c3(96, "A", 48000, 20000, 2);
76*d9f75844SAndroid Build Coastguard Worker   AudioCodec c4(96, "A", 44100, 10000, 2);
77*d9f75844SAndroid Build Coastguard Worker   AudioCodec c5(96, "A", 44100, 20000, 1);
78*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c1);
79*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c2);
80*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c3);
81*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c4);
82*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c5);
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker   AudioCodec c7;
85*d9f75844SAndroid Build Coastguard Worker   AudioCodec c8(0, "", 0, 0, 0);
86*d9f75844SAndroid Build Coastguard Worker   AudioCodec c9 = c0;
87*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(c8, c7);
88*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c9, c7);
89*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(c9, c0);
90*d9f75844SAndroid Build Coastguard Worker 
91*d9f75844SAndroid Build Coastguard Worker   AudioCodec c10(c0);
92*d9f75844SAndroid Build Coastguard Worker   AudioCodec c11(c0);
93*d9f75844SAndroid Build Coastguard Worker   AudioCodec c12(c0);
94*d9f75844SAndroid Build Coastguard Worker   AudioCodec c13(c0);
95*d9f75844SAndroid Build Coastguard Worker   c10.params["x"] = "abc";
96*d9f75844SAndroid Build Coastguard Worker   c11.params["x"] = "def";
97*d9f75844SAndroid Build Coastguard Worker   c12.params["y"] = "abc";
98*d9f75844SAndroid Build Coastguard Worker   c13.params["x"] = "abc";
99*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c10, c0);
100*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c11, c0);
101*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c11, c10);
102*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c12, c0);
103*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c12, c10);
104*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c12, c11);
105*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(c13, c10);
106*d9f75844SAndroid Build Coastguard Worker }
107*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestAudioCodecMatches)108*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestAudioCodecMatches) {
109*d9f75844SAndroid Build Coastguard Worker   // Test a codec with a static payload type.
110*d9f75844SAndroid Build Coastguard Worker   AudioCodec c0(34, "A", 44100, 20000, 1);
111*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 20000, 1)));
112*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 20000, 0)));
113*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 0, 0)));
114*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 0, 0, 0)));
115*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(96, "A", 44100, 20000, 1)));
116*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(96, "", 44100, 20000, 1)));
117*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 20000, 1)));
118*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 30000, 1)));
119*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 20000, 2)));
120*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 30000, 2)));
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker   // Test a codec with a dynamic payload type.
123*d9f75844SAndroid Build Coastguard Worker   AudioCodec c1(96, "A", 44100, 20000, 1);
124*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(96, "A", 0, 0, 0)));
125*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(97, "A", 0, 0, 0)));
126*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(96, "a", 0, 0, 0)));
127*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(97, "a", 0, 0, 0)));
128*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(35, "a", 0, 0, 0)));
129*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(42, "a", 0, 0, 0)));
130*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(AudioCodec(65, "a", 0, 0, 0)));
131*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(AudioCodec(95, "A", 0, 0, 0)));
132*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(AudioCodec(34, "A", 0, 0, 0)));
133*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(AudioCodec(96, "", 44100, 20000, 2)));
134*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(AudioCodec(96, "A", 55100, 30000, 1)));
135*d9f75844SAndroid Build Coastguard Worker 
136*d9f75844SAndroid Build Coastguard Worker   // Test a codec with a dynamic payload type, and auto bitrate.
137*d9f75844SAndroid Build Coastguard Worker   AudioCodec c2(97, "A", 16000, 0, 1);
138*d9f75844SAndroid Build Coastguard Worker   // Use default bitrate.
139*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 1)));
140*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 0)));
141*d9f75844SAndroid Build Coastguard Worker   // Use explicit bitrate.
142*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 32000, 1)));
143*d9f75844SAndroid Build Coastguard Worker   // Backward compatibility with clients that might send "-1" (for default).
144*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, -1, 1)));
145*d9f75844SAndroid Build Coastguard Worker 
146*d9f75844SAndroid Build Coastguard Worker   // Stereo doesn't match channels = 0.
147*d9f75844SAndroid Build Coastguard Worker   AudioCodec c3(96, "A", 44100, 20000, 2);
148*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 2)));
149*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 1)));
150*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 0)));
151*d9f75844SAndroid Build Coastguard Worker }
152*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestVideoCodecOperators)153*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVideoCodecOperators) {
154*d9f75844SAndroid Build Coastguard Worker   VideoCodec c0(96, "V");
155*d9f75844SAndroid Build Coastguard Worker   VideoCodec c1(95, "V");
156*d9f75844SAndroid Build Coastguard Worker   VideoCodec c2(96, "x");
157*d9f75844SAndroid Build Coastguard Worker 
158*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c1);
159*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0 != c2);
160*d9f75844SAndroid Build Coastguard Worker 
161*d9f75844SAndroid Build Coastguard Worker   VideoCodec c7;
162*d9f75844SAndroid Build Coastguard Worker   VideoCodec c8(0, "");
163*d9f75844SAndroid Build Coastguard Worker   VideoCodec c9 = c0;
164*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c8 == c7);
165*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c9 != c7);
166*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c9 == c0);
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   VideoCodec c10(c0);
169*d9f75844SAndroid Build Coastguard Worker   VideoCodec c11(c0);
170*d9f75844SAndroid Build Coastguard Worker   VideoCodec c12(c0);
171*d9f75844SAndroid Build Coastguard Worker   VideoCodec c13(c0);
172*d9f75844SAndroid Build Coastguard Worker   c10.params["x"] = "abc";
173*d9f75844SAndroid Build Coastguard Worker   c11.params["x"] = "def";
174*d9f75844SAndroid Build Coastguard Worker   c12.params["y"] = "abc";
175*d9f75844SAndroid Build Coastguard Worker   c13.params["x"] = "abc";
176*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c10 != c0);
177*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c11 != c0);
178*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c11 != c10);
179*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c12 != c0);
180*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c12 != c10);
181*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c12 != c11);
182*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c13 == c10);
183*d9f75844SAndroid Build Coastguard Worker }
184*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestVideoCodecIntersectPacketization)185*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVideoCodecIntersectPacketization) {
186*d9f75844SAndroid Build Coastguard Worker   VideoCodec c1;
187*d9f75844SAndroid Build Coastguard Worker   c1.packetization = "raw";
188*d9f75844SAndroid Build Coastguard Worker   VideoCodec c2;
189*d9f75844SAndroid Build Coastguard Worker   c2.packetization = "raw";
190*d9f75844SAndroid Build Coastguard Worker   VideoCodec c3;
191*d9f75844SAndroid Build Coastguard Worker 
192*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::IntersectPacketization(c1, c2), "raw");
193*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::IntersectPacketization(c1, c3), absl::nullopt);
194*d9f75844SAndroid Build Coastguard Worker }
195*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestVideoCodecEqualsWithDifferentPacketization)196*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVideoCodecEqualsWithDifferentPacketization) {
197*d9f75844SAndroid Build Coastguard Worker   VideoCodec c0(100, cricket::kVp8CodecName);
198*d9f75844SAndroid Build Coastguard Worker   VideoCodec c1(100, cricket::kVp8CodecName);
199*d9f75844SAndroid Build Coastguard Worker   VideoCodec c2(100, cricket::kVp8CodecName);
200*d9f75844SAndroid Build Coastguard Worker   c2.packetization = "raw";
201*d9f75844SAndroid Build Coastguard Worker 
202*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(c0, c1);
203*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c0, c2);
204*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(c2, c0);
205*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(c2, c2);
206*d9f75844SAndroid Build Coastguard Worker }
207*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestVideoCodecMatches)208*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVideoCodecMatches) {
209*d9f75844SAndroid Build Coastguard Worker   // Test a codec with a static payload type.
210*d9f75844SAndroid Build Coastguard Worker   VideoCodec c0(34, "V");
211*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(VideoCodec(34, "")));
212*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(VideoCodec(96, "")));
213*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c0.Matches(VideoCodec(96, "V")));
214*d9f75844SAndroid Build Coastguard Worker 
215*d9f75844SAndroid Build Coastguard Worker   // Test a codec with a dynamic payload type.
216*d9f75844SAndroid Build Coastguard Worker   VideoCodec c1(96, "V");
217*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(96, "V")));
218*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(97, "V")));
219*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(96, "v")));
220*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(97, "v")));
221*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(35, "v")));
222*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(42, "v")));
223*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(VideoCodec(65, "v")));
224*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(VideoCodec(96, "")));
225*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(VideoCodec(95, "V")));
226*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.Matches(VideoCodec(34, "V")));
227*d9f75844SAndroid Build Coastguard Worker }
228*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestVideoCodecMatchesWithDifferentPacketization)229*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVideoCodecMatchesWithDifferentPacketization) {
230*d9f75844SAndroid Build Coastguard Worker   VideoCodec c0(100, cricket::kVp8CodecName);
231*d9f75844SAndroid Build Coastguard Worker   VideoCodec c1(101, cricket::kVp8CodecName);
232*d9f75844SAndroid Build Coastguard Worker   c1.packetization = "raw";
233*d9f75844SAndroid Build Coastguard Worker 
234*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.Matches(c1));
235*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.Matches(c0));
236*d9f75844SAndroid Build Coastguard Worker }
237*d9f75844SAndroid Build Coastguard Worker 
238*d9f75844SAndroid Build Coastguard Worker // AV1 codecs compare profile information.
TEST(CodecTest,TestAV1CodecMatches)239*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestAV1CodecMatches) {
240*d9f75844SAndroid Build Coastguard Worker   const char kProfile0[] = "0";
241*d9f75844SAndroid Build Coastguard Worker   const char kProfile1[] = "1";
242*d9f75844SAndroid Build Coastguard Worker   const char kProfile2[] = "2";
243*d9f75844SAndroid Build Coastguard Worker 
244*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_no_profile(95, cricket::kAv1CodecName);
245*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_profile0(95, cricket::kAv1CodecName);
246*d9f75844SAndroid Build Coastguard Worker   c_profile0.params[webrtc::kAV1FmtpProfile] = kProfile0;
247*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_profile1(95, cricket::kAv1CodecName);
248*d9f75844SAndroid Build Coastguard Worker   c_profile1.params[webrtc::kAV1FmtpProfile] = kProfile1;
249*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_profile2(95, cricket::kAv1CodecName);
250*d9f75844SAndroid Build Coastguard Worker   c_profile2.params[webrtc::kAV1FmtpProfile] = kProfile2;
251*d9f75844SAndroid Build Coastguard Worker 
252*d9f75844SAndroid Build Coastguard Worker   // An AV1 entry with no profile specified should be treated as profile-0.
253*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c_profile0.Matches(c_no_profile));
254*d9f75844SAndroid Build Coastguard Worker 
255*d9f75844SAndroid Build Coastguard Worker   {
256*d9f75844SAndroid Build Coastguard Worker     // Two AV1 entries without a profile specified are treated as duplicates.
257*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_no_profile_eq(95, cricket::kAv1CodecName);
258*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(c_no_profile.Matches(c_no_profile_eq));
259*d9f75844SAndroid Build Coastguard Worker   }
260*d9f75844SAndroid Build Coastguard Worker 
261*d9f75844SAndroid Build Coastguard Worker   {
262*d9f75844SAndroid Build Coastguard Worker     // Two AV1 entries with profile 0 specified are treated as duplicates.
263*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_profile0_eq(95, cricket::kAv1CodecName);
264*d9f75844SAndroid Build Coastguard Worker     c_profile0_eq.params[webrtc::kAV1FmtpProfile] = kProfile0;
265*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(c_profile0.Matches(c_profile0_eq));
266*d9f75844SAndroid Build Coastguard Worker   }
267*d9f75844SAndroid Build Coastguard Worker 
268*d9f75844SAndroid Build Coastguard Worker   {
269*d9f75844SAndroid Build Coastguard Worker     // Two AV1 entries with profile 1 specified are treated as duplicates.
270*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_profile1_eq(95, cricket::kAv1CodecName);
271*d9f75844SAndroid Build Coastguard Worker     c_profile1_eq.params[webrtc::kAV1FmtpProfile] = kProfile1;
272*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(c_profile1.Matches(c_profile1_eq));
273*d9f75844SAndroid Build Coastguard Worker   }
274*d9f75844SAndroid Build Coastguard Worker 
275*d9f75844SAndroid Build Coastguard Worker   // AV1 entries with different profiles (0 and 1) are seen as distinct.
276*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c_profile0.Matches(c_profile1));
277*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c_no_profile.Matches(c_profile1));
278*d9f75844SAndroid Build Coastguard Worker 
279*d9f75844SAndroid Build Coastguard Worker   // AV1 entries with different profiles (0 and 2) are seen as distinct.
280*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c_profile0.Matches(c_profile2));
281*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c_no_profile.Matches(c_profile2));
282*d9f75844SAndroid Build Coastguard Worker }
283*d9f75844SAndroid Build Coastguard Worker 
284*d9f75844SAndroid Build Coastguard Worker // VP9 codecs compare profile information.
TEST(CodecTest,TestVP9CodecMatches)285*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestVP9CodecMatches) {
286*d9f75844SAndroid Build Coastguard Worker   const char kProfile0[] = "0";
287*d9f75844SAndroid Build Coastguard Worker   const char kProfile2[] = "2";
288*d9f75844SAndroid Build Coastguard Worker 
289*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_no_profile(95, cricket::kVp9CodecName);
290*d9f75844SAndroid Build Coastguard Worker   VideoCodec c_profile0(95, cricket::kVp9CodecName);
291*d9f75844SAndroid Build Coastguard Worker   c_profile0.params[webrtc::kVP9FmtpProfileId] = kProfile0;
292*d9f75844SAndroid Build Coastguard Worker 
293*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c_profile0.Matches(c_no_profile));
294*d9f75844SAndroid Build Coastguard Worker 
295*d9f75844SAndroid Build Coastguard Worker   {
296*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_profile0_eq(95, cricket::kVp9CodecName);
297*d9f75844SAndroid Build Coastguard Worker     c_profile0_eq.params[webrtc::kVP9FmtpProfileId] = kProfile0;
298*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(c_profile0.Matches(c_profile0_eq));
299*d9f75844SAndroid Build Coastguard Worker   }
300*d9f75844SAndroid Build Coastguard Worker 
301*d9f75844SAndroid Build Coastguard Worker   {
302*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_profile2(95, cricket::kVp9CodecName);
303*d9f75844SAndroid Build Coastguard Worker     c_profile2.params[webrtc::kVP9FmtpProfileId] = kProfile2;
304*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(c_profile0.Matches(c_profile2));
305*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(c_no_profile.Matches(c_profile2));
306*d9f75844SAndroid Build Coastguard Worker   }
307*d9f75844SAndroid Build Coastguard Worker 
308*d9f75844SAndroid Build Coastguard Worker   {
309*d9f75844SAndroid Build Coastguard Worker     VideoCodec c_no_profile_eq(95, cricket::kVp9CodecName);
310*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(c_no_profile.Matches(c_no_profile_eq));
311*d9f75844SAndroid Build Coastguard Worker   }
312*d9f75844SAndroid Build Coastguard Worker }
313*d9f75844SAndroid Build Coastguard Worker 
314*d9f75844SAndroid Build Coastguard Worker // Matching H264 codecs also need to have matching profile-level-id and
315*d9f75844SAndroid Build Coastguard Worker // packetization-mode.
TEST(CodecTest,TestH264CodecMatches)316*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestH264CodecMatches) {
317*d9f75844SAndroid Build Coastguard Worker   const char kProfileLevelId1[] = "42e01f";
318*d9f75844SAndroid Build Coastguard Worker   const char kProfileLevelId2[] = "42a01e";
319*d9f75844SAndroid Build Coastguard Worker 
320*d9f75844SAndroid Build Coastguard Worker   VideoCodec pli_1_pm_0(95, "H264");
321*d9f75844SAndroid Build Coastguard Worker   pli_1_pm_0.params[cricket::kH264FmtpProfileLevelId] = kProfileLevelId1;
322*d9f75844SAndroid Build Coastguard Worker   pli_1_pm_0.params[cricket::kH264FmtpPacketizationMode] = "0";
323*d9f75844SAndroid Build Coastguard Worker 
324*d9f75844SAndroid Build Coastguard Worker   {
325*d9f75844SAndroid Build Coastguard Worker     VideoCodec pli_1_pm_blank(95, "H264");
326*d9f75844SAndroid Build Coastguard Worker     pli_1_pm_blank.params[cricket::kH264FmtpProfileLevelId] = kProfileLevelId1;
327*d9f75844SAndroid Build Coastguard Worker     pli_1_pm_blank.params.erase(
328*d9f75844SAndroid Build Coastguard Worker         pli_1_pm_blank.params.find(cricket::kH264FmtpPacketizationMode));
329*d9f75844SAndroid Build Coastguard Worker 
330*d9f75844SAndroid Build Coastguard Worker     // Matches since if packetization-mode is not specified it defaults to "0".
331*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(pli_1_pm_0.Matches(pli_1_pm_blank));
332*d9f75844SAndroid Build Coastguard Worker   }
333*d9f75844SAndroid Build Coastguard Worker 
334*d9f75844SAndroid Build Coastguard Worker   {
335*d9f75844SAndroid Build Coastguard Worker     VideoCodec pli_1_pm_1(95, "H264");
336*d9f75844SAndroid Build Coastguard Worker     pli_1_pm_1.params[cricket::kH264FmtpProfileLevelId] = kProfileLevelId1;
337*d9f75844SAndroid Build Coastguard Worker     pli_1_pm_1.params[cricket::kH264FmtpPacketizationMode] = "1";
338*d9f75844SAndroid Build Coastguard Worker 
339*d9f75844SAndroid Build Coastguard Worker     // Does not match since packetization-mode is different.
340*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(pli_1_pm_0.Matches(pli_1_pm_1));
341*d9f75844SAndroid Build Coastguard Worker   }
342*d9f75844SAndroid Build Coastguard Worker 
343*d9f75844SAndroid Build Coastguard Worker   {
344*d9f75844SAndroid Build Coastguard Worker     VideoCodec pli_2_pm_0(95, "H264");
345*d9f75844SAndroid Build Coastguard Worker     pli_2_pm_0.params[cricket::kH264FmtpProfileLevelId] = kProfileLevelId2;
346*d9f75844SAndroid Build Coastguard Worker     pli_2_pm_0.params[cricket::kH264FmtpPacketizationMode] = "0";
347*d9f75844SAndroid Build Coastguard Worker 
348*d9f75844SAndroid Build Coastguard Worker     // Does not match since profile-level-id is different.
349*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(pli_1_pm_0.Matches(pli_2_pm_0));
350*d9f75844SAndroid Build Coastguard Worker   }
351*d9f75844SAndroid Build Coastguard Worker }
352*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestSetParamGetParamAndRemoveParam)353*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestSetParamGetParamAndRemoveParam) {
354*d9f75844SAndroid Build Coastguard Worker   AudioCodec codec;
355*d9f75844SAndroid Build Coastguard Worker   codec.SetParam("a", "1");
356*d9f75844SAndroid Build Coastguard Worker   codec.SetParam("b", "x");
357*d9f75844SAndroid Build Coastguard Worker 
358*d9f75844SAndroid Build Coastguard Worker   int int_value = 0;
359*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(codec.GetParam("a", &int_value));
360*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(1, int_value);
361*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(codec.GetParam("b", &int_value));
362*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(codec.GetParam("c", &int_value));
363*d9f75844SAndroid Build Coastguard Worker 
364*d9f75844SAndroid Build Coastguard Worker   std::string str_value;
365*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(codec.GetParam("a", &str_value));
366*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("1", str_value);
367*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(codec.GetParam("b", &str_value));
368*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("x", str_value);
369*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(codec.GetParam("c", &str_value));
370*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(codec.RemoveParam("a"));
371*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(codec.RemoveParam("c"));
372*d9f75844SAndroid Build Coastguard Worker }
373*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestIntersectFeedbackParams)374*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestIntersectFeedbackParams) {
375*d9f75844SAndroid Build Coastguard Worker   const FeedbackParam a1("a", "1");
376*d9f75844SAndroid Build Coastguard Worker   const FeedbackParam b2("b", "2");
377*d9f75844SAndroid Build Coastguard Worker   const FeedbackParam b3("b", "3");
378*d9f75844SAndroid Build Coastguard Worker   const FeedbackParam c3("c", "3");
379*d9f75844SAndroid Build Coastguard Worker   TestCodec c1;
380*d9f75844SAndroid Build Coastguard Worker   c1.AddFeedbackParam(a1);  // Only match with c2.
381*d9f75844SAndroid Build Coastguard Worker   c1.AddFeedbackParam(b2);  // Same param different values.
382*d9f75844SAndroid Build Coastguard Worker   c1.AddFeedbackParam(c3);  // Not in c2.
383*d9f75844SAndroid Build Coastguard Worker   TestCodec c2;
384*d9f75844SAndroid Build Coastguard Worker   c2.AddFeedbackParam(a1);
385*d9f75844SAndroid Build Coastguard Worker   c2.AddFeedbackParam(b3);
386*d9f75844SAndroid Build Coastguard Worker 
387*d9f75844SAndroid Build Coastguard Worker   c1.IntersectFeedbackParams(c2);
388*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.HasFeedbackParam(a1));
389*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.HasFeedbackParam(b2));
390*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(c1.HasFeedbackParam(c3));
391*d9f75844SAndroid Build Coastguard Worker }
392*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestGetCodecType)393*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestGetCodecType) {
394*d9f75844SAndroid Build Coastguard Worker   // Codec type comparison should be case insenstive on names.
395*d9f75844SAndroid Build Coastguard Worker   const VideoCodec codec(96, "V");
396*d9f75844SAndroid Build Coastguard Worker   const VideoCodec rtx_codec(96, "rTx");
397*d9f75844SAndroid Build Coastguard Worker   const VideoCodec ulpfec_codec(96, "ulpFeC");
398*d9f75844SAndroid Build Coastguard Worker   const VideoCodec flexfec_codec(96, "FlExFeC-03");
399*d9f75844SAndroid Build Coastguard Worker   const VideoCodec red_codec(96, "ReD");
400*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_VIDEO, codec.GetCodecType());
401*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_RTX, rtx_codec.GetCodecType());
402*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_ULPFEC, ulpfec_codec.GetCodecType());
403*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_FLEXFEC, flexfec_codec.GetCodecType());
404*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_RED, red_codec.GetCodecType());
405*d9f75844SAndroid Build Coastguard Worker }
406*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestCreateRtxCodec)407*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestCreateRtxCodec) {
408*d9f75844SAndroid Build Coastguard Worker   VideoCodec rtx_codec = VideoCodec::CreateRtxCodec(96, 120);
409*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(96, rtx_codec.id);
410*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(VideoCodec::CODEC_RTX, rtx_codec.GetCodecType());
411*d9f75844SAndroid Build Coastguard Worker   int associated_payload_type;
412*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(rtx_codec.GetParam(kCodecParamAssociatedPayloadType,
413*d9f75844SAndroid Build Coastguard Worker                                  &associated_payload_type));
414*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(120, associated_payload_type);
415*d9f75844SAndroid Build Coastguard Worker }
416*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestValidateCodecFormat)417*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestValidateCodecFormat) {
418*d9f75844SAndroid Build Coastguard Worker   const VideoCodec codec(96, "V");
419*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(codec.ValidateCodecFormat());
420*d9f75844SAndroid Build Coastguard Worker 
421*d9f75844SAndroid Build Coastguard Worker   // Accept 0-127 as payload types.
422*d9f75844SAndroid Build Coastguard Worker   VideoCodec low_payload_type = codec;
423*d9f75844SAndroid Build Coastguard Worker   low_payload_type.id = 0;
424*d9f75844SAndroid Build Coastguard Worker   VideoCodec high_payload_type = codec;
425*d9f75844SAndroid Build Coastguard Worker   high_payload_type.id = 127;
426*d9f75844SAndroid Build Coastguard Worker   ASSERT_TRUE(low_payload_type.ValidateCodecFormat());
427*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(high_payload_type.ValidateCodecFormat());
428*d9f75844SAndroid Build Coastguard Worker 
429*d9f75844SAndroid Build Coastguard Worker   // Reject negative payloads.
430*d9f75844SAndroid Build Coastguard Worker   VideoCodec negative_payload_type = codec;
431*d9f75844SAndroid Build Coastguard Worker   negative_payload_type.id = -1;
432*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(negative_payload_type.ValidateCodecFormat());
433*d9f75844SAndroid Build Coastguard Worker 
434*d9f75844SAndroid Build Coastguard Worker   // Reject too-high payloads.
435*d9f75844SAndroid Build Coastguard Worker   VideoCodec too_high_payload_type = codec;
436*d9f75844SAndroid Build Coastguard Worker   too_high_payload_type.id = 128;
437*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(too_high_payload_type.ValidateCodecFormat());
438*d9f75844SAndroid Build Coastguard Worker 
439*d9f75844SAndroid Build Coastguard Worker   // Reject codecs with min bitrate > max bitrate.
440*d9f75844SAndroid Build Coastguard Worker   VideoCodec incorrect_bitrates = codec;
441*d9f75844SAndroid Build Coastguard Worker   incorrect_bitrates.params[kCodecParamMinBitrate] = "100";
442*d9f75844SAndroid Build Coastguard Worker   incorrect_bitrates.params[kCodecParamMaxBitrate] = "80";
443*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(incorrect_bitrates.ValidateCodecFormat());
444*d9f75844SAndroid Build Coastguard Worker 
445*d9f75844SAndroid Build Coastguard Worker   // Accept min bitrate == max bitrate.
446*d9f75844SAndroid Build Coastguard Worker   VideoCodec equal_bitrates = codec;
447*d9f75844SAndroid Build Coastguard Worker   equal_bitrates.params[kCodecParamMinBitrate] = "100";
448*d9f75844SAndroid Build Coastguard Worker   equal_bitrates.params[kCodecParamMaxBitrate] = "100";
449*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(equal_bitrates.ValidateCodecFormat());
450*d9f75844SAndroid Build Coastguard Worker 
451*d9f75844SAndroid Build Coastguard Worker   // Accept min bitrate < max bitrate.
452*d9f75844SAndroid Build Coastguard Worker   VideoCodec different_bitrates = codec;
453*d9f75844SAndroid Build Coastguard Worker   different_bitrates.params[kCodecParamMinBitrate] = "99";
454*d9f75844SAndroid Build Coastguard Worker   different_bitrates.params[kCodecParamMaxBitrate] = "100";
455*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(different_bitrates.ValidateCodecFormat());
456*d9f75844SAndroid Build Coastguard Worker }
457*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,TestToCodecParameters)458*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, TestToCodecParameters) {
459*d9f75844SAndroid Build Coastguard Worker   VideoCodec v(96, "V");
460*d9f75844SAndroid Build Coastguard Worker   v.SetParam("p1", "v1");
461*d9f75844SAndroid Build Coastguard Worker   webrtc::RtpCodecParameters codec_params_1 = v.ToCodecParameters();
462*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(96, codec_params_1.payload_type);
463*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec_params_1.kind);
464*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("V", codec_params_1.name);
465*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(cricket::kVideoCodecClockrate, codec_params_1.clock_rate);
466*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(absl::nullopt, codec_params_1.num_channels);
467*d9f75844SAndroid Build Coastguard Worker   ASSERT_EQ(1u, codec_params_1.parameters.size());
468*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("p1", codec_params_1.parameters.begin()->first);
469*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("v1", codec_params_1.parameters.begin()->second);
470*d9f75844SAndroid Build Coastguard Worker 
471*d9f75844SAndroid Build Coastguard Worker   AudioCodec a(97, "A", 44100, 20000, 2);
472*d9f75844SAndroid Build Coastguard Worker   a.SetParam("p1", "a1");
473*d9f75844SAndroid Build Coastguard Worker   webrtc::RtpCodecParameters codec_params_2 = a.ToCodecParameters();
474*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(97, codec_params_2.payload_type);
475*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec_params_2.kind);
476*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("A", codec_params_2.name);
477*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(44100, codec_params_2.clock_rate);
478*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2, codec_params_2.num_channels);
479*d9f75844SAndroid Build Coastguard Worker   ASSERT_EQ(1u, codec_params_2.parameters.size());
480*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("p1", codec_params_2.parameters.begin()->first);
481*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ("a1", codec_params_2.parameters.begin()->second);
482*d9f75844SAndroid Build Coastguard Worker }
483*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,H264CostrainedBaselineIsAddedIfH264IsSupported)484*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, H264CostrainedBaselineIsAddedIfH264IsSupported) {
485*d9f75844SAndroid Build Coastguard Worker   const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = {
486*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileBaseline,
487*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "1"),
488*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileBaseline,
489*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "0")};
490*d9f75844SAndroid Build Coastguard Worker 
491*d9f75844SAndroid Build Coastguard Worker   std::vector<webrtc::SdpVideoFormat> supported_formats =
492*d9f75844SAndroid Build Coastguard Worker       kExplicitlySupportedFormats;
493*d9f75844SAndroid Build Coastguard Worker   cricket::AddH264ConstrainedBaselineProfileToSupportedFormats(
494*d9f75844SAndroid Build Coastguard Worker       &supported_formats);
495*d9f75844SAndroid Build Coastguard Worker 
496*d9f75844SAndroid Build Coastguard Worker   const webrtc::SdpVideoFormat kH264ConstrainedBasedlinePacketization1 =
497*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileConstrainedBaseline,
498*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "1");
499*d9f75844SAndroid Build Coastguard Worker   const webrtc::SdpVideoFormat kH264ConstrainedBasedlinePacketization0 =
500*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileConstrainedBaseline,
501*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "0");
502*d9f75844SAndroid Build Coastguard Worker 
503*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]);
504*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[1], kExplicitlySupportedFormats[1]);
505*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[2], kH264ConstrainedBasedlinePacketization1);
506*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[3], kH264ConstrainedBasedlinePacketization0);
507*d9f75844SAndroid Build Coastguard Worker }
508*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,H264CostrainedBaselineIsNotAddedIfH264IsUnsupported)509*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, H264CostrainedBaselineIsNotAddedIfH264IsUnsupported) {
510*d9f75844SAndroid Build Coastguard Worker   const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = {
511*d9f75844SAndroid Build Coastguard Worker       {cricket::kVp9CodecName,
512*d9f75844SAndroid Build Coastguard Worker        {{webrtc::kVP9FmtpProfileId,
513*d9f75844SAndroid Build Coastguard Worker          VP9ProfileToString(webrtc::VP9Profile::kProfile0)}}}};
514*d9f75844SAndroid Build Coastguard Worker 
515*d9f75844SAndroid Build Coastguard Worker   std::vector<webrtc::SdpVideoFormat> supported_formats =
516*d9f75844SAndroid Build Coastguard Worker       kExplicitlySupportedFormats;
517*d9f75844SAndroid Build Coastguard Worker   cricket::AddH264ConstrainedBaselineProfileToSupportedFormats(
518*d9f75844SAndroid Build Coastguard Worker       &supported_formats);
519*d9f75844SAndroid Build Coastguard Worker 
520*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]);
521*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats.size(), kExplicitlySupportedFormats.size());
522*d9f75844SAndroid Build Coastguard Worker }
523*d9f75844SAndroid Build Coastguard Worker 
TEST(CodecTest,H264CostrainedBaselineNotAddedIfAlreadySpecified)524*d9f75844SAndroid Build Coastguard Worker TEST(CodecTest, H264CostrainedBaselineNotAddedIfAlreadySpecified) {
525*d9f75844SAndroid Build Coastguard Worker   const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = {
526*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileBaseline,
527*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "1"),
528*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileBaseline,
529*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "0"),
530*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileConstrainedBaseline,
531*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "1"),
532*d9f75844SAndroid Build Coastguard Worker       webrtc::CreateH264Format(webrtc::H264Profile::kProfileConstrainedBaseline,
533*d9f75844SAndroid Build Coastguard Worker                                webrtc::H264Level::kLevel3_1, "0")};
534*d9f75844SAndroid Build Coastguard Worker 
535*d9f75844SAndroid Build Coastguard Worker   std::vector<webrtc::SdpVideoFormat> supported_formats =
536*d9f75844SAndroid Build Coastguard Worker       kExplicitlySupportedFormats;
537*d9f75844SAndroid Build Coastguard Worker   cricket::AddH264ConstrainedBaselineProfileToSupportedFormats(
538*d9f75844SAndroid Build Coastguard Worker       &supported_formats);
539*d9f75844SAndroid Build Coastguard Worker 
540*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]);
541*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[1], kExplicitlySupportedFormats[1]);
542*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[2], kExplicitlySupportedFormats[2]);
543*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats[3], kExplicitlySupportedFormats[3]);
544*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(supported_formats.size(), kExplicitlySupportedFormats.size());
545*d9f75844SAndroid Build Coastguard Worker }
546