Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: webrtc/api/rtpparameters.h

Issue 2651883010: Adding C++ versions of currently spec'd "RtpParameters" structs. (Closed)
Patch Set: Update unit tests (due to switch from special-case values to rtc::Optional) Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/media/base/codec.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #ifndef WEBRTC_API_RTPPARAMETERS_H_ 11 #ifndef WEBRTC_API_RTPPARAMETERS_H_
12 #define WEBRTC_API_RTPPARAMETERS_H_ 12 #define WEBRTC_API_RTPPARAMETERS_H_
13 13
14 #include <string> 14 #include <string>
15 #include <unordered_map>
15 #include <vector> 16 #include <vector>
16 17
18 #include "webrtc/api/mediatypes.h"
17 #include "webrtc/base/optional.h" 19 #include "webrtc/base/optional.h"
18 20
19 namespace webrtc { 21 namespace webrtc {
20 22
21 // These structures are defined as part of the RtpSender interface. 23 // These structures are intended to mirror those defined by:
22 // See http://w3c.github.io/webrtc-pc/#rtcrtpsender-interface for details. 24 // http://draft.ortc.org/#rtcrtpdictionaries*
25 // Contains everything specified as of 2017 Jan 24.
26 //
27 // They are used when retrieving or modifying the parameters of an
28 // RtpSender/RtpReceiver, or retrieving capabilities.
29 //
30 // Note on conventions: Where ORTC may use "octet", "short" and "unsigned"
31 // types, we typically use "int", in keeping with our style guidelines. The
32 // parameter's actual valid range will be enforced when the parameters are set,
33 // rather than when the parameters struct is built. An exception is made for
34 // SSRCs, since they use the full unsigned 32-bit range, and aren't expected to
35 // be used for any numeric comparisons/operations.
36 //
37 // Additionally, where ORTC uses strings, we may use enums for things that have
38 // a fixed number of supported values. However, for things that can be extended
39 // (such as codecs, by providing an external encoder factory), a string
40 // identifier is used.
41
42 enum class FecMechanism {
43 RED,
44 RED_AND_ULPFEC,
45 FLEXFEC,
46 };
47
48 // Used in RtcpFeedback struct.
49 enum class RtcpFeedbackType {
50 ACK,
51 CCM,
52 NACK,
53 REMB, // "goog-remb"
54 TRANSPORT_CC,
55 };
56
57 // Used in RtcpFeedback struct when type is ACK, NACK or CCM.
58 enum class RtcpFeedbackMessageType {
59 // Equivalent to {type: "nack", parameter: undefined} in ORTC.
60 GENERIC_NACK,
61 PLI, // Usable with NACK.
62 FIR, // Usable with CCM.
63 };
64
65 enum class DtxStatus {
66 DISABLED,
67 ENABLED,
68 };
69
70 enum class DegradationPreference {
71 MAINTAIN_FRAMERATE,
72 MAINTAIN_RESOLUTION,
73 BALANCED,
74 };
75
76 enum class PriorityType { VERY_LOW, LOW, MEDIUM, HIGH };
77
78 struct RtcpFeedback {
79 RtcpFeedbackType type = RtcpFeedbackType::ACK;
80
81 // Equivalent to ORTC "parameter" field with slight differences:
82 // 1. It's an enum instead of a string.
83 // 2. Generic NACK feedback is represented by a GENERIC_NACK message type,
84 // rather than an unset "parameter" value.
85 rtc::Optional<RtcpFeedbackMessageType> message_type;
86
87 bool operator==(const RtcpFeedback& o) const {
88 return type == o.type && message_type == o.message_type;
89 }
90 bool operator!=(const RtcpFeedback& o) const { return !(*this == o); }
91 };
92
93 // RtpCodecCapability is to RtpCodecParameters as RtpCapabilities is to
94 // RtpParameters. This represents the static capabilities of an endpoint's
95 // implementation of a codec.
96 struct RtpCodecCapability {
97 // Build MIME "type/subtype" string from |name| and |kind|.
98 std::string mime_type() const { return MediaTypeToString(kind) + "/" + name; }
99
100 // Used to identify the codec. Equivalent to MIME subtype.
101 std::string name;
102
103 // The media type of this codec. Equivalent to MIME top-level type.
104 cricket::MediaType kind = cricket::MEDIA_TYPE_AUDIO;
105
106 // Clock rate in Hertz. If unset, the codec is applicable to any clock rate.
107 rtc::Optional<int> clock_rate;
108
109 // Default payload type for this codec. Mainly needed for codecs that use
110 // that have statically assigned payload types.
111 rtc::Optional<int> preferred_payload_type;
112
113 // Maximum packetization time supported by an RtpReceiver for this codec.
114 // TODO(deadbeef): Not implemented.
115 rtc::Optional<int> max_ptime;
116
117 // Preferred packetization time for an RtpReceiver or RtpSender of this
118 // codec.
119 // TODO(deadbeef): Not implemented.
120 rtc::Optional<int> ptime;
121
122 // The number of audio channels supported. Unused for video codecs.
123 rtc::Optional<int> num_channels;
124
125 // Feedback mechanisms supported for this codec.
126 std::vector<RtcpFeedback> rtcp_feedback;
127
128 // Codec-specific parameters that must be signaled to the remote party.
129 // Corresponds to "a=fmtp" parameters in SDP.
130 std::unordered_map<std::string, std::string> parameters;
131
132 // Codec-specific parameters that may optionally be signaled to the remote
133 // party.
134 // TODO(deadbeef): Not implemented.
135 std::unordered_map<std::string, std::string> options;
136
137 // Maximum number of temporal layer extensions supported by this codec.
138 // For example, a value of 1 indicates that 2 total layers are supported.
139 // TODO(deadbeef): Not implemented.
140 int max_temporal_layer_extensions = 0;
141
142 // Maximum number of spatial layer extensions supported by this codec.
143 // For example, a value of 1 indicates that 2 total layers are supported.
144 // TODO(deadbeef): Not implemented.
145 int max_spatial_layer_extensions = 0;
146
147 // Whether the implementation can send/receive SVC layers with distinct
148 // SSRCs. Always false for audio codecs. True for video codecs that support
149 // scalable video coding with MRST.
150 // TODO(deadbeef): Not implemented.
151 bool svc_multi_stream_support = false;
152
153 bool operator==(const RtpCodecCapability& o) const {
154 return name == o.name && kind == o.kind && clock_rate == o.clock_rate &&
155 preferred_payload_type == o.preferred_payload_type &&
156 max_ptime == o.max_ptime && ptime == o.ptime &&
157 num_channels == o.num_channels && rtcp_feedback == o.rtcp_feedback &&
158 parameters == o.parameters && options == o.options &&
159 max_temporal_layer_extensions == o.max_temporal_layer_extensions &&
160 max_spatial_layer_extensions == o.max_spatial_layer_extensions &&
161 svc_multi_stream_support == o.svc_multi_stream_support;
162 }
163 bool operator!=(const RtpCodecCapability& o) const { return !(*this == o); }
164 };
165
166 // Used in RtpCapabilities; represents the capabilities/preferences of an
167 // implementation for a header extension.
168 //
169 // Just called "RtpHeaderExtension" in ORTC, but the "Capability" suffix was
170 // added here for consistency and to avoid confusion with
171 // RtpHeaderExtensionParameters.
172 //
173 // Note that ORTC includes a "kind" field, but we omit this because it's
174 // redundant; if you call "RtpReceiver::GetCapabilities(MEDIA_TYPE_AUDIO)",
175 // you know you're getting audio capabilities.
176 struct RtpHeaderExtensionCapability {
177 // URI of this extension, as defined in RFC5285.
178 std::string uri;
179
180 // Preferred value of ID that goes in the packet.
181 rtc::Optional<int> preferred_id;
182
183 // If true, it's preferred that the value in the header is encrypted.
184 // TODO(deadbeef): Not implemented.
185 bool preferred_encrypt = false;
186
187 bool operator==(const RtpHeaderExtensionCapability& o) const {
188 return uri == o.uri && preferred_id == o.preferred_id &&
189 preferred_encrypt == o.preferred_encrypt;
190 }
191 bool operator!=(const RtpHeaderExtensionCapability& o) const {
192 return !(*this == o);
193 }
194 };
195
196 // Used in RtpParameters; represents a specific configuration of a header
197 // extension.
198 struct RtpHeaderExtensionParameters {
199 // URI of this extension, as defined in RFC5285.
200 std::string uri;
201
202 // ID value that goes in the packet.
203 int id = 0;
204
205 // If true, the value in the header is encrypted.
206 // TODO(deadbeef): Not implemented.
207 bool encrypt = false;
208
209 bool operator==(const RtpHeaderExtensionParameters& o) const {
210 return uri == o.uri && id == o.id && encrypt == o.encrypt;
211 }
212 bool operator!=(const RtpHeaderExtensionParameters& o) const {
213 return !(*this == o);
214 }
215 };
216
217 struct RtpFecParameters {
218 // If unset, a value is chosen by the implementation.
219 rtc::Optional<uint32_t> ssrc;
220
221 FecMechanism mechanism = FecMechanism::RED;
222
223 bool operator==(const RtpFecParameters& o) const {
224 return ssrc == o.ssrc && mechanism == o.mechanism;
225 }
226 bool operator!=(const RtpFecParameters& o) const { return !(*this == o); }
227 };
228
229 struct RtpRtxParameters {
230 // If unset, a value is chosen by the implementation.
231 rtc::Optional<uint32_t> ssrc;
232
233 bool operator==(const RtpRtxParameters& o) const { return ssrc == o.ssrc; }
234 bool operator!=(const RtpRtxParameters& o) const { return !(*this == o); }
235 };
236
23 struct RtpEncodingParameters { 237 struct RtpEncodingParameters {
238 // If unset, a value is chosen by the implementation.
24 rtc::Optional<uint32_t> ssrc; 239 rtc::Optional<uint32_t> ssrc;
240
241 // Can be used to reference a codec in the |codecs| member of the
242 // RtpParameters that contains this RtpEncodingParameters. If unset, the
243 // implementation will choose the first possible codec.
244 // TODO(deadbeef): Not implemented.
245 rtc::Optional<int> codec_payload_type;
246
247 // Specifies the FEC mechanism, if set.
248 // TODO(deadbeef): Not implemented.
249 rtc::Optional<RtpFecParameters> fec;
250
251 // Specifies the RTX parameters, if set.
252 // TODO(deadbeef): Not implemented.
253 rtc::Optional<RtpRtxParameters> rtx;
254
255 // Only used for audio. If set, determines whether or not discontinuous
256 // transmission will be used, if an available codec supports it. If not
257 // set, the implementation default setting will be used.
258 rtc::Optional<DtxStatus> dtx;
259
260 // The relative priority of this encoding.
261 // TODO(deadbeef): Not implemented.
262 rtc::Optional<PriorityType> priority;
263
264 // If set, this represents the Transport Independent Application Specific
265 // maximum bandwidth defined in RFC3890. If unset, there is no maximum
266 // bitrate.
267 // Just called "maxBitrate" in ORTC spec.
268 rtc::Optional<int> max_bitrate_bps;
269
270 // TODO(deadbeef): Not implemented.
271 rtc::Optional<int> max_framerate;
272
273 // For video, scale the resolution down by this factor.
274 // TODO(deadbeef): Not implemented.
275 double scale_resolution_down_by = 1.0;
276
277 // Scale the framerate down by this factor.
278 // TODO(deadbeef): Not implemented.
279 double scale_framerate_down_by = 1.0;
280
281 // For an RtpSender, set to true to cause this encoding to be sent, and false
282 // for it not to be sent. For an RtpReceiver, set to true to cause the
283 // encoding to be decoded, and false for it to be ignored.
284 // TODO(deadbeef): RtpReceiver part is not implemented.
25 bool active = true; 285 bool active = true;
26 int max_bitrate_bps = -1; 286
287 // Value to use for RID RTP header extension.
288 // Called "encodingId" in ORTC.
289 // TODO(deadbeef): Not implemented.
290 std::string rid;
291
292 // RIDs of encodings on which this layer depends.
293 // Called "dependencyEncodingIds" in ORTC spec.
294 // TODO(deadbeef): Not implemented.
295 std::vector<std::string> dependency_rids;
27 296
28 bool operator==(const RtpEncodingParameters& o) const { 297 bool operator==(const RtpEncodingParameters& o) const {
29 return ssrc == o.ssrc && active == o.active && 298 return ssrc == o.ssrc && codec_payload_type == o.codec_payload_type &&
30 max_bitrate_bps == o.max_bitrate_bps; 299 fec == o.fec && rtx == o.rtx && dtx == o.dtx &&
300 priority == o.priority && max_bitrate_bps == o.max_bitrate_bps &&
301 max_framerate == o.max_framerate &&
302 scale_resolution_down_by == o.scale_resolution_down_by &&
303 scale_framerate_down_by == o.scale_framerate_down_by &&
304 active == o.active && rid == o.rid &&
305 dependency_rids == o.dependency_rids;
31 } 306 }
32 bool operator!=(const RtpEncodingParameters& o) const { 307 bool operator!=(const RtpEncodingParameters& o) const {
33 return !(*this == o); 308 return !(*this == o);
34 } 309 }
35 }; 310 };
36 311
37 struct RtpCodecParameters { 312 struct RtpCodecParameters {
38 int payload_type; 313 // Build MIME "type/subtype" string from |name| and |kind|.
39 std::string mime_type; 314 std::string mime_type() const { return MediaTypeToString(kind) + "/" + name; }
40 int clock_rate; 315
41 int channels = 1; 316 // Used to identify the codec. Equivalent to MIME subtype.
42 // TODO(deadbeef): Add sdpFmtpLine field. 317 std::string name;
318
319 // The media type of this codec. Equivalent to MIME top-level type.
320 cricket::MediaType kind = cricket::MEDIA_TYPE_AUDIO;
321
322 // Payload type used to identify this codec in RTP packets.
323 // This MUST always be present, and must be unique across all codecs using
324 // the same transport.
325 int payload_type = 0;
326
327 // If unset, the implementation default is used.
328 rtc::Optional<int> clock_rate;
329
330 // The number of audio channels used. Unset for video codecs. If unset for
331 // audio, the implementation default is used.
332 // TODO(deadbeef): The "implementation default" part is unimplemented.
333 rtc::Optional<int> num_channels;
334
335 // The maximum packetization time to be used by an RtpSender.
336 // If |ptime| is also set, this will be ignored.
337 // TODO(deadbeef): Not implemented.
338 rtc::Optional<int> max_ptime;
339
340 // The packetization time to be used by an RtpSender.
341 // If unset, will use any time up to max_ptime.
342 // TODO(deadbeef): Not implemented.
343 rtc::Optional<int> ptime;
344
345 // Feedback mechanisms to be used for this codec.
346 // TODO(deadbeef): Not implemented.
347 std::vector<RtcpFeedback> rtcp_feedback;
348
349 // Codec-specific parameters that must be signaled to the remote party.
350 // Corresponds to "a=fmtp" parameters in SDP.
351 // TODO(deadbeef): Not implemented.
352 std::unordered_map<std::string, std::string> parameters;
43 353
44 bool operator==(const RtpCodecParameters& o) const { 354 bool operator==(const RtpCodecParameters& o) const {
45 return payload_type == o.payload_type && mime_type == o.mime_type && 355 return name == o.name && kind == o.kind && payload_type == o.payload_type &&
46 clock_rate == o.clock_rate && channels == o.channels; 356 clock_rate == o.clock_rate && num_channels == o.num_channels &&
357 max_ptime == o.max_ptime && ptime == o.ptime &&
358 rtcp_feedback == o.rtcp_feedback && parameters == o.parameters;
47 } 359 }
48 bool operator!=(const RtpCodecParameters& o) const { return !(*this == o); } 360 bool operator!=(const RtpCodecParameters& o) const { return !(*this == o); }
49 }; 361 };
50 362
363 // RtpCapabilities is used to represent the static capabilities of an
364 // endpoint. An application can use these capabilities to construct an
365 // RtpParameters.
366 struct RtpCapabilities {
367 // Supported codecs.
368 std::vector<RtpCodecCapability> codecs;
369
370 // Supported RTP header extensions.
371 std::vector<RtpHeaderExtensionCapability> header_extensions;
372
373 // Supported Forward Error Correction (FEC) mechanisms.
374 std::vector<FecMechanism> fec;
375
376 bool operator==(const RtpCapabilities& o) const {
377 return codecs == o.codecs && header_extensions == o.header_extensions &&
378 fec == o.fec;
379 }
380 bool operator!=(const RtpCapabilities& o) const { return !(*this == o); }
381 };
382
383 // Note that unlike in ORTC, an RtcpParameters is not included in
384 // RtpParameters, because our API will include an additional "RtpTransport"
385 // abstraction on which RTCP parameters are set.
51 struct RtpParameters { 386 struct RtpParameters {
52 std::vector<RtpEncodingParameters> encodings; 387 // Used when calling getParameters/setParameters with a PeerConnection
388 // RtpSender, to ensure that outdated parameters are not unintentionally
389 // applied successfully.
390 // TODO(deadbeef): Not implemented.
391 std::string transaction_id;
392
393 // Value to use for MID RTP header extension.
394 // Called "muxId" in ORTC.
395 // TODO(deadbeef): Not implemented.
396 std::string mid;
397
53 std::vector<RtpCodecParameters> codecs; 398 std::vector<RtpCodecParameters> codecs;
54 399
400 // TODO(deadbeef): Not implemented.
401 std::vector<RtpHeaderExtensionParameters> header_extensions;
402
403 std::vector<RtpEncodingParameters> encodings;
404
405 // TODO(deadbeef): Not implemented.
406 DegradationPreference degradation_preference =
407 DegradationPreference::BALANCED;
408
55 bool operator==(const RtpParameters& o) const { 409 bool operator==(const RtpParameters& o) const {
56 return encodings == o.encodings && codecs == o.codecs; 410 return mid == o.mid && codecs == o.codecs &&
411 header_extensions == o.header_extensions &&
412 encodings == o.encodings &&
413 degradation_preference == o.degradation_preference;
57 } 414 }
58 bool operator!=(const RtpParameters& o) const { return !(*this == o); } 415 bool operator!=(const RtpParameters& o) const { return !(*this == o); }
59 }; 416 };
60 417
61 } // namespace webrtc 418 } // namespace webrtc
62 419
63 #endif // WEBRTC_API_RTPPARAMETERS_H_ 420 #endif // WEBRTC_API_RTPPARAMETERS_H_
OLDNEW
« no previous file with comments | « no previous file | webrtc/media/base/codec.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698