test_api_rtcp.cc revision 6a6f0893dd1e653410ba4b22e7f33947d15aeb65
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; 338281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org }; 342f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnRTCPPacketTimeout(const int32_t id) { 358281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 362f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnLipSyncUpdate(const int32_t id, 372f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org const int32_t audioVideoOffset) { 388281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org }; 399663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) { 4049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 419663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedSLI(uint32_t ssrc, 429663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint8_t pictureId) { 430365a27f56aa2d2376d2f356bf70d161c3450244sprang EXPECT_EQ(kSliPictureId & 0x3f, pictureId); 4449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 459663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedRPSI(uint32_t ssrc, 469663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint64_t pictureId) { 4749888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(kTestPictureId, pictureId); 4849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 49aca26292aeb35c91e70dd22d5923bf74ce68fa30mflodman@webrtc.org virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) {}; 508281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org private: 518281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* _rtpRtcpModule; 528281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 538281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 54822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass TestRtpFeedback : public NullRtpFeedback { 55822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org public: 56822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {} 57822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org virtual ~TestRtpFeedback() {} 58822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 59ac547a653862744d0aae560713f8418ad2852085Peter Boström void OnIncomingSSRCChanged(const uint32_t ssrc) override { 60286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org rtp_rtcp_->SetRemoteSSRC(ssrc); 61822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org } 62822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 63822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org private: 64822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org RtpRtcp* rtp_rtcp_; 65822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org}; 66822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 678281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.orgclass RtpRtcpRtcpTest : public ::testing::Test { 688281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org protected: 69a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org RtpRtcpRtcpTest() : fake_clock(123456) { 709334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(1234); 719334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(2345); 728281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_ssrc = 3456; 738281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_timestamp = 4567; 748281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_sequence_number = 2345; 758281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 768281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org ~RtpRtcpRtcpTest() {} 778281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 788281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org virtual void SetUp() { 79822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receiver = new TestRtpReceiver(); 802853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport1 = new LoopBackTransport(); 812853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport2 = new LoopBackTransport(); 822853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1 = new RtcpCallback(); 832853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2 = new RtcpCallback(); 842853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 85822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock)); 86822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock)); 87822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 882853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtpRtcp::Configuration configuration; 898d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org configuration.audio = true; 902853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.clock = &fake_clock; 91822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics1_.get(); 922853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport1; 932853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback1; 94822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 95822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.reset(new RTPPayloadRegistry( 96dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 97822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.reset(new RTPPayloadRegistry( 98dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 992853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1002853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module1 = RtpRtcp::CreateRtpRtcp(configuration); 1012853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 102822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback1_.reset(new TestRtpFeedback(module1)); 103822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 104822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver( 105ac547a653862744d0aae560713f8418ad2852085Peter Boström &fake_clock, NULL, receiver, rtp_feedback1_.get(), 106822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.get())); 107822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 108822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics2_.get(); 1092853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport2; 1102853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback2; 111822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 1122853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module2 = RtpRtcp::CreateRtpRtcp(configuration); 1132853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 114822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback2_.reset(new TestRtpFeedback(module2)); 115822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 116822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver( 117ac547a653862744d0aae560713f8418ad2852085Peter Boström &fake_clock, NULL, receiver, rtp_feedback2_.get(), 118822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.get())); 119822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 120822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport1->SetSendModule(module2, rtp_payload_registry2_.get(), 121822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.get(), receive_statistics2_.get()); 122822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport2->SetSendModule(module1, rtp_payload_registry1_.get(), 123822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.get(), receive_statistics1_.get()); 1242853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1->SetModule(module1); 1252853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2->SetModule(module2); 126ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 127da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos module1->SetRTCPStatus(RtcpMode::kCompound); 128da903eaabbb6c6830efcafc3c2ade1d36f511e43pbos module2->SetRTCPStatus(RtcpMode::kCompound); 129ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 130ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module2->SetSSRC(test_ssrc + 1); 131ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module1->SetSSRC(test_ssrc); 132d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetSequenceNumber(test_sequence_number); 133d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetStartTimestamp(test_timestamp); 1349334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org 1359334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org module1->SetCsrcs(test_csrcs); 136ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetCNAME("john.doe@test.test")); 137ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 138ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 139ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 140822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org CodecInst voice_codec; 141822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype = 96; 142822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq = 8000; 143822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.rate = 64000; 144822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 145822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 146822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 147822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 148822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 149822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 150822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 151822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 152822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 153822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 154822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 155822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 156822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 157822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 158822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 159822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 160ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 161ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // We need to send one RTP packet to get the RTCP packet to be accepted by 162ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // the receiving module. 163ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTP packet with the data "testtest" 1642f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org const uint8_t test[9] = "testtest"; 165ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 166ddfdfed3b55de3da5fda9a55d34e46d6e422baafstefan@webrtc.org 0, -1, test, 8)); 167ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org } 168ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 1692853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org virtual void TearDown() { 1702853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module1; 1712853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module2; 1728d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback1; 1738d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback2; 1742853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport1; 1752853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport2; 1762853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete receiver; 1772853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org } 1782853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 17900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback1_; 18000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback2_; 18100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics1_; 18200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics2_; 18300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry1_; 18400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry2_; 18500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver1_; 18600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver2_; 1878281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module1; 1888281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module2; 189822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org TestRtpReceiver* receiver; 1908281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport1; 1918281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport2; 1922853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback1; 1932853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback2; 1942853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1952f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_ssrc; 1962f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_timestamp; 1972f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint16_t test_sequence_number; 1989334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org std::vector<uint32_t> test_csrcs; 199a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org SimulatedClock fake_clock; 2008281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 2018281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 20249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_PLI_RPSI) { 2038281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SendRTCPReferencePictureSelection(kTestPictureId)); 2040365a27f56aa2d2376d2f356bf70d161c3450244sprang EXPECT_EQ(0, module1->SendRTCPSliceLossIndication(kSliPictureId)); 20549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 2068281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 20749888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_CNAME) { 2082f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t testOfCSRC[webrtc::kRtpCsrcSize]; 209822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(2, rtp_receiver2_->CSRCs(testOfCSRC)); 2109334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[0], testOfCSRC[0]); 2119334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[1], testOfCSRC[1]); 2128281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2138281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Set cname of mixed. 2149334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[0], "john@192.168.0.1")); 2159334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2168281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2179334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(-1, module1->RemoveMixedCNAME(test_csrcs[0] + 1)); 2189334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->RemoveMixedCNAME(test_csrcs[1])); 2199334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2208281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 22149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // send RTCP packet, triggered by timer 222a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 22349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module1->Process(); 224a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 22549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module2->Process(); 22649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 22749888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org char cName[RTCP_CNAME_SIZE]; 228822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC() + 1, cName)); 22949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 23049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Check multiple CNAME. 231822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 23249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john.doe@test.test", RTCP_CNAME_SIZE)); 23349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2349334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[0], cName)); 23549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john@192.168.0.1", RTCP_CNAME_SIZE)); 23649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2379334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[1], cName)); 23849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "jane@192.168.0.2", RTCP_CNAME_SIZE)); 23949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(false)); 24149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Test that BYE clears the CNAME 243822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 24449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 24549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 246ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.orgTEST_F(RtpRtcpRtcpTest, RemoteRTCPStatRemote) { 247ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org std::vector<RTCPReportBlock> report_blocks; 248ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 249ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 250ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks.size()); 251ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 252ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTCP packet, triggered by timer 253a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 254ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module1->Process(); 255a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 256ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module2->Process(); 257ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 258ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 259ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org ASSERT_EQ(1u, report_blocks.size()); 260ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 261ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // |test_ssrc+1| is the SSRC of module2 that send the report. 262ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc+1, report_blocks[0].remoteSSRC); 263ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc, report_blocks[0].sourceSSRC); 264ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 265ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].cumulativeLost); 266ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_LT(0u, report_blocks[0].delaySinceLastSR); 267ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_sequence_number, report_blocks[0].extendedHighSeqNum); 268ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].fractionLost); 269ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org} 2706a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap 2716a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap} // namespace 2726a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap} // namespace webrtc 273