18281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org/* 207c68b9c9de03b4110f25cb59d9d7ba8bad624bdleozwang@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 38281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * 48281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * Use of this source code is governed by a BSD-style license 58281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * that can be found in the LICENSE file in the root of the source 68281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * tree. An additional intellectual property rights grant can be found 78281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * in the file PATENTS. All contributing project authors may 88281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 98281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org */ 108281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 118281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org#include <algorithm> 128281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org#include <vector> 138281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 14a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 15a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 16a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/common_types.h" 17ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" 18ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 19ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 20822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h" 21a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h" 228281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 236a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchapnamespace webrtc { 246a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchapnamespace { 259663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org 2649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgconst uint64_t kTestPictureId = 12345678; 270365a27f56aa2d2376d2f356bf70d161c3450244sprangconst uint8_t kSliPictureId = 156; 288281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 29ece3890d3a40fe911ae895e28c329491e795b14dpbos@webrtc.orgclass RtcpCallback : public RtcpIntraFrameObserver { 308281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org public: 312853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org void SetModule(RtpRtcp* module) { 328281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org _rtpRtcpModule = module; 3340f349fddafd97c3f4cd0e37407bd1968496cb09danilchap } 342f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnRTCPPacketTimeout(const int32_t id) { 358281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 362f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnLipSyncUpdate(const int32_t id, 3740f349fddafd97c3f4cd0e37407bd1968496cb09danilchap const int32_t audioVideoOffset) {} 3840f349fddafd97c3f4cd0e37407bd1968496cb09danilchap virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) {} 399663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedSLI(uint32_t ssrc, 409663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint8_t pictureId) { 410365a27f56aa2d2376d2f356bf70d161c3450244sprang EXPECT_EQ(kSliPictureId & 0x3f, pictureId); 4240f349fddafd97c3f4cd0e37407bd1968496cb09danilchap } 439663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedRPSI(uint32_t ssrc, 449663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint64_t pictureId) { 4549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(kTestPictureId, pictureId); 4640f349fddafd97c3f4cd0e37407bd1968496cb09danilchap } 4740f349fddafd97c3f4cd0e37407bd1968496cb09danilchap virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) {} 4840f349fddafd97c3f4cd0e37407bd1968496cb09danilchap 498281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org private: 508281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* _rtpRtcpModule; 518281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 528281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 53822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass TestRtpFeedback : public NullRtpFeedback { 54822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org public: 5540f349fddafd97c3f4cd0e37407bd1968496cb09danilchap explicit TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {} 56822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org virtual ~TestRtpFeedback() {} 57822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 58ac547a653862744d0aae560713f8418ad2852085Peter Boström void OnIncomingSSRCChanged(const uint32_t ssrc) override { 59286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org rtp_rtcp_->SetRemoteSSRC(ssrc); 60822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org } 61822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 62822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org private: 63822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org RtpRtcp* rtp_rtcp_; 64822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org}; 65822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 668281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.orgclass RtpRtcpRtcpTest : public ::testing::Test { 678281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org protected: 68a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org RtpRtcpRtcpTest() : fake_clock(123456) { 699334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(1234); 709334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(2345); 718281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_ssrc = 3456; 728281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_timestamp = 4567; 738281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_sequence_number = 2345; 748281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 758281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org ~RtpRtcpRtcpTest() {} 768281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 778281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org virtual void SetUp() { 78822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receiver = new TestRtpReceiver(); 792853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport1 = new LoopBackTransport(); 802853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport2 = new LoopBackTransport(); 812853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1 = new RtcpCallback(); 822853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2 = new RtcpCallback(); 832853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 84822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock)); 85822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock)); 86822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 872853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtpRtcp::Configuration configuration; 888d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org configuration.audio = true; 892853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.clock = &fake_clock; 90822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics1_.get(); 912853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport1; 922853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback1; 93822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 94822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.reset(new RTPPayloadRegistry( 95dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 96822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.reset(new RTPPayloadRegistry( 97dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 982853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 992853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module1 = RtpRtcp::CreateRtpRtcp(configuration); 1002853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 101822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback1_.reset(new TestRtpFeedback(module1)); 102822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 103822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver( 104ac547a653862744d0aae560713f8418ad2852085Peter Boström &fake_clock, NULL, receiver, rtp_feedback1_.get(), 105822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.get())); 106822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 107822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics2_.get(); 1082853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport2; 1092853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback2; 110822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 1112853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module2 = RtpRtcp::CreateRtpRtcp(configuration); 1122853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 113822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback2_.reset(new TestRtpFeedback(module2)); 114822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 115822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver( 116ac547a653862744d0aae560713f8418ad2852085Peter Boström &fake_clock, NULL, receiver, rtp_feedback2_.get(), 117822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.get())); 118822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 119822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport1->SetSendModule(module2, rtp_payload_registry2_.get(), 120822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.get(), receive_statistics2_.get()); 121822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport2->SetSendModule(module1, rtp_payload_registry1_.get(), 122822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.get(), receive_statistics1_.get()); 1232853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1->SetModule(module1); 1242853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2->SetModule(module2); 125ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 126da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos module1->SetRTCPStatus(RtcpMode::kCompound); 127da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos module2->SetRTCPStatus(RtcpMode::kCompound); 128ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 129ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module2->SetSSRC(test_ssrc + 1); 130ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module1->SetSSRC(test_ssrc); 131d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetSequenceNumber(test_sequence_number); 132d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetStartTimestamp(test_timestamp); 1339334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org 1349334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org module1->SetCsrcs(test_csrcs); 135ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetCNAME("john.doe@test.test")); 136ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 137ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 138ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 139822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org CodecInst voice_codec; 140822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype = 96; 141822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq = 8000; 142822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.rate = 64000; 143822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 144822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 145822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 146822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 147822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 148822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 149822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 150822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 151822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 152822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 153822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 154822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 155822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 156822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 157822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 158822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 159ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 160ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // We need to send one RTP packet to get the RTCP packet to be accepted by 161ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // the receiving module. 162ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTP packet with the data "testtest" 1632f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org const uint8_t test[9] = "testtest"; 164ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 165ddfdfed3b55de3da5fda9a55d34e46d6e422baafstefan@webrtc.org 0, -1, test, 8)); 166ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org } 167ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 1682853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org virtual void TearDown() { 1692853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module1; 1702853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module2; 1718d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback1; 1728d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback2; 1732853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport1; 1742853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport2; 1752853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete receiver; 1762853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org } 1772853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 17800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback1_; 17900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback2_; 18000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics1_; 18100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics2_; 18200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry1_; 18300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry2_; 18400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver1_; 18500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver2_; 1868281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module1; 1878281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module2; 188822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org TestRtpReceiver* receiver; 1898281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport1; 1908281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport2; 1912853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback1; 1922853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback2; 1932853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1942f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_ssrc; 1952f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_timestamp; 1962f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint16_t test_sequence_number; 1979334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org std::vector<uint32_t> test_csrcs; 198a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org SimulatedClock fake_clock; 1998281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 2008281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 20149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_PLI_RPSI) { 2028281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SendRTCPReferencePictureSelection(kTestPictureId)); 2030365a27f56aa2d2376d2f356bf70d161c3450244sprang EXPECT_EQ(0, module1->SendRTCPSliceLossIndication(kSliPictureId)); 20449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 2058281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 20649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_CNAME) { 2072f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t testOfCSRC[webrtc::kRtpCsrcSize]; 208822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(2, rtp_receiver2_->CSRCs(testOfCSRC)); 2099334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[0], testOfCSRC[0]); 2109334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[1], testOfCSRC[1]); 2118281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2128281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Set cname of mixed. 2139334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[0], "john@192.168.0.1")); 2149334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2158281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2169334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(-1, module1->RemoveMixedCNAME(test_csrcs[0] + 1)); 2179334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->RemoveMixedCNAME(test_csrcs[1])); 2189334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2198281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 22049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // send RTCP packet, triggered by timer 221a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 22249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module1->Process(); 223a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 22449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module2->Process(); 22549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 22649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org char cName[RTCP_CNAME_SIZE]; 227822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC() + 1, cName)); 22849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 22949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Check multiple CNAME. 230822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 23149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john.doe@test.test", RTCP_CNAME_SIZE)); 23249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2339334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[0], cName)); 23449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john@192.168.0.1", RTCP_CNAME_SIZE)); 23549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2369334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[1], cName)); 23749888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "jane@192.168.0.2", RTCP_CNAME_SIZE)); 23849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 23949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(false)); 24049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Test that BYE clears the CNAME 242822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 24349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 24449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 245ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.orgTEST_F(RtpRtcpRtcpTest, RemoteRTCPStatRemote) { 246ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org std::vector<RTCPReportBlock> report_blocks; 247ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 248ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 249ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks.size()); 250ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 251ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTCP packet, triggered by timer 252a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 253ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module1->Process(); 254a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 255ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module2->Process(); 256ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 257ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 258ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org ASSERT_EQ(1u, report_blocks.size()); 259ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 260ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // |test_ssrc+1| is the SSRC of module2 that send the report. 261ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc+1, report_blocks[0].remoteSSRC); 262ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc, report_blocks[0].sourceSSRC); 263ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 264ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].cumulativeLost); 265ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_LT(0u, report_blocks[0].delaySinceLastSR); 266ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_sequence_number, report_blocks[0].extendedHighSeqNum); 267ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].fractionLost); 268ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org} 2696a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap 2706a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap} // namespace 2716a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap} // namespace webrtc 272