1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2017 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 "pc/rtp_parameters_conversion.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
14*d9f75844SAndroid Build Coastguard Worker #include <map>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker #include "api/media_types.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker using ::testing::UnorderedElementsAre;
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
24*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketFeedbackParam)25*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketFeedbackParam) {
26*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketFeedbackParam(
27*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR});
28*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("ccm", "fir"), result.value());
29*d9f75844SAndroid Build Coastguard Worker
30*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::LNTF));
31*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("goog-lntf"), result.value());
32*d9f75844SAndroid Build Coastguard Worker
33*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
34*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::GENERIC_NACK});
35*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("nack"), result.value());
36*d9f75844SAndroid Build Coastguard Worker
37*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
38*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI});
39*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("nack", "pli"), result.value());
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::REMB));
42*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("goog-remb"), result.value());
43*d9f75844SAndroid Build Coastguard Worker
44*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC));
45*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::FeedbackParam("transport-cc"), result.value());
46*d9f75844SAndroid Build Coastguard Worker }
47*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketFeedbackParamErrors)48*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketFeedbackParamErrors) {
49*d9f75844SAndroid Build Coastguard Worker // CCM with missing or invalid message type.
50*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::CCM));
51*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
52*d9f75844SAndroid Build Coastguard Worker
53*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
54*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::CCM, RtcpFeedbackMessageType::PLI});
55*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
56*d9f75844SAndroid Build Coastguard Worker
57*d9f75844SAndroid Build Coastguard Worker // LNTF with message type (should be left empty).
58*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
59*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::LNTF, RtcpFeedbackMessageType::GENERIC_NACK});
60*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker // NACK with missing or invalid message type.
63*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::NACK));
64*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
65*d9f75844SAndroid Build Coastguard Worker
66*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
67*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::FIR});
68*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
69*d9f75844SAndroid Build Coastguard Worker
70*d9f75844SAndroid Build Coastguard Worker // REMB with message type (should be left empty).
71*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
72*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::REMB, RtcpFeedbackMessageType::GENERIC_NACK});
73*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Worker // TRANSPORT_CC with message type (should be left empty).
76*d9f75844SAndroid Build Coastguard Worker result = ToCricketFeedbackParam(
77*d9f75844SAndroid Build Coastguard Worker {RtcpFeedbackType::TRANSPORT_CC, RtcpFeedbackMessageType::FIR});
78*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
79*d9f75844SAndroid Build Coastguard Worker }
80*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToAudioCodec)81*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToAudioCodec) {
82*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
83*d9f75844SAndroid Build Coastguard Worker codec.name = "AuDiO";
84*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_AUDIO;
85*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 120;
86*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(36000);
87*d9f75844SAndroid Build Coastguard Worker codec.num_channels.emplace(6);
88*d9f75844SAndroid Build Coastguard Worker codec.parameters["foo"] = "bar";
89*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
90*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::AudioCodec>(codec);
91*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
92*d9f75844SAndroid Build Coastguard Worker
93*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("AuDiO", result.value().name);
94*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(120, result.value().id);
95*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(36000, result.value().clockrate);
96*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(6u, result.value().channels);
97*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, result.value().params.size());
98*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", result.value().params["foo"]);
99*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, result.value().feedback_params.params().size());
100*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.value().feedback_params.Has(
101*d9f75844SAndroid Build Coastguard Worker cricket::FeedbackParam("transport-cc")));
102*d9f75844SAndroid Build Coastguard Worker }
103*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToVideoCodec)104*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToVideoCodec) {
105*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
106*d9f75844SAndroid Build Coastguard Worker codec.name = "coolcodec";
107*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
108*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 101;
109*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
110*d9f75844SAndroid Build Coastguard Worker codec.parameters["foo"] = "bar";
111*d9f75844SAndroid Build Coastguard Worker codec.parameters["PING"] = "PONG";
112*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.emplace_back(RtcpFeedbackType::LNTF);
113*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
114*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
115*d9f75844SAndroid Build Coastguard Worker RtcpFeedbackMessageType::PLI);
116*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::VideoCodec>(codec);
117*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
118*d9f75844SAndroid Build Coastguard Worker
119*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("coolcodec", result.value().name);
120*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(101, result.value().id);
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(90000, result.value().clockrate);
122*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, result.value().params.size());
123*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", result.value().params["foo"]);
124*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("PONG", result.value().params["PING"]);
125*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3u, result.value().feedback_params.params().size());
126*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(
127*d9f75844SAndroid Build Coastguard Worker result.value().feedback_params.Has(cricket::FeedbackParam("goog-lntf")));
128*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.value().feedback_params.Has(
129*d9f75844SAndroid Build Coastguard Worker cricket::FeedbackParam("transport-cc")));
130*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.value().feedback_params.Has(
131*d9f75844SAndroid Build Coastguard Worker cricket::FeedbackParam("nack", "pli")));
132*d9f75844SAndroid Build Coastguard Worker }
133*d9f75844SAndroid Build Coastguard Worker
134*d9f75844SAndroid Build Coastguard Worker // Trying to convert to an AudioCodec if the kind is "video" should fail.
TEST(RtpParametersConversionTest,ToCricketCodecInvalidKind)135*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketCodecInvalidKind) {
136*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters audio_codec;
137*d9f75844SAndroid Build Coastguard Worker audio_codec.name = "opus";
138*d9f75844SAndroid Build Coastguard Worker audio_codec.kind = cricket::MEDIA_TYPE_VIDEO;
139*d9f75844SAndroid Build Coastguard Worker audio_codec.payload_type = 111;
140*d9f75844SAndroid Build Coastguard Worker audio_codec.clock_rate.emplace(48000);
141*d9f75844SAndroid Build Coastguard Worker audio_codec.num_channels.emplace(2);
142*d9f75844SAndroid Build Coastguard Worker
143*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters video_codec;
144*d9f75844SAndroid Build Coastguard Worker video_codec.name = "VP8";
145*d9f75844SAndroid Build Coastguard Worker video_codec.kind = cricket::MEDIA_TYPE_AUDIO;
146*d9f75844SAndroid Build Coastguard Worker video_codec.payload_type = 102;
147*d9f75844SAndroid Build Coastguard Worker video_codec.clock_rate.emplace(90000);
148*d9f75844SAndroid Build Coastguard Worker
149*d9f75844SAndroid Build Coastguard Worker auto audio_result = ToCricketCodec<cricket::AudioCodec>(audio_codec);
150*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, audio_result.error().type());
151*d9f75844SAndroid Build Coastguard Worker
152*d9f75844SAndroid Build Coastguard Worker auto video_result = ToCricketCodec<cricket::VideoCodec>(video_codec);
153*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, video_result.error().type());
154*d9f75844SAndroid Build Coastguard Worker
155*d9f75844SAndroid Build Coastguard Worker // Sanity check that if the kind is correct, the conversion succeeds.
156*d9f75844SAndroid Build Coastguard Worker audio_codec.kind = cricket::MEDIA_TYPE_AUDIO;
157*d9f75844SAndroid Build Coastguard Worker video_codec.kind = cricket::MEDIA_TYPE_VIDEO;
158*d9f75844SAndroid Build Coastguard Worker audio_result = ToCricketCodec<cricket::AudioCodec>(audio_codec);
159*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(audio_result.ok());
160*d9f75844SAndroid Build Coastguard Worker video_result = ToCricketCodec<cricket::VideoCodec>(video_codec);
161*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(video_result.ok());
162*d9f75844SAndroid Build Coastguard Worker }
163*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToAudioCodecInvalidParameters)164*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToAudioCodecInvalidParameters) {
165*d9f75844SAndroid Build Coastguard Worker // Missing channels.
166*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
167*d9f75844SAndroid Build Coastguard Worker codec.name = "opus";
168*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_AUDIO;
169*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 111;
170*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(48000);
171*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::AudioCodec>(codec);
172*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
173*d9f75844SAndroid Build Coastguard Worker
174*d9f75844SAndroid Build Coastguard Worker // Negative number of channels.
175*d9f75844SAndroid Build Coastguard Worker codec.num_channels.emplace(-1);
176*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::AudioCodec>(codec);
177*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
178*d9f75844SAndroid Build Coastguard Worker
179*d9f75844SAndroid Build Coastguard Worker // Missing clock rate.
180*d9f75844SAndroid Build Coastguard Worker codec.num_channels.emplace(2);
181*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.reset();
182*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::AudioCodec>(codec);
183*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
184*d9f75844SAndroid Build Coastguard Worker
185*d9f75844SAndroid Build Coastguard Worker // Negative clock rate.
186*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(-48000);
187*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::AudioCodec>(codec);
188*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
189*d9f75844SAndroid Build Coastguard Worker
190*d9f75844SAndroid Build Coastguard Worker // Sanity check that conversion succeeds if these errors are fixed.
191*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(48000);
192*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::AudioCodec>(codec);
193*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
194*d9f75844SAndroid Build Coastguard Worker }
195*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToVideoCodecInvalidParameters)196*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToVideoCodecInvalidParameters) {
197*d9f75844SAndroid Build Coastguard Worker // Missing clock rate.
198*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
199*d9f75844SAndroid Build Coastguard Worker codec.name = "VP8";
200*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
201*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 102;
202*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::VideoCodec>(codec);
203*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
204*d9f75844SAndroid Build Coastguard Worker
205*d9f75844SAndroid Build Coastguard Worker // Invalid clock rate.
206*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(48000);
207*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
208*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
209*d9f75844SAndroid Build Coastguard Worker
210*d9f75844SAndroid Build Coastguard Worker // Channels set (should be unset).
211*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
212*d9f75844SAndroid Build Coastguard Worker codec.num_channels.emplace(2);
213*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
214*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
215*d9f75844SAndroid Build Coastguard Worker
216*d9f75844SAndroid Build Coastguard Worker // Sanity check that conversion succeeds if these errors are fixed.
217*d9f75844SAndroid Build Coastguard Worker codec.num_channels.reset();
218*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
219*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
220*d9f75844SAndroid Build Coastguard Worker }
221*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketCodecInvalidPayloadType)222*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketCodecInvalidPayloadType) {
223*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
224*d9f75844SAndroid Build Coastguard Worker codec.name = "VP8";
225*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
226*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
227*d9f75844SAndroid Build Coastguard Worker
228*d9f75844SAndroid Build Coastguard Worker codec.payload_type = -1000;
229*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::VideoCodec>(codec);
230*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
231*d9f75844SAndroid Build Coastguard Worker
232*d9f75844SAndroid Build Coastguard Worker // Max payload type is 127.
233*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 128;
234*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
235*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
236*d9f75844SAndroid Build Coastguard Worker
237*d9f75844SAndroid Build Coastguard Worker // Sanity check that conversion succeeds with a valid payload type.
238*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 127;
239*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
240*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
241*d9f75844SAndroid Build Coastguard Worker }
242*d9f75844SAndroid Build Coastguard Worker
243*d9f75844SAndroid Build Coastguard Worker // There are already tests for ToCricketFeedbackParam, but ensure that those
244*d9f75844SAndroid Build Coastguard Worker // errors are propagated from ToCricketCodec.
TEST(RtpParametersConversionTest,ToCricketCodecInvalidRtcpFeedback)245*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketCodecInvalidRtcpFeedback) {
246*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
247*d9f75844SAndroid Build Coastguard Worker codec.name = "VP8";
248*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
249*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
250*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 99;
251*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
252*d9f75844SAndroid Build Coastguard Worker RtcpFeedbackMessageType::PLI);
253*d9f75844SAndroid Build Coastguard Worker
254*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodec<cricket::VideoCodec>(codec);
255*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
256*d9f75844SAndroid Build Coastguard Worker
257*d9f75844SAndroid Build Coastguard Worker // Sanity check that conversion succeeds without invalid feedback.
258*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback.clear();
259*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodec<cricket::VideoCodec>(codec);
260*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
261*d9f75844SAndroid Build Coastguard Worker }
262*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketCodecs)263*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketCodecs) {
264*d9f75844SAndroid Build Coastguard Worker std::vector<RtpCodecParameters> codecs;
265*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
266*d9f75844SAndroid Build Coastguard Worker codec.name = "VP8";
267*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
268*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
269*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 99;
270*d9f75844SAndroid Build Coastguard Worker codecs.push_back(codec);
271*d9f75844SAndroid Build Coastguard Worker
272*d9f75844SAndroid Build Coastguard Worker codec.name = "VP9";
273*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 100;
274*d9f75844SAndroid Build Coastguard Worker codecs.push_back(codec);
275*d9f75844SAndroid Build Coastguard Worker
276*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodecs<cricket::VideoCodec>(codecs);
277*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
278*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, result.value().size());
279*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VP8", result.value()[0].name);
280*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(99, result.value()[0].id);
281*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VP9", result.value()[1].name);
282*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(100, result.value()[1].id);
283*d9f75844SAndroid Build Coastguard Worker }
284*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketCodecsDuplicatePayloadType)285*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketCodecsDuplicatePayloadType) {
286*d9f75844SAndroid Build Coastguard Worker std::vector<RtpCodecParameters> codecs;
287*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec;
288*d9f75844SAndroid Build Coastguard Worker codec.name = "VP8";
289*d9f75844SAndroid Build Coastguard Worker codec.kind = cricket::MEDIA_TYPE_VIDEO;
290*d9f75844SAndroid Build Coastguard Worker codec.clock_rate.emplace(90000);
291*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 99;
292*d9f75844SAndroid Build Coastguard Worker codecs.push_back(codec);
293*d9f75844SAndroid Build Coastguard Worker
294*d9f75844SAndroid Build Coastguard Worker codec.name = "VP9";
295*d9f75844SAndroid Build Coastguard Worker codec.payload_type = 99;
296*d9f75844SAndroid Build Coastguard Worker codecs.push_back(codec);
297*d9f75844SAndroid Build Coastguard Worker
298*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketCodecs<cricket::VideoCodec>(codecs);
299*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
300*d9f75844SAndroid Build Coastguard Worker
301*d9f75844SAndroid Build Coastguard Worker // Sanity check that this succeeds without the duplicate payload type.
302*d9f75844SAndroid Build Coastguard Worker codecs[1].payload_type = 120;
303*d9f75844SAndroid Build Coastguard Worker result = ToCricketCodecs<cricket::VideoCodec>(codecs);
304*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
305*d9f75844SAndroid Build Coastguard Worker }
306*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToCricketStreamParamsVecSimple)307*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketStreamParamsVecSimple) {
308*d9f75844SAndroid Build Coastguard Worker std::vector<RtpEncodingParameters> encodings;
309*d9f75844SAndroid Build Coastguard Worker RtpEncodingParameters encoding;
310*d9f75844SAndroid Build Coastguard Worker encoding.ssrc.emplace(0xbaadf00d);
311*d9f75844SAndroid Build Coastguard Worker encodings.push_back(encoding);
312*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketStreamParamsVec(encodings);
313*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
314*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, result.value().size());
315*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, result.value()[0].ssrcs.size());
316*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0xbaadf00d, result.value()[0].first_ssrc());
317*d9f75844SAndroid Build Coastguard Worker }
318*d9f75844SAndroid Build Coastguard Worker
319*d9f75844SAndroid Build Coastguard Worker // No encodings should be accepted; an endpoint may want to prepare a
320*d9f75844SAndroid Build Coastguard Worker // decoder/encoder without having something to receive/send yet.
TEST(RtpParametersConversionTest,ToCricketStreamParamsVecNoEncodings)321*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketStreamParamsVecNoEncodings) {
322*d9f75844SAndroid Build Coastguard Worker std::vector<RtpEncodingParameters> encodings;
323*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketStreamParamsVec(encodings);
324*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
325*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, result.value().size());
326*d9f75844SAndroid Build Coastguard Worker }
327*d9f75844SAndroid Build Coastguard Worker
328*d9f75844SAndroid Build Coastguard Worker // An encoding without SSRCs should be accepted. This could be the case when
329*d9f75844SAndroid Build Coastguard Worker // SSRCs aren't signaled and payload-type based demuxing is used.
TEST(RtpParametersConversionTest,ToCricketStreamParamsVecMissingSsrcs)330*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketStreamParamsVecMissingSsrcs) {
331*d9f75844SAndroid Build Coastguard Worker std::vector<RtpEncodingParameters> encodings = {{}};
332*d9f75844SAndroid Build Coastguard Worker // Creates RtxParameters with empty SSRC.
333*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketStreamParamsVec(encodings);
334*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(result.ok());
335*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, result.value().size());
336*d9f75844SAndroid Build Coastguard Worker }
337*d9f75844SAndroid Build Coastguard Worker
338*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Update this test when we support multiple encodings.
TEST(RtpParametersConversionTest,ToCricketStreamParamsVecMultipleEncodings)339*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToCricketStreamParamsVecMultipleEncodings) {
340*d9f75844SAndroid Build Coastguard Worker std::vector<RtpEncodingParameters> encodings = {{}, {}};
341*d9f75844SAndroid Build Coastguard Worker auto result = ToCricketStreamParamsVec(encodings);
342*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, result.error().type());
343*d9f75844SAndroid Build Coastguard Worker }
344*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToRtcpFeedback)345*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtcpFeedback) {
346*d9f75844SAndroid Build Coastguard Worker absl::optional<RtcpFeedback> result = ToRtcpFeedback({"ccm", "fir"});
347*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR),
348*d9f75844SAndroid Build Coastguard Worker *result);
349*d9f75844SAndroid Build Coastguard Worker
350*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("goog-lntf"));
351*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::LNTF), *result);
352*d9f75844SAndroid Build Coastguard Worker
353*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("nack"));
354*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK,
355*d9f75844SAndroid Build Coastguard Worker RtcpFeedbackMessageType::GENERIC_NACK),
356*d9f75844SAndroid Build Coastguard Worker *result);
357*d9f75844SAndroid Build Coastguard Worker
358*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback({"nack", "pli"});
359*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
360*d9f75844SAndroid Build Coastguard Worker *result);
361*d9f75844SAndroid Build Coastguard Worker
362*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("goog-remb"));
363*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::REMB), *result);
364*d9f75844SAndroid Build Coastguard Worker
365*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("transport-cc"));
366*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC), *result);
367*d9f75844SAndroid Build Coastguard Worker }
368*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToRtcpFeedbackErrors)369*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtcpFeedbackErrors) {
370*d9f75844SAndroid Build Coastguard Worker // CCM with missing or invalid message type.
371*d9f75844SAndroid Build Coastguard Worker absl::optional<RtcpFeedback> result = ToRtcpFeedback({"ccm", "pli"});
372*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
373*d9f75844SAndroid Build Coastguard Worker
374*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("ccm"));
375*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
376*d9f75844SAndroid Build Coastguard Worker
377*d9f75844SAndroid Build Coastguard Worker // LNTF with message type (should be left empty).
378*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback({"goog-lntf", "pli"});
379*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
380*d9f75844SAndroid Build Coastguard Worker
381*d9f75844SAndroid Build Coastguard Worker // NACK with missing or invalid message type.
382*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback({"nack", "fir"});
383*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
384*d9f75844SAndroid Build Coastguard Worker
385*d9f75844SAndroid Build Coastguard Worker // REMB with message type (should be left empty).
386*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback({"goog-remb", "pli"});
387*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
388*d9f75844SAndroid Build Coastguard Worker
389*d9f75844SAndroid Build Coastguard Worker // TRANSPORT_CC with message type (should be left empty).
390*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback({"transport-cc", "fir"});
391*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
392*d9f75844SAndroid Build Coastguard Worker
393*d9f75844SAndroid Build Coastguard Worker // Unknown message type.
394*d9f75844SAndroid Build Coastguard Worker result = ToRtcpFeedback(cricket::FeedbackParam("foo"));
395*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(result);
396*d9f75844SAndroid Build Coastguard Worker }
397*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToAudioRtpCodecCapability)398*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToAudioRtpCodecCapability) {
399*d9f75844SAndroid Build Coastguard Worker cricket::AudioCodec cricket_codec;
400*d9f75844SAndroid Build Coastguard Worker cricket_codec.name = "foo";
401*d9f75844SAndroid Build Coastguard Worker cricket_codec.id = 50;
402*d9f75844SAndroid Build Coastguard Worker cricket_codec.clockrate = 22222;
403*d9f75844SAndroid Build Coastguard Worker cricket_codec.channels = 4;
404*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["foo"] = "bar";
405*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
406*d9f75844SAndroid Build Coastguard Worker RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
407*d9f75844SAndroid Build Coastguard Worker
408*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("foo", codec.name);
409*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec.kind);
410*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(50, codec.preferred_payload_type);
411*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(22222, codec.clock_rate);
412*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(4, codec.num_channels);
413*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, codec.parameters.size());
414*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", codec.parameters["foo"]);
415*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, codec.rtcp_feedback.size());
416*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
417*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[0]);
418*d9f75844SAndroid Build Coastguard Worker }
419*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToVideoRtpCodecCapability)420*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToVideoRtpCodecCapability) {
421*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec cricket_codec;
422*d9f75844SAndroid Build Coastguard Worker cricket_codec.name = "VID";
423*d9f75844SAndroid Build Coastguard Worker cricket_codec.id = 101;
424*d9f75844SAndroid Build Coastguard Worker cricket_codec.clockrate = 80000;
425*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["foo"] = "bar";
426*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["ANOTHER"] = "param";
427*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
428*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("goog-lntf"));
429*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add({"nack", "pli"});
430*d9f75844SAndroid Build Coastguard Worker RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
431*d9f75844SAndroid Build Coastguard Worker
432*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VID", codec.name);
433*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec.kind);
434*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(101, codec.preferred_payload_type);
435*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(80000, codec.clock_rate);
436*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, codec.parameters.size());
437*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", codec.parameters["foo"]);
438*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("param", codec.parameters["ANOTHER"]);
439*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3u, codec.rtcp_feedback.size());
440*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
441*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[0]);
442*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::LNTF), codec.rtcp_feedback[1]);
443*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
444*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[2]);
445*d9f75844SAndroid Build Coastguard Worker }
446*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToRtpEncodingsWithEmptyStreamParamsVec)447*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtpEncodingsWithEmptyStreamParamsVec) {
448*d9f75844SAndroid Build Coastguard Worker cricket::StreamParamsVec streams;
449*d9f75844SAndroid Build Coastguard Worker auto rtp_encodings = ToRtpEncodings(streams);
450*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(0u, rtp_encodings.size());
451*d9f75844SAndroid Build Coastguard Worker }
452*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToRtpEncodingsWithMultipleStreamParams)453*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtpEncodingsWithMultipleStreamParams) {
454*d9f75844SAndroid Build Coastguard Worker cricket::StreamParamsVec streams;
455*d9f75844SAndroid Build Coastguard Worker cricket::StreamParams stream1;
456*d9f75844SAndroid Build Coastguard Worker stream1.ssrcs.push_back(1111u);
457*d9f75844SAndroid Build Coastguard Worker
458*d9f75844SAndroid Build Coastguard Worker cricket::StreamParams stream2;
459*d9f75844SAndroid Build Coastguard Worker stream2.ssrcs.push_back(2222u);
460*d9f75844SAndroid Build Coastguard Worker
461*d9f75844SAndroid Build Coastguard Worker streams.push_back(stream1);
462*d9f75844SAndroid Build Coastguard Worker streams.push_back(stream2);
463*d9f75844SAndroid Build Coastguard Worker
464*d9f75844SAndroid Build Coastguard Worker auto rtp_encodings = ToRtpEncodings(streams);
465*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, rtp_encodings.size());
466*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1111u, rtp_encodings[0].ssrc);
467*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2222u, rtp_encodings[1].ssrc);
468*d9f75844SAndroid Build Coastguard Worker }
469*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToAudioRtpCodecParameters)470*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToAudioRtpCodecParameters) {
471*d9f75844SAndroid Build Coastguard Worker cricket::AudioCodec cricket_codec;
472*d9f75844SAndroid Build Coastguard Worker cricket_codec.name = "foo";
473*d9f75844SAndroid Build Coastguard Worker cricket_codec.id = 50;
474*d9f75844SAndroid Build Coastguard Worker cricket_codec.clockrate = 22222;
475*d9f75844SAndroid Build Coastguard Worker cricket_codec.channels = 4;
476*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["foo"] = "bar";
477*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
478*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec = ToRtpCodecParameters(cricket_codec);
479*d9f75844SAndroid Build Coastguard Worker
480*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("foo", codec.name);
481*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec.kind);
482*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(50, codec.payload_type);
483*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(22222, codec.clock_rate);
484*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(4, codec.num_channels);
485*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, codec.parameters.size());
486*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", codec.parameters["foo"]);
487*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1u, codec.rtcp_feedback.size());
488*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
489*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[0]);
490*d9f75844SAndroid Build Coastguard Worker }
491*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToVideoRtpCodecParameters)492*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToVideoRtpCodecParameters) {
493*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec cricket_codec;
494*d9f75844SAndroid Build Coastguard Worker cricket_codec.name = "VID";
495*d9f75844SAndroid Build Coastguard Worker cricket_codec.id = 101;
496*d9f75844SAndroid Build Coastguard Worker cricket_codec.clockrate = 80000;
497*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["foo"] = "bar";
498*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["ANOTHER"] = "param";
499*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
500*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("goog-lntf"));
501*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add({"nack", "pli"});
502*d9f75844SAndroid Build Coastguard Worker RtpCodecParameters codec = ToRtpCodecParameters(cricket_codec);
503*d9f75844SAndroid Build Coastguard Worker
504*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VID", codec.name);
505*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec.kind);
506*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(101, codec.payload_type);
507*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(80000, codec.clock_rate);
508*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, codec.parameters.size());
509*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("bar", codec.parameters["foo"]);
510*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("param", codec.parameters["ANOTHER"]);
511*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3u, codec.rtcp_feedback.size());
512*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
513*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[0]);
514*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::LNTF), codec.rtcp_feedback[1]);
515*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
516*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[2]);
517*d9f75844SAndroid Build Coastguard Worker }
518*d9f75844SAndroid Build Coastguard Worker
519*d9f75844SAndroid Build Coastguard Worker // An unknown feedback param should just be ignored.
TEST(RtpParametersConversionTest,ToRtpCodecCapabilityUnknownFeedbackParam)520*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtpCodecCapabilityUnknownFeedbackParam) {
521*d9f75844SAndroid Build Coastguard Worker cricket::AudioCodec cricket_codec;
522*d9f75844SAndroid Build Coastguard Worker cricket_codec.name = "foo";
523*d9f75844SAndroid Build Coastguard Worker cricket_codec.id = 50;
524*d9f75844SAndroid Build Coastguard Worker cricket_codec.clockrate = 22222;
525*d9f75844SAndroid Build Coastguard Worker cricket_codec.channels = 4;
526*d9f75844SAndroid Build Coastguard Worker cricket_codec.params["foo"] = "bar";
527*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add({"unknown", "param"});
528*d9f75844SAndroid Build Coastguard Worker cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
529*d9f75844SAndroid Build Coastguard Worker RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
530*d9f75844SAndroid Build Coastguard Worker
531*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, codec.rtcp_feedback.size());
532*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
533*d9f75844SAndroid Build Coastguard Worker codec.rtcp_feedback[0]);
534*d9f75844SAndroid Build Coastguard Worker }
535*d9f75844SAndroid Build Coastguard Worker
536*d9f75844SAndroid Build Coastguard Worker // Most of ToRtpCapabilities is tested by ToRtpCodecCapability, but we need to
537*d9f75844SAndroid Build Coastguard Worker // test that the result of ToRtpCodecCapability ends up in the result, and that
538*d9f75844SAndroid Build Coastguard Worker // the "fec" list is assembled correctly.
TEST(RtpParametersConversionTest,ToRtpCapabilities)539*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtpCapabilities) {
540*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec vp8;
541*d9f75844SAndroid Build Coastguard Worker vp8.name = "VP8";
542*d9f75844SAndroid Build Coastguard Worker vp8.id = 101;
543*d9f75844SAndroid Build Coastguard Worker vp8.clockrate = 90000;
544*d9f75844SAndroid Build Coastguard Worker
545*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec red;
546*d9f75844SAndroid Build Coastguard Worker red.name = "red";
547*d9f75844SAndroid Build Coastguard Worker red.id = 102;
548*d9f75844SAndroid Build Coastguard Worker red.clockrate = 90000;
549*d9f75844SAndroid Build Coastguard Worker
550*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec ulpfec;
551*d9f75844SAndroid Build Coastguard Worker ulpfec.name = "ulpfec";
552*d9f75844SAndroid Build Coastguard Worker ulpfec.id = 103;
553*d9f75844SAndroid Build Coastguard Worker ulpfec.clockrate = 90000;
554*d9f75844SAndroid Build Coastguard Worker
555*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec flexfec;
556*d9f75844SAndroid Build Coastguard Worker flexfec.name = "flexfec-03";
557*d9f75844SAndroid Build Coastguard Worker flexfec.id = 102;
558*d9f75844SAndroid Build Coastguard Worker flexfec.clockrate = 90000;
559*d9f75844SAndroid Build Coastguard Worker
560*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec rtx;
561*d9f75844SAndroid Build Coastguard Worker rtx.name = "rtx";
562*d9f75844SAndroid Build Coastguard Worker rtx.id = 104;
563*d9f75844SAndroid Build Coastguard Worker rtx.params.insert({"apt", "101"});
564*d9f75844SAndroid Build Coastguard Worker
565*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec rtx2;
566*d9f75844SAndroid Build Coastguard Worker rtx2.name = "rtx";
567*d9f75844SAndroid Build Coastguard Worker rtx2.id = 105;
568*d9f75844SAndroid Build Coastguard Worker rtx2.params.insert({"apt", "109"});
569*d9f75844SAndroid Build Coastguard Worker
570*d9f75844SAndroid Build Coastguard Worker RtpCapabilities capabilities = ToRtpCapabilities<cricket::VideoCodec>(
571*d9f75844SAndroid Build Coastguard Worker {vp8, ulpfec, rtx, rtx2}, {{"uri", 1}, {"uri2", 3}});
572*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(3u, capabilities.codecs.size());
573*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VP8", capabilities.codecs[0].name);
574*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("ulpfec", capabilities.codecs[1].name);
575*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("rtx", capabilities.codecs[2].name);
576*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, capabilities.codecs[2].parameters.size());
577*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, capabilities.header_extensions.size());
578*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("uri", capabilities.header_extensions[0].uri);
579*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, capabilities.header_extensions[0].preferred_id);
580*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("uri2", capabilities.header_extensions[1].uri);
581*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3, capabilities.header_extensions[1].preferred_id);
582*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0u, capabilities.fec.size());
583*d9f75844SAndroid Build Coastguard Worker
584*d9f75844SAndroid Build Coastguard Worker capabilities = ToRtpCapabilities<cricket::VideoCodec>(
585*d9f75844SAndroid Build Coastguard Worker {vp8, red, ulpfec, rtx}, cricket::RtpHeaderExtensions());
586*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(4u, capabilities.codecs.size());
587*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
588*d9f75844SAndroid Build Coastguard Worker capabilities.fec,
589*d9f75844SAndroid Build Coastguard Worker UnorderedElementsAre(FecMechanism::RED, FecMechanism::RED_AND_ULPFEC));
590*d9f75844SAndroid Build Coastguard Worker
591*d9f75844SAndroid Build Coastguard Worker capabilities = ToRtpCapabilities<cricket::VideoCodec>(
592*d9f75844SAndroid Build Coastguard Worker {vp8, red, flexfec}, cricket::RtpHeaderExtensions());
593*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3u, capabilities.codecs.size());
594*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(capabilities.fec,
595*d9f75844SAndroid Build Coastguard Worker UnorderedElementsAre(FecMechanism::RED, FecMechanism::FLEXFEC));
596*d9f75844SAndroid Build Coastguard Worker }
597*d9f75844SAndroid Build Coastguard Worker
TEST(RtpParametersConversionTest,ToRtpParameters)598*d9f75844SAndroid Build Coastguard Worker TEST(RtpParametersConversionTest, ToRtpParameters) {
599*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec vp8;
600*d9f75844SAndroid Build Coastguard Worker vp8.name = "VP8";
601*d9f75844SAndroid Build Coastguard Worker vp8.id = 101;
602*d9f75844SAndroid Build Coastguard Worker vp8.clockrate = 90000;
603*d9f75844SAndroid Build Coastguard Worker
604*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec red;
605*d9f75844SAndroid Build Coastguard Worker red.name = "red";
606*d9f75844SAndroid Build Coastguard Worker red.id = 102;
607*d9f75844SAndroid Build Coastguard Worker red.clockrate = 90000;
608*d9f75844SAndroid Build Coastguard Worker
609*d9f75844SAndroid Build Coastguard Worker cricket::VideoCodec ulpfec;
610*d9f75844SAndroid Build Coastguard Worker ulpfec.name = "ulpfec";
611*d9f75844SAndroid Build Coastguard Worker ulpfec.id = 103;
612*d9f75844SAndroid Build Coastguard Worker ulpfec.clockrate = 90000;
613*d9f75844SAndroid Build Coastguard Worker
614*d9f75844SAndroid Build Coastguard Worker cricket::StreamParamsVec streams;
615*d9f75844SAndroid Build Coastguard Worker cricket::StreamParams stream;
616*d9f75844SAndroid Build Coastguard Worker stream.ssrcs.push_back(1234u);
617*d9f75844SAndroid Build Coastguard Worker streams.push_back(stream);
618*d9f75844SAndroid Build Coastguard Worker
619*d9f75844SAndroid Build Coastguard Worker RtpParameters rtp_parameters = ToRtpParameters<cricket::VideoCodec>(
620*d9f75844SAndroid Build Coastguard Worker {vp8, red, ulpfec}, {{"uri", 1}, {"uri2", 3}}, streams);
621*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(3u, rtp_parameters.codecs.size());
622*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("VP8", rtp_parameters.codecs[0].name);
623*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("red", rtp_parameters.codecs[1].name);
624*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("ulpfec", rtp_parameters.codecs[2].name);
625*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(2u, rtp_parameters.header_extensions.size());
626*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("uri", rtp_parameters.header_extensions[0].uri);
627*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, rtp_parameters.header_extensions[0].id);
628*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ("uri2", rtp_parameters.header_extensions[1].uri);
629*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3, rtp_parameters.header_extensions[1].id);
630*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(1u, rtp_parameters.encodings.size());
631*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1234u, rtp_parameters.encodings[0].ssrc);
632*d9f75844SAndroid Build Coastguard Worker }
633*d9f75844SAndroid Build Coastguard Worker
634*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
635