Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 1 | /* |
| 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 | */ |
Steve Anton | 10542f2 | 2019-01-11 17:11:00 | [diff] [blame] | 10 | #include "api/rtp_parameters.h" |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 11 | |
| 12 | #include <algorithm> |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 13 | #include <string> |
Tomas Gunnarsson | c69453d | 2022-01-06 12:36:04 | [diff] [blame] | 14 | #include <tuple> |
Markus Handell | dfeb0df | 2020-03-16 21:20:47 | [diff] [blame] | 15 | #include <utility> |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 16 | |
Yves Gerey | 988cc08 | 2018-10-23 10:03:01 | [diff] [blame] | 17 | #include "api/array_view.h" |
Jonas Olsson | 866d6dc | 2018-05-14 15:30:22 | [diff] [blame] | 18 | #include "rtc_base/strings/string_builder.h" |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 19 | |
| 20 | namespace webrtc { |
| 21 | |
Henrik Boström | f0eef12 | 2020-05-28 14:22:42 | [diff] [blame] | 22 | const char* DegradationPreferenceToString( |
| 23 | DegradationPreference degradation_preference) { |
| 24 | switch (degradation_preference) { |
| 25 | case DegradationPreference::DISABLED: |
| 26 | return "disabled"; |
| 27 | case DegradationPreference::MAINTAIN_FRAMERATE: |
| 28 | return "maintain-framerate"; |
| 29 | case DegradationPreference::MAINTAIN_RESOLUTION: |
| 30 | return "maintain-resolution"; |
| 31 | case DegradationPreference::BALANCED: |
| 32 | return "balanced"; |
| 33 | } |
Karl Wiberg | c95b939 | 2020-11-07 23:49:37 | [diff] [blame] | 34 | RTC_CHECK_NOTREACHED(); |
Henrik Boström | f0eef12 | 2020-05-28 14:22:42 | [diff] [blame] | 35 | } |
| 36 | |
Seth Hampson | f32795e | 2017-12-19 19:37:41 | [diff] [blame] | 37 | const double kDefaultBitratePriority = 1.0; |
| 38 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 39 | RtcpFeedback::RtcpFeedback() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 40 | RtcpFeedback::RtcpFeedback(RtcpFeedbackType type) : type(type) {} |
| 41 | RtcpFeedback::RtcpFeedback(RtcpFeedbackType type, |
| 42 | RtcpFeedbackMessageType message_type) |
| 43 | : type(type), message_type(message_type) {} |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 44 | RtcpFeedback::RtcpFeedback(const RtcpFeedback& rhs) = default; |
| 45 | RtcpFeedback::~RtcpFeedback() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 46 | |
Florent Castelli | 0a4a984 | 2023-04-03 17:25:29 | [diff] [blame] | 47 | RtpCodec::RtpCodec() = default; |
| 48 | RtpCodec::RtpCodec(const RtpCodec&) = default; |
| 49 | RtpCodec::~RtpCodec() = default; |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 50 | RtpCodecCapability::RtpCodecCapability() = default; |
| 51 | RtpCodecCapability::~RtpCodecCapability() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 52 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 53 | RtpHeaderExtensionCapability::RtpHeaderExtensionCapability() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 54 | RtpHeaderExtensionCapability::RtpHeaderExtensionCapability( |
Danil Chapovalov | 2b4ec9e | 2020-03-25 16:23:37 | [diff] [blame] | 55 | absl::string_view uri) |
| 56 | : uri(uri) {} |
| 57 | RtpHeaderExtensionCapability::RtpHeaderExtensionCapability( |
| 58 | absl::string_view uri, |
| 59 | int preferred_id) |
| 60 | : uri(uri), preferred_id(preferred_id) {} |
| 61 | RtpHeaderExtensionCapability::RtpHeaderExtensionCapability( |
| 62 | absl::string_view uri, |
Markus Handell | 0357b3e | 2020-03-16 12:40:51 | [diff] [blame] | 63 | int preferred_id, |
| 64 | RtpTransceiverDirection direction) |
Danil Chapovalov | 2b4ec9e | 2020-03-25 16:23:37 | [diff] [blame] | 65 | : uri(uri), preferred_id(preferred_id), direction(direction) {} |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 66 | RtpHeaderExtensionCapability::~RtpHeaderExtensionCapability() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 67 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 68 | RtpExtension::RtpExtension() = default; |
Danil Chapovalov | 2b4ec9e | 2020-03-25 16:23:37 | [diff] [blame] | 69 | RtpExtension::RtpExtension(absl::string_view uri, int id) : uri(uri), id(id) {} |
| 70 | RtpExtension::RtpExtension(absl::string_view uri, int id, bool encrypt) |
| 71 | : uri(uri), id(id), encrypt(encrypt) {} |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 72 | RtpExtension::~RtpExtension() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 73 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 74 | RtpFecParameters::RtpFecParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 75 | RtpFecParameters::RtpFecParameters(FecMechanism mechanism) |
| 76 | : mechanism(mechanism) {} |
| 77 | RtpFecParameters::RtpFecParameters(FecMechanism mechanism, uint32_t ssrc) |
| 78 | : ssrc(ssrc), mechanism(mechanism) {} |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 79 | RtpFecParameters::RtpFecParameters(const RtpFecParameters& rhs) = default; |
| 80 | RtpFecParameters::~RtpFecParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 81 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 82 | RtpRtxParameters::RtpRtxParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 83 | RtpRtxParameters::RtpRtxParameters(uint32_t ssrc) : ssrc(ssrc) {} |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 84 | RtpRtxParameters::RtpRtxParameters(const RtpRtxParameters& rhs) = default; |
| 85 | RtpRtxParameters::~RtpRtxParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 86 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 87 | RtpEncodingParameters::RtpEncodingParameters() = default; |
| 88 | RtpEncodingParameters::RtpEncodingParameters(const RtpEncodingParameters& rhs) = |
| 89 | default; |
| 90 | RtpEncodingParameters::~RtpEncodingParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 91 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 92 | RtpCodecParameters::RtpCodecParameters() = default; |
| 93 | RtpCodecParameters::RtpCodecParameters(const RtpCodecParameters& rhs) = default; |
| 94 | RtpCodecParameters::~RtpCodecParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 95 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 96 | RtpCapabilities::RtpCapabilities() = default; |
| 97 | RtpCapabilities::~RtpCapabilities() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 98 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 99 | RtcpParameters::RtcpParameters() = default; |
| 100 | RtcpParameters::RtcpParameters(const RtcpParameters& rhs) = default; |
| 101 | RtcpParameters::~RtcpParameters() = default; |
Florent Castelli | dacec71 | 2018-05-24 14:24:21 | [diff] [blame] | 102 | |
Mirko Bonadei | 2ffed6d | 2018-07-20 09:09:32 | [diff] [blame] | 103 | RtpParameters::RtpParameters() = default; |
| 104 | RtpParameters::RtpParameters(const RtpParameters& rhs) = default; |
| 105 | RtpParameters::~RtpParameters() = default; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 106 | |
| 107 | std::string RtpExtension::ToString() const { |
Jonas Olsson | 866d6dc | 2018-05-14 15:30:22 | [diff] [blame] | 108 | char buf[256]; |
| 109 | rtc::SimpleStringBuilder sb(buf); |
| 110 | sb << "{uri: " << uri; |
| 111 | sb << ", id: " << id; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 112 | if (encrypt) { |
Jonas Olsson | 866d6dc | 2018-05-14 15:30:22 | [diff] [blame] | 113 | sb << ", encrypt"; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 114 | } |
Jonas Olsson | 866d6dc | 2018-05-14 15:30:22 | [diff] [blame] | 115 | sb << '}'; |
| 116 | return sb.str(); |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 117 | } |
| 118 | |
Danil Chapovalov | 418cfee | 2020-03-25 10:02:37 | [diff] [blame] | 119 | constexpr char RtpExtension::kEncryptHeaderExtensionsUri[]; |
| 120 | constexpr char RtpExtension::kAudioLevelUri[]; |
| 121 | constexpr char RtpExtension::kTimestampOffsetUri[]; |
| 122 | constexpr char RtpExtension::kAbsSendTimeUri[]; |
| 123 | constexpr char RtpExtension::kAbsoluteCaptureTimeUri[]; |
| 124 | constexpr char RtpExtension::kVideoRotationUri[]; |
| 125 | constexpr char RtpExtension::kVideoContentTypeUri[]; |
| 126 | constexpr char RtpExtension::kVideoTimingUri[]; |
Danil Chapovalov | 418cfee | 2020-03-25 10:02:37 | [diff] [blame] | 127 | constexpr char RtpExtension::kGenericFrameDescriptorUri00[]; |
Danil Chapovalov | 418cfee | 2020-03-25 10:02:37 | [diff] [blame] | 128 | constexpr char RtpExtension::kDependencyDescriptorUri[]; |
Per Kjellander | 70c8945 | 2020-10-21 11:35:07 | [diff] [blame] | 129 | constexpr char RtpExtension::kVideoLayersAllocationUri[]; |
Danil Chapovalov | 418cfee | 2020-03-25 10:02:37 | [diff] [blame] | 130 | constexpr char RtpExtension::kTransportSequenceNumberUri[]; |
| 131 | constexpr char RtpExtension::kTransportSequenceNumberV2Uri[]; |
| 132 | constexpr char RtpExtension::kPlayoutDelayUri[]; |
| 133 | constexpr char RtpExtension::kColorSpaceUri[]; |
| 134 | constexpr char RtpExtension::kMidUri[]; |
| 135 | constexpr char RtpExtension::kRidUri[]; |
| 136 | constexpr char RtpExtension::kRepairedRidUri[]; |
Jeremy Leconte | b258c56 | 2021-03-18 12:50:42 | [diff] [blame] | 137 | constexpr char RtpExtension::kVideoFrameTrackingIdUri[]; |
Danil Chapovalov | d0321c5 | 2021-09-14 10:58:51 | [diff] [blame] | 138 | constexpr char RtpExtension::kCsrcAudioLevelsUri[]; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 139 | |
Johannes Kron | 07ba2b9 | 2018-09-26 11:33:35 | [diff] [blame] | 140 | constexpr int RtpExtension::kMinId; |
| 141 | constexpr int RtpExtension::kMaxId; |
Johannes Kron | 78cdde3 | 2018-10-05 08:00:46 | [diff] [blame] | 142 | constexpr int RtpExtension::kMaxValueSize; |
Johannes Kron | 07ba2b9 | 2018-09-26 11:33:35 | [diff] [blame] | 143 | constexpr int RtpExtension::kOneByteHeaderExtensionMaxId; |
Johannes Kron | 78cdde3 | 2018-10-05 08:00:46 | [diff] [blame] | 144 | constexpr int RtpExtension::kOneByteHeaderExtensionMaxValueSize; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 145 | |
Markus Handell | dfeb0df | 2020-03-16 21:20:47 | [diff] [blame] | 146 | bool RtpExtension::IsSupportedForAudio(absl::string_view uri) { |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 147 | return uri == webrtc::RtpExtension::kAudioLevelUri || |
Sebastian Jansson | 46bbdec | 2019-07-23 18:55:49 | [diff] [blame] | 148 | uri == webrtc::RtpExtension::kAbsSendTimeUri || |
Minyue Li | 74dadc1 | 2020-03-05 10:33:13 | [diff] [blame] | 149 | uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri || |
Steve Anton | bb50ce5 | 2018-03-26 17:24:32 | [diff] [blame] | 150 | uri == webrtc::RtpExtension::kTransportSequenceNumberUri || |
Johannes Kron | ce8e867 | 2019-02-22 12:06:44 | [diff] [blame] | 151 | uri == webrtc::RtpExtension::kTransportSequenceNumberV2Uri || |
Amit Hilbuch | 77938e6 | 2018-12-21 17:23:38 | [diff] [blame] | 152 | uri == webrtc::RtpExtension::kMidUri || |
| 153 | uri == webrtc::RtpExtension::kRidUri || |
| 154 | uri == webrtc::RtpExtension::kRepairedRidUri; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 155 | } |
| 156 | |
Markus Handell | dfeb0df | 2020-03-16 21:20:47 | [diff] [blame] | 157 | bool RtpExtension::IsSupportedForVideo(absl::string_view uri) { |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 158 | return uri == webrtc::RtpExtension::kTimestampOffsetUri || |
| 159 | uri == webrtc::RtpExtension::kAbsSendTimeUri || |
Minyue Li | 74dadc1 | 2020-03-05 10:33:13 | [diff] [blame] | 160 | uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri || |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 161 | uri == webrtc::RtpExtension::kVideoRotationUri || |
| 162 | uri == webrtc::RtpExtension::kTransportSequenceNumberUri || |
Johannes Kron | ce8e867 | 2019-02-22 12:06:44 | [diff] [blame] | 163 | uri == webrtc::RtpExtension::kTransportSequenceNumberV2Uri || |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 164 | uri == webrtc::RtpExtension::kPlayoutDelayUri || |
| 165 | uri == webrtc::RtpExtension::kVideoContentTypeUri || |
Steve Anton | bb50ce5 | 2018-03-26 17:24:32 | [diff] [blame] | 166 | uri == webrtc::RtpExtension::kVideoTimingUri || |
Johnny Lee | e0c8b23 | 2018-09-11 20:50:49 | [diff] [blame] | 167 | uri == webrtc::RtpExtension::kMidUri || |
Elad Alon | ccb9b75 | 2019-02-19 12:01:31 | [diff] [blame] | 168 | uri == webrtc::RtpExtension::kGenericFrameDescriptorUri00 || |
Danil Chapovalov | 2272f20 | 2020-02-18 11:09:43 | [diff] [blame] | 169 | uri == webrtc::RtpExtension::kDependencyDescriptorUri || |
Amit Hilbuch | 77938e6 | 2018-12-21 17:23:38 | [diff] [blame] | 170 | uri == webrtc::RtpExtension::kColorSpaceUri || |
| 171 | uri == webrtc::RtpExtension::kRidUri || |
Per Kjellander | 70c8945 | 2020-10-21 11:35:07 | [diff] [blame] | 172 | uri == webrtc::RtpExtension::kRepairedRidUri || |
Jeremy Leconte | b258c56 | 2021-03-18 12:50:42 | [diff] [blame] | 173 | uri == webrtc::RtpExtension::kVideoLayersAllocationUri || |
| 174 | uri == webrtc::RtpExtension::kVideoFrameTrackingIdUri; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 175 | } |
| 176 | |
Markus Handell | dfeb0df | 2020-03-16 21:20:47 | [diff] [blame] | 177 | bool RtpExtension::IsEncryptionSupported(absl::string_view uri) { |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 178 | return |
| 179 | #if defined(ENABLE_EXTERNAL_AUTH) |
| 180 | // TODO(jbauch): Figure out a way to always allow "kAbsSendTimeUri" |
| 181 | // here and filter out later if external auth is really used in |
| 182 | // srtpfilter. External auth is used by Chromium and replaces the |
| 183 | // extension header value of "kAbsSendTimeUri", so it must not be |
| 184 | // encrypted (which can't be done by Chromium). |
| 185 | uri != webrtc::RtpExtension::kAbsSendTimeUri && |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 186 | #endif |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 187 | uri != webrtc::RtpExtension::kEncryptHeaderExtensionsUri; |
| 188 | } |
| 189 | |
| 190 | // Returns whether a header extension with the given URI exists. |
| 191 | // Note: This does not differentiate between encrypted and non-encrypted |
| 192 | // extensions, so use with care! |
| 193 | static bool HeaderExtensionWithUriExists( |
| 194 | const std::vector<RtpExtension>& extensions, |
| 195 | absl::string_view uri) { |
| 196 | for (const auto& extension : extensions) { |
| 197 | if (extension.uri == uri) { |
| 198 | return true; |
| 199 | } |
| 200 | } |
| 201 | return false; |
| 202 | } |
| 203 | |
| 204 | const RtpExtension* RtpExtension::FindHeaderExtensionByUri( |
| 205 | const std::vector<RtpExtension>& extensions, |
| 206 | absl::string_view uri, |
| 207 | Filter filter) { |
| 208 | const webrtc::RtpExtension* fallback_extension = nullptr; |
| 209 | for (const auto& extension : extensions) { |
| 210 | if (extension.uri != uri) { |
| 211 | continue; |
| 212 | } |
| 213 | |
| 214 | switch (filter) { |
| 215 | case kDiscardEncryptedExtension: |
| 216 | // We only accept an unencrypted extension. |
| 217 | if (!extension.encrypt) { |
| 218 | return &extension; |
| 219 | } |
| 220 | break; |
| 221 | |
| 222 | case kPreferEncryptedExtension: |
| 223 | // We prefer an encrypted extension but we can fall back to an |
| 224 | // unencrypted extension. |
| 225 | if (extension.encrypt) { |
| 226 | return &extension; |
| 227 | } else { |
| 228 | fallback_extension = &extension; |
| 229 | } |
| 230 | break; |
| 231 | |
| 232 | case kRequireEncryptedExtension: |
| 233 | // We only accept an encrypted extension. |
| 234 | if (extension.encrypt) { |
| 235 | return &extension; |
| 236 | } |
| 237 | break; |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | // Returning fallback extension (if any) |
| 242 | return fallback_extension; |
Lennart Grahl | a743303 | 2021-04-09 20:05:06 | [diff] [blame] | 243 | } |
| 244 | |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 245 | const RtpExtension* RtpExtension::FindHeaderExtensionByUriAndEncryption( |
| 246 | const std::vector<RtpExtension>& extensions, |
| 247 | absl::string_view uri, |
| 248 | bool encrypt) { |
Lennart Grahl | a743303 | 2021-04-09 20:05:06 | [diff] [blame] | 249 | for (const auto& extension : extensions) { |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 250 | if (extension.uri == uri && extension.encrypt == encrypt) { |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 251 | return &extension; |
| 252 | } |
| 253 | } |
| 254 | return nullptr; |
| 255 | } |
| 256 | |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 257 | const std::vector<RtpExtension> RtpExtension::DeduplicateHeaderExtensions( |
| 258 | const std::vector<RtpExtension>& extensions, |
| 259 | Filter filter) { |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 260 | std::vector<RtpExtension> filtered; |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 261 | |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 262 | // If we do not discard encrypted extensions, add them first |
| 263 | if (filter != kDiscardEncryptedExtension) { |
| 264 | for (const auto& extension : extensions) { |
| 265 | if (!extension.encrypt) { |
| 266 | continue; |
| 267 | } |
| 268 | if (!HeaderExtensionWithUriExists(filtered, extension.uri)) { |
| 269 | filtered.push_back(extension); |
| 270 | } |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 271 | } |
| 272 | } |
Lennart Grahl | 0d0ed76 | 2021-05-17 14:06:37 | [diff] [blame] | 273 | |
| 274 | // If we do not require encrypted extensions, add missing, non-encrypted |
| 275 | // extensions. |
| 276 | if (filter != kRequireEncryptedExtension) { |
| 277 | for (const auto& extension : extensions) { |
| 278 | if (extension.encrypt) { |
| 279 | continue; |
| 280 | } |
| 281 | if (!HeaderExtensionWithUriExists(filtered, extension.uri)) { |
| 282 | filtered.push_back(extension); |
| 283 | } |
| 284 | } |
| 285 | } |
| 286 | |
Tomas Gunnarsson | c69453d | 2022-01-06 12:36:04 | [diff] [blame] | 287 | // Sort the returned vector to make comparisons of header extensions reliable. |
| 288 | // In order of priority, we sort by uri first, then encrypt and id last. |
| 289 | std::sort(filtered.begin(), filtered.end(), |
| 290 | [](const RtpExtension& a, const RtpExtension& b) { |
| 291 | return std::tie(a.uri, a.encrypt, a.id) < |
| 292 | std::tie(b.uri, b.encrypt, b.id); |
| 293 | }); |
| 294 | |
Stefan Holmer | 1acbd68 | 2017-09-01 13:29:28 | [diff] [blame] | 295 | return filtered; |
| 296 | } |
| 297 | } // namespace webrtc |