blob: 319dd1fb15770d61e0520def9872deae3c9e22b4 [file] [log] [blame]
solenberg7b38f692015-09-07 04:38:33 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
solenberg7b38f692015-09-07 04:38:33 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
solenberg7b38f692015-09-07 04:38:33 -07009 */
10
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/mediacontroller.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020012
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
14
Fredrik Solenberg709ed672015-09-15 12:26:33 +020015#include "webrtc/base/bind.h"
16#include "webrtc/base/checks.h"
kwiberg4485ffb2016-04-26 08:14:39 -070017#include "webrtc/base/constructormagic.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020018#include "webrtc/call.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010019#include "webrtc/pc/channelmanager.h"
nisse51542be2016-02-12 02:27:06 -080020#include "webrtc/media/base/mediachannel.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020021
22namespace {
23
24const int kMinBandwidthBps = 30000;
25const int kStartBandwidthBps = 300000;
26const int kMaxBandwidthBps = 2000000;
27
stefanc1aeaf02015-10-15 07:26:07 -070028class MediaController : public webrtc::MediaControllerInterface,
29 public sigslot::has_slots<> {
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030 public:
solenberg03d6d572016-03-01 12:42:03 -080031 MediaController(const cricket::MediaConfig& media_config,
nisse51542be2016-02-12 02:27:06 -080032 rtc::Thread* worker_thread,
skvlad11a9cbf2016-10-07 11:53:05 -070033 cricket::ChannelManager* channel_manager,
34 webrtc::RtcEventLog* event_log)
nisse51542be2016-02-12 02:27:06 -080035 : worker_thread_(worker_thread),
solenberg03d6d572016-03-01 12:42:03 -080036 media_config_(media_config),
skvlad11a9cbf2016-10-07 11:53:05 -070037 channel_manager_(channel_manager),
38 call_config_(event_log) {
solenberg03d6d572016-03-01 12:42:03 -080039 RTC_DCHECK(worker_thread);
skvlad11a9cbf2016-10-07 11:53:05 -070040 RTC_DCHECK(event_log);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070041 worker_thread_->Invoke<void>(RTC_FROM_HERE,
42 rtc::Bind(&MediaController::Construct_w, this,
43 channel_manager_->media_engine()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +020044 }
45 ~MediaController() override {
solenberg03d6d572016-03-01 12:42:03 -080046 Close();
Fredrik Solenberg709ed672015-09-15 12:26:33 +020047 }
48
solenberg03d6d572016-03-01 12:42:03 -080049 // webrtc::MediaControllerInterface implementation.
50 void Close() override {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070051 worker_thread_->Invoke<void>(RTC_FROM_HERE,
52 rtc::Bind(&MediaController::Close_w, this));
solenberg03d6d572016-03-01 12:42:03 -080053 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020054 webrtc::Call* call_w() override {
henrikg91d6ede2015-09-17 00:24:34 -070055 RTC_DCHECK(worker_thread_->IsCurrent());
solenberg03d6d572016-03-01 12:42:03 -080056 if (!call_) {
57 call_.reset(webrtc::Call::Create(call_config_));
58 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020059 return call_.get();
60 }
stefanc1aeaf02015-10-15 07:26:07 -070061 cricket::ChannelManager* channel_manager() const override {
62 return channel_manager_;
63 }
solenberg03d6d572016-03-01 12:42:03 -080064 const cricket::MediaConfig& config() const override { return media_config_; }
stefanc1aeaf02015-10-15 07:26:07 -070065
Fredrik Solenberg709ed672015-09-15 12:26:33 +020066 private:
solenberg566ef242015-11-06 15:34:49 -080067 void Construct_w(cricket::MediaEngineInterface* media_engine) {
henrikg91d6ede2015-09-17 00:24:34 -070068 RTC_DCHECK(worker_thread_->IsCurrent());
solenberg566ef242015-11-06 15:34:49 -080069 RTC_DCHECK(media_engine);
solenberg03d6d572016-03-01 12:42:03 -080070 call_config_.audio_state = media_engine->GetAudioState();
71 call_config_.bitrate_config.min_bitrate_bps = kMinBandwidthBps;
72 call_config_.bitrate_config.start_bitrate_bps = kStartBandwidthBps;
73 call_config_.bitrate_config.max_bitrate_bps = kMaxBandwidthBps;
Fredrik Solenberg709ed672015-09-15 12:26:33 +020074 }
solenberg03d6d572016-03-01 12:42:03 -080075 void Close_w() {
henrikg91d6ede2015-09-17 00:24:34 -070076 RTC_DCHECK(worker_thread_->IsCurrent());
stefanc1aeaf02015-10-15 07:26:07 -070077 call_.reset();
Fredrik Solenberg709ed672015-09-15 12:26:33 +020078 }
79
stefanc1aeaf02015-10-15 07:26:07 -070080 rtc::Thread* const worker_thread_;
solenberg03d6d572016-03-01 12:42:03 -080081 const cricket::MediaConfig media_config_;
stefanc1aeaf02015-10-15 07:26:07 -070082 cricket::ChannelManager* const channel_manager_;
solenberg03d6d572016-03-01 12:42:03 -080083 webrtc::Call::Config call_config_;
kwibergd1fe2812016-04-27 06:47:29 -070084 std::unique_ptr<webrtc::Call> call_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +020085
henrikg3c089d72015-09-16 05:37:44 -070086 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MediaController);
Fredrik Solenberg709ed672015-09-15 12:26:33 +020087};
solenberg566ef242015-11-06 15:34:49 -080088} // namespace {
Fredrik Solenberg709ed672015-09-15 12:26:33 +020089
90namespace webrtc {
91
92MediaControllerInterface* MediaControllerInterface::Create(
nisse51542be2016-02-12 02:27:06 -080093 const cricket::MediaConfig& config,
stefanc1aeaf02015-10-15 07:26:07 -070094 rtc::Thread* worker_thread,
skvlad11a9cbf2016-10-07 11:53:05 -070095 cricket::ChannelManager* channel_manager,
96 webrtc::RtcEventLog* event_log) {
97 return new MediaController(config, worker_thread, channel_manager, event_log);
Fredrik Solenberg709ed672015-09-15 12:26:33 +020098}
solenberg566ef242015-11-06 15:34:49 -080099} // namespace webrtc