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/base/basictypes.h" 36 #include "talk/base/stringutils.h" 37 #include "talk/media/base/codec.h" 38 #include "talk/media/webrtc/fakewebrtccommon.h" 39 #include "talk/media/webrtc/webrtcvideodecoderfactory.h" 40 #include "talk/media/webrtc/webrtcvideoencoderfactory.h" 41 #include "talk/media/webrtc/webrtcvie.h" 42 43 namespace webrtc { 44 45 bool operator==(const webrtc::VideoCodec& c1, const webrtc::VideoCodec& c2) { 46 return memcmp(&c1, &c2, sizeof(c1)) == 0; 47 } 48 49 } 50 51 namespace cricket { 52 53 #define WEBRTC_CHECK_CAPTURER(capturer) \ 54 if (capturers_.find(capturer) == capturers_.end()) return -1; 55 56 #define WEBRTC_ASSERT_CAPTURER(capturer) \ 57 ASSERT(capturers_.find(capturer) != capturers_.end()); 58 59 static const int kMinVideoBitrate = 100; 60 static const int kStartVideoBitrate = 300; 61 static const int kMaxVideoBitrate = 1000; 62 63 // WebRtc channel id and capture id share the same number space. 64 // This is how AddRenderer(renderId, ...) is able to tell if it is adding a 65 // renderer for a channel or it is adding a renderer for a capturer. 66 static const int kViEChannelIdBase = 0; 67 static const int kViEChannelIdMax = 1000; 68 static const int kViECaptureIdBase = 10000; // Make sure there is a gap. 69 static const int kViECaptureIdMax = 11000; 70 71 // Fake class for mocking out webrtc::VideoDecoder 72 class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder { 73 public: 74 FakeWebRtcVideoDecoder() 75 : num_frames_received_(0) { 76 } 77 78 virtual int32 InitDecode(const webrtc::VideoCodec*, int32) { 79 return WEBRTC_VIDEO_CODEC_OK; 80 } 81 82 virtual int32 Decode( 83 const webrtc::EncodedImage&, bool, const webrtc::RTPFragmentationHeader*, 84 const webrtc::CodecSpecificInfo*, int64) { 85 num_frames_received_++; 86 return WEBRTC_VIDEO_CODEC_OK; 87 } 88 89 virtual int32 RegisterDecodeCompleteCallback( 90 webrtc::DecodedImageCallback*) { 91 return WEBRTC_VIDEO_CODEC_OK; 92 } 93 94 virtual int32 Release() { 95 return WEBRTC_VIDEO_CODEC_OK; 96 } 97 98 virtual int32 Reset() { 99 return WEBRTC_VIDEO_CODEC_OK; 100 } 101 102 int GetNumFramesReceived() const { 103 return num_frames_received_; 104 } 105 106 private: 107 int num_frames_received_; 108 }; 109 110 // Fake class for mocking out WebRtcVideoDecoderFactory. 111 class FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory { 112 public: 113 FakeWebRtcVideoDecoderFactory() 114 : num_created_decoders_(0) { 115 } 116 117 virtual webrtc::VideoDecoder* CreateVideoDecoder( 118 webrtc::VideoCodecType type) { 119 if (supported_codec_types_.count(type) == 0) { 120 return NULL; 121 } 122 FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder(); 123 decoders_.push_back(decoder); 124 num_created_decoders_++; 125 return decoder; 126 } 127 128 virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) { 129 decoders_.erase( 130 std::remove(decoders_.begin(), decoders_.end(), decoder), 131 decoders_.end()); 132 delete decoder; 133 } 134 135 void AddSupportedVideoCodecType(webrtc::VideoCodecType type) { 136 supported_codec_types_.insert(type); 137 } 138 139 int GetNumCreatedDecoders() { 140 return num_created_decoders_; 141 } 142 143 const std::vector<FakeWebRtcVideoDecoder*>& decoders() { 144 return decoders_; 145 } 146 147 private: 148 std::set<webrtc::VideoCodecType> supported_codec_types_; 149 std::vector<FakeWebRtcVideoDecoder*> decoders_; 150 int num_created_decoders_; 151 }; 152 153 // Fake class for mocking out webrtc::VideoEnoder 154 class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { 155 public: 156 FakeWebRtcVideoEncoder() {} 157 158 virtual int32 InitEncode(const webrtc::VideoCodec* codecSettings, 159 int32 numberOfCores, 160 uint32 maxPayloadSize) { 161 return WEBRTC_VIDEO_CODEC_OK; 162 } 163 164 virtual int32 Encode( 165 const webrtc::I420VideoFrame& inputImage, 166 const webrtc::CodecSpecificInfo* codecSpecificInfo, 167 const std::vector<webrtc::VideoFrameType>* frame_types) { 168 return WEBRTC_VIDEO_CODEC_OK; 169 } 170 171 virtual int32 RegisterEncodeCompleteCallback( 172 webrtc::EncodedImageCallback* callback) { 173 return WEBRTC_VIDEO_CODEC_OK; 174 } 175 176 virtual int32 Release() { 177 return WEBRTC_VIDEO_CODEC_OK; 178 } 179 180 virtual int32 SetChannelParameters(uint32 packetLoss, 181 int rtt) { 182 return WEBRTC_VIDEO_CODEC_OK; 183 } 184 185 virtual int32 SetRates(uint32 newBitRate, 186 uint32 frameRate) { 187 return WEBRTC_VIDEO_CODEC_OK; 188 } 189 }; 190 191 // Fake class for mocking out WebRtcVideoEncoderFactory. 192 class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory { 193 public: 194 FakeWebRtcVideoEncoderFactory() 195 : num_created_encoders_(0) { 196 } 197 198 virtual webrtc::VideoEncoder* CreateVideoEncoder( 199 webrtc::VideoCodecType type) { 200 if (supported_codec_types_.count(type) == 0) { 201 return NULL; 202 } 203 FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder(); 204 encoders_.push_back(encoder); 205 num_created_encoders_++; 206 return encoder; 207 } 208 209 virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) { 210 encoders_.erase( 211 std::remove(encoders_.begin(), encoders_.end(), encoder), 212 encoders_.end()); 213 delete encoder; 214 } 215 216 virtual void AddObserver(WebRtcVideoEncoderFactory::Observer* observer) { 217 bool inserted = observers_.insert(observer).second; 218 EXPECT_TRUE(inserted); 219 } 220 221 virtual void RemoveObserver(WebRtcVideoEncoderFactory::Observer* observer) { 222 size_t erased = observers_.erase(observer); 223 EXPECT_EQ(erased, 1UL); 224 } 225 226 virtual const std::vector<WebRtcVideoEncoderFactory::VideoCodec>& codecs() 227 const { 228 return codecs_; 229 } 230 231 void AddSupportedVideoCodecType(webrtc::VideoCodecType type, 232 const std::string& name) { 233 supported_codec_types_.insert(type); 234 codecs_.push_back( 235 WebRtcVideoEncoderFactory::VideoCodec(type, name, 1280, 720, 30)); 236 } 237 238 void NotifyCodecsAvailable() { 239 std::set<WebRtcVideoEncoderFactory::Observer*>::iterator it; 240 for (it = observers_.begin(); it != observers_.end(); ++it) 241 (*it)->OnCodecsAvailable(); 242 } 243 244 int GetNumCreatedEncoders() { 245 return num_created_encoders_; 246 } 247 248 const std::vector<FakeWebRtcVideoEncoder*>& encoders() { 249 return encoders_; 250 } 251 252 private: 253 std::set<webrtc::VideoCodecType> supported_codec_types_; 254 std::vector<WebRtcVideoEncoderFactory::VideoCodec> codecs_; 255 std::vector<FakeWebRtcVideoEncoder*> encoders_; 256 std::set<WebRtcVideoEncoderFactory::Observer*> observers_; 257 int num_created_encoders_; 258 }; 259 260 class FakeWebRtcVideoEngine 261 : public webrtc::ViEBase, 262 public webrtc::ViECodec, 263 public webrtc::ViECapture, 264 public webrtc::ViENetwork, 265 public webrtc::ViERender, 266 public webrtc::ViERTP_RTCP, 267 public webrtc::ViEImageProcess, 268 public webrtc::ViEExternalCodec { 269 public: 270 struct Channel { 271 Channel() 272 : capture_id_(-1), 273 original_channel_id_(-1), 274 has_renderer_(false), 275 render_started_(false), 276 send(false), 277 receive_(false), 278 can_transmit_(true), 279 rtcp_status_(webrtc::kRtcpNone), 280 key_frame_request_method_(webrtc::kViEKeyFrameRequestNone), 281 tmmbr_(false), 282 remb_contribute_(false), 283 remb_bw_partition_(false), 284 rtp_offset_send_id_(0), 285 rtp_offset_receive_id_(0), 286 rtp_absolute_send_time_send_id_(0), 287 rtp_absolute_send_time_receive_id_(0), 288 sender_target_delay_(0), 289 receiver_target_delay_(0), 290 transmission_smoothing_(false), 291 nack_(false), 292 hybrid_nack_fec_(false), 293 send_video_bitrate_(0), 294 send_fec_bitrate_(0), 295 send_nack_bitrate_(0), 296 send_bandwidth_(0), 297 receive_bandwidth_(0) { 298 ssrcs_[0] = 0; // default ssrc. 299 memset(&send_codec, 0, sizeof(send_codec)); 300 } 301 int capture_id_; 302 int original_channel_id_; 303 bool has_renderer_; 304 bool render_started_; 305 bool send; 306 bool receive_; 307 bool can_transmit_; 308 std::map<int, int> ssrcs_; 309 std::string cname_; 310 webrtc::ViERTCPMode rtcp_status_; 311 webrtc::ViEKeyFrameRequestMethod key_frame_request_method_; 312 bool tmmbr_; 313 bool remb_contribute_; // This channel contributes to the remb report. 314 bool remb_bw_partition_; // This channel is allocated part of total bw. 315 int rtp_offset_send_id_; 316 int rtp_offset_receive_id_; 317 int rtp_absolute_send_time_send_id_; 318 int rtp_absolute_send_time_receive_id_; 319 int sender_target_delay_; 320 int receiver_target_delay_; 321 bool transmission_smoothing_; 322 bool nack_; 323 bool hybrid_nack_fec_; 324 std::vector<webrtc::VideoCodec> recv_codecs; 325 std::set<unsigned int> ext_decoder_pl_types_; 326 std::set<unsigned int> ext_encoder_pl_types_; 327 webrtc::VideoCodec send_codec; 328 unsigned int send_video_bitrate_; 329 unsigned int send_fec_bitrate_; 330 unsigned int send_nack_bitrate_; 331 unsigned int send_bandwidth_; 332 unsigned int receive_bandwidth_; 333 }; 334 class Capturer : public webrtc::ViEExternalCapture { 335 public: 336 Capturer() : channel_id_(-1), denoising_(false), last_capture_time_(0) { } 337 int channel_id() const { return channel_id_; } 338 void set_channel_id(int channel_id) { channel_id_ = channel_id; } 339 bool denoising() const { return denoising_; } 340 void set_denoising(bool denoising) { denoising_ = denoising; } 341 int64 last_capture_time() { return last_capture_time_; } 342 343 // From ViEExternalCapture 344 virtual int IncomingFrame(unsigned char* videoFrame, 345 unsigned int videoFrameLength, 346 unsigned short width, 347 unsigned short height, 348 webrtc::RawVideoType videoType, 349 unsigned long long captureTime) { 350 return 0; 351 } 352 virtual int IncomingFrameI420( 353 const webrtc::ViEVideoFrameI420& video_frame, 354 unsigned long long captureTime) { 355 last_capture_time_ = captureTime; 356 return 0; 357 } 358 359 private: 360 int channel_id_; 361 bool denoising_; 362 int64 last_capture_time_; 363 }; 364 365 FakeWebRtcVideoEngine(const cricket::VideoCodec* const* codecs, 366 int num_codecs) 367 : inited_(false), 368 last_channel_(kViEChannelIdBase - 1), 369 fail_create_channel_(false), 370 last_capturer_(kViECaptureIdBase - 1), 371 fail_alloc_capturer_(false), 372 codecs_(codecs), 373 num_codecs_(num_codecs), 374 num_set_send_codecs_(0) { 375 } 376 377 ~FakeWebRtcVideoEngine() { 378 ASSERT(0 == channels_.size()); 379 ASSERT(0 == capturers_.size()); 380 } 381 bool IsInited() const { return inited_; } 382 383 int GetLastChannel() const { return last_channel_; } 384 int GetChannelFromLocalSsrc(int local_ssrc) const { 385 // ssrcs_[0] is the default local ssrc. 386 for (std::map<int, Channel*>::const_iterator iter = channels_.begin(); 387 iter != channels_.end(); ++iter) { 388 if (local_ssrc == iter->second->ssrcs_[0]) { 389 return iter->first; 390 } 391 } 392 return -1; 393 } 394 395 int GetNumChannels() const { return static_cast<int>(channels_.size()); } 396 bool IsChannel(int channel) const { 397 return (channels_.find(channel) != channels_.end()); 398 } 399 void set_fail_create_channel(bool fail_create_channel) { 400 fail_create_channel_ = fail_create_channel; 401 } 402 403 int GetLastCapturer() const { return last_capturer_; } 404 int GetNumCapturers() const { return static_cast<int>(capturers_.size()); } 405 void set_fail_alloc_capturer(bool fail_alloc_capturer) { 406 fail_alloc_capturer_ = fail_alloc_capturer; 407 } 408 int num_set_send_codecs() const { return num_set_send_codecs_; } 409 410 int GetCaptureId(int channel) const { 411 WEBRTC_ASSERT_CHANNEL(channel); 412 return channels_.find(channel)->second->capture_id_; 413 } 414 int GetOriginalChannelId(int channel) const { 415 WEBRTC_ASSERT_CHANNEL(channel); 416 return channels_.find(channel)->second->original_channel_id_; 417 } 418 bool GetHasRenderer(int channel) const { 419 WEBRTC_ASSERT_CHANNEL(channel); 420 return channels_.find(channel)->second->has_renderer_; 421 } 422 bool GetRenderStarted(int channel) const { 423 WEBRTC_ASSERT_CHANNEL(channel); 424 return channels_.find(channel)->second->render_started_; 425 } 426 bool GetSend(int channel) const { 427 WEBRTC_ASSERT_CHANNEL(channel); 428 return channels_.find(channel)->second->send; 429 } 430 int GetCaptureChannelId(int capture_id) const { 431 WEBRTC_ASSERT_CAPTURER(capture_id); 432 return capturers_.find(capture_id)->second->channel_id(); 433 } 434 bool GetCaptureDenoising(int capture_id) const { 435 WEBRTC_ASSERT_CAPTURER(capture_id); 436 return capturers_.find(capture_id)->second->denoising(); 437 } 438 int64 GetCaptureLastTimestamp(int capture_id) const { 439 WEBRTC_ASSERT_CAPTURER(capture_id); 440 return capturers_.find(capture_id)->second->last_capture_time(); 441 } 442 webrtc::ViERTCPMode GetRtcpStatus(int channel) const { 443 WEBRTC_ASSERT_CHANNEL(channel); 444 return channels_.find(channel)->second->rtcp_status_; 445 } 446 webrtc::ViEKeyFrameRequestMethod GetKeyFrameRequestMethod(int channel) const { 447 WEBRTC_ASSERT_CHANNEL(channel); 448 return channels_.find(channel)->second->key_frame_request_method_; 449 } 450 bool GetTmmbrStatus(int channel) const { 451 WEBRTC_ASSERT_CHANNEL(channel); 452 return channels_.find(channel)->second->tmmbr_; 453 } 454 bool GetRembStatusBwPartition(int channel) const { 455 WEBRTC_ASSERT_CHANNEL(channel); 456 return channels_.find(channel)->second->remb_bw_partition_; 457 } 458 bool GetRembStatusContribute(int channel) const { 459 WEBRTC_ASSERT_CHANNEL(channel); 460 return channels_.find(channel)->second->remb_contribute_; 461 } 462 int GetSendRtpTimestampOffsetExtensionId(int channel) { 463 WEBRTC_ASSERT_CHANNEL(channel); 464 return channels_.find(channel)->second->rtp_offset_send_id_; 465 } 466 int GetReceiveRtpTimestampOffsetExtensionId(int channel) { 467 WEBRTC_ASSERT_CHANNEL(channel); 468 return channels_.find(channel)->second->rtp_offset_receive_id_; 469 } 470 int GetSendAbsoluteSendTimeExtensionId(int channel) { 471 WEBRTC_ASSERT_CHANNEL(channel); 472 return channels_.find(channel)->second->rtp_absolute_send_time_send_id_; 473 } 474 int GetReceiveAbsoluteSendTimeExtensionId(int channel) { 475 WEBRTC_ASSERT_CHANNEL(channel); 476 return channels_.find(channel)->second->rtp_absolute_send_time_receive_id_; 477 } 478 bool GetTransmissionSmoothingStatus(int channel) { 479 WEBRTC_ASSERT_CHANNEL(channel); 480 return channels_.find(channel)->second->transmission_smoothing_; 481 } 482 int GetSenderTargetDelay(int channel) { 483 WEBRTC_ASSERT_CHANNEL(channel); 484 return channels_.find(channel)->second->sender_target_delay_; 485 } 486 int GetReceiverTargetDelay(int channel) { 487 WEBRTC_ASSERT_CHANNEL(channel); 488 return channels_.find(channel)->second->receiver_target_delay_; 489 } 490 bool GetNackStatus(int channel) const { 491 WEBRTC_ASSERT_CHANNEL(channel); 492 return channels_.find(channel)->second->nack_; 493 } 494 bool GetHybridNackFecStatus(int channel) const { 495 WEBRTC_ASSERT_CHANNEL(channel); 496 return channels_.find(channel)->second->hybrid_nack_fec_; 497 } 498 int GetNumSsrcs(int channel) const { 499 WEBRTC_ASSERT_CHANNEL(channel); 500 return static_cast<int>( 501 channels_.find(channel)->second->ssrcs_.size()); 502 } 503 bool GetIsTransmitting(int channel) const { 504 WEBRTC_ASSERT_CHANNEL(channel); 505 return channels_.find(channel)->second->can_transmit_; 506 } 507 bool ReceiveCodecRegistered(int channel, 508 const webrtc::VideoCodec& codec) const { 509 WEBRTC_ASSERT_CHANNEL(channel); 510 const std::vector<webrtc::VideoCodec>& codecs = 511 channels_.find(channel)->second->recv_codecs; 512 return std::find(codecs.begin(), codecs.end(), codec) != codecs.end(); 513 }; 514 bool ExternalDecoderRegistered(int channel, 515 unsigned int pl_type) const { 516 WEBRTC_ASSERT_CHANNEL(channel); 517 return channels_.find(channel)->second-> 518 ext_decoder_pl_types_.count(pl_type) != 0; 519 }; 520 int GetNumExternalDecoderRegistered(int channel) const { 521 WEBRTC_ASSERT_CHANNEL(channel); 522 return static_cast<int>( 523 channels_.find(channel)->second->ext_decoder_pl_types_.size()); 524 }; 525 bool ExternalEncoderRegistered(int channel, 526 unsigned int pl_type) const { 527 WEBRTC_ASSERT_CHANNEL(channel); 528 return channels_.find(channel)->second-> 529 ext_encoder_pl_types_.count(pl_type) != 0; 530 }; 531 int GetNumExternalEncoderRegistered(int channel) const { 532 WEBRTC_ASSERT_CHANNEL(channel); 533 return static_cast<int>( 534 channels_.find(channel)->second->ext_encoder_pl_types_.size()); 535 }; 536 int GetTotalNumExternalEncoderRegistered() const { 537 std::map<int, Channel*>::const_iterator it; 538 int total_num_registered = 0; 539 for (it = channels_.begin(); it != channels_.end(); ++it) 540 total_num_registered += 541 static_cast<int>(it->second->ext_encoder_pl_types_.size()); 542 return total_num_registered; 543 } 544 void SetSendBitrates(int channel, unsigned int video_bitrate, 545 unsigned int fec_bitrate, unsigned int nack_bitrate) { 546 WEBRTC_ASSERT_CHANNEL(channel); 547 channels_[channel]->send_video_bitrate_ = video_bitrate; 548 channels_[channel]->send_fec_bitrate_ = fec_bitrate; 549 channels_[channel]->send_nack_bitrate_ = nack_bitrate; 550 } 551 void SetSendBandwidthEstimate(int channel, unsigned int send_bandwidth) { 552 WEBRTC_ASSERT_CHANNEL(channel); 553 channels_[channel]->send_bandwidth_ = send_bandwidth; 554 } 555 void SetReceiveBandwidthEstimate(int channel, 556 unsigned int receive_bandwidth) { 557 WEBRTC_ASSERT_CHANNEL(channel); 558 channels_[channel]->receive_bandwidth_ = receive_bandwidth; 559 }; 560 561 WEBRTC_STUB(Release, ()); 562 563 // webrtc::ViEBase 564 WEBRTC_FUNC(Init, ()) { 565 inited_ = true; 566 return 0; 567 }; 568 WEBRTC_STUB(SetVoiceEngine, (webrtc::VoiceEngine*)); 569 WEBRTC_FUNC(CreateChannel, (int& channel)) { // NOLINT 570 if (fail_create_channel_) { 571 return -1; 572 } 573 if (kViEChannelIdMax == last_channel_) { 574 return -1; 575 } 576 Channel* ch = new Channel(); 577 channels_[++last_channel_] = ch; 578 channel = last_channel_; 579 return 0; 580 }; 581 WEBRTC_FUNC(CreateChannel, (int& channel, int original_channel)) { 582 WEBRTC_CHECK_CHANNEL(original_channel); 583 if (CreateChannel(channel) != 0) { 584 return -1; 585 } 586 channels_[channel]->original_channel_id_ = original_channel; 587 return 0; 588 } 589 WEBRTC_FUNC(CreateReceiveChannel, (int& channel, int original_channel)) { 590 return CreateChannel(channel, original_channel); 591 } 592 WEBRTC_FUNC(DeleteChannel, (const int channel)) { 593 WEBRTC_CHECK_CHANNEL(channel); 594 // Make sure we deregister all the decoders before deleting a channel. 595 EXPECT_EQ(0, GetNumExternalDecoderRegistered(channel)); 596 delete channels_[channel]; 597 channels_.erase(channel); 598 return 0; 599 } 600 WEBRTC_STUB(RegisterCpuOveruseObserver, 601 (int channel, webrtc::CpuOveruseObserver* observer)); 602 WEBRTC_STUB(ConnectAudioChannel, (const int, const int)); 603 WEBRTC_STUB(DisconnectAudioChannel, (const int)); 604 WEBRTC_FUNC(StartSend, (const int channel)) { 605 WEBRTC_CHECK_CHANNEL(channel); 606 channels_[channel]->send = true; 607 return 0; 608 } 609 WEBRTC_FUNC(StopSend, (const int channel)) { 610 WEBRTC_CHECK_CHANNEL(channel); 611 channels_[channel]->send = false; 612 return 0; 613 } 614 WEBRTC_FUNC(StartReceive, (const int channel)) { 615 WEBRTC_CHECK_CHANNEL(channel); 616 channels_[channel]->receive_ = true; 617 return 0; 618 } 619 WEBRTC_FUNC(StopReceive, (const int channel)) { 620 WEBRTC_CHECK_CHANNEL(channel); 621 channels_[channel]->receive_ = false; 622 return 0; 623 } 624 WEBRTC_STUB(GetVersion, (char version[1024])); 625 WEBRTC_STUB(LastError, ()); 626 627 // webrtc::ViECodec 628 WEBRTC_FUNC_CONST(NumberOfCodecs, ()) { 629 return num_codecs_; 630 }; 631 WEBRTC_FUNC_CONST(GetCodec, (const unsigned char list_number, 632 webrtc::VideoCodec& out_codec)) { 633 if (list_number >= NumberOfCodecs()) { 634 return -1; 635 } 636 memset(&out_codec, 0, sizeof(out_codec)); 637 const cricket::VideoCodec& c(*codecs_[list_number]); 638 if ("I420" == c.name) { 639 out_codec.codecType = webrtc::kVideoCodecI420; 640 } else if ("VP8" == c.name) { 641 out_codec.codecType = webrtc::kVideoCodecVP8; 642 } else if ("red" == c.name) { 643 out_codec.codecType = webrtc::kVideoCodecRED; 644 } else if ("ulpfec" == c.name) { 645 out_codec.codecType = webrtc::kVideoCodecULPFEC; 646 } else { 647 out_codec.codecType = webrtc::kVideoCodecUnknown; 648 } 649 talk_base::strcpyn(out_codec.plName, sizeof(out_codec.plName), 650 c.name.c_str()); 651 out_codec.plType = c.id; 652 out_codec.width = c.width; 653 out_codec.height = c.height; 654 out_codec.startBitrate = kStartVideoBitrate; 655 out_codec.maxBitrate = kMaxVideoBitrate; 656 out_codec.minBitrate = kMinVideoBitrate; 657 out_codec.maxFramerate = c.framerate; 658 return 0; 659 }; 660 WEBRTC_FUNC(SetSendCodec, (const int channel, 661 const webrtc::VideoCodec& codec)) { 662 WEBRTC_CHECK_CHANNEL(channel); 663 channels_[channel]->send_codec = codec; 664 ++num_set_send_codecs_; 665 return 0; 666 }; 667 WEBRTC_FUNC_CONST(GetSendCodec, (const int channel, 668 webrtc::VideoCodec& codec)) { // NOLINT 669 WEBRTC_CHECK_CHANNEL(channel); 670 codec = channels_.find(channel)->second->send_codec; 671 return 0; 672 }; 673 WEBRTC_FUNC(SetReceiveCodec, (const int channel, 674 const webrtc::VideoCodec& codec)) { // NOLINT 675 WEBRTC_CHECK_CHANNEL(channel); 676 channels_[channel]->recv_codecs.push_back(codec); 677 return 0; 678 }; 679 WEBRTC_STUB_CONST(GetReceiveCodec, (const int, webrtc::VideoCodec&)); 680 WEBRTC_STUB_CONST(GetCodecConfigParameters, (const int, 681 unsigned char*, unsigned char&)); 682 WEBRTC_STUB(SetImageScaleStatus, (const int, const bool)); 683 WEBRTC_STUB_CONST(GetSendCodecStastistics, (const int, 684 unsigned int&, unsigned int&)); 685 WEBRTC_STUB_CONST(GetReceiveCodecStastistics, (const int, 686 unsigned int&, unsigned int&)); 687 WEBRTC_STUB_CONST(GetReceiveSideDelay, (const int video_channel, 688 int* delay_ms)); 689 WEBRTC_FUNC_CONST(GetCodecTargetBitrate, (const int channel, 690 unsigned int* codec_target_bitrate)) { 691 WEBRTC_CHECK_CHANNEL(channel); 692 693 std::map<int, Channel*>::const_iterator it = channels_.find(channel); 694 if (it->second->send) { 695 // Assume the encoder produces the expected rate. 696 *codec_target_bitrate = it->second->send_video_bitrate_; 697 } else { 698 *codec_target_bitrate = 0; 699 } 700 return 0; 701 } 702 virtual unsigned int GetDiscardedPackets(const int channel) const { 703 return 0; 704 } 705 706 WEBRTC_STUB(SetKeyFrameRequestCallbackStatus, (const int, const bool)); 707 WEBRTC_STUB(SetSignalKeyPacketLossStatus, (const int, const bool, 708 const bool)); 709 WEBRTC_STUB(RegisterEncoderObserver, (const int, 710 webrtc::ViEEncoderObserver&)); 711 WEBRTC_STUB(DeregisterEncoderObserver, (const int)); 712 WEBRTC_STUB(RegisterDecoderObserver, (const int, 713 webrtc::ViEDecoderObserver&)); 714 WEBRTC_STUB(DeregisterDecoderObserver, (const int)); 715 WEBRTC_STUB(SendKeyFrame, (const int)); 716 WEBRTC_STUB(WaitForFirstKeyFrame, (const int, const bool)); 717 WEBRTC_STUB(StartDebugRecording, (int, const char*)); 718 WEBRTC_STUB(StopDebugRecording, (int)); 719 720 // webrtc::ViECapture 721 WEBRTC_STUB(NumberOfCaptureDevices, ()); 722 WEBRTC_STUB(GetCaptureDevice, (unsigned int, char*, 723 const unsigned int, char*, const unsigned int)); 724 WEBRTC_STUB(AllocateCaptureDevice, (const char*, const unsigned int, int&)); 725 WEBRTC_FUNC(AllocateExternalCaptureDevice, 726 (int& capture_id, webrtc::ViEExternalCapture*& capture)) { 727 if (fail_alloc_capturer_) { 728 return -1; 729 } 730 if (kViECaptureIdMax == last_capturer_) { 731 return -1; 732 } 733 Capturer* cap = new Capturer(); 734 capturers_[++last_capturer_] = cap; 735 capture_id = last_capturer_; 736 capture = cap; 737 return 0; 738 } 739 WEBRTC_STUB(AllocateCaptureDevice, (webrtc::VideoCaptureModule&, int&)); 740 WEBRTC_FUNC(ReleaseCaptureDevice, (const int capture_id)) { 741 WEBRTC_CHECK_CAPTURER(capture_id); 742 delete capturers_[capture_id]; 743 capturers_.erase(capture_id); 744 return 0; 745 } 746 WEBRTC_FUNC(ConnectCaptureDevice, (const int capture_id, 747 const int channel)) { 748 WEBRTC_CHECK_CHANNEL(channel); 749 WEBRTC_CHECK_CAPTURER(capture_id); 750 channels_[channel]->capture_id_ = capture_id; 751 capturers_[capture_id]->set_channel_id(channel); 752 return 0; 753 } 754 WEBRTC_FUNC(DisconnectCaptureDevice, (const int channel)) { 755 WEBRTC_CHECK_CHANNEL(channel); 756 int capture_id = channels_[channel]->capture_id_; 757 WEBRTC_CHECK_CAPTURER(capture_id); 758 channels_[channel]->capture_id_ = -1; 759 capturers_[capture_id]->set_channel_id(-1); 760 return 0; 761 } 762 WEBRTC_STUB(StartCapture, (const int, const webrtc::CaptureCapability&)); 763 WEBRTC_STUB(StopCapture, (const int)); 764 WEBRTC_STUB(SetRotateCapturedFrames, (const int, 765 const webrtc::RotateCapturedFrame)); 766 WEBRTC_STUB(SetCaptureDelay, (const int, const unsigned int)); 767 WEBRTC_STUB(NumberOfCapabilities, (const char*, const unsigned int)); 768 WEBRTC_STUB(GetCaptureCapability, (const char*, const unsigned int, 769 const unsigned int, webrtc::CaptureCapability&)); 770 WEBRTC_STUB(ShowCaptureSettingsDialogBox, (const char*, const unsigned int, 771 const char*, void*, const unsigned int, const unsigned int)); 772 WEBRTC_STUB(GetOrientation, (const char*, webrtc::RotateCapturedFrame&)); 773 WEBRTC_STUB(EnableBrightnessAlarm, (const int, const bool)); 774 WEBRTC_STUB(RegisterObserver, (const int, webrtc::ViECaptureObserver&)); 775 WEBRTC_STUB(DeregisterObserver, (const int)); 776 777 // webrtc::ViENetwork 778 WEBRTC_VOID_FUNC(SetNetworkTransmissionState, (const int channel, 779 const bool is_transmitting)) { 780 WEBRTC_ASSERT_CHANNEL(channel); 781 channels_[channel]->can_transmit_ = is_transmitting; 782 } 783 WEBRTC_STUB(RegisterSendTransport, (const int, webrtc::Transport&)); 784 WEBRTC_STUB(DeregisterSendTransport, (const int)); 785 WEBRTC_STUB(ReceivedRTPPacket, (const int, const void*, const int)); 786 WEBRTC_STUB(ReceivedRTCPPacket, (const int, const void*, const int)); 787 // Not using WEBRTC_STUB due to bool return value 788 virtual bool IsIPv6Enabled(int channel) { return true; } 789 WEBRTC_STUB(SetMTU, (int, unsigned int)); 790 WEBRTC_STUB(SetPacketTimeoutNotification, (const int, bool, int)); 791 WEBRTC_STUB(RegisterObserver, (const int, webrtc::ViENetworkObserver&)); 792 WEBRTC_STUB(SetPeriodicDeadOrAliveStatus, (const int, const bool, 793 const unsigned int)); 794 795 // webrtc::ViERender 796 WEBRTC_STUB(RegisterVideoRenderModule, (webrtc::VideoRender&)); 797 WEBRTC_STUB(DeRegisterVideoRenderModule, (webrtc::VideoRender&)); 798 WEBRTC_STUB(AddRenderer, (const int, void*, const unsigned int, const float, 799 const float, const float, const float)); 800 WEBRTC_FUNC(RemoveRenderer, (const int render_id)) { 801 if (IsCapturerId(render_id)) { 802 WEBRTC_CHECK_CAPTURER(render_id); 803 return 0; 804 } else if (IsChannelId(render_id)) { 805 WEBRTC_CHECK_CHANNEL(render_id); 806 channels_[render_id]->has_renderer_ = false; 807 return 0; 808 } 809 return -1; 810 } 811 WEBRTC_FUNC(StartRender, (const int render_id)) { 812 if (IsCapturerId(render_id)) { 813 WEBRTC_CHECK_CAPTURER(render_id); 814 return 0; 815 } else if (IsChannelId(render_id)) { 816 WEBRTC_CHECK_CHANNEL(render_id); 817 channels_[render_id]->render_started_ = true; 818 return 0; 819 } 820 return -1; 821 } 822 WEBRTC_FUNC(StopRender, (const int render_id)) { 823 if (IsCapturerId(render_id)) { 824 WEBRTC_CHECK_CAPTURER(render_id); 825 return 0; 826 } else if (IsChannelId(render_id)) { 827 WEBRTC_CHECK_CHANNEL(render_id); 828 channels_[render_id]->render_started_ = false; 829 return 0; 830 } 831 return -1; 832 } 833 WEBRTC_STUB(SetExpectedRenderDelay, (int render_id, int render_delay)); 834 WEBRTC_STUB(ConfigureRender, (int, const unsigned int, const float, 835 const float, const float, const float)); 836 WEBRTC_STUB(MirrorRenderStream, (const int, const bool, const bool, 837 const bool)); 838 WEBRTC_FUNC(AddRenderer, (const int render_id, 839 webrtc::RawVideoType video_type, 840 webrtc::ExternalRenderer* renderer)) { 841 if (IsCapturerId(render_id)) { 842 WEBRTC_CHECK_CAPTURER(render_id); 843 return 0; 844 } else if (IsChannelId(render_id)) { 845 WEBRTC_CHECK_CHANNEL(render_id); 846 channels_[render_id]->has_renderer_ = true; 847 return 0; 848 } 849 return -1; 850 } 851 852 // webrtc::ViERTP_RTCP 853 WEBRTC_FUNC(SetLocalSSRC, (const int channel, 854 const unsigned int ssrc, 855 const webrtc::StreamType usage, 856 const unsigned char idx)) { 857 WEBRTC_CHECK_CHANNEL(channel); 858 channels_[channel]->ssrcs_[idx] = ssrc; 859 return 0; 860 } 861 WEBRTC_STUB_CONST(SetRemoteSSRCType, (const int, 862 const webrtc::StreamType, const unsigned int)); 863 864 WEBRTC_FUNC_CONST(GetLocalSSRC, (const int channel, 865 unsigned int& ssrc)) { 866 // ssrcs_[0] is the default local ssrc. 867 WEBRTC_CHECK_CHANNEL(channel); 868 ssrc = channels_.find(channel)->second->ssrcs_[0]; 869 return 0; 870 } 871 WEBRTC_STUB_CONST(GetRemoteSSRC, (const int, unsigned int&)); 872 WEBRTC_STUB_CONST(GetRemoteCSRCs, (const int, unsigned int*)); 873 874 WEBRTC_STUB(SetRtxSendPayloadType, (const int, const uint8)); 875 WEBRTC_STUB(SetRtxReceivePayloadType, (const int, const uint8)); 876 877 WEBRTC_STUB(SetStartSequenceNumber, (const int, unsigned short)); 878 WEBRTC_FUNC(SetRTCPStatus, 879 (const int channel, const webrtc::ViERTCPMode mode)) { 880 WEBRTC_CHECK_CHANNEL(channel); 881 channels_[channel]->rtcp_status_ = mode; 882 return 0; 883 } 884 WEBRTC_STUB_CONST(GetRTCPStatus, (const int, webrtc::ViERTCPMode&)); 885 WEBRTC_FUNC(SetRTCPCName, (const int channel, 886 const char rtcp_cname[KMaxRTCPCNameLength])) { 887 WEBRTC_CHECK_CHANNEL(channel); 888 channels_[channel]->cname_.assign(rtcp_cname); 889 return 0; 890 } 891 WEBRTC_FUNC_CONST(GetRTCPCName, (const int channel, 892 char rtcp_cname[KMaxRTCPCNameLength])) { 893 WEBRTC_CHECK_CHANNEL(channel); 894 talk_base::strcpyn(rtcp_cname, KMaxRTCPCNameLength, 895 channels_.find(channel)->second->cname_.c_str()); 896 return 0; 897 } 898 WEBRTC_STUB_CONST(GetRemoteRTCPCName, (const int, char*)); 899 WEBRTC_STUB(SendApplicationDefinedRTCPPacket, (const int, const unsigned char, 900 unsigned int, const char*, unsigned short)); 901 WEBRTC_FUNC(SetNACKStatus, (const int channel, const bool enable)) { 902 WEBRTC_CHECK_CHANNEL(channel); 903 channels_[channel]->nack_ = enable; 904 channels_[channel]->hybrid_nack_fec_ = false; 905 return 0; 906 } 907 WEBRTC_STUB(SetFECStatus, (const int, const bool, const unsigned char, 908 const unsigned char)); 909 WEBRTC_FUNC(SetHybridNACKFECStatus, (const int channel, const bool enable, 910 const unsigned char red_type, const unsigned char fec_type)) { 911 WEBRTC_CHECK_CHANNEL(channel); 912 if (red_type == fec_type || 913 red_type == channels_[channel]->send_codec.plType || 914 fec_type == channels_[channel]->send_codec.plType) { 915 return -1; 916 } 917 channels_[channel]->nack_ = false; 918 channels_[channel]->hybrid_nack_fec_ = enable; 919 return 0; 920 } 921 WEBRTC_FUNC(SetKeyFrameRequestMethod, 922 (const int channel, 923 const webrtc::ViEKeyFrameRequestMethod method)) { 924 WEBRTC_CHECK_CHANNEL(channel); 925 channels_[channel]->key_frame_request_method_ = method; 926 return 0; 927 } 928 WEBRTC_FUNC(SetSenderBufferingMode, (int channel, int target_delay)) { 929 WEBRTC_CHECK_CHANNEL(channel); 930 channels_[channel]->sender_target_delay_ = target_delay; 931 return 0; 932 } 933 WEBRTC_FUNC(SetReceiverBufferingMode, (int channel, int target_delay)) { 934 WEBRTC_CHECK_CHANNEL(channel); 935 channels_[channel]->receiver_target_delay_ = target_delay; 936 return 0; 937 } 938 // |Send| and |receive| are stored locally in variables that more clearly 939 // explain what they mean. 940 WEBRTC_FUNC(SetRembStatus, (int channel, bool send, bool receive)) { 941 WEBRTC_CHECK_CHANNEL(channel); 942 channels_[channel]->remb_contribute_ = receive; 943 channels_[channel]->remb_bw_partition_ = send; 944 return 0; 945 } 946 WEBRTC_FUNC(SetTMMBRStatus, (const int channel, const bool enable)) { 947 WEBRTC_CHECK_CHANNEL(channel); 948 channels_[channel]->tmmbr_ = enable; 949 return 0; 950 } 951 WEBRTC_FUNC(SetSendTimestampOffsetStatus, (int channel, bool enable, 952 int id)) { 953 WEBRTC_CHECK_CHANNEL(channel); 954 channels_[channel]->rtp_offset_send_id_ = (enable) ? id : 0; 955 return 0; 956 } 957 WEBRTC_FUNC(SetReceiveTimestampOffsetStatus, (int channel, bool enable, 958 int id)) { 959 WEBRTC_CHECK_CHANNEL(channel); 960 channels_[channel]->rtp_offset_receive_id_ = (enable) ? id : 0; 961 return 0; 962 } 963 WEBRTC_FUNC(SetSendAbsoluteSendTimeStatus, (int channel, bool enable, 964 int id)) { 965 WEBRTC_CHECK_CHANNEL(channel); 966 channels_[channel]->rtp_absolute_send_time_send_id_ = (enable) ? id : 0; 967 return 0; 968 } 969 WEBRTC_FUNC(SetReceiveAbsoluteSendTimeStatus, (int channel, bool enable, 970 int id)) { 971 WEBRTC_CHECK_CHANNEL(channel); 972 channels_[channel]->rtp_absolute_send_time_receive_id_ = (enable) ? id : 0; 973 return 0; 974 } 975 WEBRTC_FUNC(SetTransmissionSmoothingStatus, (int channel, bool enable)) { 976 WEBRTC_CHECK_CHANNEL(channel); 977 channels_[channel]->transmission_smoothing_ = enable; 978 return 0; 979 } 980 WEBRTC_STUB_CONST(GetReceivedRTCPStatistics, (const int, unsigned short&, 981 unsigned int&, unsigned int&, unsigned int&, int&)); 982 WEBRTC_STUB_CONST(GetSentRTCPStatistics, (const int, unsigned short&, 983 unsigned int&, unsigned int&, unsigned int&, int&)); 984 WEBRTC_STUB_CONST(GetRTPStatistics, (const int, unsigned int&, unsigned int&, 985 unsigned int&, unsigned int&)); 986 WEBRTC_FUNC_CONST(GetBandwidthUsage, (const int channel, 987 unsigned int& total_bitrate, unsigned int& video_bitrate, 988 unsigned int& fec_bitrate, unsigned int& nack_bitrate)) { 989 WEBRTC_CHECK_CHANNEL(channel); 990 std::map<int, Channel*>::const_iterator it = channels_.find(channel); 991 if (it->second->send) { 992 video_bitrate = it->second->send_video_bitrate_; 993 fec_bitrate = it->second->send_fec_bitrate_; 994 nack_bitrate = it->second->send_nack_bitrate_; 995 total_bitrate = video_bitrate + fec_bitrate + nack_bitrate; 996 } else { 997 total_bitrate = 0; 998 video_bitrate = 0; 999 fec_bitrate = 0; 1000 nack_bitrate = 0; 1001 } 1002 return 0; 1003 } 1004 WEBRTC_FUNC_CONST(GetEstimatedSendBandwidth, (const int channel, 1005 unsigned int* send_bandwidth_estimate)) { 1006 WEBRTC_CHECK_CHANNEL(channel); 1007 std::map<int, Channel*>::const_iterator it = channels_.find(channel); 1008 // Assume the current video, fec and nack bitrate sums up to our estimate. 1009 if (it->second->send) { 1010 *send_bandwidth_estimate = it->second->send_bandwidth_; 1011 } else { 1012 *send_bandwidth_estimate = 0; 1013 } 1014 return 0; 1015 } 1016 WEBRTC_FUNC_CONST(GetEstimatedReceiveBandwidth, (const int channel, 1017 unsigned int* receive_bandwidth_estimate)) { 1018 WEBRTC_CHECK_CHANNEL(channel); 1019 std::map<int, Channel*>::const_iterator it = channels_.find(channel); 1020 if (it->second->receive_) { 1021 // For simplicity, assume all channels receive half of max send rate. 1022 *receive_bandwidth_estimate = it->second->receive_bandwidth_; 1023 } else { 1024 *receive_bandwidth_estimate = 0; 1025 } 1026 return 0; 1027 } 1028 1029 WEBRTC_STUB(StartRTPDump, (const int, const char*, webrtc::RTPDirections)); 1030 WEBRTC_STUB(StopRTPDump, (const int, webrtc::RTPDirections)); 1031 WEBRTC_STUB(RegisterRTPObserver, (const int, webrtc::ViERTPObserver&)); 1032 WEBRTC_STUB(DeregisterRTPObserver, (const int)); 1033 WEBRTC_STUB(RegisterRTCPObserver, (const int, webrtc::ViERTCPObserver&)); 1034 WEBRTC_STUB(DeregisterRTCPObserver, (const int)); 1035 1036 // webrtc::ViEImageProcess 1037 WEBRTC_STUB(RegisterCaptureEffectFilter, (const int, 1038 webrtc::ViEEffectFilter&)); 1039 WEBRTC_STUB(DeregisterCaptureEffectFilter, (const int)); 1040 WEBRTC_STUB(RegisterSendEffectFilter, (const int, 1041 webrtc::ViEEffectFilter&)); 1042 WEBRTC_STUB(DeregisterSendEffectFilter, (const int)); 1043 WEBRTC_STUB(RegisterRenderEffectFilter, (const int, 1044 webrtc::ViEEffectFilter&)); 1045 WEBRTC_STUB(DeregisterRenderEffectFilter, (const int)); 1046 WEBRTC_STUB(EnableDeflickering, (const int, const bool)); 1047 WEBRTC_FUNC(EnableDenoising, (const int capture_id, const bool denoising)) { 1048 WEBRTC_CHECK_CAPTURER(capture_id); 1049 capturers_[capture_id]->set_denoising(denoising); 1050 return 0; 1051 } 1052 WEBRTC_STUB(EnableColorEnhancement, (const int, const bool)); 1053 1054 // webrtc::ViEExternalCodec 1055 WEBRTC_FUNC(RegisterExternalSendCodec, 1056 (const int channel, const unsigned char pl_type, webrtc::VideoEncoder*, 1057 bool)) { 1058 WEBRTC_CHECK_CHANNEL(channel); 1059 channels_[channel]->ext_encoder_pl_types_.insert(pl_type); 1060 return 0; 1061 } 1062 WEBRTC_FUNC(DeRegisterExternalSendCodec, 1063 (const int channel, const unsigned char pl_type)) { 1064 WEBRTC_CHECK_CHANNEL(channel); 1065 channels_[channel]->ext_encoder_pl_types_.erase(pl_type); 1066 return 0; 1067 } 1068 WEBRTC_FUNC(RegisterExternalReceiveCodec, 1069 (const int channel, const unsigned int pl_type, webrtc::VideoDecoder*, 1070 bool, int)) { 1071 WEBRTC_CHECK_CHANNEL(channel); 1072 channels_[channel]->ext_decoder_pl_types_.insert(pl_type); 1073 return 0; 1074 } 1075 WEBRTC_FUNC(DeRegisterExternalReceiveCodec, 1076 (const int channel, const unsigned char pl_type)) { 1077 WEBRTC_CHECK_CHANNEL(channel); 1078 channels_[channel]->ext_decoder_pl_types_.erase(pl_type); 1079 return 0; 1080 } 1081 1082 private: 1083 bool IsChannelId(int id) const { 1084 return (id >= kViEChannelIdBase && id <= kViEChannelIdMax); 1085 } 1086 bool IsCapturerId(int id) const { 1087 return (id >= kViECaptureIdBase && id <= kViECaptureIdMax); 1088 } 1089 1090 bool inited_; 1091 int last_channel_; 1092 std::map<int, Channel*> channels_; 1093 bool fail_create_channel_; 1094 int last_capturer_; 1095 std::map<int, Capturer*> capturers_; 1096 bool fail_alloc_capturer_; 1097 const cricket::VideoCodec* const* codecs_; 1098 int num_codecs_; 1099 int num_set_send_codecs_; // how many times we call SetSendCodec(). 1100 }; 1101 1102 } // namespace cricket 1103 1104 #endif // TALK_MEDIA_WEBRTC_FAKEWEBRTCVIDEOENGINE_H_ 1105