blob: 5a873de46e71b3e13fa5a2878f78cdd2ca04e1f6 [file] [log] [blame]
Stefan Holmer1acbd682017-09-01 15:29:28 +02001/*
2 * Copyright (c) 2017 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 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#include "api/rtpparameters.h"
Stefan Holmer1acbd682017-09-01 15:29:28 +020011
12#include <algorithm>
Stefan Holmer1acbd682017-09-01 15:29:28 +020013#include <string>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/checks.h"
Jonas Olsson866d6dc2018-05-14 17:30:22 +020016#include "rtc_base/strings/string_builder.h"
Stefan Holmer1acbd682017-09-01 15:29:28 +020017
18namespace webrtc {
19
Seth Hampsonf32795e2017-12-19 11:37:41 -080020const double kDefaultBitratePriority = 1.0;
21
Stefan Holmer1acbd682017-09-01 15:29:28 +020022RtcpFeedback::RtcpFeedback() {}
23RtcpFeedback::RtcpFeedback(RtcpFeedbackType type) : type(type) {}
24RtcpFeedback::RtcpFeedback(RtcpFeedbackType type,
25 RtcpFeedbackMessageType message_type)
26 : type(type), message_type(message_type) {}
27RtcpFeedback::~RtcpFeedback() {}
28
29RtpCodecCapability::RtpCodecCapability() {}
30RtpCodecCapability::~RtpCodecCapability() {}
31
32RtpHeaderExtensionCapability::RtpHeaderExtensionCapability() {}
33RtpHeaderExtensionCapability::RtpHeaderExtensionCapability(
34 const std::string& uri)
35 : uri(uri) {}
36RtpHeaderExtensionCapability::RtpHeaderExtensionCapability(
37 const std::string& uri,
38 int preferred_id)
39 : uri(uri), preferred_id(preferred_id) {}
40RtpHeaderExtensionCapability::~RtpHeaderExtensionCapability() {}
41
42RtpExtension::RtpExtension() {}
43RtpExtension::RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
44RtpExtension::RtpExtension(const std::string& uri, int id, bool encrypt)
45 : uri(uri), id(id), encrypt(encrypt) {}
46RtpExtension::~RtpExtension() {}
47
48RtpFecParameters::RtpFecParameters() {}
49RtpFecParameters::RtpFecParameters(FecMechanism mechanism)
50 : mechanism(mechanism) {}
51RtpFecParameters::RtpFecParameters(FecMechanism mechanism, uint32_t ssrc)
52 : ssrc(ssrc), mechanism(mechanism) {}
53RtpFecParameters::~RtpFecParameters() {}
54
55RtpRtxParameters::RtpRtxParameters() {}
56RtpRtxParameters::RtpRtxParameters(uint32_t ssrc) : ssrc(ssrc) {}
57RtpRtxParameters::~RtpRtxParameters() {}
58
59RtpEncodingParameters::RtpEncodingParameters() {}
60RtpEncodingParameters::~RtpEncodingParameters() {}
61
62RtpCodecParameters::RtpCodecParameters() {}
63RtpCodecParameters::~RtpCodecParameters() {}
64
65RtpCapabilities::RtpCapabilities() {}
66RtpCapabilities::~RtpCapabilities() {}
67
Florent Castellidacec712018-05-24 16:24:21 +020068RtcpParameters::RtcpParameters() {}
69RtcpParameters::~RtcpParameters() {}
70
Stefan Holmer1acbd682017-09-01 15:29:28 +020071RtpParameters::RtpParameters() {}
72RtpParameters::~RtpParameters() {}
73
74std::string RtpExtension::ToString() const {
Jonas Olsson866d6dc2018-05-14 17:30:22 +020075 char buf[256];
76 rtc::SimpleStringBuilder sb(buf);
77 sb << "{uri: " << uri;
78 sb << ", id: " << id;
Stefan Holmer1acbd682017-09-01 15:29:28 +020079 if (encrypt) {
Jonas Olsson866d6dc2018-05-14 17:30:22 +020080 sb << ", encrypt";
Stefan Holmer1acbd682017-09-01 15:29:28 +020081 }
Jonas Olsson866d6dc2018-05-14 17:30:22 +020082 sb << '}';
83 return sb.str();
Stefan Holmer1acbd682017-09-01 15:29:28 +020084}
85
86const char RtpExtension::kAudioLevelUri[] =
87 "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
88const int RtpExtension::kAudioLevelDefaultId = 1;
89
90const char RtpExtension::kTimestampOffsetUri[] =
91 "urn:ietf:params:rtp-hdrext:toffset";
92const int RtpExtension::kTimestampOffsetDefaultId = 2;
93
94const char RtpExtension::kAbsSendTimeUri[] =
95 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
96const int RtpExtension::kAbsSendTimeDefaultId = 3;
97
98const char RtpExtension::kVideoRotationUri[] = "urn:3gpp:video-orientation";
99const int RtpExtension::kVideoRotationDefaultId = 4;
100
101const char RtpExtension::kTransportSequenceNumberUri[] =
102 "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
103const int RtpExtension::kTransportSequenceNumberDefaultId = 5;
104
105// This extension allows applications to adaptively limit the playout delay
106// on frames as per the current needs. For example, a gaming application
107// has very different needs on end-to-end delay compared to a video-conference
108// application.
109const char RtpExtension::kPlayoutDelayUri[] =
110 "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay";
111const int RtpExtension::kPlayoutDelayDefaultId = 6;
112
113const char RtpExtension::kVideoContentTypeUri[] =
114 "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type";
115const int RtpExtension::kVideoContentTypeDefaultId = 7;
116
117const char RtpExtension::kVideoTimingUri[] =
118 "http://www.webrtc.org/experiments/rtp-hdrext/video-timing";
119const int RtpExtension::kVideoTimingDefaultId = 8;
120
Steve Antonbb50ce52018-03-26 10:24:32 -0700121const char RtpExtension::kMidUri[] = "urn:ietf:params:rtp-hdrext:sdes:mid";
122const int RtpExtension::kMidDefaultId = 9;
123
Stefan Holmer1acbd682017-09-01 15:29:28 +0200124const char RtpExtension::kEncryptHeaderExtensionsUri[] =
125 "urn:ietf:params:rtp-hdrext:encrypt";
126
127const int RtpExtension::kMinId = 1;
128const int RtpExtension::kMaxId = 14;
129
130bool RtpExtension::IsSupportedForAudio(const std::string& uri) {
131 return uri == webrtc::RtpExtension::kAudioLevelUri ||
Steve Antonbb50ce52018-03-26 10:24:32 -0700132 uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
133 uri == webrtc::RtpExtension::kMidUri;
Stefan Holmer1acbd682017-09-01 15:29:28 +0200134}
135
136bool RtpExtension::IsSupportedForVideo(const std::string& uri) {
137 return uri == webrtc::RtpExtension::kTimestampOffsetUri ||
138 uri == webrtc::RtpExtension::kAbsSendTimeUri ||
139 uri == webrtc::RtpExtension::kVideoRotationUri ||
140 uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
141 uri == webrtc::RtpExtension::kPlayoutDelayUri ||
142 uri == webrtc::RtpExtension::kVideoContentTypeUri ||
Steve Antonbb50ce52018-03-26 10:24:32 -0700143 uri == webrtc::RtpExtension::kVideoTimingUri ||
144 uri == webrtc::RtpExtension::kMidUri;
Stefan Holmer1acbd682017-09-01 15:29:28 +0200145}
146
147bool RtpExtension::IsEncryptionSupported(const std::string& uri) {
148 return uri == webrtc::RtpExtension::kAudioLevelUri ||
149 uri == webrtc::RtpExtension::kTimestampOffsetUri ||
150#if !defined(ENABLE_EXTERNAL_AUTH)
151 // TODO(jbauch): Figure out a way to always allow "kAbsSendTimeUri"
152 // here and filter out later if external auth is really used in
153 // srtpfilter. External auth is used by Chromium and replaces the
154 // extension header value of "kAbsSendTimeUri", so it must not be
155 // encrypted (which can't be done by Chromium).
156 uri == webrtc::RtpExtension::kAbsSendTimeUri ||
157#endif
158 uri == webrtc::RtpExtension::kVideoRotationUri ||
159 uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
160 uri == webrtc::RtpExtension::kPlayoutDelayUri ||
Steve Antonbb50ce52018-03-26 10:24:32 -0700161 uri == webrtc::RtpExtension::kVideoContentTypeUri ||
162 uri == webrtc::RtpExtension::kMidUri;
Stefan Holmer1acbd682017-09-01 15:29:28 +0200163}
164
165const RtpExtension* RtpExtension::FindHeaderExtensionByUri(
166 const std::vector<RtpExtension>& extensions,
167 const std::string& uri) {
168 for (const auto& extension : extensions) {
169 if (extension.uri == uri) {
170 return &extension;
171 }
172 }
173 return nullptr;
174}
175
176std::vector<RtpExtension> RtpExtension::FilterDuplicateNonEncrypted(
177 const std::vector<RtpExtension>& extensions) {
178 std::vector<RtpExtension> filtered;
179 for (auto extension = extensions.begin(); extension != extensions.end();
180 ++extension) {
181 if (extension->encrypt) {
182 filtered.push_back(*extension);
183 continue;
184 }
185
186 // Only add non-encrypted extension if no encrypted with the same URI
187 // is also present...
188 if (std::find_if(extension + 1, extensions.end(),
189 [extension](const RtpExtension& check) {
190 return extension->uri == check.uri;
191 }) != extensions.end()) {
192 continue;
193 }
194
195 // ...and has not been added before.
196 if (!FindHeaderExtensionByUri(filtered, extension->uri)) {
197 filtered.push_back(*extension);
198 }
199 }
200 return filtered;
201}
202} // namespace webrtc