blob: 13b2f14268e4a1071573fdad1946ea396a6b62c7 [file] [log] [blame]
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000011// TODO(pbos): Move Config from common.h to here.
12
pbos@webrtc.org3c107582014-07-20 15:27:35 +000013#ifndef WEBRTC_CONFIG_H_
14#define WEBRTC_CONFIG_H_
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000015
16#include <string>
pbos@webrtc.org5860de02013-09-16 13:01:47 +000017#include <vector>
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000018
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000019#include "webrtc/common_types.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020020#include "webrtc/rtc_base/basictypes.h"
21#include "webrtc/rtc_base/optional.h"
22#include "webrtc/rtc_base/refcount.h"
23#include "webrtc/rtc_base/scoped_ref_ptr.h"
pbos@webrtc.orgce90eff2013-11-20 11:48:56 +000024#include "webrtc/typedefs.h"
25
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000026namespace webrtc {
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000027
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000028// Settings for NACK, see RFC 4585 for details.
29struct NackConfig {
pbos@webrtc.orgeceb5322013-05-28 08:04:45 +000030 NackConfig() : rtp_history_ms(0) {}
solenberg971cab02016-06-14 10:02:41 -070031 std::string ToString() const;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000032 // Send side: the time RTP packets are stored for retransmissions.
33 // Receive side: the time the receiver is prepared to wait for
34 // retransmissions.
pbos@webrtc.orgeceb5322013-05-28 08:04:45 +000035 // Set to '0' to disable.
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000036 int rtp_history_ms;
37};
38
brandtrb5f2c3f2016-10-04 23:28:39 -070039// Settings for ULPFEC forward error correction.
40// Set the payload types to '-1' to disable.
41struct UlpfecConfig {
42 UlpfecConfig()
Shao Changbine62202f2015-04-21 20:24:50 +080043 : ulpfec_payload_type(-1),
44 red_payload_type(-1),
45 red_rtx_payload_type(-1) {}
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000046 std::string ToString() const;
brandtr468da7c2016-11-22 02:16:47 -080047 bool operator==(const UlpfecConfig& other) const;
48
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000049 // Payload type used for ULPFEC packets.
50 int ulpfec_payload_type;
51
52 // Payload type used for RED packets.
53 int red_payload_type;
Shao Changbine62202f2015-04-21 20:24:50 +080054
55 // RTX payload type for RED payload.
56 int red_rtx_payload_type;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000057};
58
solenberg3a941542015-11-16 07:34:50 -080059// RTP header extension, see RFC 5285.
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000060struct RtpExtension {
jbauch5869f502017-06-29 12:31:36 -070061 RtpExtension() {}
isheriff6f8d6862016-05-26 11:24:55 -070062 RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
jbauch5869f502017-06-29 12:31:36 -070063 RtpExtension(const std::string& uri, int id, bool encrypt) : uri(uri),
64 id(id), encrypt(encrypt) {}
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000065 std::string ToString() const;
solenberg3a941542015-11-16 07:34:50 -080066 bool operator==(const RtpExtension& rhs) const {
jbauch5869f502017-06-29 12:31:36 -070067 return uri == rhs.uri && id == rhs.id && encrypt == rhs.encrypt;
solenberg3a941542015-11-16 07:34:50 -080068 }
isheriff6f8d6862016-05-26 11:24:55 -070069 static bool IsSupportedForAudio(const std::string& uri);
70 static bool IsSupportedForVideo(const std::string& uri);
jbauch5869f502017-06-29 12:31:36 -070071 // Return "true" if the given RTP header extension URI may be encrypted.
72 static bool IsEncryptionSupported(const std::string& uri);
73
74 // Returns the named header extension if found among all extensions,
75 // nullptr otherwise.
76 static const RtpExtension* FindHeaderExtensionByUri(
77 const std::vector<RtpExtension>& extensions,
78 const std::string& uri);
79
80 // Return a list of RTP header extensions with the non-encrypted extensions
81 // removed if both the encrypted and non-encrypted extension is present for
82 // the same URI.
83 static std::vector<RtpExtension> FilterDuplicateNonEncrypted(
84 const std::vector<RtpExtension>& extensions);
pbos@webrtc.org3c107582014-07-20 15:27:35 +000085
isheriff6f8d6862016-05-26 11:24:55 -070086 // Header extension for audio levels, as defined in:
87 // http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
88 static const char* kAudioLevelUri;
89 static const int kAudioLevelDefaultId;
90
91 // Header extension for RTP timestamp offset, see RFC 5450 for details:
92 // http://tools.ietf.org/html/rfc5450
93 static const char* kTimestampOffsetUri;
94 static const int kTimestampOffsetDefaultId;
95
96 // Header extension for absolute send time, see url for details:
97 // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
98 static const char* kAbsSendTimeUri;
99 static const int kAbsSendTimeDefaultId;
100
101 // Header extension for coordination of video orientation, see url for
102 // details:
103 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
104 static const char* kVideoRotationUri;
105 static const int kVideoRotationDefaultId;
106
ilnik00d802b2017-04-11 10:34:31 -0700107 // Header extension for video content type. E.g. default or screenshare.
108 static const char* kVideoContentTypeUri;
109 static const int kVideoContentTypeDefaultId;
110
ilnik04f4d122017-06-19 07:18:55 -0700111 // Header extension for video timing.
112 static const char* kVideoTimingUri;
113 static const int kVideoTimingDefaultId;
114
isheriff6f8d6862016-05-26 11:24:55 -0700115 // Header extension for transport sequence number, see url for details:
116 // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
117 static const char* kTransportSequenceNumberUri;
118 static const int kTransportSequenceNumberDefaultId;
119
isheriff6b4b5f32016-06-08 00:24:21 -0700120 static const char* kPlayoutDelayUri;
121 static const int kPlayoutDelayDefaultId;
122
jbauch5869f502017-06-29 12:31:36 -0700123 // Encryption of Header Extensions, see RFC 6904 for details:
124 // https://tools.ietf.org/html/rfc6904
125 static const char* kEncryptHeaderExtensionsUri;
126
deadbeefe814a0d2017-02-25 18:15:09 -0800127 // Inclusive min and max IDs for one-byte header extensions, per RFC5285.
128 static const int kMinId;
129 static const int kMaxId;
130
isheriff6f8d6862016-05-26 11:24:55 -0700131 std::string uri;
jbauch5869f502017-06-29 12:31:36 -0700132 int id = 0;
133 bool encrypt = false;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +0000134};
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +0000135
136struct VideoStream {
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000137 VideoStream();
138 ~VideoStream();
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +0000139 std::string ToString() const;
140
141 size_t width;
142 size_t height;
143 int max_framerate;
144
145 int min_bitrate_bps;
146 int target_bitrate_bps;
147 int max_bitrate_bps;
148
149 int max_qp;
150
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +0000151 // Bitrate thresholds for enabling additional temporal layers. Since these are
152 // thresholds in between layers, we have one additional layer. One threshold
153 // gives two temporal layers, one below the threshold and one above, two give
154 // three, and so on.
155 // The VideoEncoder may redistribute bitrates over the temporal layers so a
156 // bitrate threshold of 100k and an estimate of 105k does not imply that we
157 // get 100k in one temporal layer and 5k in the other, just that the bitrate
158 // in the first temporal layer should not exceed 100k.
kthelgason29a44e32016-09-27 03:52:02 -0700159 // TODO(kthelgason): Apart from a special case for two-layer screencast these
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +0000160 // thresholds are not propagated to the VideoEncoder. To be implemented.
161 std::vector<int> temporal_layer_thresholds_bps;
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +0000162};
163
perkjfa10b552016-10-02 23:45:26 -0700164class VideoEncoderConfig {
perkj26091b12016-09-01 01:17:40 -0700165 public:
kthelgason29a44e32016-09-27 03:52:02 -0700166 // These are reference counted to permit copying VideoEncoderConfig and be
167 // kept alive until all encoder_specific_settings go out of scope.
168 // TODO(kthelgason): Consider removing the need for copying VideoEncoderConfig
169 // and use rtc::Optional for encoder_specific_settings instead.
170 class EncoderSpecificSettings : public rtc::RefCountInterface {
171 public:
172 // TODO(pbos): Remove FillEncoderSpecificSettings as soon as VideoCodec is
173 // not in use and encoder implementations ask for codec-specific structs
174 // directly.
175 void FillEncoderSpecificSettings(VideoCodec* codec_struct) const;
176
177 virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const;
178 virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const;
179 virtual void FillVideoCodecH264(VideoCodecH264* h264_settings) const;
180 private:
solenberg940b6d62016-10-25 11:19:07 -0700181 ~EncoderSpecificSettings() override {}
perkjfa10b552016-10-02 23:45:26 -0700182 friend class VideoEncoderConfig;
kthelgason29a44e32016-09-27 03:52:02 -0700183 };
184
185 class H264EncoderSpecificSettings : public EncoderSpecificSettings {
186 public:
187 explicit H264EncoderSpecificSettings(const VideoCodecH264& specifics);
perkjfa10b552016-10-02 23:45:26 -0700188 void FillVideoCodecH264(VideoCodecH264* h264_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700189
190 private:
191 VideoCodecH264 specifics_;
192 };
193
194 class Vp8EncoderSpecificSettings : public EncoderSpecificSettings {
195 public:
196 explicit Vp8EncoderSpecificSettings(const VideoCodecVP8& specifics);
perkjfa10b552016-10-02 23:45:26 -0700197 void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700198
199 private:
200 VideoCodecVP8 specifics_;
201 };
202
203 class Vp9EncoderSpecificSettings : public EncoderSpecificSettings {
204 public:
205 explicit Vp9EncoderSpecificSettings(const VideoCodecVP9& specifics);
perkjfa10b552016-10-02 23:45:26 -0700206 void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700207
208 private:
209 VideoCodecVP9 specifics_;
210 };
211
Erik Språng143cec12015-04-28 10:01:41 +0200212 enum class ContentType {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000213 kRealtimeVideo,
Erik Språng143cec12015-04-28 10:01:41 +0200214 kScreen,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000215 };
216
perkjfa10b552016-10-02 23:45:26 -0700217 class VideoStreamFactoryInterface : public rtc::RefCountInterface {
218 public:
219 // An implementation should return a std::vector<VideoStream> with the
220 // wanted VideoStream settings for the given video resolution.
221 // The size of the vector may not be larger than
222 // |encoder_config.number_of_streams|.
223 virtual std::vector<VideoStream> CreateEncoderStreams(
224 int width,
225 int height,
226 const VideoEncoderConfig& encoder_config) = 0;
227
228 protected:
solenberg940b6d62016-10-25 11:19:07 -0700229 ~VideoStreamFactoryInterface() override {}
perkjfa10b552016-10-02 23:45:26 -0700230 };
231
perkj26091b12016-09-01 01:17:40 -0700232 VideoEncoderConfig& operator=(VideoEncoderConfig&&) = default;
233 VideoEncoderConfig& operator=(const VideoEncoderConfig&) = delete;
234
235 // Mostly used by tests. Avoid creating copies if you can.
236 VideoEncoderConfig Copy() const { return VideoEncoderConfig(*this); }
237
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000238 VideoEncoderConfig();
solenberg940b6d62016-10-25 11:19:07 -0700239 VideoEncoderConfig(VideoEncoderConfig&&);
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000240 ~VideoEncoderConfig();
pbos@webrtc.orgad3b5a52014-10-24 09:23:21 +0000241 std::string ToString() const;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000242
perkjfa10b552016-10-02 23:45:26 -0700243 rtc::scoped_refptr<VideoStreamFactoryInterface> video_stream_factory;
sprangce4aef12015-11-02 07:23:20 -0800244 std::vector<SpatialLayer> spatial_layers;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000245 ContentType content_type;
kthelgason29a44e32016-09-27 03:52:02 -0700246 rtc::scoped_refptr<const EncoderSpecificSettings> encoder_specific_settings;
pbos@webrtc.orgad3b5a52014-10-24 09:23:21 +0000247
248 // Padding will be used up to this bitrate regardless of the bitrate produced
249 // by the encoder. Padding above what's actually produced by the encoder helps
250 // maintaining a higher bitrate estimate. Padding will however not be sent
251 // unless the estimated bandwidth indicates that the link can handle it.
252 int min_transmit_bitrate_bps;
perkjfa10b552016-10-02 23:45:26 -0700253 int max_bitrate_bps;
254
255 // Max number of encoded VideoStreams to produce.
256 size_t number_of_streams;
perkj26091b12016-09-01 01:17:40 -0700257
258 private:
259 // Access to the copy constructor is private to force use of the Copy()
260 // method for those exceptional cases where we do use it.
solenberg940b6d62016-10-25 11:19:07 -0700261 VideoEncoderConfig(const VideoEncoderConfig&);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000262};
263
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +0000264} // namespace webrtc
265
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000266#endif // WEBRTC_CONFIG_H_