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(&timestamp));
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