blob: 0890beb9342d682fdce6ccbdb98c04571c183749 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/audio_coding/neteq/decoder_database.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000012
Yves Gerey988cc082018-10-23 12:03:01 +020013#include <stddef.h>
14#include <cstdint>
15#include <list>
16#include <type_traits>
17#include <utility>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000018
Niels Möller2edab4c2018-10-22 09:48:08 +020019#include "absl/strings/match.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/audio_codecs/audio_decoder.h"
Yves Gerey988cc082018-10-23 12:03:01 +020021#include "common_types.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
23#include "rtc_base/logging.h"
Jonas Olssonabbe8412018-04-03 13:40:05 +020024#include "rtc_base/strings/audio_format_to_string.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000025
26namespace webrtc {
27
kwiberg5178ee82016-05-03 01:39:01 -070028DecoderDatabase::DecoderDatabase(
Karl Wiberg08126342018-03-20 19:18:55 +010029 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory,
Danil Chapovalovb6021232018-06-19 13:26:36 +020030 absl::optional<AudioCodecPairId> codec_pair_id)
kwiberg5178ee82016-05-03 01:39:01 -070031 : active_decoder_type_(-1),
32 active_cng_decoder_type_(-1),
Karl Wiberg08126342018-03-20 19:18:55 +010033 decoder_factory_(decoder_factory),
34 codec_pair_id_(codec_pair_id) {}
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +000035
ossu97ba30e2016-04-25 07:55:58 -070036DecoderDatabase::~DecoderDatabase() = default;
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +000037
Karl Wiberg08126342018-03-20 19:18:55 +010038DecoderDatabase::DecoderInfo::DecoderInfo(
39 const SdpAudioFormat& audio_format,
Danil Chapovalovb6021232018-06-19 13:26:36 +020040 absl::optional<AudioCodecPairId> codec_pair_id,
Karl Wiberg08126342018-03-20 19:18:55 +010041 AudioDecoderFactory* factory,
42 const std::string& codec_name)
kwiberge9413062016-11-03 05:29:05 -070043 : name_(codec_name),
44 audio_format_(audio_format),
Karl Wiberg08126342018-03-20 19:18:55 +010045 codec_pair_id_(codec_pair_id),
ossu84bc9852016-08-26 05:41:23 -070046 factory_(factory),
kwiberg342f7402016-06-16 03:18:00 -070047 external_decoder_(nullptr),
ossu9f38c212016-10-04 05:23:32 -070048 cng_decoder_(CngDecoder::Create(audio_format)),
49 subtype_(SubtypeFromFormat(audio_format)) {}
kwibergc0f2dcf2016-05-31 06:28:03 -070050
Karl Wiberg08126342018-03-20 19:18:55 +010051DecoderDatabase::DecoderInfo::DecoderInfo(
52 const SdpAudioFormat& audio_format,
Danil Chapovalovb6021232018-06-19 13:26:36 +020053 absl::optional<AudioCodecPairId> codec_pair_id,
Karl Wiberg08126342018-03-20 19:18:55 +010054 AudioDecoderFactory* factory)
55 : DecoderInfo(audio_format, codec_pair_id, factory, audio_format.name) {}
kwiberge9413062016-11-03 05:29:05 -070056
Karl Wiberg08126342018-03-20 19:18:55 +010057DecoderDatabase::DecoderInfo::DecoderInfo(
58 NetEqDecoder ct,
Danil Chapovalovb6021232018-06-19 13:26:36 +020059 absl::optional<AudioCodecPairId> codec_pair_id,
Karl Wiberg08126342018-03-20 19:18:55 +010060 AudioDecoderFactory* factory)
61 : DecoderInfo(*NetEqDecoderToSdpAudioFormat(ct), codec_pair_id, factory) {}
ossuf1b08da2016-09-23 02:19:43 -070062
63DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
kwiberge9413062016-11-03 05:29:05 -070064 AudioDecoder* ext_dec,
65 const std::string& codec_name)
66 : name_(codec_name),
67 audio_format_(audio_format),
Danil Chapovalovb6021232018-06-19 13:26:36 +020068 codec_pair_id_(absl::nullopt),
ossuf1b08da2016-09-23 02:19:43 -070069 factory_(nullptr),
ossu9f38c212016-10-04 05:23:32 -070070 external_decoder_(ext_dec),
71 subtype_(Subtype::kNormal) {
kwibergc0f2dcf2016-05-31 06:28:03 -070072 RTC_CHECK(ext_dec);
73}
kwiberg0fa0a972016-04-19 05:03:45 -070074
75DecoderDatabase::DecoderInfo::DecoderInfo(DecoderInfo&&) = default;
76DecoderDatabase::DecoderInfo::~DecoderInfo() = default;
77
Karl Wiberg31fbb542017-10-16 12:42:38 +020078bool DecoderDatabase::DecoderInfo::CanGetDecoder() const {
79 if (subtype_ == Subtype::kNormal && !external_decoder_ && !decoder_) {
80 // TODO(ossu): Keep a check here for now, since a number of tests create
81 // DecoderInfos without factories.
82 RTC_DCHECK(factory_);
83 return factory_->IsSupportedDecoder(audio_format_);
84 } else {
85 return true;
86 }
87}
88
ossu84bc9852016-08-26 05:41:23 -070089AudioDecoder* DecoderDatabase::DecoderInfo::GetDecoder() const {
ossu9f38c212016-10-04 05:23:32 -070090 if (subtype_ != Subtype::kNormal) {
ossuf1b08da2016-09-23 02:19:43 -070091 // These are handled internally, so they have no AudioDecoder objects.
92 return nullptr;
93 }
kwiberg342f7402016-06-16 03:18:00 -070094 if (external_decoder_) {
kwiberg0fa0a972016-04-19 05:03:45 -070095 RTC_DCHECK(!decoder_);
kwiberg342f7402016-06-16 03:18:00 -070096 RTC_DCHECK(!cng_decoder_);
97 return external_decoder_;
kwiberg0fa0a972016-04-19 05:03:45 -070098 }
99 if (!decoder_) {
ossuf1b08da2016-09-23 02:19:43 -0700100 // TODO(ossu): Keep a check here for now, since a number of tests create
101 // DecoderInfos without factories.
ossu84bc9852016-08-26 05:41:23 -0700102 RTC_DCHECK(factory_);
Karl Wiberg08126342018-03-20 19:18:55 +0100103 decoder_ = factory_->MakeAudioDecoder(audio_format_, codec_pair_id_);
kwiberg0fa0a972016-04-19 05:03:45 -0700104 }
Jonas Olssonabbe8412018-04-03 13:40:05 +0200105 RTC_DCHECK(decoder_) << "Failed to create: " << rtc::ToString(audio_format_);
kwiberg0fa0a972016-04-19 05:03:45 -0700106 return decoder_.get();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000107}
108
ossuf1b08da2016-09-23 02:19:43 -0700109bool DecoderDatabase::DecoderInfo::IsType(const char* name) const {
Niels Möller2edab4c2018-10-22 09:48:08 +0200110 return absl::EqualsIgnoreCase(audio_format_.name, name);
ossuf1b08da2016-09-23 02:19:43 -0700111}
112
113bool DecoderDatabase::DecoderInfo::IsType(const std::string& name) const {
114 return IsType(name.c_str());
ossu84bc9852016-08-26 05:41:23 -0700115}
116
Danil Chapovalovb6021232018-06-19 13:26:36 +0200117absl::optional<DecoderDatabase::DecoderInfo::CngDecoder>
ossuf1b08da2016-09-23 02:19:43 -0700118DecoderDatabase::DecoderInfo::CngDecoder::Create(const SdpAudioFormat& format) {
Niels Möller2edab4c2018-10-22 09:48:08 +0200119 if (absl::EqualsIgnoreCase(format.name, "CN")) {
kwiberg5adaf732016-10-04 09:33:27 -0700120 // CN has a 1:1 RTP clock rate to sample rate ratio.
121 const int sample_rate_hz = format.clockrate_hz;
122 RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
123 sample_rate_hz == 32000 || sample_rate_hz == 48000);
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100124 return DecoderDatabase::DecoderInfo::CngDecoder{sample_rate_hz};
ossuf1b08da2016-09-23 02:19:43 -0700125 } else {
Danil Chapovalovb6021232018-06-19 13:26:36 +0200126 return absl::nullopt;
kwibergc0f2dcf2016-05-31 06:28:03 -0700127 }
128}
129
ossu9f38c212016-10-04 05:23:32 -0700130DecoderDatabase::DecoderInfo::Subtype
131DecoderDatabase::DecoderInfo::SubtypeFromFormat(const SdpAudioFormat& format) {
Niels Möller2edab4c2018-10-22 09:48:08 +0200132 if (absl::EqualsIgnoreCase(format.name, "CN")) {
ossu9f38c212016-10-04 05:23:32 -0700133 return Subtype::kComfortNoise;
Niels Möller2edab4c2018-10-22 09:48:08 +0200134 } else if (absl::EqualsIgnoreCase(format.name, "telephone-event")) {
ossu9f38c212016-10-04 05:23:32 -0700135 return Subtype::kDtmf;
Niels Möller2edab4c2018-10-22 09:48:08 +0200136 } else if (absl::EqualsIgnoreCase(format.name, "red")) {
ossu9f38c212016-10-04 05:23:32 -0700137 return Subtype::kRed;
138 }
139
140 return Subtype::kNormal;
141}
142
Yves Gerey665174f2018-06-19 15:03:05 +0200143bool DecoderDatabase::Empty() const {
144 return decoders_.empty();
145}
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +0000146
Yves Gerey665174f2018-06-19 15:03:05 +0200147int DecoderDatabase::Size() const {
148 return static_cast<int>(decoders_.size());
149}
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +0000150
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000151void DecoderDatabase::Reset() {
152 decoders_.clear();
ossu97ba30e2016-04-25 07:55:58 -0700153 active_decoder_type_ = -1;
154 active_cng_decoder_type_ = -1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000155}
156
kwiberg1c07c702017-03-27 07:15:49 -0700157std::vector<int> DecoderDatabase::SetCodecs(
158 const std::map<int, SdpAudioFormat>& codecs) {
159 // First collect all payload types that we'll remove or reassign, then remove
160 // them from the database.
161 std::vector<int> changed_payload_types;
162 for (const std::pair<uint8_t, const DecoderInfo&> kv : decoders_) {
163 auto i = codecs.find(kv.first);
164 if (i == codecs.end() || i->second != kv.second.GetFormat()) {
165 changed_payload_types.push_back(kv.first);
166 }
167 }
168 for (int pl_type : changed_payload_types) {
169 Remove(pl_type);
170 }
171
172 // Enter the new and changed payload type mappings into the database.
173 for (const auto& kv : codecs) {
174 const int& rtp_payload_type = kv.first;
175 const SdpAudioFormat& audio_format = kv.second;
176 RTC_DCHECK_GE(rtp_payload_type, 0);
177 RTC_DCHECK_LE(rtp_payload_type, 0x7f);
178 if (decoders_.count(rtp_payload_type) == 0) {
179 decoders_.insert(std::make_pair(
Karl Wiberg08126342018-03-20 19:18:55 +0100180 rtp_payload_type,
181 DecoderInfo(audio_format, codec_pair_id_, decoder_factory_.get())));
kwiberg1c07c702017-03-27 07:15:49 -0700182 } else {
183 // The mapping for this payload type hasn't changed.
184 }
185 }
186
187 return changed_payload_types;
188}
189
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000190int DecoderDatabase::RegisterPayload(uint8_t rtp_payload_type,
henrik.lundin4cf61dd2015-12-09 06:20:58 -0800191 NetEqDecoder codec_type,
192 const std::string& name) {
pkasting@chromium.orgd3245462015-02-23 21:28:22 +0000193 if (rtp_payload_type > 0x7F) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000194 return kInvalidRtpPayloadType;
195 }
Karl Wiberg31fbb542017-10-16 12:42:38 +0200196 if (codec_type == NetEqDecoder::kDecoderArbitrary) {
197 return kCodecNotSupported; // Only supported through InsertExternal.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198 }
kwiberg65cb70d2017-03-03 06:16:28 -0800199 const auto opt_format = NetEqDecoderToSdpAudioFormat(codec_type);
ossuf1b08da2016-09-23 02:19:43 -0700200 if (!opt_format) {
201 return kCodecNotSupported;
202 }
Karl Wiberg08126342018-03-20 19:18:55 +0100203 DecoderInfo info(*opt_format, codec_pair_id_, decoder_factory_, name);
Karl Wiberg31fbb542017-10-16 12:42:38 +0200204 if (!info.CanGetDecoder()) {
205 return kCodecNotSupported;
206 }
kwiberg0fa0a972016-04-19 05:03:45 -0700207 auto ret =
208 decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000209 if (ret.second == false) {
210 // Database already contains a decoder with type |rtp_payload_type|.
211 return kDecoderExists;
212 }
213 return kOK;
214}
215
kwiberg5adaf732016-10-04 09:33:27 -0700216int DecoderDatabase::RegisterPayload(int rtp_payload_type,
217 const SdpAudioFormat& audio_format) {
218 if (rtp_payload_type < 0 || rtp_payload_type > 0x7f) {
219 return kInvalidRtpPayloadType;
220 }
221 const auto ret = decoders_.insert(std::make_pair(
Karl Wiberg08126342018-03-20 19:18:55 +0100222 rtp_payload_type,
223 DecoderInfo(audio_format, codec_pair_id_, decoder_factory_.get())));
kwiberg5adaf732016-10-04 09:33:27 -0700224 if (ret.second == false) {
225 // Database already contains a decoder with type |rtp_payload_type|.
226 return kDecoderExists;
227 }
228 return kOK;
229}
230
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000231int DecoderDatabase::InsertExternal(uint8_t rtp_payload_type,
232 NetEqDecoder codec_type,
henrik.lundin4cf61dd2015-12-09 06:20:58 -0800233 const std::string& codec_name,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000234 AudioDecoder* decoder) {
235 if (rtp_payload_type > 0x7F) {
236 return kInvalidRtpPayloadType;
237 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000238 if (!decoder) {
239 return kInvalidPointer;
240 }
ossuf1b08da2016-09-23 02:19:43 -0700241
kwiberg65cb70d2017-03-03 06:16:28 -0800242 const auto opt_db_format = NetEqDecoderToSdpAudioFormat(codec_type);
Danil Chapovalov8aba6b42018-04-17 10:10:57 +0200243 const SdpAudioFormat format =
244 opt_db_format.value_or(SdpAudioFormat("arbitrary", 0, 0));
ossuf1b08da2016-09-23 02:19:43 -0700245
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000246 std::pair<DecoderMap::iterator, bool> ret;
kwiberge9413062016-11-03 05:29:05 -0700247 DecoderInfo info(format, decoder, codec_name);
kwiberg0fa0a972016-04-19 05:03:45 -0700248 ret = decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000249 if (ret.second == false) {
250 // Database already contains a decoder with type |rtp_payload_type|.
251 return kDecoderExists;
252 }
253 return kOK;
254}
255
256int DecoderDatabase::Remove(uint8_t rtp_payload_type) {
257 if (decoders_.erase(rtp_payload_type) == 0) {
258 // No decoder with that |rtp_payload_type|.
259 return kDecoderNotFound;
260 }
ossu97ba30e2016-04-25 07:55:58 -0700261 if (active_decoder_type_ == rtp_payload_type) {
262 active_decoder_type_ = -1; // No active decoder.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000263 }
ossu97ba30e2016-04-25 07:55:58 -0700264 if (active_cng_decoder_type_ == rtp_payload_type) {
265 active_cng_decoder_type_ = -1; // No active CNG decoder.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000266 }
267 return kOK;
268}
269
kwiberg6b19b562016-09-20 04:02:25 -0700270void DecoderDatabase::RemoveAll() {
271 decoders_.clear();
272 active_decoder_type_ = -1; // No active decoder.
273 active_cng_decoder_type_ = -1; // No active CNG decoder.
274}
275
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000276const DecoderDatabase::DecoderInfo* DecoderDatabase::GetDecoderInfo(
277 uint8_t rtp_payload_type) const {
278 DecoderMap::const_iterator it = decoders_.find(rtp_payload_type);
279 if (it == decoders_.end()) {
280 // Decoder not found.
281 return NULL;
282 }
ossuf1b08da2016-09-23 02:19:43 -0700283 return &it->second;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000284}
285
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000286int DecoderDatabase::SetActiveDecoder(uint8_t rtp_payload_type,
287 bool* new_decoder) {
288 // Check that |rtp_payload_type| exists in the database.
Yves Gerey665174f2018-06-19 15:03:05 +0200289 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700290 if (!info) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000291 // Decoder not found.
292 return kDecoderNotFound;
293 }
ossu84bc9852016-08-26 05:41:23 -0700294 RTC_CHECK(!info->IsComfortNoise());
295 RTC_DCHECK(new_decoder);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000296 *new_decoder = false;
ossu97ba30e2016-04-25 07:55:58 -0700297 if (active_decoder_type_ < 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000298 // This is the first active decoder.
299 *new_decoder = true;
ossu97ba30e2016-04-25 07:55:58 -0700300 } else if (active_decoder_type_ != rtp_payload_type) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000301 // Moving from one active decoder to another. Delete the first one.
Yves Gerey665174f2018-06-19 15:03:05 +0200302 const DecoderInfo* old_info = GetDecoderInfo(active_decoder_type_);
ossu84bc9852016-08-26 05:41:23 -0700303 RTC_DCHECK(old_info);
304 old_info->DropDecoder();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000305 *new_decoder = true;
306 }
ossu97ba30e2016-04-25 07:55:58 -0700307 active_decoder_type_ = rtp_payload_type;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000308 return kOK;
309}
310
ossu84bc9852016-08-26 05:41:23 -0700311AudioDecoder* DecoderDatabase::GetActiveDecoder() const {
ossu97ba30e2016-04-25 07:55:58 -0700312 if (active_decoder_type_ < 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000313 // No active decoder.
314 return NULL;
315 }
ossu97ba30e2016-04-25 07:55:58 -0700316 return GetDecoder(active_decoder_type_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000317}
318
319int DecoderDatabase::SetActiveCngDecoder(uint8_t rtp_payload_type) {
320 // Check that |rtp_payload_type| exists in the database.
Yves Gerey665174f2018-06-19 15:03:05 +0200321 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700322 if (!info) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000323 // Decoder not found.
324 return kDecoderNotFound;
325 }
ossu97ba30e2016-04-25 07:55:58 -0700326 if (active_cng_decoder_type_ >= 0 &&
327 active_cng_decoder_type_ != rtp_payload_type) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000328 // Moving from one active CNG decoder to another. Delete the first one.
ossu84bc9852016-08-26 05:41:23 -0700329 RTC_DCHECK(active_cng_decoder_);
ossu97ba30e2016-04-25 07:55:58 -0700330 active_cng_decoder_.reset();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000331 }
ossu97ba30e2016-04-25 07:55:58 -0700332 active_cng_decoder_type_ = rtp_payload_type;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000333 return kOK;
334}
335
ossu84bc9852016-08-26 05:41:23 -0700336ComfortNoiseDecoder* DecoderDatabase::GetActiveCngDecoder() const {
ossu97ba30e2016-04-25 07:55:58 -0700337 if (active_cng_decoder_type_ < 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000338 // No active CNG decoder.
339 return NULL;
340 }
ossu97ba30e2016-04-25 07:55:58 -0700341 if (!active_cng_decoder_) {
342 active_cng_decoder_.reset(new ComfortNoiseDecoder);
343 }
344 return active_cng_decoder_.get();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000345}
346
ossu84bc9852016-08-26 05:41:23 -0700347AudioDecoder* DecoderDatabase::GetDecoder(uint8_t rtp_payload_type) const {
Yves Gerey665174f2018-06-19 15:03:05 +0200348 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700349 return info ? info->GetDecoder() : nullptr;
350}
351
ossuf1b08da2016-09-23 02:19:43 -0700352bool DecoderDatabase::IsType(uint8_t rtp_payload_type, const char* name) const {
353 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
354 return info && info->IsType(name);
355}
356
ossu84bc9852016-08-26 05:41:23 -0700357bool DecoderDatabase::IsType(uint8_t rtp_payload_type,
ossuf1b08da2016-09-23 02:19:43 -0700358 const std::string& name) const {
359 return IsType(rtp_payload_type, name.c_str());
ossu84bc9852016-08-26 05:41:23 -0700360}
361
362bool DecoderDatabase::IsComfortNoise(uint8_t rtp_payload_type) const {
Yves Gerey665174f2018-06-19 15:03:05 +0200363 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700364 return info && info->IsComfortNoise();
365}
366
367bool DecoderDatabase::IsDtmf(uint8_t rtp_payload_type) const {
Yves Gerey665174f2018-06-19 15:03:05 +0200368 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700369 return info && info->IsDtmf();
370}
371
372bool DecoderDatabase::IsRed(uint8_t rtp_payload_type) const {
Yves Gerey665174f2018-06-19 15:03:05 +0200373 const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
ossu84bc9852016-08-26 05:41:23 -0700374 return info && info->IsRed();
375}
376
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000377int DecoderDatabase::CheckPayloadTypes(const PacketList& packet_list) const {
378 PacketList::const_iterator it;
379 for (it = packet_list.begin(); it != packet_list.end(); ++it) {
ossua73f6c92016-10-24 08:25:28 -0700380 if (!GetDecoderInfo(it->payload_type)) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000381 // Payload type is not found.
Mirko Bonadei675513b2017-11-09 11:09:25 +0100382 RTC_LOG(LS_WARNING) << "CheckPayloadTypes: unknown RTP payload type "
383 << static_cast<int>(it->payload_type);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000384 return kDecoderNotFound;
385 }
386 }
387 return kOK;
388}
389
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000390} // namespace webrtc