| Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| index 491af192be5db3c3ae07fd0cd672b5fd61fae8b8..b0fc2bb8d7b4c4c8a0316c5dfcfc1bd5c0e797a7 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| @@ -38,27 +38,27 @@
|
| #include "webrtc/p2p/base/faketransportcontroller.h"
|
| #include "talk/session/media/channel.h"
|
|
|
| +// Tests for the WebRtcVoiceEngine/VoiceChannel code.
|
| +
|
| using cricket::kRtpAudioLevelHeaderExtension;
|
| using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
|
|
|
| -namespace {
|
| -
|
| -const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
|
| -const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
|
| -const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
|
| -const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
|
| -const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
|
| -const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
|
| -const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
|
| -const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
|
| -const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
|
| - 1, 0);
|
| -const cricket::AudioCodec* const kAudioCodecs[] = {
|
| +static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
|
| +static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
|
| +static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
|
| +static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
|
| +static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
|
| +static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
|
| +static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
|
| +static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
|
| +static const cricket::AudioCodec
|
| + kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
|
| +static const cricket::AudioCodec* const kAudioCodecs[] = {
|
| &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
|
| &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
|
| };
|
| -const uint32_t kSsrc1 = 0x99;
|
| -const uint32_t kSsrc2 = 0x98;
|
| +static uint32_t kSsrc1 = 0x99;
|
| +static uint32_t kSsrc2 = 0x98;
|
|
|
| class FakeVoEWrapper : public cricket::VoEWrapper {
|
| public:
|
| @@ -68,8 +68,10 @@
|
| engine, // codec
|
| engine, // dtmf
|
| engine, // hw
|
| + engine, // neteq
|
| engine, // network
|
| engine, // rtp
|
| + engine, // sync
|
| engine) { // volume
|
| }
|
| };
|
| @@ -84,7 +86,6 @@
|
| int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
|
| unsigned int filter_;
|
| };
|
| -} // namespace
|
|
|
| class WebRtcVoiceEngineTestFake : public testing::Test {
|
| public:
|
| @@ -290,71 +291,6 @@
|
| EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
| EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
|
| EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
|
| - }
|
| -
|
| - const webrtc::AudioReceiveStream::Stats& GetAudioReceiveStreamStats() const {
|
| - static webrtc::AudioReceiveStream::Stats stats;
|
| - if (stats.remote_ssrc == 0) {
|
| - stats.remote_ssrc = 123;
|
| - stats.bytes_rcvd = 456;
|
| - stats.packets_rcvd = 768;
|
| - stats.packets_lost = 101;
|
| - stats.fraction_lost = 23.45f;
|
| - stats.codec_name = "codec_name";
|
| - stats.ext_seqnum = 678;
|
| - stats.jitter_ms = 901;
|
| - stats.jitter_buffer_ms = 234;
|
| - stats.jitter_buffer_preferred_ms = 567;
|
| - stats.delay_estimate_ms = 890;
|
| - stats.audio_level = 1234;
|
| - stats.expand_rate = 5.67f;
|
| - stats.speech_expand_rate = 8.90f;
|
| - stats.secondary_decoded_rate = 1.23f;
|
| - stats.accelerate_rate = 4.56f;
|
| - stats.preemptive_expand_rate = 7.89f;
|
| - stats.decoding_calls_to_silence_generator = 012;
|
| - stats.decoding_calls_to_neteq = 345;
|
| - stats.decoding_normal = 67890;
|
| - stats.decoding_plc = 1234;
|
| - stats.decoding_cng = 5678;
|
| - stats.decoding_plc_cng = 9012;
|
| - stats.capture_start_ntp_time_ms = 3456;
|
| - }
|
| - return stats;
|
| - }
|
| - void SetAudioReceiveStreamStats() {
|
| - for (auto* s : call_.GetAudioReceiveStreams()) {
|
| - s->SetStats(GetAudioReceiveStreamStats());
|
| - }
|
| - }
|
| - void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
|
| - const auto& kStats = GetAudioReceiveStreamStats();
|
| - EXPECT_EQ(info.local_stats.front().ssrc, kStats.remote_ssrc);
|
| - EXPECT_EQ(info.bytes_rcvd, kStats.bytes_rcvd);
|
| - EXPECT_EQ(info.packets_rcvd, kStats.packets_rcvd);
|
| - EXPECT_EQ(info.packets_lost, kStats.packets_lost);
|
| - EXPECT_EQ(info.fraction_lost, kStats.fraction_lost);
|
| - EXPECT_EQ(info.codec_name, kStats.codec_name);
|
| - EXPECT_EQ(info.ext_seqnum, kStats.ext_seqnum);
|
| - EXPECT_EQ(info.jitter_ms, kStats.jitter_ms);
|
| - EXPECT_EQ(info.jitter_buffer_ms, kStats.jitter_buffer_ms);
|
| - EXPECT_EQ(info.jitter_buffer_preferred_ms,
|
| - kStats.jitter_buffer_preferred_ms);
|
| - EXPECT_EQ(info.delay_estimate_ms, kStats.delay_estimate_ms);
|
| - EXPECT_EQ(info.audio_level, kStats.audio_level);
|
| - EXPECT_EQ(info.expand_rate, kStats.expand_rate);
|
| - EXPECT_EQ(info.speech_expand_rate, kStats.speech_expand_rate);
|
| - EXPECT_EQ(info.secondary_decoded_rate, kStats.secondary_decoded_rate);
|
| - EXPECT_EQ(info.accelerate_rate, kStats.accelerate_rate);
|
| - EXPECT_EQ(info.preemptive_expand_rate, kStats.preemptive_expand_rate);
|
| - EXPECT_EQ(info.decoding_calls_to_silence_generator,
|
| - kStats.decoding_calls_to_silence_generator);
|
| - EXPECT_EQ(info.decoding_calls_to_neteq, kStats.decoding_calls_to_neteq);
|
| - EXPECT_EQ(info.decoding_normal, kStats.decoding_normal);
|
| - EXPECT_EQ(info.decoding_plc, kStats.decoding_plc);
|
| - EXPECT_EQ(info.decoding_cng, kStats.decoding_cng);
|
| - EXPECT_EQ(info.decoding_plc_cng, kStats.decoding_plc_cng);
|
| - EXPECT_EQ(info.capture_start_ntp_time_ms, kStats.capture_start_ntp_time_ms);
|
| }
|
|
|
| protected:
|
| @@ -2072,23 +2008,38 @@
|
| EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
|
| EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
|
| }
|
| -
|
| - // We have added one receive stream. We should see empty stats.
|
| - EXPECT_EQ(info.receivers.size(), 1u);
|
| - EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
|
| -
|
| - // Remove the kSsrc2 stream. No receiver stats.
|
| - EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
| + EXPECT_EQ(0u, info.receivers.size());
|
| +
|
| + // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
|
| + // We should drop the packet and no stats should be available.
|
| + DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| EXPECT_EQ(true, channel_->GetStats(&info));
|
| EXPECT_EQ(0u, info.receivers.size());
|
|
|
| - // Deliver a new packet - a default receive stream should be created and we
|
| - // should see stats again.
|
| + // Remove the kSsrc2 stream and deliver a new packet - a default receive
|
| + // stream should be created and we should see stats.
|
| + EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
| DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| - SetAudioReceiveStreamStats();
|
| EXPECT_EQ(true, channel_->GetStats(&info));
|
| EXPECT_EQ(1u, info.receivers.size());
|
| - VerifyVoiceReceiverInfo(info.receivers[0]);
|
| +
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
|
| + EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
|
| + (1 << 14), info.receivers[0].expand_rate);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
|
| + (1 << 14), info.receivers[0].speech_expand_rate);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
|
| + (1 << 14), info.receivers[0].secondary_decoded_rate);
|
| + EXPECT_EQ(
|
| + static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
|
| + info.receivers[0].accelerate_rate);
|
| + EXPECT_EQ(
|
| + static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
|
| + info.receivers[0].preemptive_expand_rate);
|
| }
|
|
|
| // Test that we can add and remove receive streams, and do proper send/playout.
|
| @@ -2349,22 +2300,33 @@
|
| // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
|
| // EXPECT_EQ(cricket::kIntStatValue,
|
| // info.senders[0].echo_return_loss_enhancement);
|
| - // We have added one receive stream. We should see empty stats.
|
| - EXPECT_EQ(info.receivers.size(), 1u);
|
| - EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
|
| -
|
| - // Remove the kSsrc2 stream. No receiver stats.
|
| - EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
| + EXPECT_EQ(0u, info.receivers.size());
|
| +
|
| + // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
|
| + // We should drop the packet and no stats should be available.
|
| + DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| EXPECT_EQ(true, channel_->GetStats(&info));
|
| EXPECT_EQ(0u, info.receivers.size());
|
|
|
| - // Deliver a new packet - a default receive stream should be created and we
|
| - // should see stats again.
|
| + // Remove the kSsrc2 stream and deliver a new packet - a default receive
|
| + // stream should be created and we should see stats.
|
| + EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
| DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| - SetAudioReceiveStreamStats();
|
| EXPECT_EQ(true, channel_->GetStats(&info));
|
| EXPECT_EQ(1u, info.receivers.size());
|
| - VerifyVoiceReceiverInfo(info.receivers[0]);
|
| +
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
|
| + EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
|
| + EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
|
| + (1 << 14), info.receivers[0].expand_rate);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
|
| + (1 << 14), info.receivers[0].speech_expand_rate);
|
| + EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
|
| + (1 << 14), info.receivers[0].secondary_decoded_rate);
|
| + // TODO(sriniv): Add testing for more receiver fields.
|
| }
|
|
|
| // Test that we can set the outgoing SSRC properly with multiple streams.
|
|
|