Home | History | Annotate | Download | only in webrtc
      1 /*
      2  * libjingle
      3  * Copyright 2010 Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
     29 #define TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
     30 
     31 #include <map>
     32 #include <set>
     33 #include <vector>
     34 
     35 #include "talk/media/base/codec.h"
     36 #include "talk/media/webrtc/fakewebrtccommon.h"
     37 #include "talk/media/webrtc/webrtcvideodecoderfactory.h"
     38 #include "talk/media/webrtc/webrtcvideoencoderfactory.h"
     39 #include "talk/media/webrtc/webrtcvie.h"
     40 #include "webrtc/base/basictypes.h"
     41 #include "webrtc/base/gunit.h"
     42 #include "webrtc/base/stringutils.h"
     43 
     44 namespace cricket {
     45 
     46 #define WEBRTC_CHECK_CAPTURER(capturer) \
     47   if (capturers_.find(capturer) == capturers_.end()) return -1;
     48 
     49 #define WEBRTC_ASSERT_CAPTURER(capturer) \
     50   ASSERT(capturers_.find(capturer) != capturers_.end());
     51 
     52 static const int kMinVideoBitrate = 100;
     53 static const int kStartVideoBitrate = 300;
     54 static const int kMaxVideoBitrate = 1000;
     55 
     56 // WebRtc channel id and capture id share the same number space.
     57 // This is how AddRenderer(renderId, ...) is able to tell if it is adding a
     58 // renderer for a channel or it is adding a renderer for a capturer.
     59 static const int kViEChannelIdBase = 0;
     60 static const int kViEChannelIdMax = 1000;
     61 static const int kViECaptureIdBase = 10000;  // Make sure there is a gap.
     62 static const int kViECaptureIdMax = 11000;
     63 
     64 // Fake class for mocking out webrtc::VideoDecoder
     65 class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder {
     66  public:
     67   FakeWebRtcVideoDecoder()
     68       : num_frames_received_(0) {
     69   }
     70 
     71   virtual int32 InitDecode(const webrtc::VideoCodec*, int32) {
     72     return WEBRTC_VIDEO_CODEC_OK;
     73   }
     74 
     75   virtual int32 Decode(
     76       const webrtc::EncodedImage&, bool, const webrtc::RTPFragmentationHeader*,
     77       const webrtc::CodecSpecificInfo*, int64) {
     78     num_frames_received_++;
     79     return WEBRTC_VIDEO_CODEC_OK;
     80   }
     81 
     82   virtual int32 RegisterDecodeCompleteCallback(
     83       webrtc::DecodedImageCallback*) {
     84     return WEBRTC_VIDEO_CODEC_OK;
     85   }
     86 
     87   virtual int32 Release() {
     88     return WEBRTC_VIDEO_CODEC_OK;
     89   }
     90 
     91   virtual int32 Reset() {
     92     return WEBRTC_VIDEO_CODEC_OK;
     93   }
     94 
     95   int GetNumFramesReceived() const {
     96     return num_frames_received_;
     97   }
     98 
     99  private:
    100   int num_frames_received_;
    101 };
    102 
    103 // Fake class for mocking out WebRtcVideoDecoderFactory.
    104 class FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory {
    105  public:
    106   FakeWebRtcVideoDecoderFactory()
    107       : num_created_decoders_(0) {
    108   }
    109 
    110   virtual webrtc::VideoDecoder* CreateVideoDecoder(
    111       webrtc::VideoCodecType type) {
    112     if (supported_codec_types_.count(type) == 0) {
    113       return NULL;
    114     }
    115     FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder();
    116     decoders_.push_back(decoder);
    117     num_created_decoders_++;
    118     return decoder;
    119   }
    120 
    121   virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) {
    122     decoders_.erase(
    123         std::remove(decoders_.begin(), decoders_.end(), decoder),
    124         decoders_.end());
    125     delete decoder;
    126   }
    127 
    128   void AddSupportedVideoCodecType(webrtc::VideoCodecType type) {
    129     supported_codec_types_.insert(type);
    130   }
    131 
    132   int GetNumCreatedDecoders() {
    133     return num_created_decoders_;
    134   }
    135 
    136   const std::vector<FakeWebRtcVideoDecoder*>& decoders() {
    137     return decoders_;
    138   }
    139 
    140  private:
    141   std::set<webrtc::VideoCodecType> supported_codec_types_;
    142   std::vector<FakeWebRtcVideoDecoder*> decoders_;
    143   int num_created_decoders_;
    144 };
    145 
    146 // Fake class for mocking out webrtc::VideoEnoder
    147 class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder {
    148  public:
    149   FakeWebRtcVideoEncoder() {}
    150 
    151   virtual int32 InitEncode(const webrtc::VideoCodec* codecSettings,
    152                            int32 numberOfCores,
    153                            uint32 maxPayloadSize) {
    154     return WEBRTC_VIDEO_CODEC_OK;
    155   }
    156 
    157   virtual int32 Encode(
    158       const webrtc::I420VideoFrame& inputImage,
    159             const webrtc::CodecSpecificInfo* codecSpecificInfo,
    160             const std::vector<webrtc::VideoFrameType>* frame_types) {
    161     return WEBRTC_VIDEO_CODEC_OK;
    162   }
    163 
    164   virtual int32 RegisterEncodeCompleteCallback(
    165       webrtc::EncodedImageCallback* callback) {
    166     return WEBRTC_VIDEO_CODEC_OK;
    167   }
    168 
    169   virtual int32 Release() {
    170     return WEBRTC_VIDEO_CODEC_OK;
    171   }
    172 
    173   virtual int32 SetChannelParameters(uint32 packetLoss,
    174                                      int rtt) {
    175     return WEBRTC_VIDEO_CODEC_OK;
    176   }
    177 
    178   virtual int32 SetRates(uint32 newBitRate,
    179                          uint32 frameRate) {
    180     return WEBRTC_VIDEO_CODEC_OK;
    181   }
    182 };
    183 
    184 // Fake class for mocking out WebRtcVideoEncoderFactory.
    185 class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory {
    186  public:
    187   FakeWebRtcVideoEncoderFactory()
    188       : num_created_encoders_(0) {
    189   }
    190 
    191   virtual webrtc::VideoEncoder* CreateVideoEncoder(
    192       webrtc::VideoCodecType type) {
    193     if (supported_codec_types_.count(type) == 0) {
    194       return NULL;
    195     }
    196     FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder();
    197     encoders_.push_back(encoder);
    198     num_created_encoders_++;
    199     return encoder;
    200   }
    201 
    202   virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) {
    203     encoders_.erase(
    204         std::remove(encoders_.begin(), encoders_.end(), encoder),
    205         encoders_.end());
    206     delete encoder;
    207   }
    208 
    209   virtual void AddObserver(WebRtcVideoEncoderFactory::Observer* observer) {
    210     bool inserted = observers_.insert(observer).second;
    211     EXPECT_TRUE(inserted);
    212   }
    213 
    214   virtual void RemoveObserver(WebRtcVideoEncoderFactory::Observer* observer) {
    215     size_t erased = observers_.erase(observer);
    216     EXPECT_EQ(erased, 1UL);
    217   }
    218 
    219   virtual const std::vector<WebRtcVideoEncoderFactory::VideoCodec>& codecs()
    220       const {
    221     return codecs_;
    222   }
    223 
    224   void AddSupportedVideoCodecType(webrtc::VideoCodecType type,
    225                                   const std::string& name) {
    226     supported_codec_types_.insert(type);
    227     codecs_.push_back(
    228         WebRtcVideoEncoderFactory::VideoCodec(type, name, 1280, 720, 30));
    229   }
    230 
    231   void NotifyCodecsAvailable() {
    232     std::set<WebRtcVideoEncoderFactory::Observer*>::iterator it;
    233     for (it = observers_.begin(); it != observers_.end(); ++it)
    234       (*it)->OnCodecsAvailable();
    235   }
    236 
    237   int GetNumCreatedEncoders() {
    238     return num_created_encoders_;
    239   }
    240 
    241   const std::vector<FakeWebRtcVideoEncoder*>& encoders() {
    242     return encoders_;
    243   }
    244 
    245  private:
    246   std::set<webrtc::VideoCodecType> supported_codec_types_;
    247   std::vector<WebRtcVideoEncoderFactory::VideoCodec> codecs_;
    248   std::vector<FakeWebRtcVideoEncoder*> encoders_;
    249   std::set<WebRtcVideoEncoderFactory::Observer*> observers_;
    250   int num_created_encoders_;
    251 };
    252 
    253 class FakeWebRtcVideoEngine
    254     : public webrtc::ViEBase,
    255       public webrtc::ViECodec,
    256       public webrtc::ViECapture,
    257       public webrtc::ViENetwork,
    258       public webrtc::ViERender,
    259       public webrtc::ViERTP_RTCP,
    260       public webrtc::ViEImageProcess,
    261       public webrtc::ViEExternalCodec {
    262  public:
    263   struct Channel {
    264     Channel()
    265         : capture_id_(-1),
    266           original_channel_id_(-1),
    267           has_renderer_(false),
    268           render_started_(false),
    269           send(false),
    270           receive_(false),
    271           can_transmit_(true),
    272           remote_rtx_ssrc_(-1),
    273           rtx_send_payload_type(-1),
    274           rtx_recv_payload_type(-1),
    275           rtcp_status_(webrtc::kRtcpNone),
    276           key_frame_request_method_(webrtc::kViEKeyFrameRequestNone),
    277           tmmbr_(false),
    278           remb_contribute_(false),
    279           remb_bw_partition_(false),
    280           rtp_offset_send_id_(-1),
    281           rtp_offset_receive_id_(-1),
    282           rtp_absolute_send_time_send_id_(-1),
    283           rtp_absolute_send_time_receive_id_(-1),
    284           sender_target_delay_(0),
    285           receiver_target_delay_(0),
    286           transmission_smoothing_(false),
    287           nack_(false),
    288           hybrid_nack_fec_(false),
    289           send_video_bitrate_(0),
    290           send_fec_bitrate_(0),
    291           send_nack_bitrate_(0),
    292           send_bandwidth_(0),
    293           receive_bandwidth_(0),
    294           reserved_transmit_bitrate_bps_(0),
    295           suspend_below_min_bitrate_(false),
    296           overuse_observer_(NULL),
    297           last_recvd_payload_type_(-1) {
    298       ssrcs_[0] = 0;  // default ssrc.
    299       memset(&send_codec, 0, sizeof(send_codec));
    300       memset(&overuse_options_, 0, sizeof(overuse_options_));
    301     }
    302     int capture_id_;
    303     int original_channel_id_;
    304     bool has_renderer_;
    305     bool render_started_;
    306     bool send;
    307     bool receive_;
    308     bool can_transmit_;
    309     std::map<int, int> ssrcs_;
    310     std::map<int, int> rtx_ssrcs_;
    311     int remote_rtx_ssrc_;
    312     int rtx_send_payload_type;
    313     int rtx_recv_payload_type;
    314     std::string cname_;
    315     webrtc::ViERTCPMode rtcp_status_;
    316     webrtc::ViEKeyFrameRequestMethod key_frame_request_method_;
    317     bool tmmbr_;
    318     bool remb_contribute_;   // This channel contributes to the remb report.
    319     bool remb_bw_partition_; // This channel is allocated part of total bw.
    320     int rtp_offset_send_id_;
    321     int rtp_offset_receive_id_;
    322     int rtp_absolute_send_time_send_id_;
    323     int rtp_absolute_send_time_receive_id_;
    324     int sender_target_delay_;
    325     int receiver_target_delay_;
    326     bool transmission_smoothing_;
    327     bool nack_;
    328     bool hybrid_nack_fec_;
    329     std::vector<webrtc::VideoCodec> recv_codecs;
    330     std::set<unsigned int> ext_decoder_pl_types_;
    331     std::set<unsigned int> ext_encoder_pl_types_;
    332     webrtc::VideoCodec send_codec;
    333     unsigned int send_video_bitrate_;
    334     unsigned int send_fec_bitrate_;
    335     unsigned int send_nack_bitrate_;
    336     unsigned int send_bandwidth_;
    337     unsigned int receive_bandwidth_;
    338     // Bandwidth to deduct from estimated uplink capacity.
    339     unsigned int reserved_transmit_bitrate_bps_;
    340     bool suspend_below_min_bitrate_;
    341     webrtc::CpuOveruseObserver* overuse_observer_;
    342     webrtc::CpuOveruseOptions overuse_options_;
    343     int last_recvd_payload_type_;
    344   };
    345   class Capturer : public webrtc::ViEExternalCapture {
    346    public:
    347     Capturer() : channel_id_(-1), denoising_(false),
    348                  last_capture_time_(0), incoming_frame_num_(0) { }
    349     int channel_id() const { return channel_id_; }
    350     void set_channel_id(int channel_id) { channel_id_ = channel_id; }
    351     bool denoising() const { return denoising_; }
    352     void set_denoising(bool denoising) { denoising_ = denoising; }
    353     int64 last_capture_time() const { return last_capture_time_; }
    354     int incoming_frame_num() const { return incoming_frame_num_; }
    355 
    356     // From ViEExternalCapture
    357     virtual int IncomingFrame(unsigned char* videoFrame,
    358                               unsigned int videoFrameLength,
    359                               unsigned short width,
    360                               unsigned short height,
    361                               webrtc::RawVideoType videoType,
    362                               unsigned long long captureTime) {
    363       return 0;
    364     }
    365     virtual int IncomingFrameI420(
    366         const webrtc::ViEVideoFrameI420& video_frame,
    367         unsigned long long captureTime) {
    368       last_capture_time_ = captureTime;
    369       ++incoming_frame_num_;
    370       return 0;
    371     }
    372 
    373    private:
    374     int channel_id_;
    375     bool denoising_;
    376     int64 last_capture_time_;
    377     int incoming_frame_num_;
    378   };
    379 
    380   FakeWebRtcVideoEngine(const cricket::VideoCodec* const* codecs,
    381                         int num_codecs)
    382       : inited_(false),
    383         last_channel_(kViEChannelIdBase - 1),
    384         fail_create_channel_(false),
    385         last_capturer_(kViECaptureIdBase - 1),
    386         fail_alloc_capturer_(false),
    387         codecs_(codecs),
    388         num_codecs_(num_codecs),
    389         num_set_send_codecs_(0) {
    390   }
    391 
    392   ~FakeWebRtcVideoEngine() {
    393     ASSERT(0 == channels_.size());
    394     ASSERT(0 == capturers_.size());
    395   }
    396   bool IsInited() const { return inited_; }
    397 
    398   int GetLastChannel() const { return last_channel_; }
    399   int GetChannelFromLocalSsrc(int local_ssrc) const {
    400     // ssrcs_[0] is the default local ssrc.
    401     for (std::map<int, Channel*>::const_iterator iter = channels_.begin();
    402          iter != channels_.end(); ++iter) {
    403       if (local_ssrc == iter->second->ssrcs_[0]) {
    404         return iter->first;
    405       }
    406     }
    407     return -1;
    408   }
    409 
    410   int GetNumChannels() const { return static_cast<int>(channels_.size()); }
    411   bool IsChannel(int channel) const {
    412     return (channels_.find(channel) != channels_.end());
    413   }
    414   void set_fail_create_channel(bool fail_create_channel) {
    415     fail_create_channel_ = fail_create_channel;
    416   }
    417 
    418   int GetLastCapturer() const { return last_capturer_; }
    419   int GetNumCapturers() const { return static_cast<int>(capturers_.size()); }
    420   int GetIncomingFrameNum(int channel_id) const {
    421     for (std::map<int, Capturer*>::const_iterator iter = capturers_.begin();
    422          iter != capturers_.end(); ++iter) {
    423       Capturer* capturer = iter->second;
    424       if (capturer->channel_id() == channel_id) {
    425         return capturer->incoming_frame_num();
    426       }
    427     }
    428     return -1;
    429   }
    430   void set_fail_alloc_capturer(bool fail_alloc_capturer) {
    431     fail_alloc_capturer_ = fail_alloc_capturer;
    432   }
    433   int GetNumSetSendCodecs() const { return num_set_send_codecs_; }
    434 
    435   int GetCaptureId(int channel) const {
    436     WEBRTC_ASSERT_CHANNEL(channel);
    437     return channels_.find(channel)->second->capture_id_;
    438   }
    439   int GetOriginalChannelId(int channel) const {
    440     WEBRTC_ASSERT_CHANNEL(channel);
    441     return channels_.find(channel)->second->original_channel_id_;
    442   }
    443   bool GetHasRenderer(int channel) const {
    444     WEBRTC_ASSERT_CHANNEL(channel);
    445     return channels_.find(channel)->second->has_renderer_;
    446   }
    447   bool GetRenderStarted(int channel) const {
    448     WEBRTC_ASSERT_CHANNEL(channel);
    449     return channels_.find(channel)->second->render_started_;
    450   }
    451   bool GetSend(int channel) const {
    452     WEBRTC_ASSERT_CHANNEL(channel);
    453     return channels_.find(channel)->second->send;
    454   }
    455   bool GetReceive(int channel) const {
    456     WEBRTC_ASSERT_CHANNEL(channel);
    457     return channels_.find(channel)->second->receive_;
    458   }
    459   int GetCaptureChannelId(int capture_id) const {
    460     WEBRTC_ASSERT_CAPTURER(capture_id);
    461     return capturers_.find(capture_id)->second->channel_id();
    462   }
    463   bool GetCaptureDenoising(int capture_id) const {
    464     WEBRTC_ASSERT_CAPTURER(capture_id);
    465     return capturers_.find(capture_id)->second->denoising();
    466   }
    467   int64 GetCaptureLastTimestamp(int capture_id) const {
    468     WEBRTC_ASSERT_CAPTURER(capture_id);
    469     return capturers_.find(capture_id)->second->last_capture_time();
    470   }
    471   webrtc::ViERTCPMode GetRtcpStatus(int channel) const {
    472     WEBRTC_ASSERT_CHANNEL(channel);
    473     return channels_.find(channel)->second->rtcp_status_;
    474   }
    475   webrtc::ViEKeyFrameRequestMethod GetKeyFrameRequestMethod(int channel) const {
    476     WEBRTC_ASSERT_CHANNEL(channel);
    477     return channels_.find(channel)->second->key_frame_request_method_;
    478   }
    479   bool GetTmmbrStatus(int channel) const {
    480     WEBRTC_ASSERT_CHANNEL(channel);
    481     return channels_.find(channel)->second->tmmbr_;
    482   }
    483   bool GetRembStatusBwPartition(int channel) const {
    484     WEBRTC_ASSERT_CHANNEL(channel);
    485     return channels_.find(channel)->second->remb_bw_partition_;
    486   }
    487   bool GetRembStatusContribute(int channel) const {
    488     WEBRTC_ASSERT_CHANNEL(channel);
    489     return channels_.find(channel)->second->remb_contribute_;
    490   }
    491   int GetSendRtpExtensionId(int channel, const std::string& extension) {
    492     WEBRTC_ASSERT_CHANNEL(channel);
    493     if (extension == kRtpTimestampOffsetHeaderExtension) {
    494       return channels_.find(channel)->second->rtp_offset_send_id_;
    495     } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
    496       return channels_.find(channel)->second->rtp_absolute_send_time_send_id_;
    497     }
    498     return -1;
    499   }
    500   int GetReceiveRtpExtensionId(int channel, const std::string& extension) {
    501     WEBRTC_ASSERT_CHANNEL(channel);
    502     if (extension == kRtpTimestampOffsetHeaderExtension) {
    503       return channels_.find(channel)->second->rtp_offset_receive_id_;
    504     } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
    505       return
    506           channels_.find(channel)->second->rtp_absolute_send_time_receive_id_;
    507     }
    508     return -1;
    509   }
    510   bool GetTransmissionSmoothingStatus(int channel) {
    511     WEBRTC_ASSERT_CHANNEL(channel);
    512     return channels_.find(channel)->second->transmission_smoothing_;
    513   }
    514   int GetSenderTargetDelay(int channel) {
    515     WEBRTC_ASSERT_CHANNEL(channel);
    516     return channels_.find(channel)->second->sender_target_delay_;
    517   }
    518   int GetReceiverTargetDelay(int channel) {
    519     WEBRTC_ASSERT_CHANNEL(channel);
    520     return channels_.find(channel)->second->receiver_target_delay_;
    521   }
    522   bool GetNackStatus(int channel) const {
    523     WEBRTC_ASSERT_CHANNEL(channel);
    524     return channels_.find(channel)->second->nack_;
    525   }
    526   bool GetHybridNackFecStatus(int channel) const {
    527     WEBRTC_ASSERT_CHANNEL(channel);
    528     return channels_.find(channel)->second->hybrid_nack_fec_;
    529   }
    530   int GetNumSsrcs(int channel) const {
    531     WEBRTC_ASSERT_CHANNEL(channel);
    532     return static_cast<int>(
    533         channels_.find(channel)->second->ssrcs_.size());
    534   }
    535   int GetNumRtxSsrcs(int channel) const {
    536     WEBRTC_ASSERT_CHANNEL(channel);
    537     return static_cast<int>(
    538         channels_.find(channel)->second->rtx_ssrcs_.size());
    539   }
    540   bool GetIsTransmitting(int channel) const {
    541     WEBRTC_ASSERT_CHANNEL(channel);
    542     return channels_.find(channel)->second->can_transmit_;
    543   }
    544   webrtc::CpuOveruseObserver* GetCpuOveruseObserver(int channel) const {
    545     WEBRTC_ASSERT_CHANNEL(channel);
    546     return channels_.find(channel)->second->overuse_observer_;
    547   }
    548   webrtc::CpuOveruseOptions GetCpuOveruseOptions(int channel) const {
    549     WEBRTC_ASSERT_CHANNEL(channel);
    550     return channels_.find(channel)->second->overuse_options_;
    551   }
    552   int GetSsrc(int channel, int idx) const {
    553     WEBRTC_ASSERT_CHANNEL(channel);
    554     if (channels_.find(channel)->second->ssrcs_.find(idx) ==
    555         channels_.find(channel)->second->ssrcs_.end()) {
    556       return -1;
    557     }
    558     return channels_.find(channel)->second->ssrcs_[idx];
    559   }
    560   int GetRtxSsrc(int channel, int idx) const {
    561     WEBRTC_ASSERT_CHANNEL(channel);
    562     if (channels_.find(channel)->second->rtx_ssrcs_.find(idx) ==
    563         channels_.find(channel)->second->rtx_ssrcs_.end()) {
    564       return -1;
    565     }
    566     return channels_.find(channel)->second->rtx_ssrcs_[idx];
    567   }
    568   bool ReceiveCodecRegistered(int channel,
    569                               const webrtc::VideoCodec& codec) const {
    570     WEBRTC_ASSERT_CHANNEL(channel);
    571     const std::vector<webrtc::VideoCodec>& codecs =
    572       channels_.find(channel)->second->recv_codecs;
    573     return std::find(codecs.begin(), codecs.end(), codec) != codecs.end();
    574   };
    575   bool ExternalDecoderRegistered(int channel,
    576                                  unsigned int pl_type) const {
    577     WEBRTC_ASSERT_CHANNEL(channel);
    578     return channels_.find(channel)->second->
    579         ext_decoder_pl_types_.count(pl_type) != 0;
    580   };
    581   int GetNumExternalDecoderRegistered(int channel) const {
    582     WEBRTC_ASSERT_CHANNEL(channel);
    583     return static_cast<int>(
    584         channels_.find(channel)->second->ext_decoder_pl_types_.size());
    585   };
    586   bool ExternalEncoderRegistered(int channel,
    587                                  unsigned int pl_type) const {
    588     WEBRTC_ASSERT_CHANNEL(channel);
    589     return channels_.find(channel)->second->
    590         ext_encoder_pl_types_.count(pl_type) != 0;
    591   };
    592   int GetNumExternalEncoderRegistered(int channel) const {
    593     WEBRTC_ASSERT_CHANNEL(channel);
    594     return static_cast<int>(
    595         channels_.find(channel)->second->ext_encoder_pl_types_.size());
    596   };
    597   int GetTotalNumExternalEncoderRegistered() const {
    598     std::map<int, Channel*>::const_iterator it;
    599     int total_num_registered = 0;
    600     for (it = channels_.begin(); it != channels_.end(); ++it)
    601       total_num_registered +=
    602           static_cast<int>(it->second->ext_encoder_pl_types_.size());
    603     return total_num_registered;
    604   }
    605   void SetSendBitrates(int channel, unsigned int video_bitrate,
    606                        unsigned int fec_bitrate, unsigned int nack_bitrate) {
    607     WEBRTC_ASSERT_CHANNEL(channel);
    608     channels_[channel]->send_video_bitrate_ = video_bitrate;
    609     channels_[channel]->send_fec_bitrate_ = fec_bitrate;
    610     channels_[channel]->send_nack_bitrate_ = nack_bitrate;
    611   }
    612   void SetSendBandwidthEstimate(int channel, unsigned int send_bandwidth) {
    613     WEBRTC_ASSERT_CHANNEL(channel);
    614     channels_[GetOriginalChannelId(channel)]->send_bandwidth_ = send_bandwidth;
    615   }
    616   void SetReceiveBandwidthEstimate(int channel,
    617                                    unsigned int receive_bandwidth) {
    618     WEBRTC_ASSERT_CHANNEL(channel);
    619     channels_[GetOriginalChannelId(channel)]->receive_bandwidth_ =
    620         receive_bandwidth;
    621   };
    622   int GetRtxSendPayloadType(int channel) {
    623     WEBRTC_CHECK_CHANNEL(channel);
    624     return channels_[channel]->rtx_send_payload_type;
    625   }
    626   int GetRtxRecvPayloadType(int channel) {
    627     WEBRTC_CHECK_CHANNEL(channel);
    628     return channels_[channel]->rtx_recv_payload_type;
    629   }
    630   int GetRemoteRtxSsrc(int channel) {
    631     WEBRTC_CHECK_CHANNEL(channel);
    632     return channels_.find(channel)->second->remote_rtx_ssrc_;
    633   }
    634   bool GetSuspendBelowMinBitrateStatus(int channel) {
    635     WEBRTC_ASSERT_CHANNEL(channel);
    636     return channels_.find(channel)->second->suspend_below_min_bitrate_;
    637   }
    638   int GetLastRecvdPayloadType(int channel) const {
    639     WEBRTC_CHECK_CHANNEL(channel);
    640     return channels_.find(channel)->second->last_recvd_payload_type_;
    641   }
    642   unsigned int GetReservedTransmitBitrate(int channel) {
    643     WEBRTC_ASSERT_CHANNEL(channel);
    644     return channels_.find(channel)->second->reserved_transmit_bitrate_bps_;
    645   }
    646 
    647   WEBRTC_STUB(Release, ());
    648 
    649   // webrtc::ViEBase
    650   WEBRTC_FUNC(Init, ()) {
    651     inited_ = true;
    652     return 0;
    653   };
    654   WEBRTC_STUB(SetVoiceEngine, (webrtc::VoiceEngine*));
    655   WEBRTC_FUNC(CreateChannel, (int& channel)) {  // NOLINT
    656     if (fail_create_channel_) {
    657       return -1;
    658     }
    659     if (kViEChannelIdMax == last_channel_) {
    660       return -1;
    661     }
    662     Channel* ch = new Channel();
    663     ++last_channel_;
    664     // The original channel of the first channel in a group refers to itself
    665     // for code simplicity.
    666     ch->original_channel_id_ = last_channel_;
    667     channels_[last_channel_] = ch;
    668     channel = last_channel_;
    669     return 0;
    670   };
    671   WEBRTC_FUNC(CreateChannel, (int& channel, int original_channel)) {
    672     WEBRTC_CHECK_CHANNEL(original_channel);
    673     if (CreateChannel(channel) != 0) {
    674       return -1;
    675     }
    676     channels_[channel]->original_channel_id_ = original_channel;
    677     return 0;
    678   }
    679   WEBRTC_FUNC(CreateReceiveChannel, (int& channel, int original_channel)) {
    680     return CreateChannel(channel, original_channel);
    681   }
    682   WEBRTC_FUNC(DeleteChannel, (const int channel)) {
    683     WEBRTC_CHECK_CHANNEL(channel);
    684     // Make sure we deregister all the decoders before deleting a channel.
    685     EXPECT_EQ(0, GetNumExternalDecoderRegistered(channel));
    686     delete channels_[channel];
    687     channels_.erase(channel);
    688     return 0;
    689   }
    690   WEBRTC_FUNC(RegisterCpuOveruseObserver,
    691       (int channel, webrtc::CpuOveruseObserver* observer)) {
    692     WEBRTC_CHECK_CHANNEL(channel);
    693     channels_[channel]->overuse_observer_ = observer;
    694     return 0;
    695   }
    696 #ifdef USE_WEBRTC_DEV_BRANCH
    697   WEBRTC_STUB(GetCpuOveruseMetrics, (int, webrtc::CpuOveruseMetrics*));
    698 #else
    699   WEBRTC_STUB(CpuOveruseMeasures, (int, int*, int*, int*, int*));
    700 #endif
    701   WEBRTC_FUNC(SetCpuOveruseOptions,
    702       (int channel, const webrtc::CpuOveruseOptions& options)) {
    703     WEBRTC_CHECK_CHANNEL(channel);
    704     channels_[channel]->overuse_options_ = options;
    705     return 0;
    706   }
    707   WEBRTC_STUB(ConnectAudioChannel, (const int, const int));
    708   WEBRTC_STUB(DisconnectAudioChannel, (const int));
    709   WEBRTC_FUNC(StartSend, (const int channel)) {
    710     WEBRTC_CHECK_CHANNEL(channel);
    711     channels_[channel]->send = true;
    712     return 0;
    713   }
    714   WEBRTC_FUNC(StopSend, (const int channel)) {
    715     WEBRTC_CHECK_CHANNEL(channel);
    716     channels_[channel]->send = false;
    717     return 0;
    718   }
    719   WEBRTC_FUNC(StartReceive, (const int channel)) {
    720     WEBRTC_CHECK_CHANNEL(channel);
    721     channels_[channel]->receive_ = true;
    722     return 0;
    723   }
    724   WEBRTC_FUNC(StopReceive, (const int channel)) {
    725     WEBRTC_CHECK_CHANNEL(channel);
    726     channels_[channel]->receive_ = false;
    727     return 0;
    728   }
    729   WEBRTC_STUB(GetVersion, (char version[1024]));
    730   WEBRTC_STUB(LastError, ());
    731 
    732   // webrtc::ViECodec
    733   WEBRTC_FUNC_CONST(NumberOfCodecs, ()) {
    734     return num_codecs_;
    735   };
    736   WEBRTC_FUNC_CONST(GetCodec, (const unsigned char list_number,
    737                                webrtc::VideoCodec& out_codec)) {
    738     if (list_number >= NumberOfCodecs()) {
    739       return -1;
    740     }
    741     memset(&out_codec, 0, sizeof(out_codec));
    742     const cricket::VideoCodec& c(*codecs_[list_number]);
    743     if ("I420" == c.name) {
    744       out_codec.codecType = webrtc::kVideoCodecI420;
    745     } else if ("VP8" == c.name) {
    746       out_codec.codecType = webrtc::kVideoCodecVP8;
    747     } else if ("red" == c.name) {
    748       out_codec.codecType = webrtc::kVideoCodecRED;
    749     } else if ("ulpfec" == c.name) {
    750       out_codec.codecType = webrtc::kVideoCodecULPFEC;
    751     } else {
    752       out_codec.codecType = webrtc::kVideoCodecUnknown;
    753     }
    754     rtc::strcpyn(out_codec.plName, sizeof(out_codec.plName),
    755                        c.name.c_str());
    756     out_codec.plType = c.id;
    757     out_codec.width = c.width;
    758     out_codec.height = c.height;
    759     out_codec.startBitrate = kStartVideoBitrate;
    760     out_codec.maxBitrate = kMaxVideoBitrate;
    761     out_codec.minBitrate = kMinVideoBitrate;
    762     out_codec.maxFramerate = c.framerate;
    763     return 0;
    764   };
    765   WEBRTC_FUNC(SetSendCodec, (const int channel,
    766                              const webrtc::VideoCodec& codec)) {
    767     WEBRTC_CHECK_CHANNEL(channel);
    768     channels_[channel]->send_codec = codec;
    769     ++num_set_send_codecs_;
    770     return 0;
    771   };
    772   WEBRTC_FUNC_CONST(GetSendCodec, (const int channel,
    773                                    webrtc::VideoCodec& codec)) {  // NOLINT
    774     WEBRTC_CHECK_CHANNEL(channel);
    775     codec = channels_.find(channel)->second->send_codec;
    776     return 0;
    777   };
    778   WEBRTC_FUNC(SetReceiveCodec, (const int channel,
    779                                 const webrtc::VideoCodec& codec)) {  // NOLINT
    780     WEBRTC_CHECK_CHANNEL(channel);
    781     channels_[channel]->recv_codecs.push_back(codec);
    782     return 0;
    783   };
    784   WEBRTC_STUB_CONST(GetReceiveCodec, (const int, webrtc::VideoCodec&));
    785   WEBRTC_STUB_CONST(GetCodecConfigParameters, (const int,
    786       unsigned char*, unsigned char&));
    787   WEBRTC_STUB(SetImageScaleStatus, (const int, const bool));
    788   WEBRTC_STUB_CONST(GetSendCodecStastistics, (const int,
    789       unsigned int&, unsigned int&));
    790   WEBRTC_STUB_CONST(GetReceiveCodecStastistics, (const int,
    791       unsigned int&, unsigned int&));
    792   WEBRTC_STUB_CONST(GetReceiveSideDelay, (const int video_channel,
    793                                           int* delay_ms));
    794   WEBRTC_FUNC_CONST(GetCodecTargetBitrate, (const int channel,
    795       unsigned int* codec_target_bitrate)) {
    796     WEBRTC_CHECK_CHANNEL(channel);
    797 
    798     std::map<int, Channel*>::const_iterator it = channels_.find(channel);
    799     if (it->second->send) {
    800       // Assume the encoder produces the expected rate.
    801       *codec_target_bitrate = it->second->send_video_bitrate_;
    802     } else {
    803       *codec_target_bitrate = 0;
    804     }
    805     return 0;
    806   }
    807   virtual unsigned int GetDiscardedPackets(const int channel) const {
    808     return 0;
    809   }
    810 
    811   WEBRTC_STUB(SetKeyFrameRequestCallbackStatus, (const int, const bool));
    812   WEBRTC_STUB(SetSignalKeyPacketLossStatus, (const int, const bool,
    813       const bool));
    814   WEBRTC_STUB(RegisterEncoderObserver, (const int,
    815       webrtc::ViEEncoderObserver&));
    816   WEBRTC_STUB(DeregisterEncoderObserver, (const int));
    817   WEBRTC_STUB(RegisterDecoderObserver, (const int,
    818       webrtc::ViEDecoderObserver&));
    819   WEBRTC_STUB(DeregisterDecoderObserver, (const int));
    820   WEBRTC_STUB(SendKeyFrame, (const int));
    821   WEBRTC_STUB(WaitForFirstKeyFrame, (const int, const bool));
    822   WEBRTC_STUB(StartDebugRecording, (int, const char*));
    823   WEBRTC_STUB(StopDebugRecording, (int));
    824   WEBRTC_VOID_FUNC(SuspendBelowMinBitrate, (int channel)) {
    825     WEBRTC_ASSERT_CHANNEL(channel);
    826     channels_[channel]->suspend_below_min_bitrate_ = true;
    827   }
    828 
    829   // webrtc::ViECapture
    830   WEBRTC_STUB(NumberOfCaptureDevices, ());
    831   WEBRTC_STUB(GetCaptureDevice, (unsigned int, char*,
    832       const unsigned int, char*, const unsigned int));
    833   WEBRTC_STUB(AllocateCaptureDevice, (const char*, const unsigned int, int&));
    834   WEBRTC_FUNC(AllocateExternalCaptureDevice,
    835               (int& capture_id, webrtc::ViEExternalCapture*& capture)) {
    836     if (fail_alloc_capturer_) {
    837       return -1;
    838     }
    839     if (kViECaptureIdMax == last_capturer_) {
    840       return -1;
    841     }
    842     Capturer* cap = new Capturer();
    843     capturers_[++last_capturer_] = cap;
    844     capture_id = last_capturer_;
    845     capture = cap;
    846     return 0;
    847   }
    848   WEBRTC_STUB(AllocateCaptureDevice, (webrtc::VideoCaptureModule&, int&));
    849   WEBRTC_FUNC(ReleaseCaptureDevice, (const int capture_id)) {
    850     WEBRTC_CHECK_CAPTURER(capture_id);
    851     delete capturers_[capture_id];
    852     capturers_.erase(capture_id);
    853     return 0;
    854   }
    855   WEBRTC_FUNC(ConnectCaptureDevice, (const int capture_id,
    856                                      const int channel)) {
    857     WEBRTC_CHECK_CHANNEL(channel);
    858     WEBRTC_CHECK_CAPTURER(capture_id);
    859     channels_[channel]->capture_id_ = capture_id;
    860     capturers_[capture_id]->set_channel_id(channel);
    861     return 0;
    862   }
    863   WEBRTC_FUNC(DisconnectCaptureDevice, (const int channel)) {
    864     WEBRTC_CHECK_CHANNEL(channel);
    865     int capture_id = channels_[channel]->capture_id_;
    866     WEBRTC_CHECK_CAPTURER(capture_id);
    867     channels_[channel]->capture_id_ = -1;
    868     capturers_[capture_id]->set_channel_id(-1);
    869     return 0;
    870   }
    871   WEBRTC_STUB(StartCapture, (const int, const webrtc::CaptureCapability&));
    872   WEBRTC_STUB(StopCapture, (const int));
    873   WEBRTC_STUB(SetRotateCapturedFrames, (const int,
    874       const webrtc::RotateCapturedFrame));
    875   WEBRTC_STUB(SetCaptureDelay, (const int, const unsigned int));
    876   WEBRTC_STUB(NumberOfCapabilities, (const char*, const unsigned int));
    877   WEBRTC_STUB(GetCaptureCapability, (const char*, const unsigned int,
    878       const unsigned int, webrtc::CaptureCapability&));
    879   WEBRTC_STUB(ShowCaptureSettingsDialogBox, (const char*, const unsigned int,
    880       const char*, void*, const unsigned int, const unsigned int));
    881   WEBRTC_STUB(GetOrientation, (const char*, webrtc::RotateCapturedFrame&));
    882   WEBRTC_STUB(EnableBrightnessAlarm, (const int, const bool));
    883   WEBRTC_STUB(RegisterObserver, (const int, webrtc::ViECaptureObserver&));
    884   WEBRTC_STUB(DeregisterObserver, (const int));
    885 
    886   // webrtc::ViENetwork
    887   WEBRTC_VOID_FUNC(SetNetworkTransmissionState, (const int channel,
    888                                                  const bool is_transmitting)) {
    889     WEBRTC_ASSERT_CHANNEL(channel);
    890     channels_[channel]->can_transmit_ = is_transmitting;
    891   }
    892   WEBRTC_STUB(RegisterSendTransport, (const int, webrtc::Transport&));
    893   WEBRTC_STUB(DeregisterSendTransport, (const int));
    894 
    895   WEBRTC_FUNC(ReceivedRTPPacket, (const int channel,
    896                                   const void* packet,
    897                                   const int length,
    898                                   const webrtc::PacketTime& packet_time)) {
    899     WEBRTC_ASSERT_CHANNEL(channel);
    900     ASSERT(length > 1);
    901     uint8_t payload_type = static_cast<const uint8_t*>(packet)[1] & 0x7F;
    902     channels_[channel]->last_recvd_payload_type_ = payload_type;
    903     return 0;
    904   }
    905 
    906   WEBRTC_STUB(ReceivedRTCPPacket, (const int, const void*, const int));
    907   // Not using WEBRTC_STUB due to bool return value
    908   virtual bool IsIPv6Enabled(int channel) { return true; }
    909   WEBRTC_STUB(SetMTU, (int, unsigned int));
    910   WEBRTC_STUB(ReceivedBWEPacket, (const int, int64_t, int,
    911       const webrtc::RTPHeader&));
    912   virtual bool SetBandwidthEstimationConfig(int, const webrtc::Config&) {
    913     return true;
    914   }
    915 
    916   // webrtc::ViERender
    917   WEBRTC_STUB(RegisterVideoRenderModule, (webrtc::VideoRender&));
    918   WEBRTC_STUB(DeRegisterVideoRenderModule, (webrtc::VideoRender&));
    919   WEBRTC_STUB(AddRenderer, (const int, void*, const unsigned int, const float,
    920       const float, const float, const float));
    921   WEBRTC_FUNC(RemoveRenderer, (const int render_id)) {
    922     if (IsCapturerId(render_id)) {
    923       WEBRTC_CHECK_CAPTURER(render_id);
    924       return 0;
    925     } else if (IsChannelId(render_id)) {
    926       WEBRTC_CHECK_CHANNEL(render_id);
    927       channels_[render_id]->has_renderer_ = false;
    928       return 0;
    929     }
    930     return -1;
    931   }
    932   WEBRTC_FUNC(StartRender, (const int render_id)) {
    933     if (IsCapturerId(render_id)) {
    934       WEBRTC_CHECK_CAPTURER(render_id);
    935       return 0;
    936     } else if (IsChannelId(render_id)) {
    937       WEBRTC_CHECK_CHANNEL(render_id);
    938       channels_[render_id]->render_started_ = true;
    939       return 0;
    940     }
    941     return -1;
    942   }
    943   WEBRTC_FUNC(StopRender, (const int render_id)) {
    944     if (IsCapturerId(render_id)) {
    945       WEBRTC_CHECK_CAPTURER(render_id);
    946       return 0;
    947     } else if (IsChannelId(render_id)) {
    948       WEBRTC_CHECK_CHANNEL(render_id);
    949       channels_[render_id]->render_started_ = false;
    950       return 0;
    951     }
    952     return -1;
    953   }
    954   WEBRTC_STUB(SetExpectedRenderDelay, (int render_id, int render_delay));
    955   WEBRTC_STUB(ConfigureRender, (int, const unsigned int, const float,
    956       const float, const float, const float));
    957   WEBRTC_STUB(MirrorRenderStream, (const int, const bool, const bool,
    958       const bool));
    959   WEBRTC_FUNC(AddRenderer, (const int render_id,
    960                             webrtc::RawVideoType video_type,
    961                             webrtc::ExternalRenderer* renderer)) {
    962     if (IsCapturerId(render_id)) {
    963       WEBRTC_CHECK_CAPTURER(render_id);
    964       return 0;
    965     } else if (IsChannelId(render_id)) {
    966       WEBRTC_CHECK_CHANNEL(render_id);
    967       channels_[render_id]->has_renderer_ = true;
    968       return 0;
    969     }
    970     return -1;
    971   }
    972 
    973   // webrtc::ViERTP_RTCP
    974   WEBRTC_FUNC(SetLocalSSRC, (const int channel,
    975                              const unsigned int ssrc,
    976                              const webrtc::StreamType usage,
    977                              const unsigned char idx)) {
    978     WEBRTC_CHECK_CHANNEL(channel);
    979     switch (usage) {
    980       case webrtc::kViEStreamTypeNormal:
    981         channels_[channel]->ssrcs_[idx] = ssrc;
    982         break;
    983       case webrtc::kViEStreamTypeRtx:
    984         channels_[channel]->rtx_ssrcs_[idx] = ssrc;
    985         break;
    986       default:
    987         return -1;
    988     }
    989     return 0;
    990   }
    991 
    992   WEBRTC_FUNC_CONST(SetRemoteSSRCType, (const int channel,
    993         const webrtc::StreamType usage, const unsigned int ssrc)) {
    994     WEBRTC_CHECK_CHANNEL(channel);
    995     if (usage == webrtc::kViEStreamTypeRtx) {
    996       channels_.find(channel)->second->remote_rtx_ssrc_ = ssrc;
    997       return 0;
    998     }
    999     return -1;
   1000   }
   1001 
   1002   WEBRTC_FUNC_CONST(GetLocalSSRC, (const int channel,
   1003                                    unsigned int& ssrc)) {
   1004     // ssrcs_[0] is the default local ssrc.
   1005     WEBRTC_CHECK_CHANNEL(channel);
   1006     ssrc = channels_.find(channel)->second->ssrcs_[0];
   1007     return 0;
   1008   }
   1009   WEBRTC_STUB_CONST(GetRemoteSSRC, (const int, unsigned int&));
   1010   WEBRTC_STUB_CONST(GetRemoteCSRCs, (const int, unsigned int*));
   1011 
   1012   WEBRTC_FUNC(SetRtxSendPayloadType, (const int channel,
   1013                                       const uint8 payload_type)) {
   1014     WEBRTC_CHECK_CHANNEL(channel);
   1015     channels_[channel]->rtx_send_payload_type = payload_type;
   1016     return 0;
   1017   }
   1018 
   1019 #ifdef USE_WEBRTC_DEV_BRANCH
   1020   WEBRTC_STUB(SetPadWithRedundantPayloads, (int, bool));
   1021 #endif
   1022 
   1023   WEBRTC_FUNC(SetRtxReceivePayloadType, (const int channel,
   1024                                          const uint8 payload_type)) {
   1025     WEBRTC_CHECK_CHANNEL(channel);
   1026     channels_[channel]->rtx_recv_payload_type = payload_type;
   1027     return 0;
   1028   }
   1029 
   1030   WEBRTC_STUB(SetStartSequenceNumber, (const int, unsigned short));
   1031   WEBRTC_FUNC(SetRTCPStatus,
   1032               (const int channel, const webrtc::ViERTCPMode mode)) {
   1033     WEBRTC_CHECK_CHANNEL(channel);
   1034     channels_[channel]->rtcp_status_ = mode;
   1035     return 0;
   1036   }
   1037   WEBRTC_STUB_CONST(GetRTCPStatus, (const int, webrtc::ViERTCPMode&));
   1038   WEBRTC_FUNC(SetRTCPCName, (const int channel,
   1039                              const char rtcp_cname[KMaxRTCPCNameLength])) {
   1040     WEBRTC_CHECK_CHANNEL(channel);
   1041     channels_[channel]->cname_.assign(rtcp_cname);
   1042     return 0;
   1043   }
   1044   WEBRTC_FUNC_CONST(GetRTCPCName, (const int channel,
   1045                                    char rtcp_cname[KMaxRTCPCNameLength])) {
   1046     WEBRTC_CHECK_CHANNEL(channel);
   1047     rtc::strcpyn(rtcp_cname, KMaxRTCPCNameLength,
   1048                        channels_.find(channel)->second->cname_.c_str());
   1049     return 0;
   1050   }
   1051   WEBRTC_STUB_CONST(GetRemoteRTCPCName, (const int, char*));
   1052   WEBRTC_STUB(SendApplicationDefinedRTCPPacket, (const int, const unsigned char,
   1053       unsigned int, const char*, unsigned short));
   1054   WEBRTC_FUNC(SetNACKStatus, (const int channel, const bool enable)) {
   1055     WEBRTC_CHECK_CHANNEL(channel);
   1056     channels_[channel]->nack_ = enable;
   1057     channels_[channel]->hybrid_nack_fec_ = false;
   1058     return 0;
   1059   }
   1060   WEBRTC_STUB(SetFECStatus, (const int, const bool, const unsigned char,
   1061       const unsigned char));
   1062   WEBRTC_FUNC(SetHybridNACKFECStatus, (const int channel, const bool enable,
   1063       const unsigned char red_type, const unsigned char fec_type)) {
   1064     WEBRTC_CHECK_CHANNEL(channel);
   1065     if (red_type == fec_type ||
   1066         red_type == channels_[channel]->send_codec.plType ||
   1067         fec_type == channels_[channel]->send_codec.plType) {
   1068       return -1;
   1069     }
   1070     channels_[channel]->nack_ = false;
   1071     channels_[channel]->hybrid_nack_fec_ = enable;
   1072     return 0;
   1073   }
   1074   WEBRTC_FUNC(SetKeyFrameRequestMethod,
   1075               (const int channel,
   1076                const webrtc::ViEKeyFrameRequestMethod method)) {
   1077     WEBRTC_CHECK_CHANNEL(channel);
   1078     channels_[channel]->key_frame_request_method_ = method;
   1079     return 0;
   1080   }
   1081   WEBRTC_FUNC(SetSenderBufferingMode, (int channel, int target_delay)) {
   1082     WEBRTC_CHECK_CHANNEL(channel);
   1083     channels_[channel]->sender_target_delay_ = target_delay;
   1084     return 0;
   1085   }
   1086   WEBRTC_FUNC(SetReceiverBufferingMode, (int channel, int target_delay)) {
   1087     WEBRTC_CHECK_CHANNEL(channel);
   1088     channels_[channel]->receiver_target_delay_ = target_delay;
   1089     return 0;
   1090   }
   1091   // |Send| and |receive| are stored locally in variables that more clearly
   1092   // explain what they mean.
   1093   WEBRTC_FUNC(SetRembStatus, (int channel, bool send, bool receive)) {
   1094     WEBRTC_CHECK_CHANNEL(channel);
   1095     channels_[channel]->remb_contribute_ = receive;
   1096     channels_[channel]->remb_bw_partition_ = send;
   1097     return 0;
   1098   }
   1099   WEBRTC_FUNC(SetTMMBRStatus, (const int channel, const bool enable)) {
   1100     WEBRTC_CHECK_CHANNEL(channel);
   1101     channels_[channel]->tmmbr_ = enable;
   1102     return 0;
   1103   }
   1104   WEBRTC_FUNC(SetSendTimestampOffsetStatus, (int channel, bool enable,
   1105       int id)) {
   1106     WEBRTC_CHECK_CHANNEL(channel);
   1107     channels_[channel]->rtp_offset_send_id_ = (enable) ? id : -1;
   1108     return 0;
   1109   }
   1110   WEBRTC_FUNC(SetReceiveTimestampOffsetStatus, (int channel, bool enable,
   1111       int id)) {
   1112     WEBRTC_CHECK_CHANNEL(channel);
   1113     channels_[channel]->rtp_offset_receive_id_ = (enable) ? id : -1;
   1114     return 0;
   1115   }
   1116   WEBRTC_FUNC(SetSendAbsoluteSendTimeStatus, (int channel, bool enable,
   1117       int id)) {
   1118     WEBRTC_CHECK_CHANNEL(channel);
   1119     channels_[channel]->rtp_absolute_send_time_send_id_ = (enable) ? id : -1;
   1120     return 0;
   1121   }
   1122   WEBRTC_FUNC(SetReceiveAbsoluteSendTimeStatus, (int channel, bool enable,
   1123       int id)) {
   1124     WEBRTC_CHECK_CHANNEL(channel);
   1125     channels_[channel]->rtp_absolute_send_time_receive_id_ = (enable) ? id : -1;
   1126     return 0;
   1127   }
   1128   WEBRTC_STUB(SetRtcpXrRrtrStatus, (int, bool));
   1129   WEBRTC_FUNC(SetTransmissionSmoothingStatus, (int channel, bool enable)) {
   1130     WEBRTC_CHECK_CHANNEL(channel);
   1131     channels_[channel]->transmission_smoothing_ = enable;
   1132     return 0;
   1133   }
   1134   WEBRTC_FUNC(SetReservedTransmitBitrate, (int channel,
   1135       unsigned int reserved_transmit_bitrate_bps)) {
   1136     WEBRTC_CHECK_CHANNEL(channel);
   1137     channels_[channel]->reserved_transmit_bitrate_bps_ =
   1138         reserved_transmit_bitrate_bps;
   1139     return 0;
   1140   }
   1141   WEBRTC_STUB_CONST(GetRtcpPacketTypeCounters, (int,
   1142       webrtc::RtcpPacketTypeCounter*, webrtc::RtcpPacketTypeCounter*));
   1143   WEBRTC_STUB_CONST(GetReceivedRTCPStatistics, (const int, unsigned short&,
   1144       unsigned int&, unsigned int&, unsigned int&, int&));
   1145   WEBRTC_STUB_CONST(GetSentRTCPStatistics, (const int, unsigned short&,
   1146       unsigned int&, unsigned int&, unsigned int&, int&));
   1147   WEBRTC_STUB_CONST(GetRTPStatistics, (const int, unsigned int&, unsigned int&,
   1148       unsigned int&, unsigned int&));
   1149   WEBRTC_STUB_CONST(GetReceiveChannelRtcpStatistics, (const int,
   1150       webrtc::RtcpStatistics&, int&));
   1151   WEBRTC_STUB_CONST(GetSendChannelRtcpStatistics, (const int,
   1152       webrtc::RtcpStatistics&, int&));
   1153   WEBRTC_STUB_CONST(GetRtpStatistics, (const int, webrtc::StreamDataCounters&,
   1154       webrtc::StreamDataCounters&));
   1155   WEBRTC_FUNC_CONST(GetBandwidthUsage, (const int channel,
   1156       unsigned int& total_bitrate, unsigned int& video_bitrate,
   1157       unsigned int& fec_bitrate, unsigned int& nack_bitrate)) {
   1158     WEBRTC_CHECK_CHANNEL(channel);
   1159     std::map<int, Channel*>::const_iterator it = channels_.find(channel);
   1160     if (it->second->send) {
   1161       video_bitrate = it->second->send_video_bitrate_;
   1162       fec_bitrate = it->second->send_fec_bitrate_;
   1163       nack_bitrate = it->second->send_nack_bitrate_;
   1164       total_bitrate = video_bitrate + fec_bitrate + nack_bitrate;
   1165     } else {
   1166       total_bitrate = 0;
   1167       video_bitrate = 0;
   1168       fec_bitrate = 0;
   1169       nack_bitrate = 0;
   1170     }
   1171     return 0;
   1172   }
   1173   WEBRTC_FUNC_CONST(GetEstimatedSendBandwidth, (const int channel,
   1174       unsigned int* send_bandwidth_estimate)) {
   1175     WEBRTC_CHECK_CHANNEL(channel);
   1176     std::map<int, Channel*>::const_iterator it = channels_.find(channel);
   1177     // Assume the current video, fec and nack bitrate sums up to our estimate.
   1178     if (it->second->send) {
   1179       it = channels_.find(GetOriginalChannelId(channel));
   1180       *send_bandwidth_estimate = it->second->send_bandwidth_;
   1181     } else {
   1182       *send_bandwidth_estimate = 0;
   1183     }
   1184     return 0;
   1185   }
   1186   WEBRTC_FUNC_CONST(GetEstimatedReceiveBandwidth, (const int channel,
   1187       unsigned int* receive_bandwidth_estimate)) {
   1188     WEBRTC_CHECK_CHANNEL(channel);
   1189     std::map<int, Channel*>::const_iterator it = channels_.find(channel);
   1190     if (it->second->receive_) {
   1191       it = channels_.find(GetOriginalChannelId(channel));
   1192       *receive_bandwidth_estimate = it->second->receive_bandwidth_;
   1193     } else {
   1194       *receive_bandwidth_estimate = 0;
   1195     }
   1196     return 0;
   1197   }
   1198   WEBRTC_STUB(RegisterSendChannelRtcpStatisticsCallback,
   1199                     (int, webrtc::RtcpStatisticsCallback*));
   1200   WEBRTC_STUB(DeregisterSendChannelRtcpStatisticsCallback,
   1201                     (int, webrtc::RtcpStatisticsCallback*));
   1202   WEBRTC_STUB(RegisterReceiveChannelRtcpStatisticsCallback,
   1203                     (int, webrtc::RtcpStatisticsCallback*));
   1204   WEBRTC_STUB(DeregisterReceiveChannelRtcpStatisticsCallback,
   1205                     (int, webrtc::RtcpStatisticsCallback*));
   1206   WEBRTC_STUB(RegisterSendChannelRtpStatisticsCallback,
   1207                     (int, webrtc::StreamDataCountersCallback*));
   1208   WEBRTC_STUB(DeregisterSendChannelRtpStatisticsCallback,
   1209                     (int, webrtc::StreamDataCountersCallback*));
   1210   WEBRTC_STUB(RegisterReceiveChannelRtpStatisticsCallback,
   1211                     (int, webrtc::StreamDataCountersCallback*));
   1212   WEBRTC_STUB(DeregisterReceiveChannelRtpStatisticsCallback,
   1213                     (int, webrtc::StreamDataCountersCallback*));
   1214   WEBRTC_STUB(RegisterSendBitrateObserver,
   1215                     (int, webrtc::BitrateStatisticsObserver*));
   1216   WEBRTC_STUB(DeregisterSendBitrateObserver,
   1217                     (int, webrtc::BitrateStatisticsObserver*));
   1218   WEBRTC_STUB(RegisterSendFrameCountObserver,
   1219                     (int, webrtc::FrameCountObserver*));
   1220   WEBRTC_STUB(DeregisterSendFrameCountObserver,
   1221                     (int, webrtc::FrameCountObserver*));
   1222 
   1223   WEBRTC_STUB(StartRTPDump, (const int, const char*, webrtc::RTPDirections));
   1224   WEBRTC_STUB(StopRTPDump, (const int, webrtc::RTPDirections));
   1225   WEBRTC_STUB(RegisterRTPObserver, (const int, webrtc::ViERTPObserver&));
   1226   WEBRTC_STUB(DeregisterRTPObserver, (const int));
   1227   WEBRTC_STUB(RegisterRTCPObserver, (const int, webrtc::ViERTCPObserver&));
   1228   WEBRTC_STUB(DeregisterRTCPObserver, (const int));
   1229 
   1230   // webrtc::ViEImageProcess
   1231   WEBRTC_STUB(RegisterCaptureEffectFilter, (const int,
   1232       webrtc::ViEEffectFilter&));
   1233   WEBRTC_STUB(DeregisterCaptureEffectFilter, (const int));
   1234   WEBRTC_STUB(RegisterSendEffectFilter, (const int,
   1235       webrtc::ViEEffectFilter&));
   1236   WEBRTC_STUB(DeregisterSendEffectFilter, (const int));
   1237   WEBRTC_STUB(RegisterRenderEffectFilter, (const int,
   1238       webrtc::ViEEffectFilter&));
   1239   WEBRTC_STUB(DeregisterRenderEffectFilter, (const int));
   1240   WEBRTC_STUB(EnableDeflickering, (const int, const bool));
   1241   WEBRTC_FUNC(EnableDenoising, (const int capture_id, const bool denoising)) {
   1242     WEBRTC_CHECK_CAPTURER(capture_id);
   1243     capturers_[capture_id]->set_denoising(denoising);
   1244     return 0;
   1245   }
   1246   WEBRTC_STUB(EnableColorEnhancement, (const int, const bool));
   1247   WEBRTC_VOID_STUB(RegisterPreEncodeCallback,
   1248                    (int, webrtc::I420FrameCallback*));
   1249   WEBRTC_VOID_STUB(DeRegisterPreEncodeCallback, (int));
   1250   WEBRTC_VOID_STUB(RegisterPreRenderCallback,
   1251                    (int, webrtc::I420FrameCallback*));
   1252   WEBRTC_VOID_STUB(DeRegisterPreRenderCallback, (int));
   1253   // webrtc::ViEExternalCodec
   1254   WEBRTC_FUNC(RegisterExternalSendCodec,
   1255       (const int channel, const unsigned char pl_type, webrtc::VideoEncoder*,
   1256           bool)) {
   1257     WEBRTC_CHECK_CHANNEL(channel);
   1258     channels_[channel]->ext_encoder_pl_types_.insert(pl_type);
   1259     return 0;
   1260   }
   1261   WEBRTC_FUNC(DeRegisterExternalSendCodec,
   1262       (const int channel, const unsigned char pl_type)) {
   1263     WEBRTC_CHECK_CHANNEL(channel);
   1264     channels_[channel]->ext_encoder_pl_types_.erase(pl_type);
   1265     return 0;
   1266   }
   1267   WEBRTC_FUNC(RegisterExternalReceiveCodec,
   1268       (const int channel, const unsigned int pl_type, webrtc::VideoDecoder*,
   1269        bool, int)) {
   1270     WEBRTC_CHECK_CHANNEL(channel);
   1271     channels_[channel]->ext_decoder_pl_types_.insert(pl_type);
   1272     return 0;
   1273   }
   1274   WEBRTC_FUNC(DeRegisterExternalReceiveCodec,
   1275       (const int channel, const unsigned char pl_type)) {
   1276     WEBRTC_CHECK_CHANNEL(channel);
   1277     channels_[channel]->ext_decoder_pl_types_.erase(pl_type);
   1278     return 0;
   1279   }
   1280 
   1281  private:
   1282   bool IsChannelId(int id) const {
   1283     return (id >= kViEChannelIdBase && id <= kViEChannelIdMax);
   1284   }
   1285   bool IsCapturerId(int id) const {
   1286     return (id >= kViECaptureIdBase && id <= kViECaptureIdMax);
   1287   }
   1288 
   1289   bool inited_;
   1290   int last_channel_;
   1291   std::map<int, Channel*> channels_;
   1292   bool fail_create_channel_;
   1293   int last_capturer_;
   1294   std::map<int, Capturer*> capturers_;
   1295   bool fail_alloc_capturer_;
   1296   const cricket::VideoCodec* const* codecs_;
   1297   int num_codecs_;
   1298   int num_set_send_codecs_;  // how many times we call SetSendCodec().
   1299 };
   1300 
   1301 }  // namespace cricket
   1302 
   1303 #endif  // TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_
   1304