1 /* 2 * Copyright (c) 2010 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 11 #ifndef MEDIA_ENGINE_FAKE_WEBRTC_VIDEO_ENGINE_H_ 12 #define MEDIA_ENGINE_FAKE_WEBRTC_VIDEO_ENGINE_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include <memory> 18 #include <string> 19 #include <vector> 20 21 #include "api/fec_controller_override.h" 22 #include "api/video/encoded_image.h" 23 #include "api/video/video_bitrate_allocation.h" 24 #include "api/video/video_frame.h" 25 #include "api/video_codecs/sdp_video_format.h" 26 #include "api/video_codecs/video_codec.h" 27 #include "api/video_codecs/video_decoder.h" 28 #include "api/video_codecs/video_decoder_factory.h" 29 #include "api/video_codecs/video_encoder.h" 30 #include "api/video_codecs/video_encoder_factory.h" 31 #include "modules/video_coding/include/video_codec_interface.h" 32 #include "rtc_base/event.h" 33 #include "rtc_base/synchronization/mutex.h" 34 #include "rtc_base/thread_annotations.h" 35 36 namespace cricket { 37 38 class FakeWebRtcVideoDecoderFactory; 39 class FakeWebRtcVideoEncoderFactory; 40 41 // Fake class for mocking out webrtc::VideoDecoder 42 class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder { 43 public: 44 explicit FakeWebRtcVideoDecoder(FakeWebRtcVideoDecoderFactory* factory); 45 ~FakeWebRtcVideoDecoder(); 46 47 bool Configure(const Settings& settings) override; 48 int32_t Decode(const webrtc::EncodedImage&, bool, int64_t) override; 49 int32_t RegisterDecodeCompleteCallback( 50 webrtc::DecodedImageCallback*) override; 51 int32_t Release() override; 52 53 int GetNumFramesReceived() const; 54 55 private: 56 int num_frames_received_; 57 FakeWebRtcVideoDecoderFactory* factory_; 58 }; 59 60 // Fake class for mocking out webrtc::VideoDecoderFactory. 61 class FakeWebRtcVideoDecoderFactory : public webrtc::VideoDecoderFactory { 62 public: 63 FakeWebRtcVideoDecoderFactory(); 64 65 std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override; 66 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( 67 const webrtc::SdpVideoFormat& format) override; 68 69 void DecoderDestroyed(FakeWebRtcVideoDecoder* decoder); 70 void AddSupportedVideoCodecType(const std::string& name); 71 int GetNumCreatedDecoders(); 72 const std::vector<FakeWebRtcVideoDecoder*>& decoders(); 73 74 private: 75 std::vector<webrtc::SdpVideoFormat> supported_codec_formats_; 76 std::vector<FakeWebRtcVideoDecoder*> decoders_; 77 int num_created_decoders_; 78 }; 79 80 // Fake class for mocking out webrtc::VideoEnoder 81 class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { 82 public: 83 explicit FakeWebRtcVideoEncoder(FakeWebRtcVideoEncoderFactory* factory); 84 ~FakeWebRtcVideoEncoder(); 85 86 void SetFecControllerOverride( 87 webrtc::FecControllerOverride* fec_controller_override) override; 88 int32_t InitEncode(const webrtc::VideoCodec* codecSettings, 89 const VideoEncoder::Settings& settings) override; 90 int32_t Encode( 91 const webrtc::VideoFrame& inputImage, 92 const std::vector<webrtc::VideoFrameType>* frame_types) override; 93 int32_t RegisterEncodeCompleteCallback( 94 webrtc::EncodedImageCallback* callback) override; 95 int32_t Release() override; 96 void SetRates(const RateControlParameters& parameters) override; 97 webrtc::VideoEncoder::EncoderInfo GetEncoderInfo() const override; 98 99 bool WaitForInitEncode(); 100 webrtc::VideoCodec GetCodecSettings(); 101 int GetNumEncodedFrames(); 102 103 private: 104 webrtc::Mutex mutex_; 105 rtc::Event init_encode_event_; 106 int num_frames_encoded_ RTC_GUARDED_BY(mutex_); 107 webrtc::VideoCodec codec_settings_ RTC_GUARDED_BY(mutex_); 108 FakeWebRtcVideoEncoderFactory* factory_; 109 }; 110 111 // Fake class for mocking out webrtc::VideoEncoderFactory. 112 class FakeWebRtcVideoEncoderFactory : public webrtc::VideoEncoderFactory { 113 public: 114 FakeWebRtcVideoEncoderFactory(); 115 116 std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override; 117 std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder( 118 const webrtc::SdpVideoFormat& format) override; 119 120 bool WaitForCreatedVideoEncoders(int num_encoders); 121 void EncoderDestroyed(FakeWebRtcVideoEncoder* encoder); 122 void set_encoders_have_internal_sources(bool internal_source); 123 void AddSupportedVideoCodec(const webrtc::SdpVideoFormat& format); 124 void AddSupportedVideoCodecType(const std::string& name); 125 int GetNumCreatedEncoders(); 126 const std::vector<FakeWebRtcVideoEncoder*> encoders(); 127 128 private: 129 webrtc::Mutex mutex_; 130 rtc::Event created_video_encoder_event_; 131 std::vector<webrtc::SdpVideoFormat> formats_; 132 std::vector<FakeWebRtcVideoEncoder*> encoders_ RTC_GUARDED_BY(mutex_); 133 int num_created_encoders_ RTC_GUARDED_BY(mutex_); 134 bool vp8_factory_mode_; 135 }; 136 137 } // namespace cricket 138 139 #endif // MEDIA_ENGINE_FAKE_WEBRTC_VIDEO_ENGINE_H_ 140