blob: 9256c0c73249aaa97e896216360f2d82f1266199 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_
12#define MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
Steve Antone78bcb92017-10-31 09:53:08 -070014#include <memory>
solenberg7e4e01a2015-12-02 08:05:01 -080015#include <string>
16#include <vector>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "call/call.h"
19#include "media/base/mediaengine.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010020#include "modules/audio_device/include/audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021
22namespace webrtc {
ossuc54071d2016-08-17 02:45:41 -070023class AudioDecoderFactory;
gyzhou95aa9642016-12-13 14:06:26 -080024class AudioMixer;
peaha9cc40b2017-06-29 08:32:09 -070025class AudioProcessing;
Magnus Jedvert58b03162017-09-15 19:02:47 +020026class VideoDecoderFactory;
27class VideoEncoderFactory;
Jiawei Ouc2ebe212018-11-08 10:02:56 -080028class VideoBitrateAllocatorFactory;
Yves Gerey665174f2018-06-19 15:03:05 +020029} // namespace webrtc
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030namespace cricket {
31class WebRtcVideoDecoderFactory;
32class WebRtcVideoEncoderFactory;
Yves Gerey665174f2018-06-19 15:03:05 +020033} // namespace cricket
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034
buildbot@webrtc.org58e7c862014-06-20 00:26:50 +000035namespace cricket {
36
henrike@webrtc.org0481f152014-08-19 14:56:59 +000037class WebRtcMediaEngineFactory {
buildbot@webrtc.org58e7c862014-06-20 00:26:50 +000038 public:
deadbeefeb02c032017-06-15 08:29:25 -070039 // These Create methods may be called on any thread, though the engine is
40 // only expected to be used on one thread, internally called the "worker
41 // thread". This is the thread Init must be called on.
Karl Wiberg5478b472017-11-03 11:28:17 +010042 //
deadbeef112b2e92017-02-10 20:13:37 -080043 // TODO(deadbeef): Change these to return an std::unique_ptr<>, to indicate
44 // that the caller owns the returned object.
Anders Carlsson50635032018-08-09 15:01:10 -070045#if defined(USE_BUILTIN_SW_CODECS)
Anders Carlsson01092952018-12-11 15:44:54 +010046 RTC_DEPRECATED static MediaEngineInterface* Create(
buildbot@webrtc.org58e7c862014-06-20 00:26:50 +000047 webrtc::AudioDeviceModule* adm,
ossueb1fde42017-05-02 06:46:30 -070048 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
49 audio_encoder_factory,
50 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
51 audio_decoder_factory,
52 WebRtcVideoEncoderFactory* video_encoder_factory,
Qingsi Wang59844ce2018-11-01 04:45:53 +000053 WebRtcVideoDecoderFactory* video_decoder_factory);
Jiawei Ouc2ebe212018-11-08 10:02:56 -080054
Anders Carlsson01092952018-12-11 15:44:54 +010055 RTC_DEPRECATED static MediaEngineInterface* Create(
ossueb1fde42017-05-02 06:46:30 -070056 webrtc::AudioDeviceModule* adm,
57 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
58 audio_encoder_factory,
59 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
60 audio_decoder_factory,
61 WebRtcVideoEncoderFactory* video_encoder_factory,
62 WebRtcVideoDecoderFactory* video_decoder_factory,
peaha9cc40b2017-06-29 08:32:09 -070063 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
64 rtc::scoped_refptr<webrtc::AudioProcessing> apm);
Jiawei Ouc2ebe212018-11-08 10:02:56 -080065
Anders Carlsson01092952018-12-11 15:44:54 +010066 RTC_DEPRECATED static MediaEngineInterface* Create(
Jiawei Ouc2ebe212018-11-08 10:02:56 -080067 webrtc::AudioDeviceModule* adm,
68 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
69 audio_encoder_factory,
70 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
71 audio_decoder_factory,
72 WebRtcVideoEncoderFactory* video_encoder_factory,
73 WebRtcVideoDecoderFactory* video_decoder_factory,
74 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
75 video_bitrate_allocator_factory);
76
Anders Carlsson01092952018-12-11 15:44:54 +010077 RTC_DEPRECATED static MediaEngineInterface* Create(
Jiawei Ouc2ebe212018-11-08 10:02:56 -080078 webrtc::AudioDeviceModule* adm,
79 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
80 audio_encoder_factory,
81 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
82 audio_decoder_factory,
83 WebRtcVideoEncoderFactory* video_encoder_factory,
84 WebRtcVideoDecoderFactory* video_decoder_factory,
85 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
86 video_bitrate_allocator_factory,
87 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
88 rtc::scoped_refptr<webrtc::AudioProcessing> apm);
Anders Carlsson50635032018-08-09 15:01:10 -070089#endif
Magnus Jedvert58b03162017-09-15 19:02:47 +020090
91 // Create a MediaEngineInterface with optional video codec factories. These
92 // video factories represents all video codecs, i.e. no extra internal video
93 // codecs will be added.
94 static std::unique_ptr<MediaEngineInterface> Create(
95 rtc::scoped_refptr<webrtc::AudioDeviceModule> adm,
96 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
97 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory,
98 std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
99 std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory,
100 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
101 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing);
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800102
103 static std::unique_ptr<MediaEngineInterface> Create(
104 rtc::scoped_refptr<webrtc::AudioDeviceModule> adm,
105 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
106 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory,
107 std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
108 std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory,
109 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
110 video_bitrate_allocator_factory,
111 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
112 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing);
buildbot@webrtc.orgbb2d6582014-06-20 14:58:56 +0000113};
114
solenberg7e4e01a2015-12-02 08:05:01 -0800115// Verify that extension IDs are within 1-byte extension range and are not
116// overlapping.
isheriff6f8d6862016-05-26 11:24:55 -0700117bool ValidateRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions);
Stefan Holmerbbaf3632015-10-29 18:53:23 +0100118
isheriff6f8d6862016-05-26 11:24:55 -0700119// Discard any extensions not validated by the 'supported' predicate. Duplicate
solenberg7e4e01a2015-12-02 08:05:01 -0800120// extensions are removed if 'filter_redundant_extensions' is set, and also any
isheriff6f8d6862016-05-26 11:24:55 -0700121// mutually exclusive extensions (see implementation for details) are removed.
solenberg7e4e01a2015-12-02 08:05:01 -0800122std::vector<webrtc::RtpExtension> FilterRtpExtensions(
isheriff6f8d6862016-05-26 11:24:55 -0700123 const std::vector<webrtc::RtpExtension>& extensions,
solenberg7e4e01a2015-12-02 08:05:01 -0800124 bool (*supported)(const std::string&),
125 bool filter_redundant_extensions);
Stefan Holmerbbaf3632015-10-29 18:53:23 +0100126
Sebastian Janssonfc8d26b2018-02-21 09:52:06 +0100127webrtc::BitrateConstraints GetBitrateConfigForCodec(const Codec& codec);
stefan13f1a0a2016-11-30 07:22:58 -0800128
buildbot@webrtc.orgbb2d6582014-06-20 14:58:56 +0000129} // namespace cricket
130
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200131#endif // MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_