123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630 |
- /*
- * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- #ifndef MEDIA_BASE_FAKE_MEDIA_ENGINE_H_
- #define MEDIA_BASE_FAKE_MEDIA_ENGINE_H_
- #include <list>
- #include <map>
- #include <memory>
- #include <set>
- #include <string>
- #include <tuple>
- #include <vector>
- #include "absl/algorithm/container.h"
- #include "api/call/audio_sink.h"
- #include "media/base/audio_source.h"
- #include "media/base/media_engine.h"
- #include "media/base/rtp_utils.h"
- #include "media/base/stream_params.h"
- #include "media/engine/webrtc_video_engine.h"
- #include "modules/audio_processing/include/audio_processing.h"
- #include "rtc_base/copy_on_write_buffer.h"
- #include "rtc_base/network_route.h"
- using webrtc::RtpExtension;
- namespace cricket {
- class FakeMediaEngine;
- class FakeVideoEngine;
- class FakeVoiceEngine;
- // A common helper class that handles sending and receiving RTP/RTCP packets.
- template <class Base>
- class RtpHelper : public Base {
- public:
- RtpHelper()
- : sending_(false),
- playout_(false),
- fail_set_send_codecs_(false),
- fail_set_recv_codecs_(false),
- send_ssrc_(0),
- ready_to_send_(false),
- transport_overhead_per_packet_(0),
- num_network_route_changes_(0) {}
- virtual ~RtpHelper() = default;
- const std::vector<RtpExtension>& recv_extensions() {
- return recv_extensions_;
- }
- const std::vector<RtpExtension>& send_extensions() {
- return send_extensions_;
- }
- bool sending() const { return sending_; }
- bool playout() const { return playout_; }
- const std::list<std::string>& rtp_packets() const { return rtp_packets_; }
- const std::list<std::string>& rtcp_packets() const { return rtcp_packets_; }
- bool SendRtp(const void* data,
- size_t len,
- const rtc::PacketOptions& options) {
- if (!sending_) {
- return false;
- }
- rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len,
- kMaxRtpPacketLen);
- return Base::SendPacket(&packet, options);
- }
- bool SendRtcp(const void* data, size_t len) {
- rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len,
- kMaxRtpPacketLen);
- return Base::SendRtcp(&packet, rtc::PacketOptions());
- }
- bool CheckRtp(const void* data, size_t len) {
- bool success = !rtp_packets_.empty();
- if (success) {
- std::string packet = rtp_packets_.front();
- rtp_packets_.pop_front();
- success = (packet == std::string(static_cast<const char*>(data), len));
- }
- return success;
- }
- bool CheckRtcp(const void* data, size_t len) {
- bool success = !rtcp_packets_.empty();
- if (success) {
- std::string packet = rtcp_packets_.front();
- rtcp_packets_.pop_front();
- success = (packet == std::string(static_cast<const char*>(data), len));
- }
- return success;
- }
- bool CheckNoRtp() { return rtp_packets_.empty(); }
- bool CheckNoRtcp() { return rtcp_packets_.empty(); }
- void set_fail_set_send_codecs(bool fail) { fail_set_send_codecs_ = fail; }
- void set_fail_set_recv_codecs(bool fail) { fail_set_recv_codecs_ = fail; }
- virtual bool AddSendStream(const StreamParams& sp) {
- if (absl::c_linear_search(send_streams_, sp)) {
- return false;
- }
- send_streams_.push_back(sp);
- rtp_send_parameters_[sp.first_ssrc()] =
- CreateRtpParametersWithEncodings(sp);
- return true;
- }
- virtual bool RemoveSendStream(uint32_t ssrc) {
- auto parameters_iterator = rtp_send_parameters_.find(ssrc);
- if (parameters_iterator != rtp_send_parameters_.end()) {
- rtp_send_parameters_.erase(parameters_iterator);
- }
- return RemoveStreamBySsrc(&send_streams_, ssrc);
- }
- virtual void ResetUnsignaledRecvStream() {}
- virtual bool AddRecvStream(const StreamParams& sp) {
- if (absl::c_linear_search(receive_streams_, sp)) {
- return false;
- }
- receive_streams_.push_back(sp);
- rtp_receive_parameters_[sp.first_ssrc()] =
- CreateRtpParametersWithEncodings(sp);
- return true;
- }
- virtual bool RemoveRecvStream(uint32_t ssrc) {
- auto parameters_iterator = rtp_receive_parameters_.find(ssrc);
- if (parameters_iterator != rtp_receive_parameters_.end()) {
- rtp_receive_parameters_.erase(parameters_iterator);
- }
- return RemoveStreamBySsrc(&receive_streams_, ssrc);
- }
- virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const {
- auto parameters_iterator = rtp_send_parameters_.find(ssrc);
- if (parameters_iterator != rtp_send_parameters_.end()) {
- return parameters_iterator->second;
- }
- return webrtc::RtpParameters();
- }
- virtual webrtc::RTCError SetRtpSendParameters(
- uint32_t ssrc,
- const webrtc::RtpParameters& parameters) {
- auto parameters_iterator = rtp_send_parameters_.find(ssrc);
- if (parameters_iterator != rtp_send_parameters_.end()) {
- auto result = CheckRtpParametersInvalidModificationAndValues(
- parameters_iterator->second, parameters);
- if (!result.ok())
- return result;
- parameters_iterator->second = parameters;
- return webrtc::RTCError::OK();
- }
- // Replicate the behavior of the real media channel: return false
- // when setting parameters for unknown SSRCs.
- return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
- }
- virtual webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const {
- auto parameters_iterator = rtp_receive_parameters_.find(ssrc);
- if (parameters_iterator != rtp_receive_parameters_.end()) {
- return parameters_iterator->second;
- }
- return webrtc::RtpParameters();
- }
- virtual webrtc::RtpParameters GetDefaultRtpReceiveParameters() const {
- return webrtc::RtpParameters();
- }
- bool IsStreamMuted(uint32_t ssrc) const {
- bool ret = muted_streams_.find(ssrc) != muted_streams_.end();
- // If |ssrc = 0| check if the first send stream is muted.
- if (!ret && ssrc == 0 && !send_streams_.empty()) {
- return muted_streams_.find(send_streams_[0].first_ssrc()) !=
- muted_streams_.end();
- }
- return ret;
- }
- const std::vector<StreamParams>& send_streams() const {
- return send_streams_;
- }
- const std::vector<StreamParams>& recv_streams() const {
- return receive_streams_;
- }
- bool HasRecvStream(uint32_t ssrc) const {
- return GetStreamBySsrc(receive_streams_, ssrc) != nullptr;
- }
- bool HasSendStream(uint32_t ssrc) const {
- return GetStreamBySsrc(send_streams_, ssrc) != nullptr;
- }
- // TODO(perkj): This is to support legacy unit test that only check one
- // sending stream.
- uint32_t send_ssrc() const {
- if (send_streams_.empty())
- return 0;
- return send_streams_[0].first_ssrc();
- }
- // TODO(perkj): This is to support legacy unit test that only check one
- // sending stream.
- const std::string rtcp_cname() {
- if (send_streams_.empty())
- return "";
- return send_streams_[0].cname;
- }
- const RtcpParameters& send_rtcp_parameters() { return send_rtcp_parameters_; }
- const RtcpParameters& recv_rtcp_parameters() { return recv_rtcp_parameters_; }
- bool ready_to_send() const { return ready_to_send_; }
- int transport_overhead_per_packet() const {
- return transport_overhead_per_packet_;
- }
- rtc::NetworkRoute last_network_route() const { return last_network_route_; }
- int num_network_route_changes() const { return num_network_route_changes_; }
- void set_num_network_route_changes(int changes) {
- num_network_route_changes_ = changes;
- }
- void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer* packet,
- int64_t packet_time_us) {
- rtcp_packets_.push_back(std::string(packet->cdata<char>(), packet->size()));
- }
- protected:
- bool MuteStream(uint32_t ssrc, bool mute) {
- if (!HasSendStream(ssrc) && ssrc != 0) {
- return false;
- }
- if (mute) {
- muted_streams_.insert(ssrc);
- } else {
- muted_streams_.erase(ssrc);
- }
- return true;
- }
- bool set_sending(bool send) {
- sending_ = send;
- return true;
- }
- void set_playout(bool playout) { playout_ = playout; }
- bool SetRecvRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
- recv_extensions_ = extensions;
- return true;
- }
- bool SetSendExtmapAllowMixed(bool extmap_allow_mixed) {
- if (Base::ExtmapAllowMixed() != extmap_allow_mixed) {
- Base::SetExtmapAllowMixed(extmap_allow_mixed);
- }
- return true;
- }
- bool SetSendRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
- send_extensions_ = extensions;
- return true;
- }
- void set_send_rtcp_parameters(const RtcpParameters& params) {
- send_rtcp_parameters_ = params;
- }
- void set_recv_rtcp_parameters(const RtcpParameters& params) {
- recv_rtcp_parameters_ = params;
- }
- virtual void OnPacketReceived(rtc::CopyOnWriteBuffer packet,
- int64_t packet_time_us) {
- rtp_packets_.push_back(std::string(packet.cdata<char>(), packet.size()));
- }
- virtual void OnReadyToSend(bool ready) { ready_to_send_ = ready; }
- virtual void OnNetworkRouteChanged(const std::string& transport_name,
- const rtc::NetworkRoute& network_route) {
- last_network_route_ = network_route;
- ++num_network_route_changes_;
- transport_overhead_per_packet_ = network_route.packet_overhead;
- }
- bool fail_set_send_codecs() const { return fail_set_send_codecs_; }
- bool fail_set_recv_codecs() const { return fail_set_recv_codecs_; }
- private:
- bool sending_;
- bool playout_;
- std::vector<RtpExtension> recv_extensions_;
- std::vector<RtpExtension> send_extensions_;
- std::list<std::string> rtp_packets_;
- std::list<std::string> rtcp_packets_;
- std::vector<StreamParams> send_streams_;
- std::vector<StreamParams> receive_streams_;
- RtcpParameters send_rtcp_parameters_;
- RtcpParameters recv_rtcp_parameters_;
- std::set<uint32_t> muted_streams_;
- std::map<uint32_t, webrtc::RtpParameters> rtp_send_parameters_;
- std::map<uint32_t, webrtc::RtpParameters> rtp_receive_parameters_;
- bool fail_set_send_codecs_;
- bool fail_set_recv_codecs_;
- uint32_t send_ssrc_;
- std::string rtcp_cname_;
- bool ready_to_send_;
- int transport_overhead_per_packet_;
- rtc::NetworkRoute last_network_route_;
- int num_network_route_changes_;
- };
- class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
- public:
- struct DtmfInfo {
- DtmfInfo(uint32_t ssrc, int event_code, int duration);
- uint32_t ssrc;
- int event_code;
- int duration;
- };
- explicit FakeVoiceMediaChannel(FakeVoiceEngine* engine,
- const AudioOptions& options);
- ~FakeVoiceMediaChannel();
- const std::vector<AudioCodec>& recv_codecs() const;
- const std::vector<AudioCodec>& send_codecs() const;
- const std::vector<AudioCodec>& codecs() const;
- const std::vector<DtmfInfo>& dtmf_info_queue() const;
- const AudioOptions& options() const;
- int max_bps() const;
- bool SetSendParameters(const AudioSendParameters& params) override;
- bool SetRecvParameters(const AudioRecvParameters& params) override;
- void SetPlayout(bool playout) override;
- void SetSend(bool send) override;
- bool SetAudioSend(uint32_t ssrc,
- bool enable,
- const AudioOptions* options,
- AudioSource* source) override;
- bool HasSource(uint32_t ssrc) const;
- bool AddRecvStream(const StreamParams& sp) override;
- bool RemoveRecvStream(uint32_t ssrc) override;
- bool CanInsertDtmf() override;
- bool InsertDtmf(uint32_t ssrc, int event_code, int duration) override;
- bool SetOutputVolume(uint32_t ssrc, double volume) override;
- bool SetDefaultOutputVolume(double volume) override;
- bool GetOutputVolume(uint32_t ssrc, double* volume);
- bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override;
- absl::optional<int> GetBaseMinimumPlayoutDelayMs(
- uint32_t ssrc) const override;
- bool GetStats(VoiceMediaInfo* info, bool get_and_clear_legacy_stats) override;
- void SetRawAudioSink(
- uint32_t ssrc,
- std::unique_ptr<webrtc::AudioSinkInterface> sink) override;
- void SetDefaultRawAudioSink(
- std::unique_ptr<webrtc::AudioSinkInterface> sink) override;
- std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override;
- private:
- class VoiceChannelAudioSink : public AudioSource::Sink {
- public:
- explicit VoiceChannelAudioSink(AudioSource* source);
- ~VoiceChannelAudioSink() override;
- void OnData(const void* audio_data,
- int bits_per_sample,
- int sample_rate,
- size_t number_of_channels,
- size_t number_of_frames,
- absl::optional<int64_t> absolute_capture_timestamp_ms) override;
- void OnClose() override;
- AudioSource* source() const;
- private:
- AudioSource* source_;
- };
- bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);
- bool SetSendCodecs(const std::vector<AudioCodec>& codecs);
- bool SetMaxSendBandwidth(int bps);
- bool SetOptions(const AudioOptions& options);
- bool SetLocalSource(uint32_t ssrc, AudioSource* source);
- FakeVoiceEngine* engine_;
- std::vector<AudioCodec> recv_codecs_;
- std::vector<AudioCodec> send_codecs_;
- std::map<uint32_t, double> output_scalings_;
- std::map<uint32_t, int> output_delays_;
- std::vector<DtmfInfo> dtmf_info_queue_;
- AudioOptions options_;
- std::map<uint32_t, std::unique_ptr<VoiceChannelAudioSink>> local_sinks_;
- std::unique_ptr<webrtc::AudioSinkInterface> sink_;
- int max_bps_;
- };
- // A helper function to compare the FakeVoiceMediaChannel::DtmfInfo.
- bool CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo& info,
- uint32_t ssrc,
- int event_code,
- int duration);
- class FakeVideoMediaChannel : public RtpHelper<VideoMediaChannel> {
- public:
- FakeVideoMediaChannel(FakeVideoEngine* engine, const VideoOptions& options);
- ~FakeVideoMediaChannel();
- const std::vector<VideoCodec>& recv_codecs() const;
- const std::vector<VideoCodec>& send_codecs() const;
- const std::vector<VideoCodec>& codecs() const;
- bool rendering() const;
- const VideoOptions& options() const;
- const std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*>&
- sinks() const;
- int max_bps() const;
- bool SetSendParameters(const VideoSendParameters& params) override;
- bool SetRecvParameters(const VideoRecvParameters& params) override;
- bool AddSendStream(const StreamParams& sp) override;
- bool RemoveSendStream(uint32_t ssrc) override;
- bool GetSendCodec(VideoCodec* send_codec) override;
- bool SetSink(uint32_t ssrc,
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
- void SetDefaultSink(
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
- bool HasSink(uint32_t ssrc) const;
- bool SetSend(bool send) override;
- bool SetVideoSend(
- uint32_t ssrc,
- const VideoOptions* options,
- rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
- bool HasSource(uint32_t ssrc) const;
- bool AddRecvStream(const StreamParams& sp) override;
- bool RemoveRecvStream(uint32_t ssrc) override;
- void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
- bool GetStats(VideoMediaInfo* info) override;
- std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override;
- bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override;
- absl::optional<int> GetBaseMinimumPlayoutDelayMs(
- uint32_t ssrc) const override;
- void SetRecordableEncodedFrameCallback(
- uint32_t ssrc,
- std::function<void(const webrtc::RecordableEncodedFrame&)> callback)
- override;
- void ClearRecordableEncodedFrameCallback(uint32_t ssrc) override;
- void GenerateKeyFrame(uint32_t ssrc) override;
- private:
- bool SetRecvCodecs(const std::vector<VideoCodec>& codecs);
- bool SetSendCodecs(const std::vector<VideoCodec>& codecs);
- bool SetOptions(const VideoOptions& options);
- bool SetMaxSendBandwidth(int bps);
- FakeVideoEngine* engine_;
- std::vector<VideoCodec> recv_codecs_;
- std::vector<VideoCodec> send_codecs_;
- std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*> sinks_;
- std::map<uint32_t, rtc::VideoSourceInterface<webrtc::VideoFrame>*> sources_;
- std::map<uint32_t, int> output_delays_;
- VideoOptions options_;
- int max_bps_;
- };
- // Dummy option class, needed for the DataTraits abstraction in
- // channel_unittest.c.
- class DataOptions {};
- class FakeDataMediaChannel : public RtpHelper<DataMediaChannel> {
- public:
- explicit FakeDataMediaChannel(void* unused, const DataOptions& options);
- ~FakeDataMediaChannel();
- const std::vector<DataCodec>& recv_codecs() const;
- const std::vector<DataCodec>& send_codecs() const;
- const std::vector<DataCodec>& codecs() const;
- int max_bps() const;
- bool SetSendParameters(const DataSendParameters& params) override;
- bool SetRecvParameters(const DataRecvParameters& params) override;
- bool SetSend(bool send) override;
- bool SetReceive(bool receive) override;
- bool AddRecvStream(const StreamParams& sp) override;
- bool RemoveRecvStream(uint32_t ssrc) override;
- bool SendData(const SendDataParams& params,
- const rtc::CopyOnWriteBuffer& payload,
- SendDataResult* result) override;
- SendDataParams last_sent_data_params();
- std::string last_sent_data();
- bool is_send_blocked();
- void set_send_blocked(bool blocked);
- private:
- bool SetRecvCodecs(const std::vector<DataCodec>& codecs);
- bool SetSendCodecs(const std::vector<DataCodec>& codecs);
- bool SetMaxSendBandwidth(int bps);
- std::vector<DataCodec> recv_codecs_;
- std::vector<DataCodec> send_codecs_;
- SendDataParams last_sent_data_params_;
- std::string last_sent_data_;
- bool send_blocked_;
- int max_bps_;
- };
- class FakeVoiceEngine : public VoiceEngineInterface {
- public:
- FakeVoiceEngine();
- void Init() override;
- rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const override;
- VoiceMediaChannel* CreateMediaChannel(
- webrtc::Call* call,
- const MediaConfig& config,
- const AudioOptions& options,
- const webrtc::CryptoOptions& crypto_options) override;
- FakeVoiceMediaChannel* GetChannel(size_t index);
- void UnregisterChannel(VoiceMediaChannel* channel);
- // TODO(ossu): For proper testing, These should either individually settable
- // or the voice engine should reference mockable factories.
- const std::vector<AudioCodec>& send_codecs() const override;
- const std::vector<AudioCodec>& recv_codecs() const override;
- void SetCodecs(const std::vector<AudioCodec>& codecs);
- void SetRecvCodecs(const std::vector<AudioCodec>& codecs);
- void SetSendCodecs(const std::vector<AudioCodec>& codecs);
- int GetInputLevel();
- bool StartAecDump(webrtc::FileWrapper file, int64_t max_size_bytes) override;
- void StopAecDump() override;
- std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions()
- const override;
- void SetRtpHeaderExtensions(
- std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions);
- private:
- std::vector<FakeVoiceMediaChannel*> channels_;
- std::vector<AudioCodec> recv_codecs_;
- std::vector<AudioCodec> send_codecs_;
- bool fail_create_channel_;
- std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions_;
- friend class FakeMediaEngine;
- };
- class FakeVideoEngine : public VideoEngineInterface {
- public:
- FakeVideoEngine();
- bool SetOptions(const VideoOptions& options);
- VideoMediaChannel* CreateMediaChannel(
- webrtc::Call* call,
- const MediaConfig& config,
- const VideoOptions& options,
- const webrtc::CryptoOptions& crypto_options,
- webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory)
- override;
- FakeVideoMediaChannel* GetChannel(size_t index);
- void UnregisterChannel(VideoMediaChannel* channel);
- std::vector<VideoCodec> send_codecs() const override;
- std::vector<VideoCodec> recv_codecs() const override;
- void SetSendCodecs(const std::vector<VideoCodec>& codecs);
- void SetRecvCodecs(const std::vector<VideoCodec>& codecs);
- bool SetCapture(bool capture);
- std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions()
- const override;
- void SetRtpHeaderExtensions(
- std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions);
- private:
- std::vector<FakeVideoMediaChannel*> channels_;
- std::vector<VideoCodec> send_codecs_;
- std::vector<VideoCodec> recv_codecs_;
- bool capture_;
- VideoOptions options_;
- bool fail_create_channel_;
- std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions_;
- friend class FakeMediaEngine;
- };
- class FakeMediaEngine : public CompositeMediaEngine {
- public:
- FakeMediaEngine();
- ~FakeMediaEngine() override;
- void SetAudioCodecs(const std::vector<AudioCodec>& codecs);
- void SetAudioRecvCodecs(const std::vector<AudioCodec>& codecs);
- void SetAudioSendCodecs(const std::vector<AudioCodec>& codecs);
- void SetVideoCodecs(const std::vector<VideoCodec>& codecs);
- FakeVoiceMediaChannel* GetVoiceChannel(size_t index);
- FakeVideoMediaChannel* GetVideoChannel(size_t index);
- void set_fail_create_channel(bool fail);
- private:
- FakeVoiceEngine* const voice_;
- FakeVideoEngine* const video_;
- };
- // Have to come afterwards due to declaration order
- class FakeDataEngine : public DataEngineInterface {
- public:
- DataMediaChannel* CreateChannel(const MediaConfig& config) override;
- FakeDataMediaChannel* GetChannel(size_t index);
- void UnregisterChannel(DataMediaChannel* channel);
- void SetDataCodecs(const std::vector<DataCodec>& data_codecs);
- const std::vector<DataCodec>& data_codecs() override;
- private:
- std::vector<FakeDataMediaChannel*> channels_;
- std::vector<DataCodec> data_codecs_;
- };
- } // namespace cricket
- #endif // MEDIA_BASE_FAKE_MEDIA_ENGINE_H_
|