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