1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <algorithm> 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector> 13cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 15cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h" 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/common_types.h" 18cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 19cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 207fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h" 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing namespace webrtc; 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define test_rate 64000u 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 267fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass VerifyingAudioReceiver : public NullRtpData { 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 28b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t OnReceivedPayloadData( 29b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t* payloadData, 30b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint16_t payloadSize, 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const webrtc::WebRtcRTPHeader* rtpHeader) { 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (rtpHeader->header.payloadType == 98 || 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rtpHeader->header.payloadType == 99) { 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(4, payloadSize); 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char str[5]; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memcpy(str, payloadData, payloadSize); 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str[4] = 0; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // All our test vectors for payload type 96 and 97 even the stereo is on 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // a per channel base equal to the 4 chars "test". 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Note there is no null termination so we add that to use the 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // test EXPECT_STRCASEEQ. 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_STRCASEEQ("test", str); 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (rtpHeader->header.payloadType == 100 || 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rtpHeader->header.payloadType == 101 || 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rtpHeader->header.payloadType == 102) { 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (rtpHeader->type.Audio.channel == 1) { 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (payloadData[0] == 0xff) { 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // All our test vectors for payload type 100, 101 and 102 have the 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // first channel data being equal to 0xff. 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ADD_FAILURE() << "This code path should never happen."; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 627fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass RTPCallback : public NullRtpFeedback { 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 64b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t OnInitializeDecoder( 65b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const int32_t id, 66b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const int8_t payloadType, 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const char payloadName[RTP_PAYLOAD_NAME_SIZE], 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int frequency, 69b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t channels, 70b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint32_t rate) { 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (payloadType == 96) { 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_rate, rate) << 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "The rate should be 64K for this payloadType"; 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 797fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass AudioFeedback : public NullRtpAudioFeedback { 80b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual void OnReceivedTelephoneEvent(const int32_t id, 81b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t event, 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool end) { 83b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org static uint8_t expectedEvent = 0; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (end) { 86b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint8_t oldEvent = expectedEvent-1; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (expectedEvent == 32) { 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org oldEvent = 15; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(oldEvent, event); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else { 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(expectedEvent, event); 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org expectedEvent++; 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (expectedEvent == 16) { 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org expectedEvent = 32; 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpRtcpAudioTest : public ::testing::Test { 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 1031bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org RtpRtcpAudioTest() : fake_clock(123456) { 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_CSRC[0] = 1234; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_CSRC[2] = 2345; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_id = 123; 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_ssrc = 3456; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_timestamp = 4567; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_sequence_number = 2345; 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~RtpRtcpAudioTest() {} 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void SetUp() { 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org audioFeedback = new AudioFeedback(); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org data_receiver1 = new VerifyingAudioReceiver(); 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org data_receiver2 = new VerifyingAudioReceiver(); 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rtp_callback = new RTPCallback(); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org transport1 = new LoopBackTransport(); 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org transport2 = new LoopBackTransport(); 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1217fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock)); 1227fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock)); 1237fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 1247fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry1_.reset(new RTPPayloadRegistry( 12599681317b0a9dc29c1682a17908f382eac16bd2aandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 1267fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry2_.reset(new RTPPayloadRegistry( 12799681317b0a9dc29c1682a17908f382eac16bd2aandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 1287fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp::Configuration configuration; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.id = test_id; 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.audio = true; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.clock = &fake_clock; 1337fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org configuration.receive_statistics = receive_statistics1_.get(); 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.outgoing_transport = transport1; 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.audio_messages = audioFeedback; 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org module1 = RtpRtcp::CreateRtpRtcp(configuration); 1387fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver( 1397fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org test_id, &fake_clock, audioFeedback, data_receiver1, NULL, 1407fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry1_.get())); 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.id = test_id + 1; 1437fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org configuration.receive_statistics = receive_statistics2_.get(); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.outgoing_transport = transport2; 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.audio_messages = audioFeedback; 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org module2 = RtpRtcp::CreateRtpRtcp(configuration); 1487fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver( 1497fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org test_id + 1, &fake_clock, audioFeedback, data_receiver2, NULL, 1507fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry2_.get())); 1517fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 1527fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org transport1->SetSendModule(module2, rtp_payload_registry2_.get(), 1537fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver2_.get(), receive_statistics2_.get()); 1547fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org transport2->SetSendModule(module1, rtp_payload_registry1_.get(), 1557fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver1_.get(), receive_statistics1_.get()); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void TearDown() { 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete module1; 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete module2; 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete transport1; 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete transport2; 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete audioFeedback; 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete data_receiver1; 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete data_receiver2; 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete rtp_callback; 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int test_id; 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp* module1; 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp* module2; 1727fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<ReceiveStatistics> receive_statistics1_; 1737fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<ReceiveStatistics> receive_statistics2_; 1747fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RtpReceiver> rtp_receiver1_; 1757fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RtpReceiver> rtp_receiver2_; 1767fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RTPPayloadRegistry> rtp_payload_registry1_; 1777fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RTPPayloadRegistry> rtp_payload_registry2_; 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyingAudioReceiver* data_receiver1; 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyingAudioReceiver* data_receiver2; 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LoopBackTransport* transport1; 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LoopBackTransport* transport2; 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioFeedback* audioFeedback; 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RTPCallback* rtp_callback; 184b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_ssrc; 185b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_timestamp; 186b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t test_sequence_number; 187b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_CSRC[webrtc::kRtpCsrcSize]; 1881bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org SimulatedClock fake_clock; 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAudioTest, Basic) { 192903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module1->SetSSRC(test_ssrc); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetStartTimestamp(test_timestamp)); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Test detection at the end of a DTMF tone. 1967fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org //EXPECT_EQ(0, module2->SetTelephoneEventForwardToDecoder(true)); 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start basic RTP test. 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Send an empty RTP packet. 2037fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org // Should fail since we have not registered the payload type. 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96, 0, -1, NULL, 0)); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2077fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org CodecInst voice_codec; 20864b5c6141a124816290795f80d555eb994edec32pbos@webrtc.org memset(&voice_codec, 0, sizeof(voice_codec)); 2097fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype = 96; 2107fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq = 8000; 2117fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 2127fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 2137fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 2147fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 2157fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2167fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2177fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2187fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2197fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 2207fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 2217fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.rate = test_rate; 2227fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 2237fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2247fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2257fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2267fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2277fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("4\n"); 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 230b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t test[5] = "test"; 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, -1, test, 4)); 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2347fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(test_ssrc, rtp_receiver2_->SSRC()); 2357e97e4c84dc21b2853f5158a03dcceb569e493adstefan@webrtc.org uint32_t timestamp; 2367e97e4c84dc21b2853f5158a03dcceb569e493adstefan@webrtc.org EXPECT_TRUE(rtp_receiver2_->Timestamp(×tamp)); 2377e97e4c84dc21b2853f5158a03dcceb569e493adstefan@webrtc.org EXPECT_EQ(test_timestamp, timestamp); 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAudioTest, RED) { 2417fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org CodecInst voice_codec; 24264b5c6141a124816290795f80d555eb994edec32pbos@webrtc.org memset(&voice_codec, 0, sizeof(voice_codec)); 2437fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype = 96; 2447fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq = 8000; 2457fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 2467fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 2477fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 2487fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 2497fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2507fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2517fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2527fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2537fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 2547fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 2557fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.rate = test_rate; 2567fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 2577fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2587fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2597fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2607fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2617fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 263903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module1->SetSSRC(test_ssrc); 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetStartTimestamp(test_timestamp)); 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2677fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype = 127; 2687fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq = 8000; 2697fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org memcpy(voice_codec.plname, "RED", 4); 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2717fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module1->SetSendREDPayloadType(voice_codec.pltype)); 272b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int8_t red = 0; 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendREDPayloadType(red)); 2747fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(voice_codec.pltype, red); 2757fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 2767fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2777fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2787fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2797fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2807fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 2817fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 2827fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 2837fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 2847fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 2857fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 2867fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RTPFragmentationHeader fragmentation; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationVectorSize = 2; 290b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org fragmentation.fragmentationLength = new uint32_t[2]; 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationLength[0] = 4; 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationLength[1] = 4; 293b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org fragmentation.fragmentationOffset = new uint32_t[2]; 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationOffset[0] = 0; 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationOffset[1] = 4; 296b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org fragmentation.fragmentationTimeDiff = new uint16_t[2]; 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationTimeDiff[0] = 0; 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationTimeDiff[1] = 0; 299b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org fragmentation.fragmentationPlType = new uint8_t[2]; 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationPlType[0] = 96; 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fragmentation.fragmentationPlType[1] = 96; 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 303b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t test[5] = "test"; 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Send a RTP packet. 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96, 160, -1, test, 4, 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &fragmentation)); 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetSendREDPayloadType(-1)); 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, module1->SendREDPayloadType(red)); 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAudioTest, DTMF) { 3147fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org CodecInst voice_codec; 31564b5c6141a124816290795f80d555eb994edec32pbos@webrtc.org memset(&voice_codec, 0, sizeof(voice_codec)); 3167fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype = 96; 3177fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq = 8000; 3187fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 3197fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 3207fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 3217fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 3227fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 3237fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 3247fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 3257fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 3267fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 3277fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 3287fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.rate = test_rate; 3297fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 3307fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 3317fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 3327fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 3337fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 3347fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 336903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module1->SetSSRC(test_ssrc); 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetStartTimestamp(test_timestamp)); 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Prepare for DTMF. 3417fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype = 97; 3427fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq = 8000; 3437fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org memcpy(voice_codec.plname, "telephone-event", 16); 3447fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org 3457fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 3467fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 3477fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plname, 3487fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.pltype, 3497fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.plfreq, 3507fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org voice_codec.channels, 3517fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start DTMF test. 354b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t timeStamp = 160; 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Send a DTMF tone using RFC 2833 (4733). 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < 16; i++) { 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendTelephoneEventOutband(i, timeStamp, 10)); 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timeStamp += 160; // Prepare for next packet. 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 362b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t test[9] = "test"; 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Send RTP packets for 16 tones a 160 ms 100ms 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // pause between = 2560ms + 1600ms = 4160ms 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (;timeStamp <= 250 * 160; timeStamp += 160) { 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timeStamp, -1, test, 4)); 3691bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(20); 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org module1->Process(); 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendTelephoneEventOutband(32, 9000, 10)); 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (;timeStamp <= 740 * 160; timeStamp += 160) { 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timeStamp, -1, test, 4)); 3771bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(20); 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org module1->Process(); 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 381