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