Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc

Issue 2524923002: Remove RTPPayloadStrategy and simplify RTPPayloadRegistry (Closed)
Patch Set: Keep old interface public to allow external code to migrate. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 strncpy(video_codec.plName, "VP8", RTP_PAYLOAD_NAME_SIZE); 42 strncpy(video_codec.plName, "VP8", RTP_PAYLOAD_NAME_SIZE);
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 strncpy(red_audio_codec.plname, "red", RTP_PAYLOAD_NAME_SIZE); 99 strncpy(red_audio_codec.plname, "red", RTP_PAYLOAD_NAME_SIZE);
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;
129 EXPECT_EQ(0,
130 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
131
132 CodecInst audio_codec_2 = kTypicalAudioCodec;
133 audio_codec_2.pltype = payload_type;
134 // Make |audio_codec_2| incompatible with |audio_codec| by changing
135 // the frequency.
136 audio_codec_2.plfreq = kTypicalFrequency + 1;
175 EXPECT_EQ( 137 EXPECT_EQ(
176 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); 138 -1, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored))
139 << "Adding incompatible codec with same payload type = bad.";
177 140
178 EXPECT_EQ( 141 // Change payload type.
179 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored))
180 << "Adding same codec twice = bad.";
181
182 RtpUtility::Payload* second_payload_on_heap =
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_TRUE(retrieved_payload->audio);
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_TRUE(retrieved_payload->audio);
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(_, _, _, _)) 170 EXPECT_EQ(0,
204 .WillByDefault(Return(true)); 171 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
205 EXPECT_CALL(*mock_payload_strategy_,
206 UpdatePayloadRate(first_payload_on_heap, kTypicalRate));
207 EXPECT_EQ(
208 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(0,
225 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); 183 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(
230 &ignored)); 187 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &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;
245 &ignored)); 200 EXPECT_EQ(
201 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_3, &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(0,
268 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); 224 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 strncpy(audio_codec.plname, "whatever", RTP_PAYLOAD_NAME_SIZE); 240 strncpy(audio_codec.plname, "whatever", RTP_PAYLOAD_NAME_SIZE);
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(-1,
291 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); 246 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 strncpy(audio_codec.plname, "generic-codec", RTP_PAYLOAD_NAME_SIZE); 261 strncpy(audio_codec.plname, "generic-codec", RTP_PAYLOAD_NAME_SIZE);
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(0,
312 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); 267 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
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698