| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2014 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 #include "webrtc/config.h" | |
| 11 | |
| 12 #include <algorithm> | |
| 13 #include <sstream> | |
| 14 #include <string> | |
| 15 | |
| 16 #include "webrtc/rtc_base/checks.h" | |
| 17 | |
| 18 namespace webrtc { | |
| 19 std::string NackConfig::ToString() const { | |
| 20 std::stringstream ss; | |
| 21 ss << "{rtp_history_ms: " << rtp_history_ms; | |
| 22 ss << '}'; | |
| 23 return ss.str(); | |
| 24 } | |
| 25 | |
| 26 std::string UlpfecConfig::ToString() const { | |
| 27 std::stringstream ss; | |
| 28 ss << "{ulpfec_payload_type: " << ulpfec_payload_type; | |
| 29 ss << ", red_payload_type: " << red_payload_type; | |
| 30 ss << ", red_rtx_payload_type: " << red_rtx_payload_type; | |
| 31 ss << '}'; | |
| 32 return ss.str(); | |
| 33 } | |
| 34 | |
| 35 bool UlpfecConfig::operator==(const UlpfecConfig& other) const { | |
| 36 return ulpfec_payload_type == other.ulpfec_payload_type && | |
| 37 red_payload_type == other.red_payload_type && | |
| 38 red_rtx_payload_type == other.red_rtx_payload_type; | |
| 39 } | |
| 40 | |
| 41 std::string RtpExtension::ToString() const { | |
| 42 std::stringstream ss; | |
| 43 ss << "{uri: " << uri; | |
| 44 ss << ", id: " << id; | |
| 45 if (encrypt) { | |
| 46 ss << ", encrypt"; | |
| 47 } | |
| 48 ss << '}'; | |
| 49 return ss.str(); | |
| 50 } | |
| 51 | |
| 52 const char RtpExtension::kAudioLevelUri[] = | |
| 53 "urn:ietf:params:rtp-hdrext:ssrc-audio-level"; | |
| 54 const int RtpExtension::kAudioLevelDefaultId = 1; | |
| 55 | |
| 56 const char RtpExtension::kTimestampOffsetUri[] = | |
| 57 "urn:ietf:params:rtp-hdrext:toffset"; | |
| 58 const int RtpExtension::kTimestampOffsetDefaultId = 2; | |
| 59 | |
| 60 const char RtpExtension::kAbsSendTimeUri[] = | |
| 61 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"; | |
| 62 const int RtpExtension::kAbsSendTimeDefaultId = 3; | |
| 63 | |
| 64 const char RtpExtension::kVideoRotationUri[] = "urn:3gpp:video-orientation"; | |
| 65 const int RtpExtension::kVideoRotationDefaultId = 4; | |
| 66 | |
| 67 const char RtpExtension::kTransportSequenceNumberUri[] = | |
| 68 "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"; | |
| 69 const int RtpExtension::kTransportSequenceNumberDefaultId = 5; | |
| 70 | |
| 71 // This extension allows applications to adaptively limit the playout delay | |
| 72 // on frames as per the current needs. For example, a gaming application | |
| 73 // has very different needs on end-to-end delay compared to a video-conference | |
| 74 // application. | |
| 75 const char RtpExtension::kPlayoutDelayUri[] = | |
| 76 "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"; | |
| 77 const int RtpExtension::kPlayoutDelayDefaultId = 6; | |
| 78 | |
| 79 const char RtpExtension::kVideoContentTypeUri[] = | |
| 80 "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type"; | |
| 81 const int RtpExtension::kVideoContentTypeDefaultId = 7; | |
| 82 | |
| 83 const char RtpExtension::kVideoTimingUri[] = | |
| 84 "http://www.webrtc.org/experiments/rtp-hdrext/video-timing"; | |
| 85 const int RtpExtension::kVideoTimingDefaultId = 8; | |
| 86 | |
| 87 const char RtpExtension::kEncryptHeaderExtensionsUri[] = | |
| 88 "urn:ietf:params:rtp-hdrext:encrypt"; | |
| 89 | |
| 90 const int RtpExtension::kMinId = 1; | |
| 91 const int RtpExtension::kMaxId = 14; | |
| 92 | |
| 93 bool RtpExtension::IsSupportedForAudio(const std::string& uri) { | |
| 94 return uri == webrtc::RtpExtension::kAudioLevelUri || | |
| 95 uri == webrtc::RtpExtension::kTransportSequenceNumberUri; | |
| 96 } | |
| 97 | |
| 98 bool RtpExtension::IsSupportedForVideo(const std::string& uri) { | |
| 99 return uri == webrtc::RtpExtension::kTimestampOffsetUri || | |
| 100 uri == webrtc::RtpExtension::kAbsSendTimeUri || | |
| 101 uri == webrtc::RtpExtension::kVideoRotationUri || | |
| 102 uri == webrtc::RtpExtension::kTransportSequenceNumberUri || | |
| 103 uri == webrtc::RtpExtension::kPlayoutDelayUri || | |
| 104 uri == webrtc::RtpExtension::kVideoContentTypeUri || | |
| 105 uri == webrtc::RtpExtension::kVideoTimingUri; | |
| 106 } | |
| 107 | |
| 108 bool RtpExtension::IsEncryptionSupported(const std::string& uri) { | |
| 109 return uri == webrtc::RtpExtension::kAudioLevelUri || | |
| 110 uri == webrtc::RtpExtension::kTimestampOffsetUri || | |
| 111 #if !defined(ENABLE_EXTERNAL_AUTH) | |
| 112 // TODO(jbauch): Figure out a way to always allow "kAbsSendTimeUri" | |
| 113 // here and filter out later if external auth is really used in | |
| 114 // srtpfilter. External auth is used by Chromium and replaces the | |
| 115 // extension header value of "kAbsSendTimeUri", so it must not be | |
| 116 // encrypted (which can't be done by Chromium). | |
| 117 uri == webrtc::RtpExtension::kAbsSendTimeUri || | |
| 118 #endif | |
| 119 uri == webrtc::RtpExtension::kVideoRotationUri || | |
| 120 uri == webrtc::RtpExtension::kTransportSequenceNumberUri || | |
| 121 uri == webrtc::RtpExtension::kPlayoutDelayUri || | |
| 122 uri == webrtc::RtpExtension::kVideoContentTypeUri; | |
| 123 } | |
| 124 | |
| 125 const RtpExtension* RtpExtension::FindHeaderExtensionByUri( | |
| 126 const std::vector<RtpExtension>& extensions, | |
| 127 const std::string& uri) { | |
| 128 for (const auto& extension : extensions) { | |
| 129 if (extension.uri == uri) { | |
| 130 return &extension; | |
| 131 } | |
| 132 } | |
| 133 return nullptr; | |
| 134 } | |
| 135 | |
| 136 std::vector<RtpExtension> RtpExtension::FilterDuplicateNonEncrypted( | |
| 137 const std::vector<RtpExtension>& extensions) { | |
| 138 std::vector<RtpExtension> filtered; | |
| 139 for (auto extension = extensions.begin(); extension != extensions.end(); | |
| 140 ++extension) { | |
| 141 if (extension->encrypt) { | |
| 142 filtered.push_back(*extension); | |
| 143 continue; | |
| 144 } | |
| 145 | |
| 146 // Only add non-encrypted extension if no encrypted with the same URI | |
| 147 // is also present... | |
| 148 if (std::find_if(extension + 1, extensions.end(), | |
| 149 [extension](const RtpExtension& check) { | |
| 150 return extension->uri == check.uri; | |
| 151 }) != extensions.end()) { | |
| 152 continue; | |
| 153 } | |
| 154 | |
| 155 // ...and has not been added before. | |
| 156 if (!FindHeaderExtensionByUri(filtered, extension->uri)) { | |
| 157 filtered.push_back(*extension); | |
| 158 } | |
| 159 } | |
| 160 return filtered; | |
| 161 } | |
| 162 | |
| 163 VideoStream::VideoStream() | |
| 164 : width(0), | |
| 165 height(0), | |
| 166 max_framerate(-1), | |
| 167 min_bitrate_bps(-1), | |
| 168 target_bitrate_bps(-1), | |
| 169 max_bitrate_bps(-1), | |
| 170 max_qp(-1) {} | |
| 171 | |
| 172 VideoStream::~VideoStream() = default; | |
| 173 | |
| 174 std::string VideoStream::ToString() const { | |
| 175 std::stringstream ss; | |
| 176 ss << "{width: " << width; | |
| 177 ss << ", height: " << height; | |
| 178 ss << ", max_framerate: " << max_framerate; | |
| 179 ss << ", min_bitrate_bps:" << min_bitrate_bps; | |
| 180 ss << ", target_bitrate_bps:" << target_bitrate_bps; | |
| 181 ss << ", max_bitrate_bps:" << max_bitrate_bps; | |
| 182 ss << ", max_qp: " << max_qp; | |
| 183 | |
| 184 ss << ", temporal_layer_thresholds_bps: ["; | |
| 185 for (size_t i = 0; i < temporal_layer_thresholds_bps.size(); ++i) { | |
| 186 ss << temporal_layer_thresholds_bps[i]; | |
| 187 if (i != temporal_layer_thresholds_bps.size() - 1) | |
| 188 ss << ", "; | |
| 189 } | |
| 190 ss << ']'; | |
| 191 | |
| 192 ss << '}'; | |
| 193 return ss.str(); | |
| 194 } | |
| 195 | |
| 196 VideoEncoderConfig::VideoEncoderConfig() | |
| 197 : content_type(ContentType::kRealtimeVideo), | |
| 198 encoder_specific_settings(nullptr), | |
| 199 min_transmit_bitrate_bps(0), | |
| 200 max_bitrate_bps(0), | |
| 201 number_of_streams(0) {} | |
| 202 | |
| 203 VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default; | |
| 204 | |
| 205 VideoEncoderConfig::~VideoEncoderConfig() = default; | |
| 206 | |
| 207 std::string VideoEncoderConfig::ToString() const { | |
| 208 std::stringstream ss; | |
| 209 ss << "{content_type: "; | |
| 210 switch (content_type) { | |
| 211 case ContentType::kRealtimeVideo: | |
| 212 ss << "kRealtimeVideo"; | |
| 213 break; | |
| 214 case ContentType::kScreen: | |
| 215 ss << "kScreenshare"; | |
| 216 break; | |
| 217 } | |
| 218 ss << ", encoder_specific_settings: "; | |
| 219 ss << (encoder_specific_settings != NULL ? "(ptr)" : "NULL"); | |
| 220 | |
| 221 ss << ", min_transmit_bitrate_bps: " << min_transmit_bitrate_bps; | |
| 222 ss << '}'; | |
| 223 return ss.str(); | |
| 224 } | |
| 225 | |
| 226 VideoEncoderConfig::VideoEncoderConfig(const VideoEncoderConfig&) = default; | |
| 227 | |
| 228 void VideoEncoderConfig::EncoderSpecificSettings::FillEncoderSpecificSettings( | |
| 229 VideoCodec* codec) const { | |
| 230 if (codec->codecType == kVideoCodecH264) { | |
| 231 FillVideoCodecH264(codec->H264()); | |
| 232 } else if (codec->codecType == kVideoCodecVP8) { | |
| 233 FillVideoCodecVp8(codec->VP8()); | |
| 234 } else if (codec->codecType == kVideoCodecVP9) { | |
| 235 FillVideoCodecVp9(codec->VP9()); | |
| 236 } else { | |
| 237 RTC_NOTREACHED() << "Encoder specifics set/used for unknown codec type."; | |
| 238 } | |
| 239 } | |
| 240 | |
| 241 void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecH264( | |
| 242 VideoCodecH264* h264_settings) const { | |
| 243 RTC_NOTREACHED(); | |
| 244 } | |
| 245 | |
| 246 void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp8( | |
| 247 VideoCodecVP8* vp8_settings) const { | |
| 248 RTC_NOTREACHED(); | |
| 249 } | |
| 250 | |
| 251 void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp9( | |
| 252 VideoCodecVP9* vp9_settings) const { | |
| 253 RTC_NOTREACHED(); | |
| 254 } | |
| 255 | |
| 256 VideoEncoderConfig::H264EncoderSpecificSettings::H264EncoderSpecificSettings( | |
| 257 const VideoCodecH264& specifics) | |
| 258 : specifics_(specifics) {} | |
| 259 | |
| 260 void VideoEncoderConfig::H264EncoderSpecificSettings::FillVideoCodecH264( | |
| 261 VideoCodecH264* h264_settings) const { | |
| 262 *h264_settings = specifics_; | |
| 263 } | |
| 264 | |
| 265 VideoEncoderConfig::Vp8EncoderSpecificSettings::Vp8EncoderSpecificSettings( | |
| 266 const VideoCodecVP8& specifics) | |
| 267 : specifics_(specifics) {} | |
| 268 | |
| 269 void VideoEncoderConfig::Vp8EncoderSpecificSettings::FillVideoCodecVp8( | |
| 270 VideoCodecVP8* vp8_settings) const { | |
| 271 *vp8_settings = specifics_; | |
| 272 } | |
| 273 | |
| 274 VideoEncoderConfig::Vp9EncoderSpecificSettings::Vp9EncoderSpecificSettings( | |
| 275 const VideoCodecVP9& specifics) | |
| 276 : specifics_(specifics) {} | |
| 277 | |
| 278 void VideoEncoderConfig::Vp9EncoderSpecificSettings::FillVideoCodecVp9( | |
| 279 VideoCodecVP9* vp9_settings) const { | |
| 280 *vp9_settings = specifics_; | |
| 281 } | |
| 282 | |
| 283 } // namespace webrtc | |
| OLD | NEW |