128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Copyright 2010 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#ifndef TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_ 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_ 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <map> 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <set> 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <vector> 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/codec.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/fakewebrtccommon.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideodecoderfactory.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideoencoderfactory.h" 39a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/basictypes.h" 407fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org#include "webrtc/base/criticalsection.h" 41a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 42a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/stringutils.h" 437fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org#include "webrtc/base/thread_annotations.h" 442557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_error_codes.h" 45300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_decoder.h" 46300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_encoder.h" 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kMinVideoBitrate = 100; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kStartVideoBitrate = 300; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kMaxVideoBitrate = 1000; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// WebRtc channel id and capture id share the same number space. 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This is how AddRenderer(renderId, ...) is able to tell if it is adding a 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// renderer for a channel or it is adding a renderer for a capturer. 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kViEChannelIdBase = 0; 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic const int kViEChannelIdMax = 1000; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Fake class for mocking out webrtc::VideoDecoder 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeWebRtcVideoDecoder : public webrtc::VideoDecoder { 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeWebRtcVideoDecoder() 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : num_frames_received_(0) { 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 670c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t InitDecode(const webrtc::VideoCodec*, int32_t) { 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 710c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t Decode(const webrtc::EncodedImage&, 720c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström bool, 730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const webrtc::RTPFragmentationHeader*, 740c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const webrtc::CodecSpecificInfo*, 750c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström int64_t) { 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org num_frames_received_++; 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 800c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t RegisterDecodeCompleteCallback( 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::DecodedImageCallback*) { 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 850c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t Release() { return WEBRTC_VIDEO_CODEC_OK; } 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 870c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t Reset() { return WEBRTC_VIDEO_CODEC_OK; } 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int GetNumFramesReceived() const { 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return num_frames_received_; 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int num_frames_received_; 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Fake class for mocking out WebRtcVideoDecoderFactory. 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory { 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeWebRtcVideoDecoderFactory() 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : num_created_decoders_(0) { 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual webrtc::VideoDecoder* CreateVideoDecoder( 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::VideoCodecType type) { 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (supported_codec_types_.count(type) == 0) { 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder(); 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org decoders_.push_back(decoder); 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org num_created_decoders_++; 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return decoder; 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) { 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org decoders_.erase( 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::remove(decoders_.begin(), decoders_.end(), decoder), 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org decoders_.end()); 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete decoder; 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddSupportedVideoCodecType(webrtc::VideoCodecType type) { 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org supported_codec_types_.insert(type); 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int GetNumCreatedDecoders() { 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return num_created_decoders_; 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::vector<FakeWebRtcVideoDecoder*>& decoders() { 13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return decoders_; 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::set<webrtc::VideoCodecType> supported_codec_types_; 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<FakeWebRtcVideoDecoder*> decoders_; 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int num_created_decoders_; 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Fake class for mocking out webrtc::VideoEnoder 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 1437fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org FakeWebRtcVideoEncoder() : num_frames_encoded_(0) {} 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1450c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings, 1460c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström int32_t numberOfCores, 1470c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström size_t maxPayloadSize) { 148f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org rtc::CritScope lock(&crit_); 149f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org codec_settings_ = *codecSettings; 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 153f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org webrtc::VideoCodec GetCodecSettings() { 154f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org rtc::CritScope lock(&crit_); 155f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org return codec_settings_; 156f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org } 157f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org 15822993e1a0c114122fc1b9de0fc74d4096ec868bdpbos virtual int32_t Encode(const webrtc::VideoFrame& inputImage, 15922993e1a0c114122fc1b9de0fc74d4096ec868bdpbos const webrtc::CodecSpecificInfo* codecSpecificInfo, 16022993e1a0c114122fc1b9de0fc74d4096ec868bdpbos const std::vector<webrtc::FrameType>* frame_types) { 1617fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org rtc::CritScope lock(&crit_); 1627fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org ++num_frames_encoded_; 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1660c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t RegisterEncodeCompleteCallback( 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::EncodedImageCallback* callback) { 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1710c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t Release() { return WEBRTC_VIDEO_CODEC_OK; } 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) { 17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1770c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) { 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return WEBRTC_VIDEO_CODEC_OK; 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 1807fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org 1817fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org int GetNumEncodedFrames() { 1827fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org rtc::CritScope lock(&crit_); 1837fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org return num_frames_encoded_; 1847fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org } 1857fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org 1867fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org private: 1877fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org rtc::CriticalSection crit_; 1887fe1e03dd6da66401010119734245f114bf06645pbos@webrtc.org int num_frames_encoded_ GUARDED_BY(crit_); 189f18fba2f7b3d1fad7b7b38a9a5dc281bef06c50epbos@webrtc.org webrtc::VideoCodec codec_settings_ GUARDED_BY(crit_); 19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Fake class for mocking out WebRtcVideoEncoderFactory. 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory { 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeWebRtcVideoEncoderFactory() 19652cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org : num_created_encoders_(0), encoders_have_internal_sources_(false) {} 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual webrtc::VideoEncoder* CreateVideoEncoder( 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::VideoCodecType type) { 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (supported_codec_types_.count(type) == 0) { 20128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder(); 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org encoders_.push_back(encoder); 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org num_created_encoders_++; 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return encoder; 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) { 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org encoders_.erase( 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::remove(encoders_.begin(), encoders_.end(), encoder), 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org encoders_.end()); 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete encoder; 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual const std::vector<WebRtcVideoEncoderFactory::VideoCodec>& codecs() 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const { 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return codecs_; 21928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22152cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org virtual bool EncoderTypeHasInternalSource( 22252cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org webrtc::VideoCodecType type) const override { 22352cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org return encoders_have_internal_sources_; 22452cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org } 22552cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org 22652cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org void set_encoders_have_internal_sources(bool internal_source) { 22752cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org encoders_have_internal_sources_ = internal_source; 22852cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org } 22952cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void AddSupportedVideoCodecType(webrtc::VideoCodecType type, 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 23228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org supported_codec_types_.insert(type); 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org codecs_.push_back( 23428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org WebRtcVideoEncoderFactory::VideoCodec(type, name, 1280, 720, 30)); 23528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 23628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 237b884eb611803b4720e55bdd8b51602edf7061061wu@webrtc.org int GetNumCreatedEncoders() { 238b884eb611803b4720e55bdd8b51602edf7061061wu@webrtc.org return num_created_encoders_; 239b884eb611803b4720e55bdd8b51602edf7061061wu@webrtc.org } 240b884eb611803b4720e55bdd8b51602edf7061061wu@webrtc.org 24128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::vector<FakeWebRtcVideoEncoder*>& encoders() { 24228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return encoders_; 24328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 24428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 24628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::set<webrtc::VideoCodecType> supported_codec_types_; 24728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<WebRtcVideoEncoderFactory::VideoCodec> codecs_; 24828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<FakeWebRtcVideoEncoder*> encoders_; 24928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int num_created_encoders_; 25052cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org bool encoders_have_internal_sources_; 25152cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org}; 25252cd828e1731266272e671020c353f5f89992a83pthatcher@webrtc.org 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 25528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#endif // TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_ 256