fake_webrtc_call.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*
  2. * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. // This file contains fake implementations, for use in unit tests, of the
  11. // following classes:
  12. //
  13. // webrtc::Call
  14. // webrtc::AudioSendStream
  15. // webrtc::AudioReceiveStream
  16. // webrtc::VideoSendStream
  17. // webrtc::VideoReceiveStream
  18. #ifndef MEDIA_ENGINE_FAKE_WEBRTC_CALL_H_
  19. #define MEDIA_ENGINE_FAKE_WEBRTC_CALL_H_
  20. #include <memory>
  21. #include <string>
  22. #include <vector>
  23. #include "api/video/video_frame.h"
  24. #include "call/audio_receive_stream.h"
  25. #include "call/audio_send_stream.h"
  26. #include "call/call.h"
  27. #include "call/flexfec_receive_stream.h"
  28. #include "call/test/mock_rtp_transport_controller_send.h"
  29. #include "call/video_receive_stream.h"
  30. #include "call/video_send_stream.h"
  31. #include "modules/rtp_rtcp/source/rtp_packet_received.h"
  32. #include "rtc_base/buffer.h"
  33. namespace cricket {
  34. class FakeAudioSendStream final : public webrtc::AudioSendStream {
  35. public:
  36. struct TelephoneEvent {
  37. int payload_type = -1;
  38. int payload_frequency = -1;
  39. int event_code = 0;
  40. int duration_ms = 0;
  41. };
  42. explicit FakeAudioSendStream(int id,
  43. const webrtc::AudioSendStream::Config& config);
  44. int id() const { return id_; }
  45. const webrtc::AudioSendStream::Config& GetConfig() const override;
  46. void SetStats(const webrtc::AudioSendStream::Stats& stats);
  47. TelephoneEvent GetLatestTelephoneEvent() const;
  48. bool IsSending() const { return sending_; }
  49. bool muted() const { return muted_; }
  50. private:
  51. // webrtc::AudioSendStream implementation.
  52. void Reconfigure(const webrtc::AudioSendStream::Config& config) override;
  53. void Start() override { sending_ = true; }
  54. void Stop() override { sending_ = false; }
  55. void SendAudioData(std::unique_ptr<webrtc::AudioFrame> audio_frame) override {
  56. }
  57. bool SendTelephoneEvent(int payload_type,
  58. int payload_frequency,
  59. int event,
  60. int duration_ms) override;
  61. void SetMuted(bool muted) override;
  62. webrtc::AudioSendStream::Stats GetStats() const override;
  63. webrtc::AudioSendStream::Stats GetStats(
  64. bool has_remote_tracks) const override;
  65. int id_ = -1;
  66. TelephoneEvent latest_telephone_event_;
  67. webrtc::AudioSendStream::Config config_;
  68. webrtc::AudioSendStream::Stats stats_;
  69. bool sending_ = false;
  70. bool muted_ = false;
  71. };
  72. class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream {
  73. public:
  74. explicit FakeAudioReceiveStream(
  75. int id,
  76. const webrtc::AudioReceiveStream::Config& config);
  77. int id() const { return id_; }
  78. const webrtc::AudioReceiveStream::Config& GetConfig() const;
  79. void SetStats(const webrtc::AudioReceiveStream::Stats& stats);
  80. int received_packets() const { return received_packets_; }
  81. bool VerifyLastPacket(const uint8_t* data, size_t length) const;
  82. const webrtc::AudioSinkInterface* sink() const { return sink_; }
  83. float gain() const { return gain_; }
  84. bool DeliverRtp(const uint8_t* packet, size_t length, int64_t packet_time_us);
  85. bool started() const { return started_; }
  86. int base_mininum_playout_delay_ms() const {
  87. return base_mininum_playout_delay_ms_;
  88. }
  89. private:
  90. // webrtc::AudioReceiveStream implementation.
  91. void Reconfigure(const webrtc::AudioReceiveStream::Config& config) override;
  92. void Start() override { started_ = true; }
  93. void Stop() override { started_ = false; }
  94. webrtc::AudioReceiveStream::Stats GetStats() const override;
  95. void SetSink(webrtc::AudioSinkInterface* sink) override;
  96. void SetGain(float gain) override;
  97. bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override {
  98. base_mininum_playout_delay_ms_ = delay_ms;
  99. return true;
  100. }
  101. int GetBaseMinimumPlayoutDelayMs() const override {
  102. return base_mininum_playout_delay_ms_;
  103. }
  104. std::vector<webrtc::RtpSource> GetSources() const override {
  105. return std::vector<webrtc::RtpSource>();
  106. }
  107. int id_ = -1;
  108. webrtc::AudioReceiveStream::Config config_;
  109. webrtc::AudioReceiveStream::Stats stats_;
  110. int received_packets_ = 0;
  111. webrtc::AudioSinkInterface* sink_ = nullptr;
  112. float gain_ = 1.0f;
  113. rtc::Buffer last_packet_;
  114. bool started_ = false;
  115. int base_mininum_playout_delay_ms_ = 0;
  116. };
  117. class FakeVideoSendStream final
  118. : public webrtc::VideoSendStream,
  119. public rtc::VideoSinkInterface<webrtc::VideoFrame> {
  120. public:
  121. FakeVideoSendStream(webrtc::VideoSendStream::Config config,
  122. webrtc::VideoEncoderConfig encoder_config);
  123. ~FakeVideoSendStream() override;
  124. const webrtc::VideoSendStream::Config& GetConfig() const;
  125. const webrtc::VideoEncoderConfig& GetEncoderConfig() const;
  126. const std::vector<webrtc::VideoStream>& GetVideoStreams() const;
  127. bool IsSending() const;
  128. bool GetVp8Settings(webrtc::VideoCodecVP8* settings) const;
  129. bool GetVp9Settings(webrtc::VideoCodecVP9* settings) const;
  130. bool GetH264Settings(webrtc::VideoCodecH264* settings) const;
  131. int GetNumberOfSwappedFrames() const;
  132. int GetLastWidth() const;
  133. int GetLastHeight() const;
  134. int64_t GetLastTimestamp() const;
  135. void SetStats(const webrtc::VideoSendStream::Stats& stats);
  136. int num_encoder_reconfigurations() const {
  137. return num_encoder_reconfigurations_;
  138. }
  139. bool resolution_scaling_enabled() const {
  140. return resolution_scaling_enabled_;
  141. }
  142. bool framerate_scaling_enabled() const { return framerate_scaling_enabled_; }
  143. void InjectVideoSinkWants(const rtc::VideoSinkWants& wants);
  144. rtc::VideoSourceInterface<webrtc::VideoFrame>* source() const {
  145. return source_;
  146. }
  147. private:
  148. // rtc::VideoSinkInterface<VideoFrame> implementation.
  149. void OnFrame(const webrtc::VideoFrame& frame) override;
  150. // webrtc::VideoSendStream implementation.
  151. void UpdateActiveSimulcastLayers(
  152. const std::vector<bool> active_layers) override;
  153. void Start() override;
  154. void Stop() override;
  155. void AddAdaptationResource(
  156. rtc::scoped_refptr<webrtc::Resource> resource) override;
  157. std::vector<rtc::scoped_refptr<webrtc::Resource>> GetAdaptationResources()
  158. override;
  159. void SetSource(
  160. rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
  161. const webrtc::DegradationPreference& degradation_preference) override;
  162. webrtc::VideoSendStream::Stats GetStats() override;
  163. void ReconfigureVideoEncoder(webrtc::VideoEncoderConfig config) override;
  164. bool sending_;
  165. webrtc::VideoSendStream::Config config_;
  166. webrtc::VideoEncoderConfig encoder_config_;
  167. std::vector<webrtc::VideoStream> video_streams_;
  168. rtc::VideoSinkWants sink_wants_;
  169. bool codec_settings_set_;
  170. union CodecSpecificSettings {
  171. webrtc::VideoCodecVP8 vp8;
  172. webrtc::VideoCodecVP9 vp9;
  173. webrtc::VideoCodecH264 h264;
  174. } codec_specific_settings_;
  175. bool resolution_scaling_enabled_;
  176. bool framerate_scaling_enabled_;
  177. rtc::VideoSourceInterface<webrtc::VideoFrame>* source_;
  178. int num_swapped_frames_;
  179. absl::optional<webrtc::VideoFrame> last_frame_;
  180. webrtc::VideoSendStream::Stats stats_;
  181. int num_encoder_reconfigurations_ = 0;
  182. };
  183. class FakeVideoReceiveStream final : public webrtc::VideoReceiveStream {
  184. public:
  185. explicit FakeVideoReceiveStream(webrtc::VideoReceiveStream::Config config);
  186. const webrtc::VideoReceiveStream::Config& GetConfig() const;
  187. bool IsReceiving() const;
  188. void InjectFrame(const webrtc::VideoFrame& frame);
  189. void SetStats(const webrtc::VideoReceiveStream::Stats& stats);
  190. void AddSecondarySink(webrtc::RtpPacketSinkInterface* sink) override;
  191. void RemoveSecondarySink(const webrtc::RtpPacketSinkInterface* sink) override;
  192. int GetNumAddedSecondarySinks() const;
  193. int GetNumRemovedSecondarySinks() const;
  194. std::vector<webrtc::RtpSource> GetSources() const override {
  195. return std::vector<webrtc::RtpSource>();
  196. }
  197. int base_mininum_playout_delay_ms() const {
  198. return base_mininum_playout_delay_ms_;
  199. }
  200. void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
  201. frame_decryptor) override {}
  202. void SetDepacketizerToDecoderFrameTransformer(
  203. rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
  204. override {}
  205. RecordingState SetAndGetRecordingState(RecordingState state,
  206. bool generate_key_frame) override {
  207. return RecordingState();
  208. }
  209. void GenerateKeyFrame() override {}
  210. private:
  211. // webrtc::VideoReceiveStream implementation.
  212. void Start() override;
  213. void Stop() override;
  214. webrtc::VideoReceiveStream::Stats GetStats() const override;
  215. bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override {
  216. base_mininum_playout_delay_ms_ = delay_ms;
  217. return true;
  218. }
  219. int GetBaseMinimumPlayoutDelayMs() const override {
  220. return base_mininum_playout_delay_ms_;
  221. }
  222. webrtc::VideoReceiveStream::Config config_;
  223. bool receiving_;
  224. webrtc::VideoReceiveStream::Stats stats_;
  225. int base_mininum_playout_delay_ms_ = 0;
  226. int num_added_secondary_sinks_;
  227. int num_removed_secondary_sinks_;
  228. };
  229. class FakeFlexfecReceiveStream final : public webrtc::FlexfecReceiveStream {
  230. public:
  231. explicit FakeFlexfecReceiveStream(
  232. const webrtc::FlexfecReceiveStream::Config& config);
  233. const webrtc::FlexfecReceiveStream::Config& GetConfig() const override;
  234. private:
  235. webrtc::FlexfecReceiveStream::Stats GetStats() const override;
  236. void OnRtpPacket(const webrtc::RtpPacketReceived& packet) override;
  237. webrtc::FlexfecReceiveStream::Config config_;
  238. };
  239. class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver {
  240. public:
  241. FakeCall();
  242. ~FakeCall() override;
  243. webrtc::MockRtpTransportControllerSend* GetMockTransportControllerSend() {
  244. return &transport_controller_send_;
  245. }
  246. const std::vector<FakeVideoSendStream*>& GetVideoSendStreams();
  247. const std::vector<FakeVideoReceiveStream*>& GetVideoReceiveStreams();
  248. const std::vector<FakeAudioSendStream*>& GetAudioSendStreams();
  249. const FakeAudioSendStream* GetAudioSendStream(uint32_t ssrc);
  250. const std::vector<FakeAudioReceiveStream*>& GetAudioReceiveStreams();
  251. const FakeAudioReceiveStream* GetAudioReceiveStream(uint32_t ssrc);
  252. const FakeVideoReceiveStream* GetVideoReceiveStream(uint32_t ssrc);
  253. const std::vector<FakeFlexfecReceiveStream*>& GetFlexfecReceiveStreams();
  254. rtc::SentPacket last_sent_packet() const { return last_sent_packet_; }
  255. // This is useful if we care about the last media packet (with id populated)
  256. // but not the last ICE packet (with -1 ID).
  257. int last_sent_nonnegative_packet_id() const {
  258. return last_sent_nonnegative_packet_id_;
  259. }
  260. webrtc::NetworkState GetNetworkState(webrtc::MediaType media) const;
  261. int GetNumCreatedSendStreams() const;
  262. int GetNumCreatedReceiveStreams() const;
  263. void SetStats(const webrtc::Call::Stats& stats);
  264. void SetClientBitratePreferences(
  265. const webrtc::BitrateSettings& preferences) override {}
  266. private:
  267. webrtc::AudioSendStream* CreateAudioSendStream(
  268. const webrtc::AudioSendStream::Config& config) override;
  269. void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override;
  270. webrtc::AudioReceiveStream* CreateAudioReceiveStream(
  271. const webrtc::AudioReceiveStream::Config& config) override;
  272. void DestroyAudioReceiveStream(
  273. webrtc::AudioReceiveStream* receive_stream) override;
  274. webrtc::VideoSendStream* CreateVideoSendStream(
  275. webrtc::VideoSendStream::Config config,
  276. webrtc::VideoEncoderConfig encoder_config) override;
  277. void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override;
  278. webrtc::VideoReceiveStream* CreateVideoReceiveStream(
  279. webrtc::VideoReceiveStream::Config config) override;
  280. void DestroyVideoReceiveStream(
  281. webrtc::VideoReceiveStream* receive_stream) override;
  282. webrtc::FlexfecReceiveStream* CreateFlexfecReceiveStream(
  283. const webrtc::FlexfecReceiveStream::Config& config) override;
  284. void DestroyFlexfecReceiveStream(
  285. webrtc::FlexfecReceiveStream* receive_stream) override;
  286. void AddAdaptationResource(
  287. rtc::scoped_refptr<webrtc::Resource> resource) override;
  288. webrtc::PacketReceiver* Receiver() override;
  289. DeliveryStatus DeliverPacket(webrtc::MediaType media_type,
  290. rtc::CopyOnWriteBuffer packet,
  291. int64_t packet_time_us) override;
  292. webrtc::RtpTransportControllerSendInterface* GetTransportControllerSend()
  293. override {
  294. return &transport_controller_send_;
  295. }
  296. webrtc::Call::Stats GetStats() const override;
  297. void SignalChannelNetworkState(webrtc::MediaType media,
  298. webrtc::NetworkState state) override;
  299. void OnAudioTransportOverheadChanged(
  300. int transport_overhead_per_packet) override;
  301. void OnSentPacket(const rtc::SentPacket& sent_packet) override;
  302. ::testing::NiceMock<webrtc::MockRtpTransportControllerSend>
  303. transport_controller_send_;
  304. webrtc::NetworkState audio_network_state_;
  305. webrtc::NetworkState video_network_state_;
  306. rtc::SentPacket last_sent_packet_;
  307. int last_sent_nonnegative_packet_id_ = -1;
  308. int next_stream_id_ = 665;
  309. webrtc::Call::Stats stats_;
  310. std::vector<FakeVideoSendStream*> video_send_streams_;
  311. std::vector<FakeAudioSendStream*> audio_send_streams_;
  312. std::vector<FakeVideoReceiveStream*> video_receive_streams_;
  313. std::vector<FakeAudioReceiveStream*> audio_receive_streams_;
  314. std::vector<FakeFlexfecReceiveStream*> flexfec_receive_streams_;
  315. int num_created_send_streams_;
  316. int num_created_receive_streams_;
  317. };
  318. } // namespace cricket
  319. #endif // MEDIA_ENGINE_FAKE_WEBRTC_CALL_H_