OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <memory> | 11 #include <memory> |
12 | 12 |
13 #include "webrtc/common_types.h" | 13 #include "webrtc/common_types.h" |
14 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 14 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
15 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" | 15 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
17 #include "webrtc/modules/rtp_rtcp/source/mock/mock_rtp_payload_strategy.h" | |
18 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 17 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
19 #include "webrtc/test/gmock.h" | 18 #include "webrtc/test/gmock.h" |
20 #include "webrtc/test/gtest.h" | 19 #include "webrtc/test/gtest.h" |
21 | 20 |
22 namespace webrtc { | 21 namespace webrtc { |
23 | 22 |
24 using ::testing::Eq; | 23 using ::testing::Eq; |
25 using ::testing::Return; | 24 using ::testing::Return; |
26 using ::testing::StrEq; | 25 using ::testing::StrEq; |
27 using ::testing::_; | 26 using ::testing::_; |
28 | 27 |
29 static const char* kTypicalPayloadName = "name"; | 28 static const char* kTypicalPayloadName = "name"; |
30 static const size_t kTypicalChannels = 1; | 29 static const size_t kTypicalChannels = 1; |
31 static const int kTypicalFrequency = 44000; | 30 static const uint32_t kTypicalFrequency = 44000; |
32 static const int kTypicalRate = 32 * 1024; | 31 static const uint32_t kTypicalRate = 32 * 1024; |
33 static const CodecInst kTypicalAudioCodec = {-1 /* pltype */, "name", | 32 static const CodecInst kTypicalAudioCodec = {-1 /* pltype */, "name", |
34 kTypicalFrequency, 0 /* pacsize */, | 33 kTypicalFrequency, 0 /* pacsize */, |
35 kTypicalChannels, kTypicalRate}; | 34 kTypicalChannels, kTypicalRate}; |
36 | 35 |
37 class RtpPayloadRegistryTest : public ::testing::Test { | 36 TEST(RtpPayloadRegistryTest, |
38 public: | 37 RegistersAndRemembersVideoPayloadsUntilDeregistered) { |
39 void SetUp() { | 38 RTPPayloadRegistry rtp_payload_registry; |
40 // Note: the payload registry takes ownership of the strategy. | |
41 mock_payload_strategy_ = new testing::NiceMock<MockRTPPayloadStrategy>(); | |
42 rtp_payload_registry_.reset(new RTPPayloadRegistry(mock_payload_strategy_)); | |
43 } | |
44 | |
45 protected: | |
46 RtpUtility::Payload* ExpectReturnOfTypicalAudioPayload(uint8_t payload_type, | |
47 uint32_t rate) { | |
48 bool audio = true; | |
49 RtpUtility::Payload returned_payload = { | |
50 "name", | |
51 audio, | |
52 {// Initialize the audio struct in this case. | |
53 {kTypicalFrequency, kTypicalChannels, rate}}}; | |
54 | |
55 // Note: we return a new payload since the payload registry takes ownership | |
56 // of the created object. | |
57 RtpUtility::Payload* returned_payload_on_heap = | |
58 new RtpUtility::Payload(returned_payload); | |
59 EXPECT_CALL(*mock_payload_strategy_, | |
60 CreatePayloadType(StrEq(kTypicalPayloadName), payload_type, | |
61 kTypicalFrequency, kTypicalChannels, rate)) | |
62 .WillOnce(Return(returned_payload_on_heap)); | |
63 return returned_payload_on_heap; | |
64 } | |
65 | |
66 std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry_; | |
67 testing::NiceMock<MockRTPPayloadStrategy>* mock_payload_strategy_; | |
68 }; | |
69 | |
70 TEST_F(RtpPayloadRegistryTest, | |
71 RegistersAndRemembersVideoPayloadsUntilDeregistered) { | |
72 const uint8_t payload_type = 97; | 39 const uint8_t payload_type = 97; |
73 RtpUtility::Payload returned_video_payload = { | |
74 "VP8", false /* audio */, {{kRtpVideoVp8}}}; | |
75 // Note: The payload registry takes ownership of this object in | |
76 // RegisterReceivePayload. | |
77 RtpUtility::Payload* returned_video_payload_on_heap = | |
78 new RtpUtility::Payload(returned_video_payload); | |
79 EXPECT_CALL( | |
80 *mock_payload_strategy_, | |
81 CreatePayloadType(StrEq("VP8"), payload_type, kVideoPayloadTypeFrequency, | |
82 0 /* channels */, 0 /* rate */)) | |
83 .WillOnce(Return(returned_video_payload_on_heap)); | |
84 | |
85 VideoCodec video_codec; | 40 VideoCodec video_codec; |
86 video_codec.codecType = kVideoCodecVP8; | 41 video_codec.codecType = kVideoCodecVP8; |
87 strcpy(video_codec.plName, "VP8"); | 42 strcpy(video_codec.plName, "VP8"); |
88 video_codec.plType = payload_type; | 43 video_codec.plType = payload_type; |
89 | 44 |
90 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(video_codec)); | 45 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(video_codec)); |
91 | 46 |
92 const RtpUtility::Payload* retrieved_payload = | 47 const RtpUtility::Payload* retrieved_payload = |
93 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 48 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
94 EXPECT_TRUE(retrieved_payload); | 49 EXPECT_TRUE(retrieved_payload); |
95 | 50 |
96 // We should get back the exact pointer to the payload returned by the | 51 // We should get back the corresponding payload that we registered. |
97 // payload strategy. | 52 EXPECT_STREQ("VP8", retrieved_payload->name); |
98 EXPECT_EQ(returned_video_payload_on_heap, retrieved_payload); | 53 EXPECT_FALSE(retrieved_payload->audio); |
54 EXPECT_EQ(kRtpVideoVp8, retrieved_payload->typeSpecific.Video.videoCodecType); | |
99 | 55 |
100 // Now forget about it and verify it's gone. | 56 // Now forget about it and verify it's gone. |
101 EXPECT_EQ(0, rtp_payload_registry_->DeRegisterReceivePayload(payload_type)); | 57 EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); |
102 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)); | 58 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)); |
103 } | 59 } |
104 | 60 |
105 TEST_F(RtpPayloadRegistryTest, | 61 TEST(RtpPayloadRegistryTest, |
106 RegistersAndRemembersAudioPayloadsUntilDeregistered) { | 62 RegistersAndRemembersAudioPayloadsUntilDeregistered) { |
63 RTPPayloadRegistry rtp_payload_registry; | |
107 uint8_t payload_type = 97; | 64 uint8_t payload_type = 97; |
108 RtpUtility::Payload* returned_payload_on_heap = | |
109 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
110 | |
111 bool new_payload_created = false; | 65 bool new_payload_created = false; |
112 CodecInst audio_codec = kTypicalAudioCodec; | 66 CodecInst audio_codec = kTypicalAudioCodec; |
113 audio_codec.pltype = payload_type; | 67 audio_codec.pltype = payload_type; |
114 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload( | 68 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload( |
115 audio_codec, &new_payload_created)); | 69 audio_codec, &new_payload_created)); |
116 | 70 |
117 EXPECT_TRUE(new_payload_created) << "A new payload WAS created."; | 71 EXPECT_TRUE(new_payload_created) << "A new payload WAS created."; |
118 | 72 |
119 const RtpUtility::Payload* retrieved_payload = | 73 const RtpUtility::Payload* retrieved_payload = |
120 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 74 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
121 EXPECT_TRUE(retrieved_payload); | 75 EXPECT_TRUE(retrieved_payload); |
122 | 76 |
123 // We should get back the exact pointer to the payload returned by the | 77 // We should get back the corresponding payload that we registered. |
124 // payload strategy. | 78 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
125 EXPECT_EQ(returned_payload_on_heap, retrieved_payload); | 79 EXPECT_TRUE(retrieved_payload->audio); |
80 EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); | |
81 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); | |
82 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); | |
126 | 83 |
127 // Now forget about it and verify it's gone. | 84 // Now forget about it and verify it's gone. |
128 EXPECT_EQ(0, rtp_payload_registry_->DeRegisterReceivePayload(payload_type)); | 85 EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); |
129 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)); | 86 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)); |
130 } | 87 } |
131 | 88 |
132 TEST_F(RtpPayloadRegistryTest, AudioRedWorkProperly) { | 89 TEST(RtpPayloadRegistryTest, AudioRedWorkProperly) { |
133 const uint8_t kRedPayloadType = 127; | 90 const uint8_t kRedPayloadType = 127; |
134 const int kRedSampleRate = 8000; | 91 const int kRedSampleRate = 8000; |
135 const size_t kRedChannels = 1; | 92 const size_t kRedChannels = 1; |
136 const int kRedBitRate = 0; | 93 const int kRedBitRate = 0; |
137 | 94 |
138 // This creates an audio RTP payload strategy. | 95 RTPPayloadRegistry rtp_payload_registry; |
139 rtp_payload_registry_.reset( | |
140 new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))); | |
141 | 96 |
142 bool new_payload_created = false; | 97 bool new_payload_created = false; |
143 CodecInst red_audio_codec; | 98 CodecInst red_audio_codec; |
144 strcpy(red_audio_codec.plname, "red"); | 99 strcpy(red_audio_codec.plname, "red"); |
145 red_audio_codec.pltype = kRedPayloadType; | 100 red_audio_codec.pltype = kRedPayloadType; |
146 red_audio_codec.plfreq = kRedSampleRate; | 101 red_audio_codec.plfreq = kRedSampleRate; |
147 red_audio_codec.channels = kRedChannels; | 102 red_audio_codec.channels = kRedChannels; |
148 red_audio_codec.rate = kRedBitRate; | 103 red_audio_codec.rate = kRedBitRate; |
149 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload( | 104 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload( |
150 red_audio_codec, &new_payload_created)); | 105 red_audio_codec, &new_payload_created)); |
151 EXPECT_TRUE(new_payload_created); | 106 EXPECT_TRUE(new_payload_created); |
152 | 107 |
153 EXPECT_EQ(kRedPayloadType, rtp_payload_registry_->red_payload_type()); | 108 EXPECT_EQ(kRedPayloadType, rtp_payload_registry.red_payload_type()); |
154 | 109 |
155 const RtpUtility::Payload* retrieved_payload = | 110 const RtpUtility::Payload* retrieved_payload = |
156 rtp_payload_registry_->PayloadTypeToPayload(kRedPayloadType); | 111 rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType); |
157 EXPECT_TRUE(retrieved_payload); | 112 EXPECT_TRUE(retrieved_payload); |
158 EXPECT_TRUE(retrieved_payload->audio); | 113 EXPECT_TRUE(retrieved_payload->audio); |
159 EXPECT_STRCASEEQ("red", retrieved_payload->name); | 114 EXPECT_STRCASEEQ("red", retrieved_payload->name); |
160 | 115 |
161 // Sample rate is correctly registered. | 116 // Sample rate is correctly registered. |
162 EXPECT_EQ(kRedSampleRate, | 117 EXPECT_EQ(kRedSampleRate, |
163 rtp_payload_registry_->GetPayloadTypeFrequency(kRedPayloadType)); | 118 rtp_payload_registry.GetPayloadTypeFrequency(kRedPayloadType)); |
164 } | 119 } |
165 | 120 |
166 TEST_F(RtpPayloadRegistryTest, | 121 TEST(RtpPayloadRegistryTest, |
167 DoesNotAcceptSamePayloadTypeTwiceExceptIfPayloadIsCompatible) { | 122 DoesNotAcceptSamePayloadTypeTwiceExceptIfPayloadIsCompatible) { |
168 uint8_t payload_type = 97; | 123 uint8_t payload_type = 97; |
124 RTPPayloadRegistry rtp_payload_registry; | |
169 | 125 |
170 bool ignored = false; | 126 bool ignored = false; |
171 RtpUtility::Payload* first_payload_on_heap = | |
172 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
173 CodecInst audio_codec = kTypicalAudioCodec; | 127 CodecInst audio_codec = kTypicalAudioCodec; |
174 audio_codec.pltype = payload_type; | 128 audio_codec.pltype = payload_type; |
175 EXPECT_EQ( | 129 EXPECT_EQ( |
176 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 130 0, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
177 | 131 |
178 EXPECT_EQ( | 132 CodecInst audio_codec_2 = kTypicalAudioCodec; |
179 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)) | 133 audio_codec_2.pltype = payload_type; |
180 << "Adding same codec twice = bad."; | 134 // Make |audio_codec_2| incompatible with |audio_codec| by changing |
135 // the frequency. | |
136 audio_codec_2.plfreq = kTypicalFrequency + 1; | |
137 EXPECT_EQ(-1, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, | |
138 &ignored)) | |
139 << "Adding incompatible codec with same payload type = bad."; | |
181 | 140 |
182 RtpUtility::Payload* second_payload_on_heap = | 141 // Change payload type. |
183 ExpectReturnOfTypicalAudioPayload(payload_type - 1, kTypicalRate); | |
184 CodecInst audio_codec_2 = kTypicalAudioCodec; | |
185 audio_codec_2.pltype = payload_type - 1; | 142 audio_codec_2.pltype = payload_type - 1; |
186 EXPECT_EQ( | 143 EXPECT_EQ( |
187 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_2, &ignored)) | 144 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored)) |
188 << "With a different payload type is fine though."; | 145 << "With a different payload type is fine though."; |
189 | 146 |
190 // Ensure both payloads are preserved. | 147 // Ensure both payloads are preserved. |
191 const RtpUtility::Payload* retrieved_payload = | 148 const RtpUtility::Payload* retrieved_payload = |
192 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 149 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
193 EXPECT_TRUE(retrieved_payload); | 150 EXPECT_TRUE(retrieved_payload); |
194 EXPECT_EQ(first_payload_on_heap, retrieved_payload); | 151 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
152 EXPECT_EQ(true, retrieved_payload->audio); | |
danilchap
2016/11/24 13:24:36
EXPECT_TRUE
magjed_webrtc
2016/11/24 14:29:29
Done.
| |
153 EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); | |
154 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); | |
155 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); | |
156 | |
195 retrieved_payload = | 157 retrieved_payload = |
196 rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1); | 158 rtp_payload_registry.PayloadTypeToPayload(payload_type - 1); |
197 EXPECT_TRUE(retrieved_payload); | 159 EXPECT_TRUE(retrieved_payload); |
198 EXPECT_EQ(second_payload_on_heap, retrieved_payload); | 160 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
161 EXPECT_EQ(true, retrieved_payload->audio); | |
danilchap
2016/11/24 13:24:36
EXPECT_TRUE
magjed_webrtc
2016/11/24 14:29:29
Done.
| |
162 EXPECT_EQ(kTypicalFrequency + 1, | |
163 retrieved_payload->typeSpecific.Audio.frequency); | |
164 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); | |
165 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); | |
199 | 166 |
200 // Ok, update the rate for one of the codecs. If either the incoming rate or | 167 // Ok, update the rate for one of the codecs. If either the incoming rate or |
201 // the stored rate is zero it's not really an error to register the same | 168 // the stored rate is zero it's not really an error to register the same |
202 // codec twice, and in that case roughly the following happens. | 169 // codec twice, and in that case roughly the following happens. |
203 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | |
204 .WillByDefault(Return(true)); | |
205 EXPECT_CALL(*mock_payload_strategy_, | |
206 UpdatePayloadRate(first_payload_on_heap, kTypicalRate)); | |
207 EXPECT_EQ( | 170 EXPECT_EQ( |
208 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 171 0, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
209 } | 172 } |
210 | 173 |
211 TEST_F(RtpPayloadRegistryTest, | 174 TEST(RtpPayloadRegistryTest, |
212 RemovesCompatibleCodecsOnRegistryIfCodecsMustBeUnique) { | 175 RemovesCompatibleCodecsOnRegistryIfCodecsMustBeUnique) { |
213 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | |
214 .WillByDefault(Return(true)); | |
215 ON_CALL(*mock_payload_strategy_, CodecsMustBeUnique()) | |
216 .WillByDefault(Return(true)); | |
217 | |
218 uint8_t payload_type = 97; | 176 uint8_t payload_type = 97; |
177 RTPPayloadRegistry rtp_payload_registry; | |
219 | 178 |
220 bool ignored = false; | 179 bool ignored = false; |
221 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
222 CodecInst audio_codec = kTypicalAudioCodec; | 180 CodecInst audio_codec = kTypicalAudioCodec; |
223 audio_codec.pltype = payload_type; | 181 audio_codec.pltype = payload_type; |
224 EXPECT_EQ( | 182 EXPECT_EQ( |
225 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 183 0, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
226 ExpectReturnOfTypicalAudioPayload(payload_type - 1, kTypicalRate); | |
227 CodecInst audio_codec_2 = kTypicalAudioCodec; | 184 CodecInst audio_codec_2 = kTypicalAudioCodec; |
228 audio_codec_2.pltype = payload_type - 1; | 185 audio_codec_2.pltype = payload_type - 1; |
229 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_2, | 186 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, |
230 &ignored)); | 187 &ignored)); |
231 | 188 |
232 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)) | 189 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)) |
233 << "The first payload should be " | 190 << "The first payload should be " |
234 "deregistered because the only thing that differs is payload type."; | 191 "deregistered because the only thing that differs is payload type."; |
235 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1)) | 192 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1)) |
236 << "The second payload should still be registered though."; | 193 << "The second payload should still be registered though."; |
237 | 194 |
238 // Now ensure non-compatible codecs aren't removed. | 195 // Now ensure non-compatible codecs aren't removed. Make |audio_codec_3| |
239 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | 196 // incompatible by changing the frequency. |
240 .WillByDefault(Return(false)); | |
241 ExpectReturnOfTypicalAudioPayload(payload_type + 1, kTypicalRate); | |
242 CodecInst audio_codec_3 = kTypicalAudioCodec; | 197 CodecInst audio_codec_3 = kTypicalAudioCodec; |
243 audio_codec_3.pltype = payload_type + 1; | 198 audio_codec_3.pltype = payload_type + 1; |
244 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_3, | 199 audio_codec_3.plfreq = kTypicalFrequency + 1; |
200 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(audio_codec_3, | |
245 &ignored)); | 201 &ignored)); |
246 | 202 |
247 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1)) | 203 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1)) |
248 << "Not compatible; both payloads should be kept."; | 204 << "Not compatible; both payloads should be kept."; |
249 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type + 1)) | 205 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type + 1)) |
250 << "Not compatible; both payloads should be kept."; | 206 << "Not compatible; both payloads should be kept."; |
251 } | 207 } |
252 | 208 |
253 TEST_F(RtpPayloadRegistryTest, | 209 TEST(RtpPayloadRegistryTest, |
254 LastReceivedCodecTypesAreResetWhenRegisteringNewPayloadTypes) { | 210 LastReceivedCodecTypesAreResetWhenRegisteringNewPayloadTypes) { |
255 rtp_payload_registry_->set_last_received_payload_type(17); | 211 RTPPayloadRegistry rtp_payload_registry; |
256 EXPECT_EQ(17, rtp_payload_registry_->last_received_payload_type()); | 212 rtp_payload_registry.set_last_received_payload_type(17); |
213 EXPECT_EQ(17, rtp_payload_registry.last_received_payload_type()); | |
257 | 214 |
258 bool media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 215 bool media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
259 EXPECT_FALSE(media_type_unchanged); | 216 EXPECT_FALSE(media_type_unchanged); |
260 media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 217 media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
261 EXPECT_TRUE(media_type_unchanged); | 218 EXPECT_TRUE(media_type_unchanged); |
262 | 219 |
263 bool ignored; | 220 bool ignored; |
264 ExpectReturnOfTypicalAudioPayload(34, kTypicalRate); | |
265 CodecInst audio_codec = kTypicalAudioCodec; | 221 CodecInst audio_codec = kTypicalAudioCodec; |
266 audio_codec.pltype = 34; | 222 audio_codec.pltype = 34; |
267 EXPECT_EQ( | 223 EXPECT_EQ( |
268 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 224 0, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
269 | 225 |
270 EXPECT_EQ(-1, rtp_payload_registry_->last_received_payload_type()); | 226 EXPECT_EQ(-1, rtp_payload_registry.last_received_payload_type()); |
271 media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 227 media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
272 EXPECT_FALSE(media_type_unchanged); | 228 EXPECT_FALSE(media_type_unchanged); |
273 } | 229 } |
274 | 230 |
275 class ParameterizedRtpPayloadRegistryTest | 231 class ParameterizedRtpPayloadRegistryTest |
276 : public RtpPayloadRegistryTest, | 232 : public ::testing::TestWithParam<int> {}; |
277 public ::testing::WithParamInterface<int> {}; | |
278 | 233 |
279 TEST_P(ParameterizedRtpPayloadRegistryTest, | 234 TEST_P(ParameterizedRtpPayloadRegistryTest, |
280 FailsToRegisterKnownPayloadsWeAreNotInterestedIn) { | 235 FailsToRegisterKnownPayloadsWeAreNotInterestedIn) { |
281 int payload_type = GetParam(); | 236 RTPPayloadRegistry rtp_payload_registry; |
282 | 237 |
283 bool ignored; | 238 bool ignored; |
284 CodecInst audio_codec; | 239 CodecInst audio_codec; |
285 strcpy(audio_codec.plname, "whatever"); | 240 strcpy(audio_codec.plname, "whatever"); |
286 audio_codec.pltype = static_cast<uint8_t>(payload_type); | 241 audio_codec.pltype = GetParam(); |
287 audio_codec.plfreq = 19; | 242 audio_codec.plfreq = 1900; |
288 audio_codec.channels = 1; | 243 audio_codec.channels = 1; |
289 audio_codec.rate = 17; | 244 audio_codec.rate = 17; |
290 EXPECT_EQ( | 245 EXPECT_EQ( |
291 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 246 -1, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
292 } | 247 } |
293 | 248 |
294 INSTANTIATE_TEST_CASE_P(TestKnownBadPayloadTypes, | 249 INSTANTIATE_TEST_CASE_P(TestKnownBadPayloadTypes, |
295 ParameterizedRtpPayloadRegistryTest, | 250 ParameterizedRtpPayloadRegistryTest, |
296 testing::Values(64, 72, 73, 74, 75, 76, 77, 78, 79)); | 251 testing::Values(64, 72, 73, 74, 75, 76, 77, 78, 79)); |
297 | 252 |
298 class RtpPayloadRegistryGenericTest | 253 class RtpPayloadRegistryGenericTest : public ::testing::TestWithParam<int> {}; |
299 : public RtpPayloadRegistryTest, | |
300 public ::testing::WithParamInterface<int> {}; | |
301 | 254 |
302 TEST_P(RtpPayloadRegistryGenericTest, RegisterGenericReceivePayloadType) { | 255 TEST_P(RtpPayloadRegistryGenericTest, RegisterGenericReceivePayloadType) { |
256 RTPPayloadRegistry rtp_payload_registry; | |
257 | |
303 bool ignored; | 258 bool ignored; |
304 CodecInst audio_codec; | 259 CodecInst audio_codec; |
305 // Dummy values, except for payload_type. | 260 // Dummy values, except for payload_type. |
306 strcpy(audio_codec.plname, "generic-codec"); | 261 strcpy(audio_codec.plname, "generic-codec"); |
307 audio_codec.pltype = GetParam(); | 262 audio_codec.pltype = GetParam(); |
308 audio_codec.plfreq = 19; | 263 audio_codec.plfreq = 1900; |
309 audio_codec.channels = 1; | 264 audio_codec.channels = 1; |
310 audio_codec.rate = 17; | 265 audio_codec.rate = 17; |
311 EXPECT_EQ( | 266 EXPECT_EQ( |
312 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 267 0, rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
313 } | 268 } |
314 | 269 |
315 // Generates an RTX packet for the given length and original sequence number. | 270 // Generates an RTX packet for the given length and original sequence number. |
316 // The RTX sequence number and ssrc will use the default value of 9999. The | 271 // The RTX sequence number and ssrc will use the default value of 9999. The |
317 // caller takes ownership of the returned buffer. | 272 // caller takes ownership of the returned buffer. |
318 const uint8_t* GenerateRtxPacket(size_t header_length, | 273 const uint8_t* GenerateRtxPacket(size_t header_length, |
319 size_t payload_length, | 274 size_t payload_length, |
320 uint16_t original_sequence_number) { | 275 uint16_t original_sequence_number) { |
321 uint8_t* packet = | 276 uint8_t* packet = |
322 new uint8_t[kRtxHeaderSize + header_length + payload_length](); | 277 new uint8_t[kRtxHeaderSize + header_length + payload_length](); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
377 header_parser->Parse(restored_packet.get(), length, &restored_header)); | 332 header_parser->Parse(restored_packet.get(), length, &restored_header)); |
378 EXPECT_EQ(original_sequence_number, restored_header.sequenceNumber) | 333 EXPECT_EQ(original_sequence_number, restored_header.sequenceNumber) |
379 << "The restored packet should have the original sequence number " | 334 << "The restored packet should have the original sequence number " |
380 << "in the correct location in the RTP header."; | 335 << "in the correct location in the RTP header."; |
381 EXPECT_EQ(expected_payload_type, restored_header.payloadType) | 336 EXPECT_EQ(expected_payload_type, restored_header.payloadType) |
382 << "The restored packet should have the correct payload type."; | 337 << "The restored packet should have the correct payload type."; |
383 EXPECT_EQ(original_ssrc, restored_header.ssrc) | 338 EXPECT_EQ(original_ssrc, restored_header.ssrc) |
384 << "The restored packet should have the correct ssrc."; | 339 << "The restored packet should have the correct ssrc."; |
385 } | 340 } |
386 | 341 |
387 TEST_F(RtpPayloadRegistryTest, MultipleRtxPayloadTypes) { | 342 TEST(RtpPayloadRegistryTest, MultipleRtxPayloadTypes) { |
343 RTPPayloadRegistry rtp_payload_registry; | |
388 // Set the incoming payload type to 90. | 344 // Set the incoming payload type to 90. |
389 RTPHeader header; | 345 RTPHeader header; |
390 header.payloadType = 90; | 346 header.payloadType = 90; |
391 header.ssrc = 1; | 347 header.ssrc = 1; |
392 rtp_payload_registry_->SetIncomingPayloadType(header); | 348 rtp_payload_registry.SetIncomingPayloadType(header); |
393 rtp_payload_registry_->SetRtxSsrc(100); | 349 rtp_payload_registry.SetRtxSsrc(100); |
394 // Map two RTX payload types. | 350 // Map two RTX payload types. |
395 rtp_payload_registry_->SetRtxPayloadType(105, 95); | 351 rtp_payload_registry.SetRtxPayloadType(105, 95); |
396 rtp_payload_registry_->SetRtxPayloadType(106, 96); | 352 rtp_payload_registry.SetRtxPayloadType(106, 96); |
397 | 353 |
398 TestRtxPacket(rtp_payload_registry_.get(), 105, 95, true); | 354 TestRtxPacket(&rtp_payload_registry, 105, 95, true); |
399 TestRtxPacket(rtp_payload_registry_.get(), 106, 96, true); | 355 TestRtxPacket(&rtp_payload_registry, 106, 96, true); |
400 } | 356 } |
401 | 357 |
402 TEST_F(RtpPayloadRegistryTest, InvalidRtxConfiguration) { | 358 TEST(RtpPayloadRegistryTest, InvalidRtxConfiguration) { |
403 rtp_payload_registry_->SetRtxSsrc(100); | 359 RTPPayloadRegistry rtp_payload_registry; |
360 rtp_payload_registry.SetRtxSsrc(100); | |
404 // Fails because no mappings exist and the incoming payload type isn't known. | 361 // Fails because no mappings exist and the incoming payload type isn't known. |
405 TestRtxPacket(rtp_payload_registry_.get(), 105, 0, false); | 362 TestRtxPacket(&rtp_payload_registry, 105, 0, false); |
406 // Succeeds when the mapping is used, but fails for the implicit fallback. | 363 // Succeeds when the mapping is used, but fails for the implicit fallback. |
407 rtp_payload_registry_->SetRtxPayloadType(105, 95); | 364 rtp_payload_registry.SetRtxPayloadType(105, 95); |
408 TestRtxPacket(rtp_payload_registry_.get(), 105, 95, true); | 365 TestRtxPacket(&rtp_payload_registry, 105, 95, true); |
409 TestRtxPacket(rtp_payload_registry_.get(), 106, 0, false); | 366 TestRtxPacket(&rtp_payload_registry, 106, 0, false); |
410 } | 367 } |
411 | 368 |
412 INSTANTIATE_TEST_CASE_P(TestDynamicRange, | 369 INSTANTIATE_TEST_CASE_P(TestDynamicRange, |
413 RtpPayloadRegistryGenericTest, | 370 RtpPayloadRegistryGenericTest, |
414 testing::Range(96, 127 + 1)); | 371 testing::Range(96, 127 + 1)); |
415 | 372 |
416 } // namespace webrtc | 373 } // namespace webrtc |
OLD | NEW |