1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_codeclist_info.h"
17 #include "avcodec_mime_type.h"
18 #include "avcodec_codec_name.h"
19
20 namespace OHOS {
21 namespace MediaAVCodec {
22 const std::vector<int32_t> AUDIO_SAMPLE_RATE = {8000, 11025, 12000, 16000, 22050, 24000,
23 32000, 44100, 48000, 64000, 88200, 96000};
24 constexpr int MAX_AUDIO_CHANNEL_COUNT = 8;
25 constexpr int MAX_SUPPORT_AUDIO_INSTANCE = 16;
26
27 constexpr int MIN_BIT_RATE_MP3 = 32000;
28 constexpr int MAX_BIT_RATE_MP3 = 320000;
29 constexpr int MAX_BIT_RATE_OPUS = 510000;
30 constexpr int MAX_CHANNEL_COUNT_MP3 = 2;
31
32 constexpr int MIN_BIT_RATE_AAC = 8000;
33 constexpr int MAX_BIT_RATE_AAC = 960000;
34 const std::vector<int32_t> AUDIO_VORBIS_SAMPLE_RATE = {8000, 11025, 12000, 16000, 22050, 24000,
35 32000, 44100, 48000, 64000, 88200, 96000};
36 const std::vector<int32_t> AUDIO_AMRNB_SAMPLE_RATE = {8000};
37
38 const std::vector<int32_t> AUDIO_AMRWB_SAMPLE_RATE = {16000};
39
40 const std::vector<int32_t> AUDIO_G711MU_SAMPLE_RATE = {8000};
41 constexpr int MAX_BIT_RATE_FLAC = 2100000;
42
43 constexpr int MIN_BIT_RATE_VORBIS = 32000;
44 constexpr int MAX_BIT_RATE_VORBIS = 500000;
45
46 constexpr int MAX_BIT_RATE_AMRWB = 23850;
47 constexpr int MAX_BIT_RATE_AMRNB = 12200;
48
49 constexpr int MIN_BIT_RATE_AAC_ENCODER = 8000;
50 constexpr int MAX_BIT_RATE_AAC_ENCODER = 448000;
51
52 #ifdef AV_CODEC_AUDIO_VIVID_CAPACITY
53 const std::vector<int32_t> AUDIO_VIVID_SAMPLE_RATE = {32000, 44100, 48000, 96000, 192000};
54 constexpr int MIN_BIT_RATE_VIVID_DECODER = 16000;
55 constexpr int MAX_BIT_RATE_VIVID_DECODER = 3075000;
56 constexpr int MAX_CHANNEL_COUNT_VIVID = 16;
57 #endif
58 constexpr int MAX_BIT_RATE_G711MU_DECODER = 64000;
59 constexpr int MAX_BIT_RATE_G711MU_ENCODER = 64000;
60
GetMP3DecoderCapability()61 CapabilityData AudioCodeclistInfo::GetMP3DecoderCapability()
62 {
63 CapabilityData audioMp3Capability;
64 audioMp3Capability.codecName = AVCodecCodecName::AUDIO_DECODER_MP3_NAME;
65 audioMp3Capability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
66 audioMp3Capability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_MPEG;
67 audioMp3Capability.isVendor = false;
68 audioMp3Capability.bitrate = Range(MIN_BIT_RATE_MP3, MAX_BIT_RATE_MP3);
69 audioMp3Capability.channels = Range(1, MAX_CHANNEL_COUNT_MP3);
70 audioMp3Capability.sampleRate = AUDIO_SAMPLE_RATE;
71 audioMp3Capability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
72 return audioMp3Capability;
73 }
74
GetAacDecoderCapability()75 CapabilityData AudioCodeclistInfo::GetAacDecoderCapability()
76 {
77 CapabilityData audioAacCapability;
78 audioAacCapability.codecName = AVCodecCodecName::AUDIO_DECODER_AAC_NAME;
79 audioAacCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
80 audioAacCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_AAC;
81 audioAacCapability.isVendor = false;
82 audioAacCapability.bitrate = Range(MIN_BIT_RATE_AAC, MAX_BIT_RATE_AAC);
83 audioAacCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
84 audioAacCapability.sampleRate = AUDIO_SAMPLE_RATE;
85 audioAacCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
86 return audioAacCapability;
87 }
88
GetOpusDecoderCapability()89 CapabilityData AudioCodeclistInfo::GetOpusDecoderCapability()
90 {
91 CapabilityData audioOpusCapability;
92 audioOpusCapability.codecName = AVCodecCodecName::AUDIO_DECODER_OPUS_NAME;
93 audioOpusCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
94 audioOpusCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_OPUS;
95 audioOpusCapability.isVendor = false;
96 audioOpusCapability.bitrate = Range(1, MAX_BIT_RATE_OPUS);
97 audioOpusCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
98 audioOpusCapability.sampleRate = AUDIO_SAMPLE_RATE;
99 audioOpusCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
100 return audioOpusCapability;
101 }
102
GetFlacDecoderCapability()103 CapabilityData AudioCodeclistInfo::GetFlacDecoderCapability()
104 {
105 CapabilityData audioFlacCapability;
106 audioFlacCapability.codecName = AVCodecCodecName::AUDIO_DECODER_FLAC_NAME;
107 audioFlacCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
108 audioFlacCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_FLAC;
109 audioFlacCapability.isVendor = false;
110 audioFlacCapability.bitrate = Range(1, MAX_BIT_RATE_FLAC);
111 audioFlacCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
112 audioFlacCapability.sampleRate = AUDIO_SAMPLE_RATE;
113 audioFlacCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
114 return audioFlacCapability;
115 }
116
GetVorbisDecoderCapability()117 CapabilityData AudioCodeclistInfo::GetVorbisDecoderCapability()
118 {
119 CapabilityData audioVorbisCapability;
120 audioVorbisCapability.codecName = AVCodecCodecName::AUDIO_DECODER_VORBIS_NAME;
121 audioVorbisCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
122 audioVorbisCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_VORBIS;
123 audioVorbisCapability.isVendor = false;
124 audioVorbisCapability.bitrate = Range(MIN_BIT_RATE_VORBIS, MAX_BIT_RATE_VORBIS);
125 audioVorbisCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
126 audioVorbisCapability.sampleRate = AUDIO_VORBIS_SAMPLE_RATE;
127 audioVorbisCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
128 return audioVorbisCapability;
129 }
130
GetAmrnbDecoderCapability()131 CapabilityData AudioCodeclistInfo::GetAmrnbDecoderCapability()
132 {
133 CapabilityData audioAmrnbCapability;
134 audioAmrnbCapability.codecName = AVCodecCodecName::AUDIO_DECODER_AMRNB_NAME;
135 audioAmrnbCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
136 audioAmrnbCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_AMRNB;
137 audioAmrnbCapability.isVendor = false;
138 audioAmrnbCapability.bitrate = Range(1, MAX_BIT_RATE_AMRNB);
139 audioAmrnbCapability.channels = Range(1, 1);
140 audioAmrnbCapability.sampleRate = AUDIO_AMRNB_SAMPLE_RATE;
141 audioAmrnbCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
142 return audioAmrnbCapability;
143 }
144
GetAmrwbDecoderCapability()145 CapabilityData AudioCodeclistInfo::GetAmrwbDecoderCapability()
146 {
147 CapabilityData audioAmrwbCapability;
148 audioAmrwbCapability.codecName = AVCodecCodecName::AUDIO_DECODER_AMRWB_NAME;
149 audioAmrwbCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
150 audioAmrwbCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_AMRWB;
151 audioAmrwbCapability.isVendor = false;
152 audioAmrwbCapability.bitrate = Range(1, MAX_BIT_RATE_AMRWB);
153 audioAmrwbCapability.channels = Range(1, 1);
154 audioAmrwbCapability.sampleRate = AUDIO_AMRWB_SAMPLE_RATE;
155 audioAmrwbCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
156 return audioAmrwbCapability;
157 }
158
159 #ifdef AV_CODEC_AUDIO_VIVID_CAPACITY
GetVividDecoderCapability()160 CapabilityData AudioCodeclistInfo::GetVividDecoderCapability()
161 {
162 CapabilityData audioVividCapability;
163 audioVividCapability.codecName = AVCodecCodecName::AUDIO_DECODER_VIVID_NAME;
164 audioVividCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
165 audioVividCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_VIVID;
166 audioVividCapability.isVendor = false;
167 audioVividCapability.bitrate = Range(MIN_BIT_RATE_VIVID_DECODER, MAX_BIT_RATE_VIVID_DECODER);
168 audioVividCapability.channels = Range(1, MAX_CHANNEL_COUNT_VIVID);
169 audioVividCapability.sampleRate = AUDIO_VIVID_SAMPLE_RATE;
170 audioVividCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
171 return audioVividCapability;
172 }
173 #endif
174
GetAacEncoderCapability()175 CapabilityData AudioCodeclistInfo::GetAacEncoderCapability()
176 {
177 CapabilityData audioAacCapability;
178 audioAacCapability.codecName = AVCodecCodecName::AUDIO_ENCODER_AAC_NAME;
179 audioAacCapability.codecType = AVCODEC_TYPE_AUDIO_ENCODER;
180 audioAacCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_AAC;
181 audioAacCapability.isVendor = false;
182 audioAacCapability.bitrate = Range(MIN_BIT_RATE_AAC_ENCODER, MAX_BIT_RATE_AAC_ENCODER);
183 audioAacCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
184 audioAacCapability.sampleRate = AUDIO_SAMPLE_RATE;
185 audioAacCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
186 audioAacCapability.profiles = { AAC_PROFILE_LC };
187 return audioAacCapability;
188 }
189
GetOpusEncoderCapability()190 CapabilityData AudioCodeclistInfo::GetOpusEncoderCapability()
191 {
192 CapabilityData audioOpusCapability;
193 audioOpusCapability.codecName = AVCodecCodecName::AUDIO_ENCODER_OPUS_NAME;
194 audioOpusCapability.codecType = AVCODEC_TYPE_AUDIO_ENCODER;
195 audioOpusCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_OPUS;
196 audioOpusCapability.isVendor = false;
197 audioOpusCapability.bitrate = Range(1, MAX_BIT_RATE_OPUS);
198 audioOpusCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
199 audioOpusCapability.sampleRate = AUDIO_SAMPLE_RATE;
200 audioOpusCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
201 return audioOpusCapability;
202 }
203
GetFlacEncoderCapability()204 CapabilityData AudioCodeclistInfo::GetFlacEncoderCapability()
205 {
206 CapabilityData audioFlacCapability;
207 audioFlacCapability.codecName = AVCodecCodecName::AUDIO_ENCODER_FLAC_NAME;
208 audioFlacCapability.codecType = AVCODEC_TYPE_AUDIO_ENCODER;
209 audioFlacCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_FLAC;
210 audioFlacCapability.isVendor = false;
211 audioFlacCapability.bitrate = Range(1, MAX_BIT_RATE_FLAC);
212 audioFlacCapability.channels = Range(1, MAX_AUDIO_CHANNEL_COUNT);
213 audioFlacCapability.sampleRate = AUDIO_SAMPLE_RATE;
214 audioFlacCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
215 return audioFlacCapability;
216 }
217
GetG711muDecoderCapability()218 CapabilityData AudioCodeclistInfo::GetG711muDecoderCapability()
219 {
220 CapabilityData audioG711muDecoderCapability;
221 audioG711muDecoderCapability.codecName = AVCodecCodecName::AUDIO_DECODER_G711MU_NAME;
222 audioG711muDecoderCapability.codecType = AVCODEC_TYPE_AUDIO_DECODER;
223 audioG711muDecoderCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_G711MU;
224 audioG711muDecoderCapability.isVendor = false;
225 audioG711muDecoderCapability.bitrate = Range(1, MAX_BIT_RATE_G711MU_DECODER);
226 audioG711muDecoderCapability.channels = Range(1, 1);
227 audioG711muDecoderCapability.sampleRate = AUDIO_G711MU_SAMPLE_RATE;
228 audioG711muDecoderCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
229 return audioG711muDecoderCapability;
230 }
231
GetG711muEncoderCapability()232 CapabilityData AudioCodeclistInfo::GetG711muEncoderCapability()
233 {
234 CapabilityData audioG711muEncoderCapability;
235 audioG711muEncoderCapability.codecName = AVCodecCodecName::AUDIO_ENCODER_G711MU_NAME;
236 audioG711muEncoderCapability.codecType = AVCODEC_TYPE_AUDIO_ENCODER;
237 audioG711muEncoderCapability.mimeType = AVCodecMimeType::MEDIA_MIMETYPE_AUDIO_G711MU;
238 audioG711muEncoderCapability.isVendor = false;
239 audioG711muEncoderCapability.bitrate = Range(1, MAX_BIT_RATE_G711MU_ENCODER);
240 audioG711muEncoderCapability.channels = Range(1, 1);
241 audioG711muEncoderCapability.sampleRate = AUDIO_G711MU_SAMPLE_RATE;
242 audioG711muEncoderCapability.maxInstance = MAX_SUPPORT_AUDIO_INSTANCE;
243 return audioG711muEncoderCapability;
244 }
245
AudioCodeclistInfo()246 AudioCodeclistInfo::AudioCodeclistInfo()
247 {
248 audioCapabilities_ = {GetMP3DecoderCapability(), GetAacDecoderCapability(), GetFlacDecoderCapability(),
249 GetOpusDecoderCapability(), GetVorbisDecoderCapability(), GetAmrnbDecoderCapability(),
250 GetAmrwbDecoderCapability(), GetG711muDecoderCapability(), GetAacEncoderCapability(),
251 GetFlacEncoderCapability(), GetOpusEncoderCapability(), GetG711muEncoderCapability(),
252 #ifdef AV_CODEC_AUDIO_VIVID_CAPACITY
253 GetVividDecoderCapability()
254 #endif
255 };
256 }
257
~AudioCodeclistInfo()258 AudioCodeclistInfo::~AudioCodeclistInfo()
259 {
260 audioCapabilities_.clear();
261 }
262
GetInstance()263 AudioCodeclistInfo &AudioCodeclistInfo::GetInstance()
264 {
265 static AudioCodeclistInfo audioCodecList;
266 return audioCodecList;
267 }
268
GetAudioCapabilities() const269 std::vector<CapabilityData> AudioCodeclistInfo::GetAudioCapabilities() const noexcept
270 {
271 return audioCapabilities_;
272 }
273 } // namespace MediaAVCodec
274 } // namespace OHOS