15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * libjingle
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2004 Google Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  1. Redistributions of source code must retain the above copyright notice,
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  2. Redistributions in binary form must reproduce the above copyright notice,
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     this list of conditions and the following disclaimer in the documentation
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     and/or other materials provided with the distribution.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  3. The name of the author may not be used to endorse or promote products
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     derived from this software without specific prior written permission.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/media/base/mediachannel.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/media/base/rtputils.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/buffer.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/byteorder.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/criticalsection.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/dscp.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/messagehandler.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/messagequeue.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webrtc/base/thread.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cricket {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fake NetworkInterface that sends/receives RTP/RTCP packets.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeNetworkInterface : public MediaChannel::NetworkInterface,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             public rtc::MessageHandler {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeNetworkInterface()
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : thread_(rtc::Thread::Current()),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest_(NULL),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        conf_(false),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sendbuf_size_(-1),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        recvbuf_size_(-1),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dscp_(rtc::DSCP_NO_CHANGE) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDestination(MediaChannel* dest) { dest_ = dest; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Conference mode is a mode where instead of simply forwarding the packets,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the transport will send multiple copies of the packet with the specified
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSRCs. This allows us to simulate receiving media from multiple sources.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetConferenceMode(bool conf, const std::vector<uint32>& ssrcs) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conf_ = conf;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conf_sent_ssrcs_ = ssrcs;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumRtpBytes() {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bytes = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < rtp_packets_.size(); ++i) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes += static_cast<int>(rtp_packets_[i].length());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bytes;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumRtpBytes(uint32 ssrc) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bytes = 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumRtpBytesAndPackets(ssrc, &bytes, NULL);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bytes;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumRtpPackets() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int>(rtp_packets_.size());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumRtpPackets(uint32 ssrc) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int packets = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumRtpBytesAndPackets(ssrc, NULL, &packets);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return packets;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumSentSsrcs() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int>(sent_ssrcs_.size());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: callers are responsible for deleting the returned buffer.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const rtc::Buffer* GetRtpPacket(int index) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index >= NumRtpPackets()) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new rtc::Buffer(rtp_packets_[index]);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumRtcpPackets() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int>(rtcp_packets_.size());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: callers are responsible for deleting the returned buffer.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const rtc::Buffer* GetRtcpPacket(int index) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index >= NumRtcpPackets()) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new rtc::Buffer(rtcp_packets_[index]);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicate that |n|'th packet for |ssrc| should be dropped.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPacketDrop(uint32 ssrc, uint32 n) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_map_[ssrc].insert(n);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sendbuf_size() const { return sendbuf_size_; }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int recvbuf_size() const { return recvbuf_size_; }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rtc::DiffServCodePoint dscp() const { return dscp_; }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendPacket(rtc::Buffer* packet,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          rtc::DiffServCodePoint dscp) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 cur_ssrc = 0;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!GetRtpSsrc(packet->data(), packet->length(), &cur_ssrc)) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sent_ssrcs_[cur_ssrc]++;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check if we need to drop this packet.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::map<uint32, std::set<uint32> >::iterator itr =
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drop_map_.find(cur_ssrc);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr != drop_map_.end() &&
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        itr->second.count(sent_ssrcs_[cur_ssrc]) > 0) {
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // "Drop" the packet.
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return true;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtp_packets_.push_back(*packet);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (conf_) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rtc::Buffer buffer_copy(*packet);
158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      for (size_t i = 0; i < conf_sent_ssrcs_.size(); ++i) {
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        if (!SetRtpSsrc(buffer_copy.data(), buffer_copy.length(),
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                        conf_sent_ssrcs_[i])) {
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          return false;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        PostMessage(ST_RTP, buffer_copy);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PostMessage(ST_RTP, *packet);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendRtcp(rtc::Buffer* packet,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        rtc::DiffServCodePoint dscp) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::CritScope cs(&crit_);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtcp_packets_.push_back(*packet);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!conf_) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // don't worry about RTCP in conf mode for now
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PostMessage(ST_RTCP, *packet);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int SetOption(SocketType type, rtc::Socket::Option opt,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int option) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (opt == rtc::Socket::OPT_SNDBUF) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sendbuf_size_ = option;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (opt == rtc::Socket::OPT_RCVBUF) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      recvbuf_size_ = option;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (opt == rtc::Socket::OPT_DSCP) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dscp_ = static_cast<rtc::DiffServCodePoint>(option);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostMessage(int id, const rtc::Buffer& packet) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thread_->Post(this, id, rtc::WrapMessageData(packet));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMessage(rtc::Message* msg) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtc::TypedMessageData<rtc::Buffer>* msg_data =
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<rtc::TypedMessageData<rtc::Buffer>*>(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            msg->pdata);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dest_) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (msg->message_id == ST_RTP) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest_->OnPacketReceived(&msg_data->data(),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                rtc::CreatePacketTime(0));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest_->OnRtcpReceived(&msg_data->data(),
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              rtc::CreatePacketTime(0));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete msg_data;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNumRtpBytesAndPackets(uint32 ssrc, int* bytes, int* packets) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bytes) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *bytes = 0;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (packets) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *packets = 0;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 cur_ssrc = 0;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < rtp_packets_.size(); ++i) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!GetRtpSsrc(rtp_packets_[i].data(),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      rtp_packets_[i].length(), &cur_ssrc)) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ssrc == cur_ssrc) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (bytes) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *bytes += static_cast<int>(rtp_packets_[i].length());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (packets) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ++(*packets);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rtc::Thread* thread_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaChannel* dest_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool conf_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ssrcs used in sending out packets in conference mode.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint32> conf_sent_ssrcs_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map to track counts of packets that have been sent per ssrc.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This includes packets that are dropped.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, uint32> sent_ssrcs_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map to track packet-number that needs to be dropped per ssrc.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, std::set<uint32> > drop_map_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rtc::CriticalSection crit_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<rtc::Buffer> rtp_packets_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<rtc::Buffer> rtcp_packets_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sendbuf_size_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int recvbuf_size_;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rtc::DiffServCodePoint dscp_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace cricket
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // TALK_MEDIA_BASE_FAKENETWORKINTERFACE_H_
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)