blob: 3b3c3d90a811234515dd0348fe44da8be153ff1d [file] [log] [blame]
mflodman@webrtc.org06e80262013-04-18 12:02:521/*
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.org24e20892013-10-28 16:32:0111// TODO(pbos): Move Config from common.h to here.
12
pbos@webrtc.orgf0a119f2014-07-20 15:27:3513#ifndef WEBRTC_CONFIG_H_
14#define WEBRTC_CONFIG_H_
mflodman@webrtc.org06e80262013-04-18 12:02:5215
16#include <string>
pbos@webrtc.org041d54b2013-09-16 13:01:4717#include <vector>
mflodman@webrtc.org06e80262013-04-18 12:02:5218
brandtr4e974392016-10-20 11:54:4819#include "webrtc/base/basictypes.h"
johan246856b2016-08-05 16:19:2520#include "webrtc/base/optional.h"
kthelgason4cc4a8d2016-09-27 10:52:0221#include "webrtc/base/refcount.h"
22#include "webrtc/base/scoped_ref_ptr.h"
sprang@webrtc.org49812e62014-01-07 09:54:3423#include "webrtc/common_types.h"
pbos@webrtc.org346dbe72013-11-20 11:48:5624#include "webrtc/typedefs.h"
25
mflodman@webrtc.org06e80262013-04-18 12:02:5226namespace webrtc {
mflodman@webrtc.org06e80262013-04-18 12:02:5227
mflodman@webrtc.org06e80262013-04-18 12:02:5228// Settings for NACK, see RFC 4585 for details.
29struct NackConfig {
pbos@webrtc.orgb2d1a402013-05-28 08:04:4530 NackConfig() : rtp_history_ms(0) {}
solenberg5a37e3e2016-06-14 17:02:4131 std::string ToString() const;
mflodman@webrtc.org06e80262013-04-18 12:02:5232 // 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.orgb2d1a402013-05-28 08:04:4535 // Set to '0' to disable.
mflodman@webrtc.org06e80262013-04-18 12:02:5236 int rtp_history_ms;
37};
38
brandtrd984c572016-10-05 06:28:3939// Settings for ULPFEC forward error correction.
40// Set the payload types to '-1' to disable.
41struct UlpfecConfig {
42 UlpfecConfig()
Shao Changbin0f071712015-04-21 12:24:5043 : ulpfec_payload_type(-1),
44 red_payload_type(-1),
45 red_rtx_payload_type(-1) {}
pbos@webrtc.org7e686932014-05-15 09:35:0646 std::string ToString() const;
mflodman@webrtc.org06e80262013-04-18 12:02:5247 // Payload type used for ULPFEC packets.
48 int ulpfec_payload_type;
49
50 // Payload type used for RED packets.
51 int red_payload_type;
Shao Changbin0f071712015-04-21 12:24:5052
53 // RTX payload type for RED payload.
54 int red_rtx_payload_type;
mflodman@webrtc.org06e80262013-04-18 12:02:5255};
56
brandtr4e974392016-10-20 11:54:4857// Settings for FlexFEC forward error correction.
58// Set the payload type to '-1' to disable.
59struct FlexfecConfig {
solenberg91c6f342016-10-25 18:19:0760 FlexfecConfig();
61 ~FlexfecConfig();
brandtr4e974392016-10-20 11:54:4862 std::string ToString() const;
63
64 // Payload type of FlexFEC.
65 int flexfec_payload_type;
66
67 // SSRC of FlexFEC stream.
68 uint32_t flexfec_ssrc;
69
70 // Vector containing a single element, corresponding to the SSRC of the media
71 // stream being protected by this FlexFEC stream. The vector MUST have size 1.
72 //
73 // TODO(brandtr): Update comment above when we support multistream protection.
74 std::vector<uint32_t> protected_media_ssrcs;
75};
76
solenbergffe1ce02015-11-16 15:34:5077// RTP header extension, see RFC 5285.
mflodman@webrtc.org06e80262013-04-18 12:02:5278struct RtpExtension {
isheriffc4921f42016-05-26 18:24:5579 RtpExtension() : id(0) {}
80 RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
pbos@webrtc.org7e686932014-05-15 09:35:0681 std::string ToString() const;
solenbergffe1ce02015-11-16 15:34:5082 bool operator==(const RtpExtension& rhs) const {
isheriffc4921f42016-05-26 18:24:5583 return uri == rhs.uri && id == rhs.id;
solenbergffe1ce02015-11-16 15:34:5084 }
isheriffc4921f42016-05-26 18:24:5585 static bool IsSupportedForAudio(const std::string& uri);
86 static bool IsSupportedForVideo(const std::string& uri);
pbos@webrtc.orgf0a119f2014-07-20 15:27:3587
isheriffc4921f42016-05-26 18:24:5588 // Header extension for audio levels, as defined in:
89 // http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
90 static const char* kAudioLevelUri;
91 static const int kAudioLevelDefaultId;
92
93 // Header extension for RTP timestamp offset, see RFC 5450 for details:
94 // http://tools.ietf.org/html/rfc5450
95 static const char* kTimestampOffsetUri;
96 static const int kTimestampOffsetDefaultId;
97
98 // Header extension for absolute send time, see url for details:
99 // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
100 static const char* kAbsSendTimeUri;
101 static const int kAbsSendTimeDefaultId;
102
103 // Header extension for coordination of video orientation, see url for
104 // details:
105 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
106 static const char* kVideoRotationUri;
107 static const int kVideoRotationDefaultId;
108
109 // Header extension for transport sequence number, see url for details:
110 // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
111 static const char* kTransportSequenceNumberUri;
112 static const int kTransportSequenceNumberDefaultId;
113
isheriff00cc0452016-06-08 07:24:21114 static const char* kPlayoutDelayUri;
115 static const int kPlayoutDelayDefaultId;
116
isheriffc4921f42016-05-26 18:24:55117 std::string uri;
mflodman@webrtc.org06e80262013-04-18 12:02:52118 int id;
119};
pbos@webrtc.org7e686932014-05-15 09:35:06120
121struct VideoStream {
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22122 VideoStream();
123 ~VideoStream();
pbos@webrtc.org7e686932014-05-15 09:35:06124 std::string ToString() const;
125
126 size_t width;
127 size_t height;
128 int max_framerate;
129
130 int min_bitrate_bps;
131 int target_bitrate_bps;
132 int max_bitrate_bps;
133
134 int max_qp;
135
pbos@webrtc.orgddb84aa2014-10-31 13:08:10136 // Bitrate thresholds for enabling additional temporal layers. Since these are
137 // thresholds in between layers, we have one additional layer. One threshold
138 // gives two temporal layers, one below the threshold and one above, two give
139 // three, and so on.
140 // The VideoEncoder may redistribute bitrates over the temporal layers so a
141 // bitrate threshold of 100k and an estimate of 105k does not imply that we
142 // get 100k in one temporal layer and 5k in the other, just that the bitrate
143 // in the first temporal layer should not exceed 100k.
kthelgason4cc4a8d2016-09-27 10:52:02144 // TODO(kthelgason): Apart from a special case for two-layer screencast these
pbos@webrtc.orgddb84aa2014-10-31 13:08:10145 // thresholds are not propagated to the VideoEncoder. To be implemented.
146 std::vector<int> temporal_layer_thresholds_bps;
pbos@webrtc.org7e686932014-05-15 09:35:06147};
148
perkj730a9e72016-10-03 06:45:26149class VideoEncoderConfig {
perkj3f65eaf2016-09-01 08:17:40150 public:
kthelgason4cc4a8d2016-09-27 10:52:02151 // These are reference counted to permit copying VideoEncoderConfig and be
152 // kept alive until all encoder_specific_settings go out of scope.
153 // TODO(kthelgason): Consider removing the need for copying VideoEncoderConfig
154 // and use rtc::Optional for encoder_specific_settings instead.
155 class EncoderSpecificSettings : public rtc::RefCountInterface {
156 public:
157 // TODO(pbos): Remove FillEncoderSpecificSettings as soon as VideoCodec is
158 // not in use and encoder implementations ask for codec-specific structs
159 // directly.
160 void FillEncoderSpecificSettings(VideoCodec* codec_struct) const;
161
162 virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const;
163 virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const;
164 virtual void FillVideoCodecH264(VideoCodecH264* h264_settings) const;
165 private:
solenberg91c6f342016-10-25 18:19:07166 ~EncoderSpecificSettings() override {}
perkj730a9e72016-10-03 06:45:26167 friend class VideoEncoderConfig;
kthelgason4cc4a8d2016-09-27 10:52:02168 };
169
170 class H264EncoderSpecificSettings : public EncoderSpecificSettings {
171 public:
172 explicit H264EncoderSpecificSettings(const VideoCodecH264& specifics);
perkj730a9e72016-10-03 06:45:26173 void FillVideoCodecH264(VideoCodecH264* h264_settings) const override;
kthelgason4cc4a8d2016-09-27 10:52:02174
175 private:
176 VideoCodecH264 specifics_;
177 };
178
179 class Vp8EncoderSpecificSettings : public EncoderSpecificSettings {
180 public:
181 explicit Vp8EncoderSpecificSettings(const VideoCodecVP8& specifics);
perkj730a9e72016-10-03 06:45:26182 void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const override;
kthelgason4cc4a8d2016-09-27 10:52:02183
184 private:
185 VideoCodecVP8 specifics_;
186 };
187
188 class Vp9EncoderSpecificSettings : public EncoderSpecificSettings {
189 public:
190 explicit Vp9EncoderSpecificSettings(const VideoCodecVP9& specifics);
perkj730a9e72016-10-03 06:45:26191 void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const override;
kthelgason4cc4a8d2016-09-27 10:52:02192
193 private:
194 VideoCodecVP9 specifics_;
195 };
196
Erik Språngfc398fe2015-04-28 08:01:41197 enum class ContentType {
pbos@webrtc.org58b51402014-09-19 12:30:25198 kRealtimeVideo,
Erik Språngfc398fe2015-04-28 08:01:41199 kScreen,
pbos@webrtc.org58b51402014-09-19 12:30:25200 };
201
perkj730a9e72016-10-03 06:45:26202 class VideoStreamFactoryInterface : public rtc::RefCountInterface {
203 public:
204 // An implementation should return a std::vector<VideoStream> with the
205 // wanted VideoStream settings for the given video resolution.
206 // The size of the vector may not be larger than
207 // |encoder_config.number_of_streams|.
208 virtual std::vector<VideoStream> CreateEncoderStreams(
209 int width,
210 int height,
211 const VideoEncoderConfig& encoder_config) = 0;
212
213 protected:
solenberg91c6f342016-10-25 18:19:07214 ~VideoStreamFactoryInterface() override {}
perkj730a9e72016-10-03 06:45:26215 };
216
perkj3f65eaf2016-09-01 08:17:40217 VideoEncoderConfig& operator=(VideoEncoderConfig&&) = default;
218 VideoEncoderConfig& operator=(const VideoEncoderConfig&) = delete;
219
220 // Mostly used by tests. Avoid creating copies if you can.
221 VideoEncoderConfig Copy() const { return VideoEncoderConfig(*this); }
222
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22223 VideoEncoderConfig();
solenberg91c6f342016-10-25 18:19:07224 VideoEncoderConfig(VideoEncoderConfig&&);
kwiberg@webrtc.orgc4e2cd02015-02-26 13:59:22225 ~VideoEncoderConfig();
pbos@webrtc.org23668752014-10-24 09:23:21226 std::string ToString() const;
pbos@webrtc.org58b51402014-09-19 12:30:25227
perkj730a9e72016-10-03 06:45:26228 rtc::scoped_refptr<VideoStreamFactoryInterface> video_stream_factory;
sprang0ba16d12015-11-02 15:23:20229 std::vector<SpatialLayer> spatial_layers;
pbos@webrtc.org58b51402014-09-19 12:30:25230 ContentType content_type;
kthelgason4cc4a8d2016-09-27 10:52:02231 rtc::scoped_refptr<const EncoderSpecificSettings> encoder_specific_settings;
pbos@webrtc.org23668752014-10-24 09:23:21232
233 // Padding will be used up to this bitrate regardless of the bitrate produced
234 // by the encoder. Padding above what's actually produced by the encoder helps
235 // maintaining a higher bitrate estimate. Padding will however not be sent
236 // unless the estimated bandwidth indicates that the link can handle it.
237 int min_transmit_bitrate_bps;
perkj730a9e72016-10-03 06:45:26238 int max_bitrate_bps;
239
240 // Max number of encoded VideoStreams to produce.
241 size_t number_of_streams;
perkj3f65eaf2016-09-01 08:17:40242
243 private:
244 // Access to the copy constructor is private to force use of the Copy()
245 // method for those exceptional cases where we do use it.
solenberg91c6f342016-10-25 18:19:07246 VideoEncoderConfig(const VideoEncoderConfig&);
pbos@webrtc.org58b51402014-09-19 12:30:25247};
248
johan246856b2016-08-05 16:19:25249struct VideoDecoderH264Settings {
250 std::string sprop_parameter_sets;
251};
252
253class DecoderSpecificSettings {
254 public:
solenberg91c6f342016-10-25 18:19:07255 DecoderSpecificSettings();
256 virtual ~DecoderSpecificSettings();
johan246856b2016-08-05 16:19:25257 rtc::Optional<VideoDecoderH264Settings> h264_extra_settings;
258};
259
mflodman@webrtc.org06e80262013-04-18 12:02:52260} // namespace webrtc
261
pbos@webrtc.orgf0a119f2014-07-20 15:27:35262#endif // WEBRTC_CONFIG_H_