| Index: webrtc/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/payload_splitter_unittest.cc b/webrtc/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
|
| similarity index 70%
|
| rename from webrtc/modules/audio_coding/neteq/payload_splitter_unittest.cc
|
| rename to webrtc/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
|
| index 0a4b2157b5acc4b7e8c0500481d8dfd585487091..5396ff4d0a84d604750cb663365abf0d9cba1886 100644
|
| --- a/webrtc/modules/audio_coding/neteq/payload_splitter_unittest.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
|
| @@ -8,9 +8,9 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -// Unit tests for PayloadSplitter class.
|
| +// Unit tests for RedPayloadSplitter class.
|
|
|
| -#include "webrtc/modules/audio_coding/neteq/payload_splitter.h"
|
| +#include "webrtc/modules/audio_coding/neteq/red_payload_splitter.h"
|
|
|
| #include <assert.h>
|
|
|
| @@ -46,7 +46,8 @@ static const uint32_t kBaseTimestamp = 0x12345678;
|
| // : |
|
| // | |
|
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| -void CreateOpusFecPayload(uint8_t* payload, size_t payload_length,
|
| +void CreateOpusFecPayload(uint8_t* payload,
|
| + size_t payload_length,
|
| uint8_t payload_value) {
|
| if (payload_length < 2) {
|
| return;
|
| @@ -121,8 +122,10 @@ Packet* CreateRedPayload(size_t num_payloads,
|
| }
|
|
|
| // Create a packet with all payload bytes set to |payload_value|.
|
| -Packet* CreatePacket(uint8_t payload_type, size_t payload_length,
|
| - uint8_t payload_value, bool opus_fec = false) {
|
| +Packet* CreatePacket(uint8_t payload_type,
|
| + size_t payload_length,
|
| + uint8_t payload_value,
|
| + bool opus_fec = false) {
|
| Packet* packet = new Packet;
|
| packet->header.payloadType = payload_type;
|
| packet->header.timestamp = kBaseTimestamp;
|
| @@ -144,22 +147,34 @@ void VerifyPacket(const Packet* packet,
|
| uint16_t sequence_number,
|
| uint32_t timestamp,
|
| uint8_t payload_value,
|
| - bool primary = true) {
|
| + Packet::Priority priority) {
|
| EXPECT_EQ(payload_length, packet->payload.size());
|
| EXPECT_EQ(payload_type, packet->header.payloadType);
|
| EXPECT_EQ(sequence_number, packet->header.sequenceNumber);
|
| EXPECT_EQ(timestamp, packet->header.timestamp);
|
| - EXPECT_EQ(primary, packet->primary);
|
| + EXPECT_EQ(priority, packet->priority);
|
| ASSERT_FALSE(packet->payload.empty());
|
| for (size_t i = 0; i < packet->payload.size(); ++i) {
|
| ASSERT_EQ(payload_value, packet->payload.data()[i]);
|
| }
|
| }
|
|
|
| +void VerifyPacket(const Packet* packet,
|
| + size_t payload_length,
|
| + uint8_t payload_type,
|
| + uint16_t sequence_number,
|
| + uint32_t timestamp,
|
| + uint8_t payload_value,
|
| + bool primary) {
|
| + return VerifyPacket(packet, payload_length, payload_type, sequence_number,
|
| + timestamp, payload_value,
|
| + Packet::Priority{0, primary ? 0 : 1});
|
| +}
|
| +
|
| // Start of test definitions.
|
|
|
| -TEST(PayloadSplitter, CreateAndDestroy) {
|
| - PayloadSplitter* splitter = new PayloadSplitter;
|
| +TEST(RedPayloadSplitter, CreateAndDestroy) {
|
| + RedPayloadSplitter* splitter = new RedPayloadSplitter;
|
| delete splitter;
|
| }
|
|
|
| @@ -170,8 +185,8 @@ TEST(RedPayloadSplitter, OnePacketTwoPayloads) {
|
| Packet* packet = CreateRedPayload(2, payload_types, kTimestampOffset);
|
| PacketList packet_list;
|
| packet_list.push_back(packet);
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list));
|
| + RedPayloadSplitter splitter;
|
| + EXPECT_TRUE(splitter.SplitRed(&packet_list));
|
| ASSERT_EQ(2u, packet_list.size());
|
| // Check first packet. The first in list should always be the primary payload.
|
| packet = packet_list.front();
|
| @@ -201,8 +216,8 @@ TEST(RedPayloadSplitter, TwoPacketsOnePayload) {
|
| packet->header.timestamp += kTimestampOffset;
|
| packet->header.sequenceNumber++;
|
| packet_list.push_back(packet);
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list));
|
| + RedPayloadSplitter splitter;
|
| + EXPECT_TRUE(splitter.SplitRed(&packet_list));
|
| ASSERT_EQ(2u, packet_list.size());
|
| // Check first packet.
|
| packet = packet_list.front();
|
| @@ -239,43 +254,43 @@ TEST(RedPayloadSplitter, TwoPacketsThreePayloads) {
|
| packet->header.timestamp += kTimestampOffset;
|
| packet->header.sequenceNumber++;
|
| packet_list.push_back(packet);
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list));
|
| + RedPayloadSplitter splitter;
|
| + EXPECT_TRUE(splitter.SplitRed(&packet_list));
|
| ASSERT_EQ(6u, packet_list.size());
|
| // Check first packet, A1.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber,
|
| - kBaseTimestamp, 2, true);
|
| + kBaseTimestamp, 2, {0, 0});
|
| delete packet;
|
| packet_list.pop_front();
|
| // Check second packet, A2.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber,
|
| - kBaseTimestamp - kTimestampOffset, 1, false);
|
| + kBaseTimestamp - kTimestampOffset, 1, {0, 1});
|
| delete packet;
|
| packet_list.pop_front();
|
| // Check third packet, A3.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber,
|
| - kBaseTimestamp - 2 * kTimestampOffset, 0, false);
|
| + kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2});
|
| delete packet;
|
| packet_list.pop_front();
|
| // Check fourth packet, B1.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1,
|
| - kBaseTimestamp + kTimestampOffset, 2, true);
|
| + kBaseTimestamp + kTimestampOffset, 2, {0, 0});
|
| delete packet;
|
| packet_list.pop_front();
|
| // Check fifth packet, B2.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1,
|
| - kBaseTimestamp, 1, false);
|
| + kBaseTimestamp, 1, {0, 1});
|
| delete packet;
|
| packet_list.pop_front();
|
| // Check sixth packet, B3.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1,
|
| - kBaseTimestamp - kTimestampOffset, 0, false);
|
| + kBaseTimestamp - kTimestampOffset, 0, {0, 2});
|
| delete packet;
|
| }
|
|
|
| @@ -305,7 +320,7 @@ TEST(RedPayloadSplitter, CheckRedPayloads) {
|
| decoder_database.RegisterPayload(2, NetEqDecoder::kDecoderAVT, "avt");
|
| decoder_database.RegisterPayload(3, NetEqDecoder::kDecoderILBC, "ilbc");
|
|
|
| - PayloadSplitter splitter;
|
| + RedPayloadSplitter splitter;
|
| splitter.CheckRedPayloads(&packet_list, decoder_database);
|
|
|
| ASSERT_EQ(3u, packet_list.size()); // Should have dropped the last packet.
|
| @@ -332,124 +347,13 @@ TEST(RedPayloadSplitter, WrongPayloadLength) {
|
| packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1));
|
| PacketList packet_list;
|
| packet_list.push_back(packet);
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kRedLengthMismatch,
|
| - splitter.SplitRed(&packet_list));
|
| + RedPayloadSplitter splitter;
|
| + EXPECT_FALSE(splitter.SplitRed(&packet_list));
|
| ASSERT_EQ(1u, packet_list.size());
|
| // Check first packet.
|
| packet = packet_list.front();
|
| VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber,
|
| - kBaseTimestamp - 2 * kTimestampOffset, 0, false);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -}
|
| -
|
| -TEST(FecPayloadSplitter, MixedPayload) {
|
| - PacketList packet_list;
|
| - DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory());
|
| -
|
| - decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus");
|
| - decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu");
|
| -
|
| - Packet* packet = CreatePacket(0, 10, 0xFF, true);
|
| - packet_list.push_back(packet);
|
| -
|
| - packet = CreatePacket(0, 10, 0); // Non-FEC Opus payload.
|
| - packet_list.push_back(packet);
|
| -
|
| - packet = CreatePacket(1, 10, 0); // Non-Opus payload.
|
| - packet_list.push_back(packet);
|
| -
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kOK,
|
| - splitter.SplitFec(&packet_list, &decoder_database));
|
| - EXPECT_EQ(4u, packet_list.size());
|
| -
|
| - // Check first packet.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp - 20 * 48, packet->header.timestamp);
|
| - EXPECT_EQ(10U, packet->payload.size());
|
| - EXPECT_FALSE(packet->primary);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check second packet.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp, packet->header.timestamp);
|
| - EXPECT_EQ(10U, packet->payload.size());
|
| - EXPECT_TRUE(packet->primary);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check third packet.
|
| - packet = packet_list.front();
|
| - VerifyPacket(packet, 10, 0, kSequenceNumber, kBaseTimestamp, 0, true);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check fourth packet.
|
| - packet = packet_list.front();
|
| - VerifyPacket(packet, 10, 1, kSequenceNumber, kBaseTimestamp, 0, true);
|
| - delete packet;
|
| -}
|
| -
|
| -TEST(FecPayloadSplitter, EmbedFecInRed) {
|
| - PacketList packet_list;
|
| - DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory());
|
| -
|
| - const int kTimestampOffset = 20 * 48; // 20 ms * 48 kHz.
|
| - uint8_t payload_types[] = {0, 0};
|
| - decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus");
|
| - Packet* packet = CreateRedPayload(2, payload_types, kTimestampOffset, true);
|
| - packet_list.push_back(packet);
|
| -
|
| - PayloadSplitter splitter;
|
| - EXPECT_EQ(PayloadSplitter::kOK,
|
| - splitter.SplitRed(&packet_list));
|
| - EXPECT_EQ(PayloadSplitter::kOK,
|
| - splitter.SplitFec(&packet_list, &decoder_database));
|
| -
|
| - EXPECT_EQ(4u, packet_list.size());
|
| -
|
| - // Check first packet. FEC packet copied from primary payload in RED.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp);
|
| - EXPECT_EQ(kPayloadLength, packet->payload.size());
|
| - EXPECT_FALSE(packet->primary);
|
| - EXPECT_EQ(packet->payload[3], 1);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check second packet. Normal packet copied from primary payload in RED.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp, packet->header.timestamp);
|
| - EXPECT_EQ(kPayloadLength, packet->payload.size());
|
| - EXPECT_TRUE(packet->primary);
|
| - EXPECT_EQ(packet->payload[3], 1);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check third packet. FEC packet copied from secondary payload in RED.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp - 2 * kTimestampOffset, packet->header.timestamp);
|
| - EXPECT_EQ(kPayloadLength, packet->payload.size());
|
| - EXPECT_FALSE(packet->primary);
|
| - EXPECT_EQ(packet->payload[3], 0);
|
| - delete packet;
|
| - packet_list.pop_front();
|
| -
|
| - // Check fourth packet. Normal packet copied from primary payload in RED.
|
| - packet = packet_list.front();
|
| - EXPECT_EQ(0, packet->header.payloadType);
|
| - EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp);
|
| - EXPECT_EQ(kPayloadLength, packet->payload.size());
|
| - EXPECT_TRUE(packet->primary);
|
| - EXPECT_EQ(packet->payload[3], 0);
|
| + kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2});
|
| delete packet;
|
| packet_list.pop_front();
|
| }
|
|
|