Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: webrtc/modules/audio_coding/neteq/decoder_database.cc

Issue 2383723002: Cache the subtype of each DecoderInfo to make the Is* checks quicker. (Closed)
Patch Set: Inline IsComfortNoise, IsDtmf and IsRed in DecoderInfo. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_coding/neteq/decoder_database.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 13 matching lines...) Expand all
24 active_cng_decoder_type_(-1), 24 active_cng_decoder_type_(-1),
25 decoder_factory_(decoder_factory) {} 25 decoder_factory_(decoder_factory) {}
26 26
27 DecoderDatabase::~DecoderDatabase() = default; 27 DecoderDatabase::~DecoderDatabase() = default;
28 28
29 DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format, 29 DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
30 AudioDecoderFactory* factory) 30 AudioDecoderFactory* factory)
31 : audio_format_(audio_format), 31 : audio_format_(audio_format),
32 factory_(factory), 32 factory_(factory),
33 external_decoder_(nullptr), 33 external_decoder_(nullptr),
34 cng_decoder_(CngDecoder::Create(audio_format)) {} 34 cng_decoder_(CngDecoder::Create(audio_format)),
35 subtype_(SubtypeFromFormat(audio_format)) {}
35 36
36 DecoderDatabase::DecoderInfo::DecoderInfo(NetEqDecoder ct, 37 DecoderDatabase::DecoderInfo::DecoderInfo(NetEqDecoder ct,
37 AudioDecoderFactory* factory) 38 AudioDecoderFactory* factory)
38 : audio_format_(*acm2::RentACodec::NetEqDecoderToSdpAudioFormat(ct)), 39 : audio_format_(*acm2::RentACodec::NetEqDecoderToSdpAudioFormat(ct)),
39 factory_(factory), 40 factory_(factory),
40 external_decoder_(nullptr), 41 external_decoder_(nullptr),
41 cng_decoder_(CngDecoder::Create(audio_format_)) {} 42 cng_decoder_(CngDecoder::Create(audio_format_)),
43 subtype_(SubtypeFromFormat(audio_format_)) {}
42 44
43 DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format, 45 DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
44 AudioDecoder* ext_dec) 46 AudioDecoder* ext_dec)
45 : audio_format_(audio_format), 47 : audio_format_(audio_format),
46 factory_(nullptr), 48 factory_(nullptr),
47 external_decoder_(ext_dec) { 49 external_decoder_(ext_dec),
50 subtype_(Subtype::kNormal) {
48 RTC_CHECK(ext_dec); 51 RTC_CHECK(ext_dec);
49 } 52 }
50 53
51 DecoderDatabase::DecoderInfo::DecoderInfo(DecoderInfo&&) = default; 54 DecoderDatabase::DecoderInfo::DecoderInfo(DecoderInfo&&) = default;
52 DecoderDatabase::DecoderInfo::~DecoderInfo() = default; 55 DecoderDatabase::DecoderInfo::~DecoderInfo() = default;
53 56
54 AudioDecoder* DecoderDatabase::DecoderInfo::GetDecoder() const { 57 AudioDecoder* DecoderDatabase::DecoderInfo::GetDecoder() const {
55 if (IsDtmf() || IsRed() || IsComfortNoise()) { 58 if (subtype_ != Subtype::kNormal) {
56 // These are handled internally, so they have no AudioDecoder objects. 59 // These are handled internally, so they have no AudioDecoder objects.
57 return nullptr; 60 return nullptr;
58 } 61 }
59 if (external_decoder_) { 62 if (external_decoder_) {
60 RTC_DCHECK(!decoder_); 63 RTC_DCHECK(!decoder_);
61 RTC_DCHECK(!cng_decoder_); 64 RTC_DCHECK(!cng_decoder_);
62 return external_decoder_; 65 return external_decoder_;
63 } 66 }
64 if (!decoder_) { 67 if (!decoder_) {
65 // TODO(ossu): Keep a check here for now, since a number of tests create 68 // TODO(ossu): Keep a check here for now, since a number of tests create
66 // DecoderInfos without factories. 69 // DecoderInfos without factories.
67 RTC_DCHECK(factory_); 70 RTC_DCHECK(factory_);
68 decoder_ = factory_->MakeAudioDecoder(audio_format_); 71 decoder_ = factory_->MakeAudioDecoder(audio_format_);
69 } 72 }
70 RTC_DCHECK(decoder_) << "Failed to create: " << audio_format_; 73 RTC_DCHECK(decoder_) << "Failed to create: " << audio_format_;
71 return decoder_.get(); 74 return decoder_.get();
72 } 75 }
73 76
74 bool DecoderDatabase::DecoderInfo::IsComfortNoise() const {
75 RTC_DCHECK_EQ(!!cng_decoder_, IsType("CN"));
76 return !!cng_decoder_;
77 }
78
79 bool DecoderDatabase::DecoderInfo::IsDtmf() const {
80 return IsType("telephone-event");
81 }
82
83 bool DecoderDatabase::DecoderInfo::IsRed() const {
84 return IsType("red");
85 }
86
87 bool DecoderDatabase::DecoderInfo::IsType(const char* name) const { 77 bool DecoderDatabase::DecoderInfo::IsType(const char* name) const {
88 return STR_CASE_CMP(audio_format_.name.c_str(), name) == 0; 78 return STR_CASE_CMP(audio_format_.name.c_str(), name) == 0;
89 } 79 }
90 80
91 bool DecoderDatabase::DecoderInfo::IsType(const std::string& name) const { 81 bool DecoderDatabase::DecoderInfo::IsType(const std::string& name) const {
92 return IsType(name.c_str()); 82 return IsType(name.c_str());
93 } 83 }
94 84
95 rtc::Optional<DecoderDatabase::DecoderInfo::CngDecoder> 85 rtc::Optional<DecoderDatabase::DecoderInfo::CngDecoder>
96 DecoderDatabase::DecoderInfo::CngDecoder::Create(const SdpAudioFormat& format) { 86 DecoderDatabase::DecoderInfo::CngDecoder::Create(const SdpAudioFormat& format) {
97 if (STR_CASE_CMP(format.name.c_str(), "CN") == 0) { 87 if (STR_CASE_CMP(format.name.c_str(), "CN") == 0) {
98 return rtc::Optional<CngDecoder>({format.clockrate_hz}); 88 return rtc::Optional<CngDecoder>({format.clockrate_hz});
99 } else { 89 } else {
100 return rtc::Optional<CngDecoder>(); 90 return rtc::Optional<CngDecoder>();
101 } 91 }
102 } 92 }
103 93
94 DecoderDatabase::DecoderInfo::Subtype
95 DecoderDatabase::DecoderInfo::SubtypeFromFormat(const SdpAudioFormat& format) {
96 if (STR_CASE_CMP(format.name.c_str(), "CN") == 0) {
97 return Subtype::kComfortNoise;
98 } else if (STR_CASE_CMP(format.name.c_str(), "telephone-event") == 0) {
99 return Subtype::kDtmf;
100 } else if (STR_CASE_CMP(format.name.c_str(), "red") == 0) {
101 return Subtype::kRed;
102 }
103
104 return Subtype::kNormal;
105 }
106
104 bool DecoderDatabase::Empty() const { return decoders_.empty(); } 107 bool DecoderDatabase::Empty() const { return decoders_.empty(); }
105 108
106 int DecoderDatabase::Size() const { return static_cast<int>(decoders_.size()); } 109 int DecoderDatabase::Size() const { return static_cast<int>(decoders_.size()); }
107 110
108 void DecoderDatabase::Reset() { 111 void DecoderDatabase::Reset() {
109 decoders_.clear(); 112 decoders_.clear();
110 active_decoder_type_ = -1; 113 active_decoder_type_ = -1;
111 active_cng_decoder_type_ = -1; 114 active_cng_decoder_type_ = -1;
112 } 115 }
113 116
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 // Payload type is not found. 295 // Payload type is not found.
293 LOG(LS_WARNING) << "CheckPayloadTypes: unknown RTP payload type " 296 LOG(LS_WARNING) << "CheckPayloadTypes: unknown RTP payload type "
294 << static_cast<int>((*it)->header.payloadType); 297 << static_cast<int>((*it)->header.payloadType);
295 return kDecoderNotFound; 298 return kDecoderNotFound;
296 } 299 }
297 } 300 }
298 return kOK; 301 return kOK;
299 } 302 }
300 303
301 } // namespace webrtc 304 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/decoder_database.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698