128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Copyright 2004 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#ifndef TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_ 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_ 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <map> 32a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include <vector> 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/base/mediachannel.h" 35a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "talk/media/base/rtputils.h" 36d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/buffer.h" 37d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/byteorder.h" 38d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/criticalsection.h" 39d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/dscp.h" 40d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/messagehandler.h" 41d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/messagequeue.h" 42d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org#include "webrtc/base/thread.h" 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Fake NetworkInterface that sends/receives RTP/RTCP packets. 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeNetworkInterface : public MediaChannel::NetworkInterface, 48d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org public rtc::MessageHandler { 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeNetworkInterface() 51d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org : thread_(rtc::Thread::Current()), 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org dest_(NULL), 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conf_(false), 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sendbuf_size_(-1), 55de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org recvbuf_size_(-1), 56d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org dscp_(rtc::DSCP_NO_CHANGE) { 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetDestination(MediaChannel* dest) { dest_ = dest; } 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Conference mode is a mode where instead of simply forwarding the packets, 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // the transport will send multiple copies of the packet with the specified 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // SSRCs. This allows us to simulate receiving media from multiple sources. 640c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström void SetConferenceMode(bool conf, const std::vector<uint32_t>& ssrcs) { 65d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conf_ = conf; 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conf_sent_ssrcs_ = ssrcs; 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int NumRtpBytes() { 71d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int bytes = 0; 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < rtp_packets_.size(); ++i) { 74eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org bytes += static_cast<int>(rtp_packets_[i].size()); 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return bytes; 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 790c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström int NumRtpBytes(uint32_t ssrc) { 80d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int bytes = 0; 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org GetNumRtpBytesAndPackets(ssrc, &bytes, NULL); 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return bytes; 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int NumRtpPackets() { 87d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 8828654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org return static_cast<int>(rtp_packets_.size()); 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 910c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström int NumRtpPackets(uint32_t ssrc) { 92d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int packets = 0; 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org GetNumRtpBytesAndPackets(ssrc, NULL, &packets); 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return packets; 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int NumSentSsrcs() { 99d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 10028654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org return static_cast<int>(sent_ssrcs_.size()); 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Note: callers are responsible for deleting the returned buffer. 104d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::Buffer* GetRtpPacket(int index) { 105d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (index >= NumRtpPackets()) { 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 109d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return new rtc::Buffer(rtp_packets_[index]); 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int NumRtcpPackets() { 113d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 11428654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org return static_cast<int>(rtcp_packets_.size()); 11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Note: callers are responsible for deleting the returned buffer. 118d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::Buffer* GetRtcpPacket(int index) { 119d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (index >= NumRtcpPackets()) { 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 123d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return new rtc::Buffer(rtcp_packets_[index]); 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int sendbuf_size() const { return sendbuf_size_; } 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int recvbuf_size() const { return recvbuf_size_; } 128d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::DiffServCodePoint dscp() const { return dscp_; } 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 131d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual bool SendPacket(rtc::Buffer* packet, 132c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan const rtc::PacketOptions& options) { 133d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1350c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t cur_ssrc = 0; 136eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org if (!GetRtpSsrc(packet->data(), packet->size(), &cur_ssrc)) { 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sent_ssrcs_[cur_ssrc]++; 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org rtp_packets_.push_back(*packet); 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (conf_) { 143d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Buffer buffer_copy(*packet); 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < conf_sent_ssrcs_.size(); ++i) { 145eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org if (!SetRtpSsrc(buffer_copy.data(), buffer_copy.size(), 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conf_sent_ssrcs_[i])) { 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return false; 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PostMessage(ST_RTP, buffer_copy); 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PostMessage(ST_RTP, *packet); 15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return true; 15528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 157d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual bool SendRtcp(rtc::Buffer* packet, 158c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan const rtc::PacketOptions& options) { 159d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CritScope cs(&crit_); 16028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org rtcp_packets_.push_back(*packet); 16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (!conf_) { 16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // don't worry about RTCP in conf mode for now 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org PostMessage(ST_RTCP, *packet); 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return true; 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 168d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual int SetOption(SocketType type, rtc::Socket::Option opt, 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int option) { 170d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org if (opt == rtc::Socket::OPT_SNDBUF) { 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sendbuf_size_ = option; 172d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org } else if (opt == rtc::Socket::OPT_RCVBUF) { 17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org recvbuf_size_ = option; 174d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org } else if (opt == rtc::Socket::OPT_DSCP) { 175d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org dscp_ = static_cast<rtc::DiffServCodePoint>(option); 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return 0; 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 180d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void PostMessage(int id, const rtc::Buffer& packet) { 181d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org thread_->Post(this, id, rtc::WrapMessageData(packet)); 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 184d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual void OnMessage(rtc::Message* msg) { 185d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::TypedMessageData<rtc::Buffer>* msg_data = 186d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org static_cast<rtc::TypedMessageData<rtc::Buffer>*>( 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org msg->pdata); 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (dest_) { 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (msg->message_id == ST_RTP) { 190a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org dest_->OnPacketReceived(&msg_data->data(), 191d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CreatePacketTime(0)); 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } else { 193a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org dest_->OnRtcpReceived(&msg_data->data(), 194d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CreatePacketTime(0)); 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete msg_data; 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 2010c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström void GetNumRtpBytesAndPackets(uint32_t ssrc, int* bytes, int* packets) { 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (bytes) { 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *bytes = 0; 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (packets) { 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *packets = 0; 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2080c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t cur_ssrc = 0; 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < rtp_packets_.size(); ++i) { 210eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org if (!GetRtpSsrc(rtp_packets_[i].data(), rtp_packets_[i].size(), 211eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org &cur_ssrc)) { 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return; 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (ssrc == cur_ssrc) { 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (bytes) { 216eebcab5ce99d3e8641dd92a569916b0d24e29fcakwiberg@webrtc.org *bytes += static_cast<int>(rtp_packets_[i].size()); 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (packets) { 21928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ++(*packets); 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 22328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 22428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 225d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread* thread_; 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MediaChannel* dest_; 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool conf_; 22828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The ssrcs used in sending out packets in conference mode. 2290c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström std::vector<uint32_t> conf_sent_ssrcs_; 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Map to track counts of packets that have been sent per ssrc. 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // This includes packets that are dropped. 2320c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström std::map<uint32_t, uint32_t> sent_ssrcs_; 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Map to track packet-number that needs to be dropped per ssrc. 2340c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström std::map<uint32_t, std::set<uint32_t> > drop_map_; 235d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::CriticalSection crit_; 236d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::vector<rtc::Buffer> rtp_packets_; 237d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::vector<rtc::Buffer> rtcp_packets_; 23828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int sendbuf_size_; 23928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int recvbuf_size_; 240d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::DiffServCodePoint dscp_; 24128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 24228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 24428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#endif // TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_ 246