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 11946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 12946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org#include "webrtc/common_types.h" 137fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" 146696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 157fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" 167fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h" 17946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 18946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 196696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This class sends all its packet straight to the provided RtpRtcp module. 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// with optional packet loss. 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass LoopBackTransport : public webrtc::Transport { 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LoopBackTransport() 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : _count(0), 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _packetLoss(0), 307fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry_(NULL), 317fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver_(NULL), 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _rtpRtcpModule(NULL) { 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 347fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org void SetSendModule(RtpRtcp* rtpRtcpModule, 357fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RTPPayloadRegistry* payload_registry, 367fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RtpReceiver* receiver, 377fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org ReceiveStatistics* receive_statistics) { 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _rtpRtcpModule = rtpRtcpModule; 397fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry_ = payload_registry; 407fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver_ = receiver; 417fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org receive_statistics_ = receive_statistics; 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void DropEveryNthPacket(int n) { 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _packetLoss = n; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int SendPacket(int channel, const void *data, int len) { 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _count++; 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_packetLoss > 0) { 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ((_count % _packetLoss) == 0) { 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return len; 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 536696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org RTPHeader header; 546696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); 556aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org if (!parser->Parse(static_cast<const uint8_t*>(data), 566aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org static_cast<size_t>(len), 576aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org &header)) { 586696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org return -1; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 607fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org PayloadUnion payload_specific; 617fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org if (!rtp_payload_registry_->GetPayloadSpecifics( 627fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org header.payloadType, &payload_specific)) { 637fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org return -1; 647fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org } 65db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org receive_statistics_->IncomingPacket(header, len, false); 66db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (!rtp_receiver_->IncomingRtpPacket(header, 677fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org static_cast<const uint8_t*>(data), 687fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org len, payload_specific, true)) { 696696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org return -1; 706696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org } 716696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org return len; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int SendRTCPPacket(int channel, const void *data, int len) { 746696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org if (_rtpRtcpModule->IncomingRtcpPacket((const uint8_t*)data, len) < 0) { 756696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org return -1; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 776696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org return len; 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int _count; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int _packetLoss; 827fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org ReceiveStatistics* receive_statistics_; 837fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RTPPayloadRegistry* rtp_payload_registry_; 847fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RtpReceiver* rtp_receiver_; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp* _rtpRtcpModule; 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 887fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass TestRtpReceiver : public NullRtpData { 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 90cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org 91b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t OnReceivedPayloadData( 92b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t* payloadData, 93b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint16_t payloadSize, 94cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org const webrtc::WebRtcRTPHeader* rtpHeader) { 9598b201189e601aa1863085e0016e868d2db416b1pbos@webrtc.org EXPECT_LE(payloadSize, sizeof(_payloadData)); 96cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org memcpy(_payloadData, payloadData, payloadSize); 97cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org memcpy(&_rtpHeader, rtpHeader, sizeof(_rtpHeader)); 98cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org _payloadSize = payloadSize; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 101cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org 102b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t* payload_data() const { 103cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org return _payloadData; 104cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org } 105cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org 106b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t payload_size() const { 107cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org return _payloadSize; 108cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org } 109cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org 110cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org webrtc::WebRtcRTPHeader rtp_header() const { 111cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org return _rtpHeader; 112cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org } 113cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org 114cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org private: 11598b201189e601aa1863085e0016e868d2db416b1pbos@webrtc.org uint8_t _payloadData[1500]; 116b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t _payloadSize; 117cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org webrtc::WebRtcRTPHeader _rtpHeader; 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 121