• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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