blob: a6778715d87f634692a63b59aac64d3010ec73c6 [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
johan3859c892016-08-05 09:19:25 -070019#include "webrtc/base/optional.h"
kthelgason29a44e32016-09-27 03:52:02 -070020#include "webrtc/base/refcount.h"
21#include "webrtc/base/scoped_ref_ptr.h"
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000022#include "webrtc/common_types.h"
pbos@webrtc.orgce90eff2013-11-20 11:48:56 +000023#include "webrtc/typedefs.h"
24
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000025namespace webrtc {
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000026
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000027// Settings for NACK, see RFC 4585 for details.
28struct NackConfig {
pbos@webrtc.orgeceb5322013-05-28 08:04:45 +000029 NackConfig() : rtp_history_ms(0) {}
solenberg971cab02016-06-14 10:02:41 -070030 std::string ToString() const;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000031 // Send side: the time RTP packets are stored for retransmissions.
32 // Receive side: the time the receiver is prepared to wait for
33 // retransmissions.
pbos@webrtc.orgeceb5322013-05-28 08:04:45 +000034 // Set to '0' to disable.
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000035 int rtp_history_ms;
36};
37
brandtrb5f2c3f2016-10-04 23:28:39 -070038// Settings for ULPFEC forward error correction.
39// Set the payload types to '-1' to disable.
40struct UlpfecConfig {
41 UlpfecConfig()
Shao Changbine62202f2015-04-21 20:24:50 +080042 : ulpfec_payload_type(-1),
43 red_payload_type(-1),
44 red_rtx_payload_type(-1) {}
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000045 std::string ToString() const;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000046 // Payload type used for ULPFEC packets.
47 int ulpfec_payload_type;
48
49 // Payload type used for RED packets.
50 int red_payload_type;
Shao Changbine62202f2015-04-21 20:24:50 +080051
52 // RTX payload type for RED payload.
53 int red_rtx_payload_type;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000054};
55
solenberg3a941542015-11-16 07:34:50 -080056// RTP header extension, see RFC 5285.
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000057struct RtpExtension {
isheriff6f8d6862016-05-26 11:24:55 -070058 RtpExtension() : id(0) {}
59 RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000060 std::string ToString() const;
solenberg3a941542015-11-16 07:34:50 -080061 bool operator==(const RtpExtension& rhs) const {
isheriff6f8d6862016-05-26 11:24:55 -070062 return uri == rhs.uri && id == rhs.id;
solenberg3a941542015-11-16 07:34:50 -080063 }
isheriff6f8d6862016-05-26 11:24:55 -070064 static bool IsSupportedForAudio(const std::string& uri);
65 static bool IsSupportedForVideo(const std::string& uri);
pbos@webrtc.org3c107582014-07-20 15:27:35 +000066
isheriff6f8d6862016-05-26 11:24:55 -070067 // Header extension for audio levels, as defined in:
68 // http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
69 static const char* kAudioLevelUri;
70 static const int kAudioLevelDefaultId;
71
72 // Header extension for RTP timestamp offset, see RFC 5450 for details:
73 // http://tools.ietf.org/html/rfc5450
74 static const char* kTimestampOffsetUri;
75 static const int kTimestampOffsetDefaultId;
76
77 // Header extension for absolute send time, see url for details:
78 // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
79 static const char* kAbsSendTimeUri;
80 static const int kAbsSendTimeDefaultId;
81
82 // Header extension for coordination of video orientation, see url for
83 // details:
84 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
85 static const char* kVideoRotationUri;
86 static const int kVideoRotationDefaultId;
87
88 // Header extension for transport sequence number, see url for details:
89 // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
90 static const char* kTransportSequenceNumberUri;
91 static const int kTransportSequenceNumberDefaultId;
92
isheriff6b4b5f32016-06-08 00:24:21 -070093 static const char* kPlayoutDelayUri;
94 static const int kPlayoutDelayDefaultId;
95
isheriff6f8d6862016-05-26 11:24:55 -070096 std::string uri;
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +000097 int id;
98};
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +000099
100struct VideoStream {
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000101 VideoStream();
102 ~VideoStream();
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +0000103 std::string ToString() const;
104
105 size_t width;
106 size_t height;
107 int max_framerate;
108
109 int min_bitrate_bps;
110 int target_bitrate_bps;
111 int max_bitrate_bps;
112
113 int max_qp;
114
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +0000115 // Bitrate thresholds for enabling additional temporal layers. Since these are
116 // thresholds in between layers, we have one additional layer. One threshold
117 // gives two temporal layers, one below the threshold and one above, two give
118 // three, and so on.
119 // The VideoEncoder may redistribute bitrates over the temporal layers so a
120 // bitrate threshold of 100k and an estimate of 105k does not imply that we
121 // get 100k in one temporal layer and 5k in the other, just that the bitrate
122 // in the first temporal layer should not exceed 100k.
kthelgason29a44e32016-09-27 03:52:02 -0700123 // TODO(kthelgason): Apart from a special case for two-layer screencast these
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +0000124 // thresholds are not propagated to the VideoEncoder. To be implemented.
125 std::vector<int> temporal_layer_thresholds_bps;
pbos@webrtc.org1e92b0a2014-05-15 09:35:06 +0000126};
127
perkjfa10b552016-10-02 23:45:26 -0700128class VideoEncoderConfig {
perkj26091b12016-09-01 01:17:40 -0700129 public:
kthelgason29a44e32016-09-27 03:52:02 -0700130 // These are reference counted to permit copying VideoEncoderConfig and be
131 // kept alive until all encoder_specific_settings go out of scope.
132 // TODO(kthelgason): Consider removing the need for copying VideoEncoderConfig
133 // and use rtc::Optional for encoder_specific_settings instead.
134 class EncoderSpecificSettings : public rtc::RefCountInterface {
135 public:
136 // TODO(pbos): Remove FillEncoderSpecificSettings as soon as VideoCodec is
137 // not in use and encoder implementations ask for codec-specific structs
138 // directly.
139 void FillEncoderSpecificSettings(VideoCodec* codec_struct) const;
140
141 virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const;
142 virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const;
143 virtual void FillVideoCodecH264(VideoCodecH264* h264_settings) const;
144 private:
145 virtual ~EncoderSpecificSettings() {}
perkjfa10b552016-10-02 23:45:26 -0700146 friend class VideoEncoderConfig;
kthelgason29a44e32016-09-27 03:52:02 -0700147 };
148
149 class H264EncoderSpecificSettings : public EncoderSpecificSettings {
150 public:
151 explicit H264EncoderSpecificSettings(const VideoCodecH264& specifics);
perkjfa10b552016-10-02 23:45:26 -0700152 void FillVideoCodecH264(VideoCodecH264* h264_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700153
154 private:
155 VideoCodecH264 specifics_;
156 };
157
158 class Vp8EncoderSpecificSettings : public EncoderSpecificSettings {
159 public:
160 explicit Vp8EncoderSpecificSettings(const VideoCodecVP8& specifics);
perkjfa10b552016-10-02 23:45:26 -0700161 void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700162
163 private:
164 VideoCodecVP8 specifics_;
165 };
166
167 class Vp9EncoderSpecificSettings : public EncoderSpecificSettings {
168 public:
169 explicit Vp9EncoderSpecificSettings(const VideoCodecVP9& specifics);
perkjfa10b552016-10-02 23:45:26 -0700170 void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const override;
kthelgason29a44e32016-09-27 03:52:02 -0700171
172 private:
173 VideoCodecVP9 specifics_;
174 };
175
Erik Språng143cec12015-04-28 10:01:41 +0200176 enum class ContentType {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000177 kRealtimeVideo,
Erik Språng143cec12015-04-28 10:01:41 +0200178 kScreen,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000179 };
180
perkjfa10b552016-10-02 23:45:26 -0700181 class VideoStreamFactoryInterface : public rtc::RefCountInterface {
182 public:
183 // An implementation should return a std::vector<VideoStream> with the
184 // wanted VideoStream settings for the given video resolution.
185 // The size of the vector may not be larger than
186 // |encoder_config.number_of_streams|.
187 virtual std::vector<VideoStream> CreateEncoderStreams(
188 int width,
189 int height,
190 const VideoEncoderConfig& encoder_config) = 0;
191
192 protected:
193 virtual ~VideoStreamFactoryInterface() {}
194 };
195
perkj26091b12016-09-01 01:17:40 -0700196 VideoEncoderConfig& operator=(VideoEncoderConfig&&) = default;
197 VideoEncoderConfig& operator=(const VideoEncoderConfig&) = delete;
198
199 // Mostly used by tests. Avoid creating copies if you can.
200 VideoEncoderConfig Copy() const { return VideoEncoderConfig(*this); }
201
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000202 VideoEncoderConfig();
perkj26091b12016-09-01 01:17:40 -0700203 VideoEncoderConfig(VideoEncoderConfig&&) = default;
kwiberg@webrtc.orgac2d27d2015-02-26 13:59:22 +0000204 ~VideoEncoderConfig();
pbos@webrtc.orgad3b5a52014-10-24 09:23:21 +0000205 std::string ToString() const;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000206
perkjfa10b552016-10-02 23:45:26 -0700207 rtc::scoped_refptr<VideoStreamFactoryInterface> video_stream_factory;
sprangce4aef12015-11-02 07:23:20 -0800208 std::vector<SpatialLayer> spatial_layers;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000209 ContentType content_type;
kthelgason29a44e32016-09-27 03:52:02 -0700210 rtc::scoped_refptr<const EncoderSpecificSettings> encoder_specific_settings;
pbos@webrtc.orgad3b5a52014-10-24 09:23:21 +0000211
212 // Padding will be used up to this bitrate regardless of the bitrate produced
213 // by the encoder. Padding above what's actually produced by the encoder helps
214 // maintaining a higher bitrate estimate. Padding will however not be sent
215 // unless the estimated bandwidth indicates that the link can handle it.
216 int min_transmit_bitrate_bps;
perkjfa10b552016-10-02 23:45:26 -0700217 int max_bitrate_bps;
218
219 // Max number of encoded VideoStreams to produce.
220 size_t number_of_streams;
perkj26091b12016-09-01 01:17:40 -0700221
222 private:
223 // Access to the copy constructor is private to force use of the Copy()
224 // method for those exceptional cases where we do use it.
225 VideoEncoderConfig(const VideoEncoderConfig&) = default;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000226};
227
johan3859c892016-08-05 09:19:25 -0700228struct VideoDecoderH264Settings {
229 std::string sprop_parameter_sets;
230};
231
232class DecoderSpecificSettings {
233 public:
234 virtual ~DecoderSpecificSettings() {}
235 rtc::Optional<VideoDecoderH264Settings> h264_extra_settings;
236};
237
mflodman@webrtc.org65f995a2013-04-18 12:02:52 +0000238} // namespace webrtc
239
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000240#endif // WEBRTC_CONFIG_H_