10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2010 Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map>
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <set>
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/base/basictypes.h"
36cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org#include "talk/base/gunit.h"
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/base/stringutils.h"
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/codec.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/fakewebrtccommon.h"
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideodecoderfactory.h"
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideoencoderfactory.h"
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvie.h"
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define WEBRTC_CHECK_CAPTURER(capturer) \
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (capturers_.find(capturer) == capturers_.end()) return -1;
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define WEBRTC_ASSERT_CAPTURER(capturer) \
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(capturers_.find(capturer) != capturers_.end());
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kMinVideoBitrate = 100;
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kStartVideoBitrate = 300;
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kMaxVideoBitrate = 1000;
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// WebRtc channel id and capture id share the same number space.
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This is how AddRenderer(renderId, ...) is able to tell if it is adding a
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// renderer for a channel or it is adding a renderer for a capturer.
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kViEChannelIdBase = 0;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kViEChannelIdMax = 1000;
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kViECaptureIdBase = 10000;  // Make sure there is a gap.
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kViECaptureIdMax = 11000;
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake class for mocking out webrtc::VideoDecoder
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVideoDecoder : public webrtc::VideoDecoder {
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVideoDecoder()
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : num_frames_received_(0) {
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 InitDecode(const webrtc::VideoCodec*, int32) {
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 Decode(
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const webrtc::EncodedImage&, bool, const webrtc::RTPFragmentationHeader*,
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const webrtc::CodecSpecificInfo*, int64) {
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    num_frames_received_++;
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 RegisterDecodeCompleteCallback(
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::DecodedImageCallback*) {
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 Release() {
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 Reset() {
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumFramesReceived() const {
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return num_frames_received_;
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_frames_received_;
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake class for mocking out WebRtcVideoDecoderFactory.
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory {
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVideoDecoderFactory()
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : num_created_decoders_(0) {
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual webrtc::VideoDecoder* CreateVideoDecoder(
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::VideoCodecType type) {
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (supported_codec_types_.count(type) == 0) {
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder();
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    decoders_.push_back(decoder);
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    num_created_decoders_++;
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return decoder;
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) {
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    decoders_.erase(
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        std::remove(decoders_.begin(), decoders_.end(), decoder),
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        decoders_.end());
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete decoder;
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddSupportedVideoCodecType(webrtc::VideoCodecType type) {
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    supported_codec_types_.insert(type);
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumCreatedDecoders() {
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return num_created_decoders_;
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<FakeWebRtcVideoDecoder*>& decoders() {
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return decoders_;
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::set<webrtc::VideoCodecType> supported_codec_types_;
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<FakeWebRtcVideoDecoder*> decoders_;
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_created_decoders_;
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake class for mocking out webrtc::VideoEnoder
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVideoEncoder : public webrtc::VideoEncoder {
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVideoEncoder() {}
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 InitEncode(const webrtc::VideoCodec* codecSettings,
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           int32 numberOfCores,
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           uint32 maxPayloadSize) {
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 Encode(
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const webrtc::I420VideoFrame& inputImage,
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            const webrtc::CodecSpecificInfo* codecSpecificInfo,
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            const std::vector<webrtc::VideoFrameType>* frame_types) {
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 RegisterEncodeCompleteCallback(
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::EncodedImageCallback* callback) {
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 Release() {
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 SetChannelParameters(uint32 packetLoss,
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     int rtt) {
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int32 SetRates(uint32 newBitRate,
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         uint32 frameRate) {
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return WEBRTC_VIDEO_CODEC_OK;
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Fake class for mocking out WebRtcVideoEncoderFactory.
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory {
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVideoEncoderFactory()
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : num_created_encoders_(0) {
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual webrtc::VideoEncoder* CreateVideoEncoder(
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::VideoCodecType type) {
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (supported_codec_types_.count(type) == 0) {
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder();
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    encoders_.push_back(encoder);
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    num_created_encoders_++;
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return encoder;
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) {
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    encoders_.erase(
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        std::remove(encoders_.begin(), encoders_.end(), encoder),
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        encoders_.end());
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete encoder;
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddObserver(WebRtcVideoEncoderFactory::Observer* observer) {
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool inserted = observers_.insert(observer).second;
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(inserted);
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void RemoveObserver(WebRtcVideoEncoderFactory::Observer* observer) {
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    size_t erased = observers_.erase(observer);
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(erased, 1UL);
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual const std::vector<WebRtcVideoEncoderFactory::VideoCodec>& codecs()
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const {
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return codecs_;
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddSupportedVideoCodecType(webrtc::VideoCodecType type,
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  const std::string& name) {
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    supported_codec_types_.insert(type);
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codecs_.push_back(
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        WebRtcVideoEncoderFactory::VideoCodec(type, name, 1280, 720, 30));
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void NotifyCodecsAvailable() {
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::set<WebRtcVideoEncoderFactory::Observer*>::iterator it;
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (it = observers_.begin(); it != observers_.end(); ++it)
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (*it)->OnCodecsAvailable();
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
23792ad4370e12c1017bcc1137e738d81957a2d038ewu@webrtc.org  int GetNumCreatedEncoders() {
23892ad4370e12c1017bcc1137e738d81957a2d038ewu@webrtc.org    return num_created_encoders_;
23992ad4370e12c1017bcc1137e738d81957a2d038ewu@webrtc.org  }
24092ad4370e12c1017bcc1137e738d81957a2d038ewu@webrtc.org
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::vector<FakeWebRtcVideoEncoder*>& encoders() {
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return encoders_;
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::set<webrtc::VideoCodecType> supported_codec_types_;
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<WebRtcVideoEncoderFactory::VideoCodec> codecs_;
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<FakeWebRtcVideoEncoder*> encoders_;
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::set<WebRtcVideoEncoderFactory::Observer*> observers_;
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_created_encoders_;
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVideoEngine
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public webrtc::ViEBase,
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViECodec,
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViECapture,
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViENetwork,
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViERender,
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViERTP_RTCP,
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViEImageProcess,
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::ViEExternalCodec {
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct Channel {
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Channel()
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : capture_id_(-1),
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          original_channel_id_(-1),
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          has_renderer_(false),
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          render_started_(false),
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send(false),
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          receive_(false),
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          can_transmit_(true),
27297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org          remote_rtx_ssrc_(-1),
27397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org          rtx_send_payload_type(-1),
2746049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org          rtx_recv_payload_type(-1),
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          rtcp_status_(webrtc::kRtcpNone),
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          key_frame_request_method_(webrtc::kViEKeyFrameRequestNone),
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          tmmbr_(false),
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          remb_contribute_(false),
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          remb_bw_partition_(false),
2802ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          rtp_offset_send_id_(-1),
2812ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          rtp_offset_receive_id_(-1),
2822ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          rtp_absolute_send_time_send_id_(-1),
2832ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          rtp_absolute_send_time_receive_id_(-1),
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          sender_target_delay_(0),
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          receiver_target_delay_(0),
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          transmission_smoothing_(false),
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          nack_(false),
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          hybrid_nack_fec_(false),
2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_video_bitrate_(0),
2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_fec_bitrate_(0),
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_nack_bitrate_(0),
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_bandwidth_(0),
293bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org          receive_bandwidth_(0),
294afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org          reserved_transmit_bitrate_bps_(0),
295bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org          suspend_below_min_bitrate_(false),
2966049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org          overuse_observer_(NULL),
2976049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org          last_recvd_payload_type_(-1) {
2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ssrcs_[0] = 0;  // default ssrc.
2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      memset(&send_codec, 0, sizeof(send_codec));
3003865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org      memset(&overuse_options_, 0, sizeof(overuse_options_));
3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int capture_id_;
3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int original_channel_id_;
3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool has_renderer_;
3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool render_started_;
3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool send;
3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool receive_;
3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool can_transmit_;
3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, int> ssrcs_;
31097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    std::map<int, int> rtx_ssrcs_;
31197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    int remote_rtx_ssrc_;
31297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    int rtx_send_payload_type;
3136049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    int rtx_recv_payload_type;
3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string cname_;
3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::ViERTCPMode rtcp_status_;
3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::ViEKeyFrameRequestMethod key_frame_request_method_;
3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool tmmbr_;
3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool remb_contribute_;   // This channel contributes to the remb report.
3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool remb_bw_partition_; // This channel is allocated part of total bw.
3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int rtp_offset_send_id_;
3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int rtp_offset_receive_id_;
3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int rtp_absolute_send_time_send_id_;
3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int rtp_absolute_send_time_receive_id_;
3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int sender_target_delay_;
3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int receiver_target_delay_;
3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool transmission_smoothing_;
3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool nack_;
3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool hybrid_nack_fec_;
3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::vector<webrtc::VideoCodec> recv_codecs;
3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::set<unsigned int> ext_decoder_pl_types_;
3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::set<unsigned int> ext_encoder_pl_types_;
3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::VideoCodec send_codec;
3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    unsigned int send_video_bitrate_;
3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    unsigned int send_fec_bitrate_;
3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    unsigned int send_nack_bitrate_;
3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    unsigned int send_bandwidth_;
3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    unsigned int receive_bandwidth_;
338afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    unsigned int reserved_transmit_bitrate_bps_;
339bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    bool suspend_below_min_bitrate_;
340bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    webrtc::CpuOveruseObserver* overuse_observer_;
3413865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    webrtc::CpuOveruseOptions overuse_options_;
3426049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    int last_recvd_payload_type_;
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  class Capturer : public webrtc::ViEExternalCapture {
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   public:
34640ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    Capturer() : channel_id_(-1), denoising_(false),
34740ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org                 last_capture_time_(0), incoming_frame_num_(0) { }
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int channel_id() const { return channel_id_; }
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void set_channel_id(int channel_id) { channel_id_ = channel_id; }
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool denoising() const { return denoising_; }
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void set_denoising(bool denoising) { denoising_ = denoising; }
35240ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    int64 last_capture_time() const { return last_capture_time_; }
35340ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    int incoming_frame_num() const { return incoming_frame_num_; }
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // From ViEExternalCapture
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    virtual int IncomingFrame(unsigned char* videoFrame,
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              unsigned int videoFrameLength,
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              unsigned short width,
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              unsigned short height,
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              webrtc::RawVideoType videoType,
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              unsigned long long captureTime) {
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    virtual int IncomingFrameI420(
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        const webrtc::ViEVideoFrameI420& video_frame,
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        unsigned long long captureTime) {
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      last_capture_time_ = captureTime;
36840ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org      ++incoming_frame_num_;
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org   private:
3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int channel_id_;
3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool denoising_;
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int64 last_capture_time_;
37640ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    int incoming_frame_num_;
3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVideoEngine(const cricket::VideoCodec* const* codecs,
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        int num_codecs)
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : inited_(false),
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        last_channel_(kViEChannelIdBase - 1),
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_create_channel_(false),
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        last_capturer_(kViECaptureIdBase - 1),
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_alloc_capturer_(false),
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        codecs_(codecs),
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        num_codecs_(num_codecs),
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        num_set_send_codecs_(0) {
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~FakeWebRtcVideoEngine() {
3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT(0 == channels_.size());
3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT(0 == capturers_.size());
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsInited() const { return inited_; }
3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetLastChannel() const { return last_channel_; }
3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetChannelFromLocalSsrc(int local_ssrc) const {
3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // ssrcs_[0] is the default local ssrc.
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::map<int, Channel*>::const_iterator iter = channels_.begin();
4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         iter != channels_.end(); ++iter) {
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (local_ssrc == iter->second->ssrcs_[0]) {
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return iter->first;
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4091a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org  int GetNumChannels() const { return static_cast<int>(channels_.size()); }
4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsChannel(int channel) const {
4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_.find(channel) != channels_.end());
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_create_channel(bool fail_create_channel) {
4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    fail_create_channel_ = fail_create_channel;
4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetLastCapturer() const { return last_capturer_; }
4181a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org  int GetNumCapturers() const { return static_cast<int>(capturers_.size()); }
41940ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org  int GetIncomingFrameNum(int channel_id) const {
42040ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    for (std::map<int, Capturer*>::const_iterator iter = capturers_.begin();
42140ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org         iter != capturers_.end(); ++iter) {
42240ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org      Capturer* capturer = iter->second;
42340ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org      if (capturer->channel_id() == channel_id) {
42440ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org        return capturer->incoming_frame_num();
42540ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org      }
42640ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    }
42740ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    return -1;
42840ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org  }
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_alloc_capturer(bool fail_alloc_capturer) {
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    fail_alloc_capturer_ = fail_alloc_capturer;
4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
432a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  int GetNumSetSendCodecs() const { return num_set_send_codecs_; }
4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetCaptureId(int channel) const {
4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->capture_id_;
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetOriginalChannelId(int channel) const {
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->original_channel_id_;
4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetHasRenderer(int channel) const {
4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->has_renderer_;
4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetRenderStarted(int channel) const {
4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->render_started_;
4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetSend(int channel) const {
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->send;
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4548a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  bool GetReceive(int channel) const {
4558a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4568a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org    return channels_.find(channel)->second->receive_;
4578a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  }
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetCaptureChannelId(int capture_id) const {
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CAPTURER(capture_id);
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return capturers_.find(capture_id)->second->channel_id();
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetCaptureDenoising(int capture_id) const {
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CAPTURER(capture_id);
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return capturers_.find(capture_id)->second->denoising();
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int64 GetCaptureLastTimestamp(int capture_id) const {
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CAPTURER(capture_id);
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return capturers_.find(capture_id)->second->last_capture_time();
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::ViERTCPMode GetRtcpStatus(int channel) const {
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->rtcp_status_;
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::ViEKeyFrameRequestMethod GetKeyFrameRequestMethod(int channel) const {
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->key_frame_request_method_;
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetTmmbrStatus(int channel) const {
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->tmmbr_;
4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetRembStatusBwPartition(int channel) const {
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->remb_bw_partition_;
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetRembStatusContribute(int channel) const {
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->remb_contribute_;
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4902ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  int GetSendRtpExtensionId(int channel, const std::string& extension) {
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4922ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    if (extension == kRtpTimestampOffsetHeaderExtension) {
4932ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_.find(channel)->second->rtp_offset_send_id_;
4942ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
4952ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_.find(channel)->second->rtp_absolute_send_time_send_id_;
4962ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    }
4972ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return -1;
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4992ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  int GetReceiveRtpExtensionId(int channel, const std::string& extension) {
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5012ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    if (extension == kRtpTimestampOffsetHeaderExtension) {
5022ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_.find(channel)->second->rtp_offset_receive_id_;
5032ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
5042ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return
5052ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          channels_.find(channel)->second->rtp_absolute_send_time_receive_id_;
5062ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    }
5072ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return -1;
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetTransmissionSmoothingStatus(int channel) {
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->transmission_smoothing_;
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetSenderTargetDelay(int channel) {
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->sender_target_delay_;
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetReceiverTargetDelay(int channel) {
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->receiver_target_delay_;
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetNackStatus(int channel) const {
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->nack_;
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetHybridNackFecStatus(int channel) const {
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->hybrid_nack_fec_;
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumSsrcs(int channel) const {
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5311a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return static_cast<int>(
5321a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org        channels_.find(channel)->second->ssrcs_.size());
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
53497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  int GetNumRtxSsrcs(int channel) const {
53597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_ASSERT_CHANNEL(channel);
53697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return static_cast<int>(
53797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        channels_.find(channel)->second->rtx_ssrcs_.size());
53897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetIsTransmitting(int channel) const {
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->can_transmit_;
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
543bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  webrtc::CpuOveruseObserver* GetCpuOveruseObserver(int channel) const {
544bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
545bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    return channels_.find(channel)->second->overuse_observer_;
546bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  }
5473865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org  webrtc::CpuOveruseOptions GetCpuOveruseOptions(int channel) const {
5483865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5493865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    return channels_.find(channel)->second->overuse_options_;
5503865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org  }
55197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  int GetRtxSsrc(int channel, int simulcast_idx) const {
55297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_ASSERT_CHANNEL(channel);
55397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    if (channels_.find(channel)->second->rtx_ssrcs_.find(simulcast_idx) ==
55497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        channels_.find(channel)->second->rtx_ssrcs_.end()) {
55597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      return -1;
55697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    }
55797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return channels_.find(channel)->second->rtx_ssrcs_[simulcast_idx];
55897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ReceiveCodecRegistered(int channel,
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              const webrtc::VideoCodec& codec) const {
5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5626049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    const std::vector<webrtc::VideoCodec>& codecs =
5636049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org      channels_.find(channel)->second->recv_codecs;
5646049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    return std::find(codecs.begin(), codecs.end(), codec) != codecs.end();
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ExternalDecoderRegistered(int channel,
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 unsigned int pl_type) const {
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ext_decoder_pl_types_.count(pl_type) != 0;
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumExternalDecoderRegistered(int channel) const {
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5741a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return static_cast<int>(
5751a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org        channels_.find(channel)->second->ext_decoder_pl_types_.size());
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ExternalEncoderRegistered(int channel,
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 unsigned int pl_type) const {
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_.find(channel)->second->
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ext_encoder_pl_types_.count(pl_type) != 0;
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumExternalEncoderRegistered(int channel) const {
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5851a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org    return static_cast<int>(
5861a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org        channels_.find(channel)->second->ext_encoder_pl_types_.size());
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetTotalNumExternalEncoderRegistered() const {
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, Channel*>::const_iterator it;
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int total_num_registered = 0;
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (it = channels_.begin(); it != channels_.end(); ++it)
5921a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org      total_num_registered +=
5931a04b881e0ef480802fb01b4fbe9bcd5388d2c69henrike@webrtc.org          static_cast<int>(it->second->ext_encoder_pl_types_.size());
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return total_num_registered;
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetSendBitrates(int channel, unsigned int video_bitrate,
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       unsigned int fec_bitrate, unsigned int nack_bitrate) {
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_video_bitrate_ = video_bitrate;
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_fec_bitrate_ = fec_bitrate;
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_nack_bitrate_ = nack_bitrate;
6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetSendBandwidthEstimate(int channel, unsigned int send_bandwidth) {
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
605e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    channels_[GetOriginalChannelId(channel)]->send_bandwidth_ = send_bandwidth;
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetReceiveBandwidthEstimate(int channel,
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   unsigned int receive_bandwidth) {
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
610e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    channels_[GetOriginalChannelId(channel)]->receive_bandwidth_ =
611e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org        receive_bandwidth;
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
61397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  int GetRtxSendPayloadType(int channel) {
61497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_CHECK_CHANNEL(channel);
61597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return channels_[channel]->rtx_send_payload_type;
61697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
6176049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  int GetRtxRecvPayloadType(int channel) {
6186049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6196049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    return channels_[channel]->rtx_recv_payload_type;
6206049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  }
62197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  int GetRemoteRtxSsrc(int channel) {
62297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_CHECK_CHANNEL(channel);
62397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return channels_.find(channel)->second->remote_rtx_ssrc_;
62497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
625bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  bool GetSuspendBelowMinBitrateStatus(int channel) {
626bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
627bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    return channels_.find(channel)->second->suspend_below_min_bitrate_;
628bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  }
6296049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  int GetLastRecvdPayloadType(int channel) const {
6306049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6316049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    return channels_.find(channel)->second->last_recvd_payload_type_;
6326049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  }
633afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  unsigned int GetReservedTransmitBitrate(int channel) {
634afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
635afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return channels_.find(channel)->second->reserved_transmit_bitrate_bps_;
636afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(Release, ());
6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViEBase
6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(Init, ()) {
6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    inited_ = true;
6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetVoiceEngine, (webrtc::VoiceEngine*));
6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(CreateChannel, (int& channel)) {  // NOLINT
6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_create_channel_) {
6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kViEChannelIdMax == last_channel_) {
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Channel* ch = new Channel();
654e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    ++last_channel_;
655e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    // The original channel of the first channel in a group refers to itself
656e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    // for code simplicity.
657e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    ch->original_channel_id_ = last_channel_;
658e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org    channels_[last_channel_] = ch;
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel = last_channel_;
6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(CreateChannel, (int& channel, int original_channel)) {
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(original_channel);
6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (CreateChannel(channel) != 0) {
6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->original_channel_id_ = original_channel;
6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(CreateReceiveChannel, (int& channel, int original_channel)) {
6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return CreateChannel(channel, original_channel);
6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeleteChannel, (const int channel)) {
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Make sure we deregister all the decoders before deleting a channel.
6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(0, GetNumExternalDecoderRegistered(channel));
6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channels_[channel];
6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.erase(channel);
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
681bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  WEBRTC_FUNC(RegisterCpuOveruseObserver,
682bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org      (int channel, webrtc::CpuOveruseObserver* observer)) {
683bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
684bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    channels_[channel]->overuse_observer_ = observer;
685bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    return 0;
686bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  }
687cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  WEBRTC_STUB(CpuOveruseMeasures, (int, int*, int*, int*, int*));
6883865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org  WEBRTC_FUNC(SetCpuOveruseOptions,
6893865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org      (int channel, const webrtc::CpuOveruseOptions& options)) {
6903865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6913865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    channels_[channel]->overuse_options_ = options;
6923865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org    return 0;
6933865f242aa057847ca2c3728d24874882ef227eehenrike@webrtc.org  }
6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConnectAudioChannel, (const int, const int));
6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DisconnectAudioChannel, (const int));
6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartSend, (const int channel)) {
6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send = true;
6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopSend, (const int channel)) {
7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send = false;
7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartReceive, (const int channel)) {
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->receive_ = true;
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopReceive, (const int channel)) {
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->receive_ = false;
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetVersion, (char version[1024]));
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(LastError, ());
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViECodec
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(NumberOfCodecs, ()) {
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return num_codecs_;
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetCodec, (const unsigned char list_number,
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               webrtc::VideoCodec& out_codec)) {
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (list_number >= NumberOfCodecs()) {
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    memset(&out_codec, 0, sizeof(out_codec));
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::VideoCodec& c(*codecs_[list_number]);
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if ("I420" == c.name) {
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      out_codec.codecType = webrtc::kVideoCodecI420;
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if ("VP8" == c.name) {
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      out_codec.codecType = webrtc::kVideoCodecVP8;
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if ("red" == c.name) {
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      out_codec.codecType = webrtc::kVideoCodecRED;
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if ("ulpfec" == c.name) {
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      out_codec.codecType = webrtc::kVideoCodecULPFEC;
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      out_codec.codecType = webrtc::kVideoCodecUnknown;
7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    talk_base::strcpyn(out_codec.plName, sizeof(out_codec.plName),
7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       c.name.c_str());
7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.plType = c.id;
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.width = c.width;
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.height = c.height;
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.startBitrate = kStartVideoBitrate;
7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.maxBitrate = kMaxVideoBitrate;
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.minBitrate = kMinVideoBitrate;
7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_codec.maxFramerate = c.framerate;
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendCodec, (const int channel,
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             const webrtc::VideoCodec& codec)) {
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_codec = codec;
7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ++num_set_send_codecs_;
7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetSendCodec, (const int channel,
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   webrtc::VideoCodec& codec)) {  // NOLINT
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec = channels_.find(channel)->second->send_codec;
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetReceiveCodec, (const int channel,
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                const webrtc::VideoCodec& codec)) {  // NOLINT
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->recv_codecs.push_back(codec);
7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetReceiveCodec, (const int, webrtc::VideoCodec&));
7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetCodecConfigParameters, (const int,
7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned char*, unsigned char&));
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetImageScaleStatus, (const int, const bool));
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetSendCodecStastistics, (const int,
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int&, unsigned int&));
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetReceiveCodecStastistics, (const int,
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int&, unsigned int&));
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetReceiveSideDelay, (const int video_channel,
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          int* delay_ms));
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetCodecTargetBitrate, (const int channel,
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int* codec_target_bitrate)) {
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, Channel*>::const_iterator it = channels_.find(channel);
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (it->second->send) {
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Assume the encoder produces the expected rate.
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *codec_target_bitrate = it->second->send_video_bitrate_;
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *codec_target_bitrate = 0;
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual unsigned int GetDiscardedPackets(const int channel) const {
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetKeyFrameRequestCallbackStatus, (const int, const bool));
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetSignalKeyPacketLossStatus, (const int, const bool,
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const bool));
8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterEncoderObserver, (const int,
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::ViEEncoderObserver&));
8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterEncoderObserver, (const int));
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterDecoderObserver, (const int,
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::ViEDecoderObserver&));
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterDecoderObserver, (const int));
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SendKeyFrame, (const int));
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(WaitForFirstKeyFrame, (const int, const bool));
809692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org  WEBRTC_STUB(StartDebugRecording, (int, const char*));
810692d748e58db01318ef10a7a19147da601e13e93henrike@webrtc.org  WEBRTC_STUB(StopDebugRecording, (int));
811bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  WEBRTC_VOID_FUNC(SuspendBelowMinBitrate, (int channel)) {
812bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
813bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org    channels_[channel]->suspend_below_min_bitrate_ = true;
814bf64da011cfd8fc4c0243d7c52caa6db0d298bddhenrike@webrtc.org  }
8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViECapture
8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(NumberOfCaptureDevices, ());
8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetCaptureDevice, (unsigned int, char*,
8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const unsigned int, char*, const unsigned int));
8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(AllocateCaptureDevice, (const char*, const unsigned int, int&));
8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(AllocateExternalCaptureDevice,
8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (int& capture_id, webrtc::ViEExternalCapture*& capture)) {
8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_alloc_capturer_) {
8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kViECaptureIdMax == last_capturer_) {
8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Capturer* cap = new Capturer();
8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_[++last_capturer_] = cap;
8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capture_id = last_capturer_;
8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capture = cap;
8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(AllocateCaptureDevice, (webrtc::VideoCaptureModule&, int&));
8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(ReleaseCaptureDevice, (const int capture_id)) {
8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CAPTURER(capture_id);
8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete capturers_[capture_id];
8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_.erase(capture_id);
8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(ConnectCaptureDevice, (const int capture_id,
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     const int channel)) {
8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CAPTURER(capture_id);
8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->capture_id_ = capture_id;
8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_[capture_id]->set_channel_id(channel);
8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DisconnectCaptureDevice, (const int channel)) {
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int capture_id = channels_[channel]->capture_id_;
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CAPTURER(capture_id);
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->capture_id_ = -1;
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_[capture_id]->set_channel_id(-1);
8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartCapture, (const int, const webrtc::CaptureCapability&));
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopCapture, (const int));
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetRotateCapturedFrames, (const int,
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const webrtc::RotateCapturedFrame));
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetCaptureDelay, (const int, const unsigned int));
8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(NumberOfCapabilities, (const char*, const unsigned int));
8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetCaptureCapability, (const char*, const unsigned int,
8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const unsigned int, webrtc::CaptureCapability&));
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ShowCaptureSettingsDialogBox, (const char*, const unsigned int,
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const char*, void*, const unsigned int, const unsigned int));
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetOrientation, (const char*, webrtc::RotateCapturedFrame&));
8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(EnableBrightnessAlarm, (const int, const bool));
8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterObserver, (const int, webrtc::ViECaptureObserver&));
8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterObserver, (const int));
8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViENetwork
8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_VOID_FUNC(SetNetworkTransmissionState, (const int channel,
8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 const bool is_transmitting)) {
8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->can_transmit_ = is_transmitting;
8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterSendTransport, (const int, webrtc::Transport&));
8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterSendTransport, (const int));
8816049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org
8826049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  WEBRTC_FUNC(ReceivedRTPPacket, (const int channel,
8836049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org                                  const void* packet,
8846049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org                                  const int length,
8856049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org                                  const webrtc::PacketTime& packet_time)) {
8866049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
8876049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    ASSERT(length > 1);
8886049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    uint8_t payload_type = static_cast<const uint8_t*>(packet)[1] & 0x7F;
8896049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    channels_[channel]->last_recvd_payload_type_ = payload_type;
8906049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    return 0;
8916049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  }
8926049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org
8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ReceivedRTCPPacket, (const int, const void*, const int));
8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Not using WEBRTC_STUB due to bool return value
8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool IsIPv6Enabled(int channel) { return true; }
8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetMTU, (int, unsigned int));
897afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  WEBRTC_STUB(ReceivedBWEPacket, (const int, int64_t, int,
898afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org      const webrtc::RTPHeader&));
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViERender
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterVideoRenderModule, (webrtc::VideoRender&));
9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeRegisterVideoRenderModule, (webrtc::VideoRender&));
9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(AddRenderer, (const int, void*, const unsigned int, const float,
9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const float, const float, const float));
9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RemoveRenderer, (const int render_id)) {
9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (IsCapturerId(render_id)) {
9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CAPTURER(render_id);
9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (IsChannelId(render_id)) {
9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(render_id);
9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[render_id]->has_renderer_ = false;
9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartRender, (const int render_id)) {
9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (IsCapturerId(render_id)) {
9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CAPTURER(render_id);
9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (IsChannelId(render_id)) {
9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(render_id);
9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[render_id]->render_started_ = true;
9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopRender, (const int render_id)) {
9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (IsCapturerId(render_id)) {
9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CAPTURER(render_id);
9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (IsChannelId(render_id)) {
9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(render_id);
9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[render_id]->render_started_ = false;
9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetExpectedRenderDelay, (int render_id, int render_delay));
9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConfigureRender, (int, const unsigned int, const float,
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const float, const float, const float));
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(MirrorRenderStream, (const int, const bool, const bool,
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const bool));
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(AddRenderer, (const int render_id,
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            webrtc::RawVideoType video_type,
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            webrtc::ExternalRenderer* renderer)) {
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (IsCapturerId(render_id)) {
9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CAPTURER(render_id);
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (IsChannelId(render_id)) {
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(render_id);
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[render_id]->has_renderer_ = true;
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViERTP_RTCP
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetLocalSSRC, (const int channel,
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             const unsigned int ssrc,
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             const webrtc::StreamType usage,
9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             const unsigned char idx)) {
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
96397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    switch (usage) {
96497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      case webrtc::kViEStreamTypeNormal:
96597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        channels_[channel]->ssrcs_[idx] = ssrc;
96697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        break;
96797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      case webrtc::kViEStreamTypeRtx:
96897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        channels_[channel]->rtx_ssrcs_[idx] = ssrc;
96997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        break;
97097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      default:
97197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        return -1;
97297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    }
9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
97597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org
97697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_FUNC_CONST(SetRemoteSSRCType, (const int channel,
97797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org        const webrtc::StreamType usage, const unsigned int ssrc)) {
97897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_CHECK_CHANNEL(channel);
97997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    if (usage == webrtc::kViEStreamTypeRtx) {
98097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      channels_.find(channel)->second->remote_rtx_ssrc_ = ssrc;
98197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      return 0;
98297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    }
98397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return -1;
98497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetLocalSSRC, (const int channel,
9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   unsigned int& ssrc)) {
9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // ssrcs_[0] is the default local ssrc.
9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ssrc = channels_.find(channel)->second->ssrcs_[0];
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetRemoteSSRC, (const int, unsigned int&));
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetRemoteCSRCs, (const int, unsigned int*));
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
99697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_FUNC(SetRtxSendPayloadType, (const int channel,
99797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                                      const uint8 payload_type)) {
99897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    WEBRTC_CHECK_CHANNEL(channel);
99997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    channels_[channel]->rtx_send_payload_type = payload_type;
100097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    return 0;
100197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  }
10026049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org
1003d25cd982c474849f04f8a3670f3abe19ada78b11buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
1004d25cd982c474849f04f8a3670f3abe19ada78b11buildbot@webrtc.org  WEBRTC_STUB(SetPadWithRedundantPayloads, (int, bool));
1005d25cd982c474849f04f8a3670f3abe19ada78b11buildbot@webrtc.org#endif
1006d25cd982c474849f04f8a3670f3abe19ada78b11buildbot@webrtc.org
10076049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  WEBRTC_FUNC(SetRtxReceivePayloadType, (const int channel,
10086049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org                                         const uint8 payload_type)) {
10096049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10106049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    channels_[channel]->rtx_recv_payload_type = payload_type;
10116049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org    return 0;
10126049526e284c9ffb1629b963dc5a1fc09c84ae83buildbot@webrtc.org  }
10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetStartSequenceNumber, (const int, unsigned short));
10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetRTCPStatus,
10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (const int channel, const webrtc::ViERTCPMode mode)) {
10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->rtcp_status_ = mode;
10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetRTCPStatus, (const int, webrtc::ViERTCPMode&));
10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetRTCPCName, (const int channel,
10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             const char rtcp_cname[KMaxRTCPCNameLength])) {
10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->cname_.assign(rtcp_cname);
10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetRTCPCName, (const int channel,
10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   char rtcp_cname[KMaxRTCPCNameLength])) {
10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    talk_base::strcpyn(rtcp_cname, KMaxRTCPCNameLength,
10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       channels_.find(channel)->second->cname_.c_str());
10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetRemoteRTCPCName, (const int, char*));
10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SendApplicationDefinedRTCPPacket, (const int, const unsigned char,
10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int, const char*, unsigned short));
10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetNACKStatus, (const int channel, const bool enable)) {
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->nack_ = enable;
10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->hybrid_nack_fec_ = false;
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1044fb2b140b70936f05d5edff3aa9e6968981e7e299buildbot@webrtc.org  WEBRTC_STUB(SetFECStatus, (const int, const bool, const unsigned char,
1045fb2b140b70936f05d5edff3aa9e6968981e7e299buildbot@webrtc.org      const unsigned char));
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetHybridNACKFECStatus, (const int channel, const bool enable,
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const unsigned char red_type, const unsigned char fec_type)) {
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
1049fb2b140b70936f05d5edff3aa9e6968981e7e299buildbot@webrtc.org    if (red_type == fec_type ||
10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        red_type == channels_[channel]->send_codec.plType ||
1051fb2b140b70936f05d5edff3aa9e6968981e7e299buildbot@webrtc.org        fec_type == channels_[channel]->send_codec.plType) {
10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->nack_ = false;
10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->hybrid_nack_fec_ = enable;
10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetKeyFrameRequestMethod,
10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (const int channel,
10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               const webrtc::ViEKeyFrameRequestMethod method)) {
10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->key_frame_request_method_ = method;
10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSenderBufferingMode, (int channel, int target_delay)) {
10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->sender_target_delay_ = target_delay;
10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetReceiverBufferingMode, (int channel, int target_delay)) {
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->receiver_target_delay_ = target_delay;
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // |Send| and |receive| are stored locally in variables that more clearly
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // explain what they mean.
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetRembStatus, (int channel, bool send, bool receive)) {
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->remb_contribute_ = receive;
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->remb_bw_partition_ = send;
10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetTMMBRStatus, (const int channel, const bool enable)) {
10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->tmmbr_ = enable;
10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendTimestampOffsetStatus, (int channel, bool enable,
10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int id)) {
10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10912ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channels_[channel]->rtp_offset_send_id_ = (enable) ? id : -1;
10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetReceiveTimestampOffsetStatus, (int channel, bool enable,
10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int id)) {
10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10972ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channels_[channel]->rtp_offset_receive_id_ = (enable) ? id : -1;
10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendAbsoluteSendTimeStatus, (int channel, bool enable,
11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int id)) {
11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11032ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channels_[channel]->rtp_absolute_send_time_send_id_ = (enable) ? id : -1;
11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetReceiveAbsoluteSendTimeStatus, (int channel, bool enable,
11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int id)) {
11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11092ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channels_[channel]->rtp_absolute_send_time_receive_id_ = (enable) ? id : -1;
11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1112cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  WEBRTC_STUB(SetRtcpXrRrtrStatus, (int, bool));
11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetTransmissionSmoothingStatus, (int channel, bool enable)) {
11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->transmission_smoothing_ = enable;
11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1118d25cd982c474849f04f8a3670f3abe19ada78b11buildbot@webrtc.org  WEBRTC_FUNC(SetReservedTransmitBitrate, (int channel,
1119afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org      unsigned int reserved_transmit_bitrate_bps)) {
1120afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
1121afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    channels_[channel]->reserved_transmit_bitrate_bps_ =
1122afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org        reserved_transmit_bitrate_bps;
1123afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return 0;
1124afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
11257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org  WEBRTC_STUB_CONST(GetRtcpPacketTypeCounters, (int,
11267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org      webrtc::RtcpPacketTypeCounter*, webrtc::RtcpPacketTypeCounter*));
11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetReceivedRTCPStatistics, (const int, unsigned short&,
11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int&, unsigned int&, unsigned int&, int&));
11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetSentRTCPStatistics, (const int, unsigned short&,
11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int&, unsigned int&, unsigned int&, int&));
11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetRTPStatistics, (const int, unsigned int&, unsigned int&,
11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int&, unsigned int&));
113397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB_CONST(GetReceiveChannelRtcpStatistics, (const int,
113497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      webrtc::RtcpStatistics&, int&));
113597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB_CONST(GetSendChannelRtcpStatistics, (const int,
113697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      webrtc::RtcpStatistics&, int&));
113797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB_CONST(GetRtpStatistics, (const int, webrtc::StreamDataCounters&,
113897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org      webrtc::StreamDataCounters&));
11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetBandwidthUsage, (const int channel,
11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int& total_bitrate, unsigned int& video_bitrate,
11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int& fec_bitrate, unsigned int& nack_bitrate)) {
11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, Channel*>::const_iterator it = channels_.find(channel);
11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (it->second->send) {
11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      video_bitrate = it->second->send_video_bitrate_;
11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      fec_bitrate = it->second->send_fec_bitrate_;
11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      nack_bitrate = it->second->send_nack_bitrate_;
11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      total_bitrate = video_bitrate + fec_bitrate + nack_bitrate;
11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      total_bitrate = 0;
11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      video_bitrate = 0;
11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      fec_bitrate = 0;
11530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      nack_bitrate = 0;
11540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
11550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetEstimatedSendBandwidth, (const int channel,
11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int* send_bandwidth_estimate)) {
11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, Channel*>::const_iterator it = channels_.find(channel);
11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Assume the current video, fec and nack bitrate sums up to our estimate.
11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (it->second->send) {
1163e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org      it = channels_.find(GetOriginalChannelId(channel));
11640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *send_bandwidth_estimate = it->second->send_bandwidth_;
11650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
11660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *send_bandwidth_estimate = 0;
11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC_CONST(GetEstimatedReceiveBandwidth, (const int channel,
11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      unsigned int* receive_bandwidth_estimate)) {
11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::map<int, Channel*>::const_iterator it = channels_.find(channel);
11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (it->second->receive_) {
1175e9dd75328a7c9d9525fcc72d7485335a7d5fa41ebuildbot@webrtc.org      it = channels_.find(GetOriginalChannelId(channel));
11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *receive_bandwidth_estimate = it->second->receive_bandwidth_;
11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      *receive_bandwidth_estimate = 0;
11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
118297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterSendChannelRtcpStatisticsCallback,
118397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::RtcpStatisticsCallback*));
118497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterSendChannelRtcpStatisticsCallback,
118597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::RtcpStatisticsCallback*));
118697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterReceiveChannelRtcpStatisticsCallback,
118797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::RtcpStatisticsCallback*));
118897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterReceiveChannelRtcpStatisticsCallback,
118997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::RtcpStatisticsCallback*));
119097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterSendChannelRtpStatisticsCallback,
119197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::StreamDataCountersCallback*));
119297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterSendChannelRtpStatisticsCallback,
119397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::StreamDataCountersCallback*));
119497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterReceiveChannelRtpStatisticsCallback,
119597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::StreamDataCountersCallback*));
119697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterReceiveChannelRtpStatisticsCallback,
119797fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::StreamDataCountersCallback*));
119897fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterSendBitrateObserver,
119997fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::BitrateStatisticsObserver*));
120097fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterSendBitrateObserver,
120197fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::BitrateStatisticsObserver*));
120297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(RegisterSendFrameCountObserver,
120397fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::FrameCountObserver*));
120497fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org  WEBRTC_STUB(DeregisterSendFrameCountObserver,
120597fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org                    (int, webrtc::FrameCountObserver*));
12060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartRTPDump, (const int, const char*, webrtc::RTPDirections));
12080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopRTPDump, (const int, webrtc::RTPDirections));
12090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRTPObserver, (const int, webrtc::ViERTPObserver&));
12100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterRTPObserver, (const int));
12110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRTCPObserver, (const int, webrtc::ViERTCPObserver&));
12120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterRTCPObserver, (const int));
12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViEImageProcess
12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterCaptureEffectFilter, (const int,
12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::ViEEffectFilter&));
12170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterCaptureEffectFilter, (const int));
12180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterSendEffectFilter, (const int,
12190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::ViEEffectFilter&));
12200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterSendEffectFilter, (const int));
12210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRenderEffectFilter, (const int,
12220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::ViEEffectFilter&));
12230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeregisterRenderEffectFilter, (const int));
12240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(EnableDeflickering, (const int, const bool));
12250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(EnableDenoising, (const int capture_id, const bool denoising)) {
12260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CAPTURER(capture_id);
12270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturers_[capture_id]->set_denoising(denoising);
12280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(EnableColorEnhancement, (const int, const bool));
12315c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_VOID_STUB(RegisterPreEncodeCallback,
12325c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                   (int, webrtc::I420FrameCallback*));
12335c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_VOID_STUB(DeRegisterPreEncodeCallback, (int));
12345c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_VOID_STUB(RegisterPreRenderCallback,
12355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                   (int, webrtc::I420FrameCallback*));
12365c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_VOID_STUB(DeRegisterPreRenderCallback, (int));
12370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::ViEExternalCodec
12380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RegisterExternalSendCodec,
12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (const int channel, const unsigned char pl_type, webrtc::VideoEncoder*,
12400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          bool)) {
12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->ext_encoder_pl_types_.insert(pl_type);
12430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeRegisterExternalSendCodec,
12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (const int channel, const unsigned char pl_type)) {
12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->ext_encoder_pl_types_.erase(pl_type);
12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RegisterExternalReceiveCodec,
12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (const int channel, const unsigned int pl_type, webrtc::VideoDecoder*,
12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org       bool, int)) {
12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->ext_decoder_pl_types_.insert(pl_type);
12560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeRegisterExternalReceiveCodec,
12590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (const int channel, const unsigned char pl_type)) {
12600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->ext_decoder_pl_types_.erase(pl_type);
12620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
12660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsChannelId(int id) const {
12670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (id >= kViEChannelIdBase && id <= kViEChannelIdMax);
12680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsCapturerId(int id) const {
12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (id >= kViECaptureIdBase && id <= kViECaptureIdMax);
12710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool inited_;
12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int last_channel_;
12750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<int, Channel*> channels_;
12760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_create_channel_;
12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int last_capturer_;
12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<int, Capturer*> capturers_;
12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_alloc_capturer_;
12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const cricket::VideoCodec* const* codecs_;
12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_codecs_;
12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_set_send_codecs_;  // how many times we call SetSendCodec().
12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
1288