phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 1 | /* |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 2 | * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 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 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 11 | #include "modules/rtp_rtcp/include/rtp_payload_registry.h" |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 12 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 13 | #include <algorithm> |
| 14 | |
Mirko Bonadei | 7120742 | 2017-09-15 13:58:09 +0200 | [diff] [blame] | 15 | #include "common_types.h" // NOLINT(build/include) |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 16 | #include "modules/audio_coding/codecs/audio_format_conversion.h" |
| 17 | #include "rtc_base/checks.h" |
| 18 | #include "rtc_base/logging.h" |
| 19 | #include "rtc_base/stringutils.h" |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 20 | |
| 21 | namespace webrtc { |
| 22 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 23 | namespace { |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 24 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 25 | bool PayloadIsCompatible(const RtpUtility::Payload& payload, |
| 26 | const CodecInst& audio_codec) { |
| 27 | if (!payload.audio) |
| 28 | return false; |
| 29 | if (_stricmp(payload.name, audio_codec.plname) != 0) |
| 30 | return false; |
| 31 | const AudioPayload& audio_payload = payload.typeSpecific.Audio; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 32 | return audio_payload.frequency == static_cast<uint32_t>(audio_codec.plfreq) && |
kwiberg | 68d3213 | 2016-12-06 03:52:18 -0800 | [diff] [blame] | 33 | audio_payload.channels == audio_codec.channels; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | bool PayloadIsCompatible(const RtpUtility::Payload& payload, |
| 37 | const VideoCodec& video_codec) { |
magjed | e69a1a9 | 2016-11-25 10:06:31 -0800 | [diff] [blame] | 38 | if (payload.audio || _stricmp(payload.name, video_codec.plName) != 0) |
| 39 | return false; |
| 40 | // For H264, profiles must match as well. |
| 41 | if (video_codec.codecType == kVideoCodecH264) { |
| 42 | return video_codec.H264().profile == |
| 43 | payload.typeSpecific.Video.h264_profile; |
| 44 | } |
| 45 | return true; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | RtpUtility::Payload CreatePayloadType(const CodecInst& audio_codec) { |
| 49 | RtpUtility::Payload payload; |
| 50 | payload.name[RTP_PAYLOAD_NAME_SIZE - 1] = 0; |
| 51 | strncpy(payload.name, audio_codec.plname, RTP_PAYLOAD_NAME_SIZE - 1); |
| 52 | RTC_DCHECK_GE(audio_codec.plfreq, 1000); |
| 53 | payload.typeSpecific.Audio.frequency = audio_codec.plfreq; |
| 54 | payload.typeSpecific.Audio.channels = audio_codec.channels; |
kwiberg | 68d3213 | 2016-12-06 03:52:18 -0800 | [diff] [blame] | 55 | payload.typeSpecific.Audio.rate = 0; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 56 | payload.audio = true; |
| 57 | return payload; |
| 58 | } |
| 59 | |
| 60 | RtpVideoCodecTypes ConvertToRtpVideoCodecType(VideoCodecType type) { |
| 61 | switch (type) { |
| 62 | case kVideoCodecVP8: |
| 63 | return kRtpVideoVp8; |
| 64 | case kVideoCodecVP9: |
| 65 | return kRtpVideoVp9; |
| 66 | case kVideoCodecH264: |
| 67 | return kRtpVideoH264; |
| 68 | case kVideoCodecRED: |
| 69 | case kVideoCodecULPFEC: |
| 70 | return kRtpVideoNone; |
| 71 | default: |
| 72 | return kRtpVideoGeneric; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 73 | } |
| 74 | } |
| 75 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 76 | RtpUtility::Payload CreatePayloadType(const VideoCodec& video_codec) { |
| 77 | RtpUtility::Payload payload; |
| 78 | payload.name[RTP_PAYLOAD_NAME_SIZE - 1] = 0; |
| 79 | strncpy(payload.name, video_codec.plName, RTP_PAYLOAD_NAME_SIZE - 1); |
| 80 | payload.typeSpecific.Video.videoCodecType = |
| 81 | ConvertToRtpVideoCodecType(video_codec.codecType); |
magjed | e69a1a9 | 2016-11-25 10:06:31 -0800 | [diff] [blame] | 82 | if (video_codec.codecType == kVideoCodecH264) |
| 83 | payload.typeSpecific.Video.h264_profile = video_codec.H264().profile; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 84 | payload.audio = false; |
| 85 | return payload; |
magjed | 56124bd | 2016-11-24 09:34:46 -0800 | [diff] [blame] | 86 | } |
| 87 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 88 | bool IsPayloadTypeValid(int8_t payload_type) { |
pbos@webrtc.org | b5bf54c | 2013-04-05 13:27:38 +0000 | [diff] [blame] | 89 | assert(payload_type >= 0); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 90 | |
| 91 | // Sanity check. |
| 92 | switch (payload_type) { |
| 93 | // Reserved payload types to avoid RTCP conflicts when marker bit is set. |
| 94 | case 64: // 192 Full INTRA-frame request. |
| 95 | case 72: // 200 Sender report. |
| 96 | case 73: // 201 Receiver report. |
| 97 | case 74: // 202 Source description. |
| 98 | case 75: // 203 Goodbye. |
| 99 | case 76: // 204 Application-defined. |
| 100 | case 77: // 205 Transport layer FB message. |
| 101 | case 78: // 206 Payload-specific FB message. |
| 102 | case 79: // 207 Extended report. |
andresp@webrtc.org | dc80bae | 2014-04-08 11:06:12 +0000 | [diff] [blame] | 103 | LOG(LS_ERROR) << "Can't register invalid receiver payload type: " |
| 104 | << payload_type; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 105 | return false; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 106 | default: |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 107 | return true; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 108 | } |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 109 | } |
pbos@webrtc.org | b5bf54c | 2013-04-05 13:27:38 +0000 | [diff] [blame] | 110 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 111 | } // namespace |
| 112 | |
| 113 | RTPPayloadRegistry::RTPPayloadRegistry() |
| 114 | : incoming_payload_type_(-1), |
| 115 | last_received_payload_type_(-1), |
| 116 | last_received_media_payload_type_(-1), |
| 117 | rtx_(false), |
| 118 | ssrc_rtx_(0) {} |
| 119 | |
| 120 | RTPPayloadRegistry::~RTPPayloadRegistry() = default; |
| 121 | |
kwiberg | 1c07c70 | 2017-03-27 07:15:49 -0700 | [diff] [blame] | 122 | void RTPPayloadRegistry::SetAudioReceivePayloads( |
| 123 | std::map<int, SdpAudioFormat> codecs) { |
| 124 | rtc::CritScope cs(&crit_sect_); |
| 125 | |
| 126 | #if RTC_DCHECK_IS_ON |
| 127 | RTC_DCHECK(!used_for_video_); |
| 128 | used_for_audio_ = true; |
| 129 | #endif |
| 130 | |
| 131 | payload_type_map_.clear(); |
| 132 | for (const auto& kv : codecs) { |
| 133 | const int& rtp_payload_type = kv.first; |
| 134 | const SdpAudioFormat& audio_format = kv.second; |
| 135 | const CodecInst ci = SdpToCodecInst(rtp_payload_type, audio_format); |
| 136 | RTC_DCHECK(IsPayloadTypeValid(rtp_payload_type)); |
| 137 | payload_type_map_.insert( |
| 138 | std::make_pair(rtp_payload_type, CreatePayloadType(ci))); |
| 139 | } |
| 140 | |
| 141 | // Clear the value of last received payload type since it might mean |
| 142 | // something else now. |
| 143 | last_received_payload_type_ = -1; |
| 144 | last_received_media_payload_type_ = -1; |
| 145 | } |
| 146 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 147 | int32_t RTPPayloadRegistry::RegisterReceivePayload(const CodecInst& audio_codec, |
| 148 | bool* created_new_payload) { |
kwiberg | b0bf93a | 2017-03-23 00:10:09 -0700 | [diff] [blame] | 149 | rtc::CritScope cs(&crit_sect_); |
| 150 | |
| 151 | #if RTC_DCHECK_IS_ON |
| 152 | RTC_DCHECK(!used_for_video_); |
| 153 | used_for_audio_ = true; |
| 154 | #endif |
| 155 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 156 | *created_new_payload = false; |
| 157 | if (!IsPayloadTypeValid(audio_codec.pltype)) |
| 158 | return -1; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 159 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 160 | auto it = payload_type_map_.find(audio_codec.pltype); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 161 | if (it != payload_type_map_.end()) { |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 162 | // We already use this payload type. Check if it's the same as we already |
| 163 | // have. If same, ignore sending an error. |
| 164 | if (PayloadIsCompatible(it->second, audio_codec)) { |
kwiberg | 68d3213 | 2016-12-06 03:52:18 -0800 | [diff] [blame] | 165 | it->second.typeSpecific.Audio.rate = 0; |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 166 | return 0; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 167 | } |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 168 | LOG(LS_ERROR) << "Payload type already registered: " << audio_codec.pltype; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 169 | return -1; |
| 170 | } |
| 171 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 172 | // Audio codecs must be unique. |
| 173 | DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType(audio_codec); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 174 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 175 | payload_type_map_[audio_codec.pltype] = CreatePayloadType(audio_codec); |
Minyue Li | 190c3ca | 2015-03-25 16:11:24 +0100 | [diff] [blame] | 176 | *created_new_payload = true; |
| 177 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 178 | // Successful set of payload type, clear the value of last received payload |
| 179 | // type since it might mean something else. |
| 180 | last_received_payload_type_ = -1; |
| 181 | last_received_media_payload_type_ = -1; |
| 182 | return 0; |
| 183 | } |
| 184 | |
| 185 | int32_t RTPPayloadRegistry::RegisterReceivePayload( |
| 186 | const VideoCodec& video_codec) { |
kwiberg | b0bf93a | 2017-03-23 00:10:09 -0700 | [diff] [blame] | 187 | rtc::CritScope cs(&crit_sect_); |
| 188 | |
| 189 | #if RTC_DCHECK_IS_ON |
| 190 | RTC_DCHECK(!used_for_audio_); |
| 191 | used_for_video_ = true; |
| 192 | #endif |
| 193 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 194 | if (!IsPayloadTypeValid(video_codec.plType)) |
| 195 | return -1; |
| 196 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 197 | auto it = payload_type_map_.find(video_codec.plType); |
| 198 | if (it != payload_type_map_.end()) { |
| 199 | // We already use this payload type. Check if it's the same as we already |
| 200 | // have. If same, ignore sending an error. |
| 201 | if (PayloadIsCompatible(it->second, video_codec)) |
| 202 | return 0; |
| 203 | LOG(LS_ERROR) << "Payload type already registered: " |
| 204 | << static_cast<int>(video_codec.plType); |
| 205 | return -1; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 206 | } |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 207 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 208 | payload_type_map_[video_codec.plType] = CreatePayloadType(video_codec); |
| 209 | |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 210 | // Successful set of payload type, clear the value of last received payload |
| 211 | // type since it might mean something else. |
| 212 | last_received_payload_type_ = -1; |
| 213 | last_received_media_payload_type_ = -1; |
| 214 | return 0; |
| 215 | } |
| 216 | |
pbos@webrtc.org | 2f44673 | 2013-04-08 11:08:41 +0000 | [diff] [blame] | 217 | int32_t RTPPayloadRegistry::DeRegisterReceivePayload( |
| 218 | const int8_t payload_type) { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 219 | rtc::CritScope cs(&crit_sect_); |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 220 | payload_type_map_.erase(payload_type); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 221 | return 0; |
| 222 | } |
| 223 | |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 224 | // There can't be several codecs with the same rate, frequency and channels |
| 225 | // for audio codecs, but there can for video. |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 226 | // Always called from within a critical section. |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 227 | void RTPPayloadRegistry::DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType( |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 228 | const CodecInst& audio_codec) { |
| 229 | for (auto iterator = payload_type_map_.begin(); |
| 230 | iterator != payload_type_map_.end(); ++iterator) { |
| 231 | if (PayloadIsCompatible(iterator->second, audio_codec)) { |
| 232 | // Remove old setting. |
| 233 | payload_type_map_.erase(iterator); |
| 234 | break; |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 235 | } |
| 236 | } |
| 237 | } |
| 238 | |
magjed | 56124bd | 2016-11-24 09:34:46 -0800 | [diff] [blame] | 239 | int32_t RTPPayloadRegistry::ReceivePayloadType(const CodecInst& audio_codec, |
| 240 | int8_t* payload_type) const { |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 241 | assert(payload_type); |
| 242 | rtc::CritScope cs(&crit_sect_); |
| 243 | |
| 244 | for (const auto& it : payload_type_map_) { |
| 245 | if (PayloadIsCompatible(it.second, audio_codec)) { |
| 246 | *payload_type = it.first; |
| 247 | return 0; |
| 248 | } |
| 249 | } |
| 250 | return -1; |
magjed | 56124bd | 2016-11-24 09:34:46 -0800 | [diff] [blame] | 251 | } |
| 252 | |
| 253 | int32_t RTPPayloadRegistry::ReceivePayloadType(const VideoCodec& video_codec, |
| 254 | int8_t* payload_type) const { |
andresp@webrtc.org | dc80bae | 2014-04-08 11:06:12 +0000 | [diff] [blame] | 255 | assert(payload_type); |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 256 | rtc::CritScope cs(&crit_sect_); |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 257 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 258 | for (const auto& it : payload_type_map_) { |
| 259 | if (PayloadIsCompatible(it.second, video_codec)) { |
| 260 | *payload_type = it.first; |
| 261 | return 0; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 262 | } |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 263 | } |
| 264 | return -1; |
| 265 | } |
| 266 | |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 267 | bool RTPPayloadRegistry::RtxEnabled() const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 268 | rtc::CritScope cs(&crit_sect_); |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 269 | return rtx_; |
| 270 | } |
| 271 | |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 272 | bool RTPPayloadRegistry::IsRtxInternal(const RTPHeader& header) const { |
| 273 | return rtx_ && ssrc_rtx_ == header.ssrc; |
| 274 | } |
| 275 | |
stefan@webrtc.org | ef92755 | 2014-06-05 08:25:29 +0000 | [diff] [blame] | 276 | void RTPPayloadRegistry::SetRtxSsrc(uint32_t ssrc) { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 277 | rtc::CritScope cs(&crit_sect_); |
stefan@webrtc.org | ef92755 | 2014-06-05 08:25:29 +0000 | [diff] [blame] | 278 | ssrc_rtx_ = ssrc; |
| 279 | rtx_ = true; |
| 280 | } |
| 281 | |
asapersson@webrtc.org | d952c40 | 2014-11-27 07:38:56 +0000 | [diff] [blame] | 282 | bool RTPPayloadRegistry::GetRtxSsrc(uint32_t* ssrc) const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 283 | rtc::CritScope cs(&crit_sect_); |
asapersson@webrtc.org | d952c40 | 2014-11-27 07:38:56 +0000 | [diff] [blame] | 284 | *ssrc = ssrc_rtx_; |
| 285 | return rtx_; |
| 286 | } |
| 287 | |
Shao Changbin | e62202f | 2015-04-21 20:24:50 +0800 | [diff] [blame] | 288 | void RTPPayloadRegistry::SetRtxPayloadType(int payload_type, |
| 289 | int associated_payload_type) { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 290 | rtc::CritScope cs(&crit_sect_); |
Shao Changbin | e62202f | 2015-04-21 20:24:50 +0800 | [diff] [blame] | 291 | if (payload_type < 0) { |
| 292 | LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type; |
| 293 | return; |
| 294 | } |
| 295 | |
| 296 | rtx_payload_type_map_[payload_type] = associated_payload_type; |
stefan@webrtc.org | ef92755 | 2014-06-05 08:25:29 +0000 | [diff] [blame] | 297 | rtx_ = true; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 298 | } |
| 299 | |
| 300 | bool RTPPayloadRegistry::IsRed(const RTPHeader& header) const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 301 | rtc::CritScope cs(&crit_sect_); |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 302 | auto it = payload_type_map_.find(header.payloadType); |
| 303 | return it != payload_type_map_.end() && _stricmp(it->second.name, "red") == 0; |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 304 | } |
| 305 | |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 306 | bool RTPPayloadRegistry::GetPayloadSpecifics(uint8_t payload_type, |
| 307 | PayloadUnion* payload) const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 308 | rtc::CritScope cs(&crit_sect_); |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 309 | auto it = payload_type_map_.find(payload_type); |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 310 | |
| 311 | // Check that this is a registered payload type. |
| 312 | if (it == payload_type_map_.end()) { |
| 313 | return false; |
| 314 | } |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 315 | *payload = it->second.typeSpecific; |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 316 | return true; |
| 317 | } |
| 318 | |
| 319 | int RTPPayloadRegistry::GetPayloadTypeFrequency( |
| 320 | uint8_t payload_type) const { |
danilchap | 5c1def8 | 2015-12-10 09:51:54 -0800 | [diff] [blame] | 321 | const RtpUtility::Payload* payload = PayloadTypeToPayload(payload_type); |
| 322 | if (!payload) { |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 323 | return -1; |
| 324 | } |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 325 | rtc::CritScope cs(&crit_sect_); |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 326 | return payload->audio ? payload->typeSpecific.Audio.frequency |
| 327 | : kVideoPayloadTypeFrequency; |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 328 | } |
| 329 | |
danilchap | 5c1def8 | 2015-12-10 09:51:54 -0800 | [diff] [blame] | 330 | const RtpUtility::Payload* RTPPayloadRegistry::PayloadTypeToPayload( |
| 331 | uint8_t payload_type) const { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 332 | rtc::CritScope cs(&crit_sect_); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 333 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 334 | auto it = payload_type_map_.find(payload_type); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 335 | |
| 336 | // Check that this is a registered payload type. |
| 337 | if (it == payload_type_map_.end()) { |
danilchap | 5c1def8 | 2015-12-10 09:51:54 -0800 | [diff] [blame] | 338 | return nullptr; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 339 | } |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 340 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 341 | return &it->second; |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 342 | } |
| 343 | |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 344 | void RTPPayloadRegistry::SetIncomingPayloadType(const RTPHeader& header) { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 345 | rtc::CritScope cs(&crit_sect_); |
stefan@webrtc.org | 7bb8f02 | 2013-09-06 13:40:11 +0000 | [diff] [blame] | 346 | if (!IsRtxInternal(header)) |
| 347 | incoming_payload_type_ = header.payloadType; |
| 348 | } |
| 349 | |
| 350 | bool RTPPayloadRegistry::ReportMediaPayloadType(uint8_t media_payload_type) { |
danilchap | 7c9426c | 2016-04-14 03:05:31 -0700 | [diff] [blame] | 351 | rtc::CritScope cs(&crit_sect_); |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 352 | if (last_received_media_payload_type_ == media_payload_type) { |
| 353 | // Media type unchanged. |
| 354 | return true; |
| 355 | } |
| 356 | last_received_media_payload_type_ = media_payload_type; |
| 357 | return false; |
| 358 | } |
| 359 | |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 360 | // Returns -1 if a payload with name |payload_name| is not registered. |
| 361 | int8_t RTPPayloadRegistry::GetPayloadTypeWithName( |
| 362 | const char* payload_name) const { |
| 363 | rtc::CritScope cs(&crit_sect_); |
| 364 | for (const auto& it : payload_type_map_) { |
| 365 | if (_stricmp(it.second.name, payload_name) == 0) |
| 366 | return it.first; |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 367 | } |
magjed | f3feeff | 2016-11-25 06:40:25 -0800 | [diff] [blame] | 368 | return -1; |
phoglund@webrtc.org | 244251a | 2013-02-04 13:23:07 +0000 | [diff] [blame] | 369 | } |
| 370 | |
phoglund@webrtc.org | efae5d5 | 2013-01-17 16:10:45 +0000 | [diff] [blame] | 371 | } // namespace webrtc |