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

Side by Side Diff: webrtc/modules/audio_coding/neteq/payload_splitter_unittest.cc

Issue 2342443005: Moved Opus-specific payload splitting into AudioDecoderOpus. (Closed)
Patch Set: Created 4 years, 3 months 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) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 return packet; 137 return packet;
138 } 138 }
139 139
140 // Checks that |packet| has the attributes given in the remaining parameters. 140 // Checks that |packet| has the attributes given in the remaining parameters.
141 void VerifyPacket(const Packet* packet, 141 void VerifyPacket(const Packet* packet,
142 size_t payload_length, 142 size_t payload_length,
143 uint8_t payload_type, 143 uint8_t payload_type,
144 uint16_t sequence_number, 144 uint16_t sequence_number,
145 uint32_t timestamp, 145 uint32_t timestamp,
146 uint8_t payload_value, 146 uint8_t payload_value,
147 bool primary = true) { 147 Packet::Priority priority) {
148 EXPECT_EQ(payload_length, packet->payload.size()); 148 EXPECT_EQ(payload_length, packet->payload.size());
149 EXPECT_EQ(payload_type, packet->header.payloadType); 149 EXPECT_EQ(payload_type, packet->header.payloadType);
150 EXPECT_EQ(sequence_number, packet->header.sequenceNumber); 150 EXPECT_EQ(sequence_number, packet->header.sequenceNumber);
151 EXPECT_EQ(timestamp, packet->header.timestamp); 151 EXPECT_EQ(timestamp, packet->header.timestamp);
152 EXPECT_EQ(primary, packet->primary); 152 EXPECT_EQ(priority, packet->priority);
153 ASSERT_FALSE(packet->payload.empty()); 153 ASSERT_FALSE(packet->payload.empty());
154 for (size_t i = 0; i < packet->payload.size(); ++i) { 154 for (size_t i = 0; i < packet->payload.size(); ++i) {
155 ASSERT_EQ(payload_value, packet->payload.data()[i]); 155 ASSERT_EQ(payload_value, packet->payload.data()[i]);
156 } 156 }
157 } 157 }
158 158
159 void VerifyPacket(const Packet* packet,
160 size_t payload_length,
161 uint8_t payload_type,
162 uint16_t sequence_number,
163 uint32_t timestamp,
164 uint8_t payload_value,
165 bool primary) {
166 return VerifyPacket(packet, payload_length, payload_type, sequence_number,
167 timestamp, payload_value,
168 Packet::Priority{0, primary ? 0 : 1});
169 }
170
159 // Start of test definitions. 171 // Start of test definitions.
160 172
161 TEST(PayloadSplitter, CreateAndDestroy) { 173 TEST(PayloadSplitter, CreateAndDestroy) {
162 PayloadSplitter* splitter = new PayloadSplitter; 174 PayloadSplitter* splitter = new PayloadSplitter;
163 delete splitter; 175 delete splitter;
164 } 176 }
165 177
166 // Packet A is split into A1 and A2. 178 // Packet A is split into A1 and A2.
167 TEST(RedPayloadSplitter, OnePacketTwoPayloads) { 179 TEST(RedPayloadSplitter, OnePacketTwoPayloads) {
168 uint8_t payload_types[] = {0, 0}; 180 uint8_t payload_types[] = {0, 0};
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 // Manually change timestamp and sequence number of second packet. 250 // Manually change timestamp and sequence number of second packet.
239 packet->header.timestamp += kTimestampOffset; 251 packet->header.timestamp += kTimestampOffset;
240 packet->header.sequenceNumber++; 252 packet->header.sequenceNumber++;
241 packet_list.push_back(packet); 253 packet_list.push_back(packet);
242 PayloadSplitter splitter; 254 PayloadSplitter splitter;
243 EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list)); 255 EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list));
244 ASSERT_EQ(6u, packet_list.size()); 256 ASSERT_EQ(6u, packet_list.size());
245 // Check first packet, A1. 257 // Check first packet, A1.
246 packet = packet_list.front(); 258 packet = packet_list.front();
247 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber, 259 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber,
248 kBaseTimestamp, 2, true); 260 kBaseTimestamp, 2, {0, 0});
249 delete packet; 261 delete packet;
250 packet_list.pop_front(); 262 packet_list.pop_front();
251 // Check second packet, A2. 263 // Check second packet, A2.
252 packet = packet_list.front(); 264 packet = packet_list.front();
253 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber, 265 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber,
254 kBaseTimestamp - kTimestampOffset, 1, false); 266 kBaseTimestamp - kTimestampOffset, 1, {0, 1});
255 delete packet; 267 delete packet;
256 packet_list.pop_front(); 268 packet_list.pop_front();
257 // Check third packet, A3. 269 // Check third packet, A3.
258 packet = packet_list.front(); 270 packet = packet_list.front();
259 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, 271 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber,
260 kBaseTimestamp - 2 * kTimestampOffset, 0, false); 272 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2});
261 delete packet; 273 delete packet;
262 packet_list.pop_front(); 274 packet_list.pop_front();
263 // Check fourth packet, B1. 275 // Check fourth packet, B1.
264 packet = packet_list.front(); 276 packet = packet_list.front();
265 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1, 277 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1,
266 kBaseTimestamp + kTimestampOffset, 2, true); 278 kBaseTimestamp + kTimestampOffset, 2, {0, 0});
267 delete packet; 279 delete packet;
268 packet_list.pop_front(); 280 packet_list.pop_front();
269 // Check fifth packet, B2. 281 // Check fifth packet, B2.
270 packet = packet_list.front(); 282 packet = packet_list.front();
271 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1, 283 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1,
272 kBaseTimestamp, 1, false); 284 kBaseTimestamp, 1, {0, 1});
273 delete packet; 285 delete packet;
274 packet_list.pop_front(); 286 packet_list.pop_front();
275 // Check sixth packet, B3. 287 // Check sixth packet, B3.
276 packet = packet_list.front(); 288 packet = packet_list.front();
277 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1, 289 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1,
278 kBaseTimestamp - kTimestampOffset, 0, false); 290 kBaseTimestamp - kTimestampOffset, 0, {0, 2});
279 delete packet; 291 delete packet;
280 } 292 }
281 293
282 // Creates a list with 4 packets with these payload types: 294 // Creates a list with 4 packets with these payload types:
283 // 0 = CNGnb 295 // 0 = CNGnb
284 // 1 = PCMu 296 // 1 = PCMu
285 // 2 = DTMF (AVT) 297 // 2 = DTMF (AVT)
286 // 3 = iLBC 298 // 3 = iLBC
287 // We expect the method CheckRedPayloads to discard the iLBC packet, since it 299 // We expect the method CheckRedPayloads to discard the iLBC packet, since it
288 // is a non-CNG, non-DTMF payload of another type than the first speech payload 300 // is a non-CNG, non-DTMF payload of another type than the first speech payload
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1)); 344 packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1));
333 PacketList packet_list; 345 PacketList packet_list;
334 packet_list.push_back(packet); 346 packet_list.push_back(packet);
335 PayloadSplitter splitter; 347 PayloadSplitter splitter;
336 EXPECT_EQ(PayloadSplitter::kRedLengthMismatch, 348 EXPECT_EQ(PayloadSplitter::kRedLengthMismatch,
337 splitter.SplitRed(&packet_list)); 349 splitter.SplitRed(&packet_list));
338 ASSERT_EQ(1u, packet_list.size()); 350 ASSERT_EQ(1u, packet_list.size());
339 // Check first packet. 351 // Check first packet.
340 packet = packet_list.front(); 352 packet = packet_list.front();
341 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, 353 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber,
342 kBaseTimestamp - 2 * kTimestampOffset, 0, false); 354 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2});
343 delete packet; 355 delete packet;
344 packet_list.pop_front(); 356 packet_list.pop_front();
345 } 357 }
346
347 TEST(FecPayloadSplitter, MixedPayload) {
ossu 2016/09/14 16:21:07 Since splitting is now done on a per-codec basis,
hlundin-webrtc 2016/09/15 09:33:30 Acknowledged.
348 PacketList packet_list;
349 DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory());
350
351 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus");
352 decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu");
353
354 Packet* packet = CreatePacket(0, 10, 0xFF, true);
355 packet_list.push_back(packet);
356
357 packet = CreatePacket(0, 10, 0); // Non-FEC Opus payload.
358 packet_list.push_back(packet);
359
360 packet = CreatePacket(1, 10, 0); // Non-Opus payload.
361 packet_list.push_back(packet);
362
363 PayloadSplitter splitter;
364 EXPECT_EQ(PayloadSplitter::kOK,
365 splitter.SplitFec(&packet_list, &decoder_database));
366 EXPECT_EQ(4u, packet_list.size());
367
368 // Check first packet.
369 packet = packet_list.front();
370 EXPECT_EQ(0, packet->header.payloadType);
371 EXPECT_EQ(kBaseTimestamp - 20 * 48, packet->header.timestamp);
372 EXPECT_EQ(10U, packet->payload.size());
373 EXPECT_FALSE(packet->primary);
374 delete packet;
375 packet_list.pop_front();
376
377 // Check second packet.
378 packet = packet_list.front();
379 EXPECT_EQ(0, packet->header.payloadType);
380 EXPECT_EQ(kBaseTimestamp, packet->header.timestamp);
381 EXPECT_EQ(10U, packet->payload.size());
382 EXPECT_TRUE(packet->primary);
383 delete packet;
384 packet_list.pop_front();
385
386 // Check third packet.
387 packet = packet_list.front();
388 VerifyPacket(packet, 10, 0, kSequenceNumber, kBaseTimestamp, 0, true);
389 delete packet;
390 packet_list.pop_front();
391
392 // Check fourth packet.
393 packet = packet_list.front();
394 VerifyPacket(packet, 10, 1, kSequenceNumber, kBaseTimestamp, 0, true);
395 delete packet;
396 }
397
398 TEST(FecPayloadSplitter, EmbedFecInRed) {
ossu 2016/09/14 16:21:07 As RED and FEC is now indicated separately, rather
399 PacketList packet_list;
400 DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory());
401
402 const int kTimestampOffset = 20 * 48; // 20 ms * 48 kHz.
403 uint8_t payload_types[] = {0, 0};
404 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus");
405 Packet* packet = CreateRedPayload(2, payload_types, kTimestampOffset, true);
406 packet_list.push_back(packet);
407
408 PayloadSplitter splitter;
409 EXPECT_EQ(PayloadSplitter::kOK,
410 splitter.SplitRed(&packet_list));
411 EXPECT_EQ(PayloadSplitter::kOK,
412 splitter.SplitFec(&packet_list, &decoder_database));
413
414 EXPECT_EQ(4u, packet_list.size());
415
416 // Check first packet. FEC packet copied from primary payload in RED.
417 packet = packet_list.front();
418 EXPECT_EQ(0, packet->header.payloadType);
419 EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp);
420 EXPECT_EQ(kPayloadLength, packet->payload.size());
421 EXPECT_FALSE(packet->primary);
422 EXPECT_EQ(packet->payload[3], 1);
423 delete packet;
424 packet_list.pop_front();
425
426 // Check second packet. Normal packet copied from primary payload in RED.
427 packet = packet_list.front();
428 EXPECT_EQ(0, packet->header.payloadType);
429 EXPECT_EQ(kBaseTimestamp, packet->header.timestamp);
430 EXPECT_EQ(kPayloadLength, packet->payload.size());
431 EXPECT_TRUE(packet->primary);
432 EXPECT_EQ(packet->payload[3], 1);
433 delete packet;
434 packet_list.pop_front();
435
436 // Check third packet. FEC packet copied from secondary payload in RED.
437 packet = packet_list.front();
438 EXPECT_EQ(0, packet->header.payloadType);
439 EXPECT_EQ(kBaseTimestamp - 2 * kTimestampOffset, packet->header.timestamp);
440 EXPECT_EQ(kPayloadLength, packet->payload.size());
441 EXPECT_FALSE(packet->primary);
442 EXPECT_EQ(packet->payload[3], 0);
443 delete packet;
444 packet_list.pop_front();
445
446 // Check fourth packet. Normal packet copied from primary payload in RED.
447 packet = packet_list.front();
448 EXPECT_EQ(0, packet->header.payloadType);
449 EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp);
450 EXPECT_EQ(kPayloadLength, packet->payload.size());
451 EXPECT_TRUE(packet->primary);
452 EXPECT_EQ(packet->payload[3], 0);
453 delete packet;
454 packet_list.pop_front();
455 }
456 358
457 } // namespace webrtc 359 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698