10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_MEDIA_BASE_FAKEMEDIAENGINE_H_
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_MEDIA_BASE_FAKEMEDIAENGINE_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <list>
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map>
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <set>
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string>
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
377162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org#include "talk/media/base/audiorenderer.h"
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediaengine.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/rtputils.h"
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/streamparams.h"
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessiondescription.h"
42cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/buffer.h"
43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/stringutils.h"
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeMediaEngine;
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVideoEngine;
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVoiceEngine;
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// A common helper class that handles sending and receiving RTP/RTCP packets.
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <class Base> class RtpHelper : public Base {
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RtpHelper()
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : sending_(false),
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        playout_(false),
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_set_send_codecs_(false),
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_set_recv_codecs_(false),
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        send_ssrc_(0),
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ready_to_send_(false) {}
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<RtpHeaderExtension>& recv_extensions() {
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return recv_extensions_;
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<RtpHeaderExtension>& send_extensions() {
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return send_extensions_;
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool sending() const { return sending_; }
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool playout() const { return playout_; }
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::list<std::string>& rtp_packets() const { return rtp_packets_; }
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::list<std::string>& rtcp_packets() const { return rtcp_packets_; }
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtp(const void* data, int len) {
737162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    if (!sending_) {
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Buffer packet(data, len, kMaxRtpPacketLen);
777162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    return Base::SendPacket(&packet);
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SendRtcp(const void* data, int len) {
802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::Buffer packet(data, len, kMaxRtpPacketLen);
817162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    return Base::SendRtcp(&packet);
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtp(const void* data, int len) {
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool success = !rtp_packets_.empty();
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (success) {
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string packet = rtp_packets_.front();
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      rtp_packets_.pop_front();
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      success = (packet == std::string(static_cast<const char*>(data), len));
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return success;
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckRtcp(const void* data, int len) {
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool success = !rtcp_packets_.empty();
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (success) {
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string packet = rtcp_packets_.front();
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      rtcp_packets_.pop_front();
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      success = (packet == std::string(static_cast<const char*>(data), len));
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return success;
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtp() { return rtp_packets_.empty(); }
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoRtcp() { return rtcp_packets_.empty(); }
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvRtpHeaderExtensions(
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) {
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recv_extensions_ = extensions;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendRtpHeaderExtensions(
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) {
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_extensions_ = extensions;
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_set_send_codecs(bool fail) { fail_set_send_codecs_ = fail; }
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_set_recv_codecs(bool fail) { fail_set_recv_codecs_ = fail; }
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddSendStream(const StreamParams& sp) {
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (std::find(send_streams_.begin(), send_streams_.end(), sp) !=
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        send_streams_.end()) {
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_streams_.push_back(sp);
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveSendStream(uint32 ssrc) {
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return RemoveStreamBySsrc(&send_streams_, ssrc);
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddRecvStream(const StreamParams& sp) {
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (std::find(receive_streams_.begin(), receive_streams_.end(), sp) !=
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        receive_streams_.end()) {
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    receive_streams_.push_back(sp);
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveRecvStream(uint32 ssrc) {
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return RemoveStreamBySsrc(&receive_streams_, ssrc);
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool MuteStream(uint32 ssrc, bool on) {
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!HasSendStream(ssrc) && ssrc != 0)
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (on)
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      muted_streams_.insert(ssrc);
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      muted_streams_.erase(ssrc);
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsStreamMuted(uint32 ssrc) const {
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool ret = muted_streams_.find(ssrc) != muted_streams_.end();
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // If |ssrc = 0| check if the first send stream is muted.
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!ret && ssrc == 0 && !send_streams_.empty()) {
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return muted_streams_.find(send_streams_[0].first_ssrc()) !=
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             muted_streams_.end();
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ret;
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<StreamParams>& send_streams() const {
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return send_streams_;
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<StreamParams>& recv_streams() const {
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return receive_streams_;
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool HasRecvStream(uint32 ssrc) const {
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetStreamBySsrc(receive_streams_, ssrc, NULL);
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool HasSendStream(uint32 ssrc) const {
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetStreamBySsrc(send_streams_, ssrc, NULL);
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO(perkj): This is to support legacy unit test that only check one
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // sending stream.
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const uint32 send_ssrc() {
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_streams_.empty())
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return send_streams_[0].first_ssrc();
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO(perkj): This is to support legacy unit test that only check one
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // sending stream.
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string rtcp_cname() {
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_streams_.empty())
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return "";
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return send_streams_[0].cname;
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ready_to_send() const {
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ready_to_send_;
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool set_sending(bool send) {
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sending_ = send;
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_playout(bool playout) { playout_ = playout; }
1942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual void OnPacketReceived(rtc::Buffer* packet,
1952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                                const rtc::PacketTime& packet_time) {
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rtp_packets_.push_back(std::string(packet->data(), packet->length()));
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual void OnRtcpReceived(rtc::Buffer* packet,
1992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                              const rtc::PacketTime& packet_time) {
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rtcp_packets_.push_back(std::string(packet->data(), packet->length()));
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnReadyToSend(bool ready) {
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ready_to_send_ = ready;
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_set_send_codecs() const { return fail_set_send_codecs_; }
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_set_recv_codecs() const { return fail_set_recv_codecs_; }
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool sending_;
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool playout_;
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<RtpHeaderExtension> recv_extensions_;
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<RtpHeaderExtension> send_extensions_;
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::list<std::string> rtp_packets_;
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::list<std::string> rtcp_packets_;
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<StreamParams> send_streams_;
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<StreamParams> receive_streams_;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::set<uint32> muted_streams_;
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_set_send_codecs_;
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_set_recv_codecs_;
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 send_ssrc_;
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string rtcp_cname_;
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ready_to_send_;
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct DtmfInfo {
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    DtmfInfo(uint32 ssrc, int event_code, int duration, int flags)
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : ssrc(ssrc), event_code(event_code), duration(duration), flags(flags) {
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 ssrc;
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int event_code;
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int duration;
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int flags;
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  explicit FakeVoiceMediaChannel(FakeVoiceEngine* engine)
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : engine_(engine),
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_set_send_(false),
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ringback_tone_ssrc_(0),
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ringback_tone_play_(false),
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ringback_tone_loop_(false),
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        time_since_last_typing_(-1) {
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    output_scalings_[0] = OutputScaling();  // For default channel.
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~FakeVoiceMediaChannel();
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<AudioCodec>& recv_codecs() const { return recv_codecs_; }
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<AudioCodec>& send_codecs() const { return send_codecs_; }
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<AudioCodec>& codecs() const { return send_codecs(); }
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<DtmfInfo>& dtmf_info_queue() const {
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return dtmf_info_queue_;
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const AudioOptions& options() const { return options_; }
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 ringback_tone_ssrc() const { return ringback_tone_ssrc_; }
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ringback_tone_play() const { return ringback_tone_play_; }
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ringback_tone_loop() const { return ringback_tone_loop_; }
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) {
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_recv_codecs()) {
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetRecvCodecs.
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recv_codecs_ = codecs;
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs) {
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_send_codecs()) {
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetSendCodecs.
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_codecs_ = codecs;
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetPlayout(bool playout) {
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    set_playout(playout);
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSend(SendFlags flag) {
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_send_) {
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return set_sending(flag != SEND_NOTHING);
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
284f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetStartSendBandwidth(int bps) { return true; }
285f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetMaxSendBandwidth(int bps) { return true; }
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddRecvStream(const StreamParams& sp) {
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<VoiceMediaChannel>::AddRecvStream(sp))
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    output_scalings_[sp.first_ssrc()] = OutputScaling();
2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveRecvStream(uint32 ssrc) {
2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<VoiceMediaChannel>::RemoveRecvStream(ssrc))
2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    output_scalings_.erase(ssrc);
2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2987162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  virtual bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) {
2997162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    std::map<uint32, AudioRenderer*>::iterator it =
3007162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        remote_renderers_.find(ssrc);
3017162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    if (renderer) {
3027162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      if (it != remote_renderers_.end()) {
3037162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        ASSERT(it->second == renderer);
3047162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      } else {
3057162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        remote_renderers_.insert(std::make_pair(ssrc, renderer));
3067162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        renderer->AddChannel(0);
3077162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      }
3087162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    } else {
3097162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      if (it != remote_renderers_.end()) {
3107162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        it->second->RemoveChannel(0);
3117162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        remote_renderers_.erase(it);
3127162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      } else {
3137162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        return false;
3147162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      }
3157162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    }
3167162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    return true;
3177162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  }
3187162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  virtual bool SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) {
319e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    std::map<uint32, VoiceChannelAudioSink*>::iterator it =
320e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        local_renderers_.find(ssrc);
3217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    if (renderer) {
3227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      if (it != local_renderers_.end()) {
323e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        ASSERT(it->second->renderer() == renderer);
3247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      } else {
325e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        local_renderers_.insert(std::make_pair(
326e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org            ssrc, new VoiceChannelAudioSink(renderer)));
3277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      }
3287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    } else {
3297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      if (it != local_renderers_.end()) {
330e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        delete it->second;
3317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        local_renderers_.erase(it);
3327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      } else {
3337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org        return false;
3347162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org      }
3357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    }
3367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org    return true;
3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetActiveStreams(AudioInfo::StreamList* streams) { return true; }
3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetOutputLevel() { return 0; }
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_time_since_last_typing(int ms) { time_since_last_typing_ = ms; }
3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetTimeSinceLastTyping() { return time_since_last_typing_; }
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetTypingDetectionParameters(
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int time_window, int cost_per_typing, int reporting_threshold,
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int penalty_decay, int type_event_delay) {}
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRingbackTone(const char* buf, int len) { return true; }
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool PlayRingbackTone(uint32 ssrc, bool play, bool loop) {
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ringback_tone_ssrc_ = ssrc;
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ringback_tone_play_ = play;
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ringback_tone_loop_ = loop;
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool CanInsertDtmf() {
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::vector<AudioCodec>::const_iterator it = send_codecs_.begin();
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != send_codecs_.end(); ++it) {
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Find the DTMF telephone event "codec".
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (_stricmp(it->name.c_str(), "telephone-event") == 0) {
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return true;
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool InsertDtmf(uint32 ssrc, int event_code, int duration,
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          int flags) {
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    dtmf_info_queue_.push_back(DtmfInfo(ssrc, event_code, duration, flags));
3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOutputScaling(uint32 ssrc, double left, double right) {
3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (0 == ssrc) {
3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::map<uint32, OutputScaling>::iterator it;
3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      for (it = output_scalings_.begin(); it != output_scalings_.end(); ++it) {
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        it->second.left = left;
3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        it->second.right = right;
3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (output_scalings_.find(ssrc) != output_scalings_.end()) {
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      output_scalings_[ssrc].left = left;
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      output_scalings_[ssrc].right = right;
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetOutputScaling(uint32 ssrc, double* left, double* right) {
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (output_scalings_.find(ssrc) == output_scalings_.end())
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *left = output_scalings_[ssrc].left;
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *right = output_scalings_[ssrc].right;
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetStats(VoiceMediaInfo* info) { return false; }
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void GetLastMediaError(uint32* ssrc,
3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 VoiceMediaChannel::Error* error) {
3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *ssrc = 0;
3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *error = fail_set_send_ ? VoiceMediaChannel::ERROR_REC_DEVICE_OPEN_FAILED
3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            : VoiceMediaChannel::ERROR_NONE;
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_set_send(bool fail) { fail_set_send_ = fail; }
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TriggerError(uint32 ssrc, VoiceMediaChannel::Error error) {
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    VoiceMediaChannel::SignalMediaError(ssrc, error);
4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOptions(const AudioOptions& options) {
4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Does a "merge" of current options and set options.
4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_.SetAll(options);
4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetOptions(AudioOptions* options) const {
4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *options = options_;
4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct OutputScaling {
4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    OutputScaling() : left(1.0), right(1.0) {}
4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    double left, right;
4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
423e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org  class VoiceChannelAudioSink : public AudioRenderer::Sink {
424e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org   public:
425e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    explicit VoiceChannelAudioSink(AudioRenderer* renderer)
426e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        : renderer_(renderer) {
427e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org      renderer_->AddChannel(0);
428e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org      renderer_->SetSink(this);
429e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    }
430e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    virtual ~VoiceChannelAudioSink() {
431e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org      if (renderer_) {
432e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        renderer_->RemoveChannel(0);
433e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org        renderer_->SetSink(NULL);
434e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org      }
435e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    }
436e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    virtual void OnData(const void* audio_data,
437e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org                        int bits_per_sample,
438e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org                        int sample_rate,
439e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org                        int number_of_channels,
440e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org                        int number_of_frames) OVERRIDE {}
441e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    virtual void OnClose() OVERRIDE {
442e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org      renderer_ = NULL;
443e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    }
444e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    AudioRenderer* renderer() const { return renderer_; }
445e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org
446e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org   private:
447e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org    AudioRenderer* renderer_;
448e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org  };
449e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org
450e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVoiceEngine* engine_;
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<AudioCodec> recv_codecs_;
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<AudioCodec> send_codecs_;
4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<uint32, OutputScaling> output_scalings_;
4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<DtmfInfo> dtmf_info_queue_;
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_set_send_;
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 ringback_tone_ssrc_;
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ringback_tone_play_;
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ringback_tone_loop_;
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int time_since_last_typing_;
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioOptions options_;
462e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org  std::map<uint32, VoiceChannelAudioSink*> local_renderers_;
4637162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org  std::map<uint32, AudioRenderer*> remote_renderers_;
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// A helper function to compare the FakeVoiceMediaChannel::DtmfInfo.
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orginline bool CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo& info,
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            uint32 ssrc, int event_code, int duration,
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            int flags) {
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return (info.duration == duration && info.event_code == event_code &&
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          info.flags == flags && info.ssrc == ssrc);
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVideoMediaChannel : public RtpHelper<VideoMediaChannel> {
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  explicit FakeVideoMediaChannel(FakeVideoEngine* engine)
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : engine_(engine),
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        sent_intra_frame_(false),
479f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org        requested_intra_frame_(false),
480f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org        start_bps_(-1),
481f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org        max_bps_(-1) {}
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~FakeVideoMediaChannel();
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<VideoCodec>& recv_codecs() const { return recv_codecs_; }
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<VideoCodec>& send_codecs() const { return send_codecs_; }
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<VideoCodec>& codecs() const { return send_codecs(); }
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool rendering() const { return playout(); }
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const VideoOptions& options() const { return options_; }
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::map<uint32, VideoRenderer*>& renderers() const {
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return renderers_;
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
492f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  int start_bps() const { return start_bps_; }
493f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  int max_bps() const { return max_bps_; }
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetSendStreamFormat(uint32 ssrc, VideoFormat* format) {
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_formats_.find(ssrc) == send_formats_.end()) {
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *format = send_formats_[ssrc];
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendStreamFormat(uint32 ssrc, const VideoFormat& format) {
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_formats_.find(ssrc) == send_formats_.end()) {
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_formats_[ssrc] = format;
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddSendStream(const StreamParams& sp) {
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<VideoMediaChannel>::AddSendStream(sp)) {
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetSendStreamDefaultFormat(sp.first_ssrc());
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveSendStream(uint32 ssrc) {
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_formats_.erase(ssrc);
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return RtpHelper<VideoMediaChannel>::RemoveSendStream(ssrc);
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) {
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_recv_codecs()) {
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetRecvCodecs.
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recv_codecs_ = codecs;
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendCodecs(const std::vector<VideoCodec>& codecs) {
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_send_codecs()) {
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetSendCodecs.
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_codecs_ = codecs;
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::vector<StreamParams>::const_iterator it = send_streams().begin();
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != send_streams().end(); ++it) {
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      SetSendStreamDefaultFormat(it->first_ssrc());
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetSendCodec(VideoCodec* send_codec) {
5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_codecs_.empty()) {
5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *send_codec = send_codecs_[0];
5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRender(bool render) {
5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    set_playout(render);
5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRenderer(uint32 ssrc, VideoRenderer* r) {
5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ssrc != 0 && renderers_.find(ssrc) == renderers_.end()) {
5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ssrc != 0) {
5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      renderers_[ssrc] = r;
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSend(bool send) { return set_sending(send); }
5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetCapturer(uint32 ssrc, VideoCapturer* capturer) {
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_[ssrc] = capturer;
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool HasCapturer(uint32 ssrc) const {
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return capturers_.find(ssrc) != capturers_.end();
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
571f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetStartSendBandwidth(int bps) {
572f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    start_bps_ = bps;
573f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    return true;
574f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  }
575f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetMaxSendBandwidth(int bps) {
576f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    max_bps_ = bps;
577f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org    return true;
578f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  }
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddRecvStream(const StreamParams& sp) {
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<VideoMediaChannel>::AddRecvStream(sp))
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    renderers_[sp.first_ssrc()] = NULL;
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveRecvStream(uint32 ssrc) {
5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<VideoMediaChannel>::RemoveRecvStream(ssrc))
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    renderers_.erase(ssrc);
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5928a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  virtual bool GetStats(const StatsOptions& options,
5938a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org                        VideoMediaInfo* info) { return false; }
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SendIntraFrame() {
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    sent_intra_frame_ = true;
5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RequestIntraFrame() {
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    requested_intra_frame_ = true;
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOptions(const VideoOptions& options) {
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_ = options;
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetOptions(VideoOptions* options) const {
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *options = options_;
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void UpdateAspectRatio(int ratio_w, int ratio_h) {}
6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_sent_intra_frame(bool v) { sent_intra_frame_ = v; }
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool sent_intra_frame() const { return sent_intra_frame_; }
6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_requested_intra_frame(bool v) { requested_intra_frame_ = v; }
6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool requested_intra_frame() const { return requested_intra_frame_; }
6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Be default, each send stream uses the first send codec format.
6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetSendStreamDefaultFormat(uint32 ssrc) {
6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!send_codecs_.empty()) {
6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      send_formats_[ssrc] = VideoFormat(
6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_codecs_[0].width, send_codecs_[0].height,
6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          cricket::VideoFormat::FpsToInterval(send_codecs_[0].framerate),
6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          cricket::FOURCC_I420);
6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVideoEngine* engine_;
6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<VideoCodec> recv_codecs_;
6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<VideoCodec> send_codecs_;
6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<uint32, VideoRenderer*> renderers_;
6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<uint32, VideoFormat> send_formats_;
6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<uint32, VideoCapturer*> capturers_;
6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool sent_intra_frame_;
6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool requested_intra_frame_;
6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoOptions options_;
636f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  int start_bps_;
637f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  int max_bps_;
6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeSoundclipMedia : public SoundclipMedia {
6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool PlaySound(const char* buf, int len, int flags) { return true; }
6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeDataMediaChannel : public RtpHelper<DataMediaChannel> {
6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  explicit FakeDataMediaChannel(void* unused)
648f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org      : send_blocked_(false), max_bps_(-1) {}
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~FakeDataMediaChannel() {}
6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<DataCodec>& recv_codecs() const { return recv_codecs_; }
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<DataCodec>& send_codecs() const { return send_codecs_; }
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<DataCodec>& codecs() const { return send_codecs(); }
6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int max_bps() const { return max_bps_; }
6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvCodecs(const std::vector<DataCodec>& codecs) {
6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_recv_codecs()) {
6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetRecvCodecs.
6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recv_codecs_ = codecs;
6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendCodecs(const std::vector<DataCodec>& codecs) {
6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_set_send_codecs()) {
6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Fake the failure in SetSendCodecs.
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_codecs_ = codecs;
6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSend(bool send) { return set_sending(send); }
6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetReceive(bool receive) {
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    set_playout(receive);
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
676f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetStartSendBandwidth(int bps) { return true; }
677f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetMaxSendBandwidth(int bps) {
6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    max_bps_ = bps;
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddRecvStream(const StreamParams& sp) {
6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<DataMediaChannel>::AddRecvStream(sp))
6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveRecvStream(uint32 ssrc) {
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!RtpHelper<DataMediaChannel>::RemoveRecvStream(ssrc))
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return false;
6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SendData(const SendDataParams& params,
6932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                        const rtc::Buffer& payload,
6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        SendDataResult* result) {
695d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org    if (send_blocked_) {
696d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org      *result = SDR_BLOCK;
697d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org      return false;
698d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org    } else {
699d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org      last_sent_data_params_ = params;
700d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org      last_sent_data_ = std::string(payload.data(), payload.length());
701d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org      return true;
702d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org    }
7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SendDataParams last_sent_data_params() { return last_sent_data_params_; }
7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string last_sent_data() { return last_sent_data_; }
707d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org  bool is_send_blocked() { return send_blocked_; }
708d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org  void set_send_blocked(bool blocked) { send_blocked_ = blocked; }
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<DataCodec> recv_codecs_;
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<DataCodec> send_codecs_;
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SendDataParams last_sent_data_params_;
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string last_sent_data_;
715d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org  bool send_blocked_;
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int max_bps_;
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// A base class for all of the shared parts between FakeVoiceEngine
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and FakeVideoEngine.
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeBaseEngine {
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeBaseEngine()
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : loglevel_(-1),
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        options_changed_(false),
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_create_channel_(false) {}
7272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  bool Init(rtc::Thread* worker_thread) { return true; }
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Terminate() {}
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetLogging(int level, const char* filter) {
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    loglevel_ = level;
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    logfilter_ = filter;
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_create_channel(bool fail) { fail_create_channel_ = fail; }
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<RtpHeaderExtension>& rtp_header_extensions() const {
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return rtp_header_extensions_;
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7403ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  void set_rtp_header_extensions(
7413ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) {
7423ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    rtp_header_extensions_ = extensions;
7433ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int loglevel_;
7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string logfilter_;
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Flag used by optionsmessagehandler_unittest for checking whether any
7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // relevant setting has been updated.
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO(thaloun): Replace with explicit checks of before & after values.
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool options_changed_;
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_create_channel_;
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<RtpHeaderExtension> rtp_header_extensions_;
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVoiceEngine : public FakeBaseEngine {
7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVoiceEngine()
7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : output_volume_(-1),
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        delay_offset_(0),
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        rx_processor_(NULL),
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        tx_processor_(NULL) {
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Add a fake audio codec. Note that the name must not be "" as there are
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // sanity checks against that.
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs_.push_back(AudioCodec(101, "fake_audio_codec", 0, 0, 1, 0));
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetCapabilities() { return AUDIO_SEND | AUDIO_RECV; }
7685528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  AudioOptions GetAudioOptions() const {
7695528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return options_;
7705528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
7715528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  AudioOptions GetOptions() const {
7725528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return options_;
7735528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
7745528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  bool SetOptions(const AudioOptions& options) {
7755528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    options_ = options;
7765528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    options_changed_ = true;
7775528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return true;
7785528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VoiceMediaChannel* CreateChannel() {
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_create_channel_) {
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    FakeVoiceMediaChannel* ch = new FakeVoiceMediaChannel(this);
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.push_back(ch);
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ch;
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVoiceMediaChannel* GetChannel(size_t index) {
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_.size() > index) ? channels_[index] : NULL;
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void UnregisterChannel(VoiceMediaChannel* channel) {
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.erase(std::find(channels_.begin(), channels_.end(), channel));
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SoundclipMedia* CreateSoundclip() { return new FakeSoundclipMedia(); }
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<AudioCodec>& codecs() { return codecs_; }
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetCodecs(const std::vector<AudioCodec> codecs) { codecs_ = codecs; }
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetDelayOffset(int offset) {
8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delay_offset_ = offset;
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetDevices(const Device* in_device, const Device* out_device) {
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    in_device_ = (in_device) ? in_device->name : "";
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_device_ = (out_device) ? out_device->name : "";
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_changed_ = true;
8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetOutputVolume(int* level) {
8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    *level = output_volume_;
8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetOutputVolume(int level) {
8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    output_volume_ = level;
8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_changed_ = true;
8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetInputLevel() { return 0; }
8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetLocalMonitor(bool enable) { return true; }
8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  bool StartAecDump(rtc::PlatformFile file) { return false; }
828f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org
8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool RegisterProcessor(uint32 ssrc, VoiceProcessor* voice_processor,
8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         MediaProcessorDirection direction) {
8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (direction == MPD_RX) {
8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      rx_processor_ = voice_processor;
8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (direction == MPD_TX) {
8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      tx_processor_ = voice_processor;
8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool UnregisterProcessor(uint32 ssrc, VoiceProcessor* voice_processor,
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           MediaProcessorDirection direction) {
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool unregistered = false;
8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (direction & MPD_RX) {
8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      rx_processor_ = NULL;
8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unregistered = true;
8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (direction & MPD_TX) {
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      tx_processor_ = NULL;
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unregistered = true;
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return unregistered;
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<FakeVoiceMediaChannel*> channels_;
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<AudioCodec> codecs_;
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int output_volume_;
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int delay_offset_;
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string in_device_;
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string out_device_;
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VoiceProcessor* rx_processor_;
8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VoiceProcessor* tx_processor_;
8645528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  AudioOptions options_;
8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  friend class FakeMediaEngine;
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVideoEngine : public FakeBaseEngine {
8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
8712b73e54efd883e483dfee48c5417601306faf10ebuildbot@webrtc.org  FakeVideoEngine() : capture_(false), processor_(NULL) {
8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Add a fake video codec. Note that the name must not be "" as there are
8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // sanity checks against that.
8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs_.push_back(VideoCodec(0, "fake_video_codec", 0, 0, 0, 0));
8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8765528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  bool GetOptions(VideoOptions* options) const {
8775528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    *options = options_;
8785528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return true;
8795528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
8805528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  bool SetOptions(const VideoOptions& options) {
8815528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    options_ = options;
8825528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    options_changed_ = true;
8835528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return true;
8845528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetCapabilities() { return VIDEO_SEND | VIDEO_RECV; }
8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetDefaultEncoderConfig(const VideoEncoderConfig& config) {
8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    default_encoder_config_ = config;
8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
890861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  VideoEncoderConfig GetDefaultEncoderConfig() const {
891861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org    return default_encoder_config_;
892861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org  }
8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const VideoEncoderConfig& default_encoder_config() const {
8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return default_encoder_config_;
8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoMediaChannel* CreateChannel(VoiceMediaChannel* channel) {
8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_create_channel_) {
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    FakeVideoMediaChannel* ch = new FakeVideoMediaChannel(this);
9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.push_back(ch);
9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ch;
9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVideoMediaChannel* GetChannel(size_t index) {
9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_.size() > index) ? channels_[index] : NULL;
9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void UnregisterChannel(VideoMediaChannel* channel) {
9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.erase(std::find(channels_.begin(), channels_.end(), channel));
9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<VideoCodec>& codecs() const { return codecs_; }
9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool FindCodec(const VideoCodec& in) {
9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (size_t i = 0; i < codecs_.size(); ++i) {
9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (codecs_[i].Matches(in)) {
9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return true;
9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetCodecs(const std::vector<VideoCodec> codecs) { codecs_ = codecs; }
9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetCaptureDevice(const Device* device) {
9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    in_device_ = (device) ? device->name : "";
9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options_changed_ = true;
9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool SetCapture(bool capture) {
9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capture_ = capture;
9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoFormat GetStartCaptureFormat() const {
9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return VideoFormat(640, 480, cricket::VideoFormat::FpsToInterval(30),
9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       FOURCC_I420);
9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  sigslot::repeater2<VideoCapturer*, CaptureState> SignalCaptureStateChange;
9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<FakeVideoMediaChannel*> channels_;
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<VideoCodec> codecs_;
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoEncoderConfig default_encoder_config_;
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string in_device_;
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool capture_;
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProcessor* processor_;
9475528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  VideoOptions options_;
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  friend class FakeMediaEngine;
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeMediaEngine :
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    public CompositeMediaEngine<FakeVoiceEngine, FakeVideoEngine> {
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeMediaEngine() {
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    voice_ = FakeVoiceEngine();
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video_ = FakeVideoEngine();
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~FakeMediaEngine() {}
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9613ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  void SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    voice_.SetCodecs(codecs);
9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9643ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  void SetVideoCodecs(const std::vector<VideoCodec>& codecs) {
9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video_.SetCodecs(codecs);
9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9683ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  void SetAudioRtpHeaderExtensions(
9693ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) {
9703ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    voice_.set_rtp_header_extensions(extensions);
9713ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
9723ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  void SetVideoRtpHeaderExtensions(
9733ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) {
9743ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    video_.set_rtp_header_extensions(extensions);
9753ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
9763ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVoiceMediaChannel* GetVoiceChannel(size_t index) {
9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return voice_.GetChannel(index);
9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeVideoMediaChannel* GetVideoChannel(size_t index) {
9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return video_.GetChannel(index);
9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9845528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  AudioOptions audio_options() const { return voice_.options_; }
9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int audio_delay_offset() const { return voice_.delay_offset_; }
9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int output_volume() const { return voice_.output_volume_; }
9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const VideoEncoderConfig& default_video_encoder_config() const {
9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return video_.default_encoder_config_;
9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& audio_in_device() const { return voice_.in_device_; }
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& audio_out_device() const { return voice_.out_device_; }
9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int voice_loglevel() const { return voice_.loglevel_; }
9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& voice_logfilter() const { return voice_.logfilter_; }
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int video_loglevel() const { return video_.loglevel_; }
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string& video_logfilter() const { return video_.logfilter_; }
9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool capture() const { return video_.capture_; }
9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool options_changed() const {
9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return voice_.options_changed_ || video_.options_changed_;
9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void clear_options_changed() {
10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video_.options_changed_ = false;
10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    voice_.options_changed_ = false;
10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_create_channel(bool fail) {
10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    voice_.set_fail_create_channel(fail);
10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video_.set_fail_create_channel(fail);
10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool voice_processor_registered(MediaProcessorDirection direction) const {
10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (direction == MPD_RX) {
10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return voice_.rx_processor_ != NULL;
10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (direction == MPD_TX) {
10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return voice_.tx_processor_ != NULL;
10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// CompositeMediaEngine with FakeVoiceEngine to expose SetAudioCodecs to
10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// establish a media connectionwith minimum set of audio codes required
10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtemplate <class VIDEO>
10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass CompositeMediaEngineWithFakeVoiceEngine :
10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    public CompositeMediaEngine<FakeVoiceEngine, VIDEO> {
10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CompositeMediaEngineWithFakeVoiceEngine() {}
10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~CompositeMediaEngineWithFakeVoiceEngine() {}
10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CompositeMediaEngine<FakeVoiceEngine, VIDEO>::voice_.SetCodecs(codecs);
10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Have to come afterwards due to declaration order
10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orginline FakeVoiceMediaChannel::~FakeVoiceMediaChannel() {
10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (engine_) {
10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine_->UnregisterChannel(this);
10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orginline FakeVideoMediaChannel::~FakeVideoMediaChannel() {
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (engine_) {
10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine_->UnregisterChannel(this);
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeDataEngine : public DataEngineInterface {
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeDataEngine() : last_channel_type_(DCT_NONE) {}
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual DataMediaChannel* CreateChannel(DataChannelType data_channel_type) {
10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    last_channel_type_ = data_channel_type;
10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    FakeDataMediaChannel* ch = new FakeDataMediaChannel(this);
10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.push_back(ch);
10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ch;
10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeDataMediaChannel* GetChannel(size_t index) {
10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_.size() > index) ? channels_[index] : NULL;
10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void UnregisterChannel(DataMediaChannel* channel) {
10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.erase(std::find(channels_.begin(), channels_.end(), channel));
10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetDataCodecs(const std::vector<DataCodec>& data_codecs) {
10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    data_codecs_ = data_codecs;
10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual const std::vector<DataCodec>& data_codecs() { return data_codecs_; }
10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DataChannelType last_channel_type() const { return last_channel_type_; }
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<FakeDataMediaChannel*> channels_;
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<DataCodec> data_codecs_;
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DataChannelType last_channel_type_;
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_MEDIA_BASE_FAKEMEDIAENGINE_H_
1081