1 /*
2 * Copyright (c) 2024 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 "format_converter.h"
17 #include "audio_stream_info.h"
18 #include "audio_log.h"
19 #include <string>
20 #include <vector>
21
22 namespace OHOS {
23 namespace AudioStandard {
24 #define PCM_FLOAT_EPS 1e-6f
25 #define BIT_16 16
26 #define INT32_FORMAT_SHIFT 31
27 static constexpr int32_t VOLUME_SHIFT_NUMBER = 16; // 1 >> 16 = 65536, max volume
28
CapMax(float v)29 static float CapMax(float v)
30 {
31 float value = v;
32 if (v >= 1.0f) {
33 value = 1.0f - PCM_FLOAT_EPS;
34 } else if (v <= -1.0f) {
35 value = -1.0f + PCM_FLOAT_EPS;
36 }
37 return value;
38 }
39
ConvertFromFloatTo16Bit(const float * a)40 static int16_t ConvertFromFloatTo16Bit(const float *a)
41 {
42 float tmp = *a;
43 float v = CapMax(tmp) * (1 << (BIT_16 - 1));
44 return static_cast<int16_t>(v);
45 }
46
MixS16Volume(const std::vector<AudioStreamData> & srcDataList,const AudioStreamData & dstData)47 void MixS16Volume(const std::vector<AudioStreamData> &srcDataList, const AudioStreamData &dstData)
48 {
49 size_t srcListSize = srcDataList.size();
50 size_t loopCount = dstData.bufferDesc.dataLength / sizeof(int16_t);
51
52 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstData.bufferDesc.buffer);
53 for (size_t offset = 0; loopCount > 0; loopCount--) {
54 int32_t sum = 0;
55 for (size_t i = 0; i < srcListSize; i++) {
56 int32_t vol = srcDataList[i].volumeStart;
57 int16_t *srcPtr = reinterpret_cast<int16_t *>(srcDataList[i].bufferDesc.buffer) + offset;
58 sum += (*srcPtr * static_cast<int64_t>(vol)) >> VOLUME_SHIFT_NUMBER;
59 }
60 offset++;
61 *dstPtr++ = sum > INT16_MAX ? INT16_MAX : (sum < INT16_MIN ? INT16_MIN : sum);
62 }
63 }
64
MixS32Volume(const std::vector<AudioStreamData> & srcDataList,const AudioStreamData & dstData)65 void MixS32Volume(const std::vector<AudioStreamData> &srcDataList, const AudioStreamData &dstData)
66 {
67 size_t srcListSize = srcDataList.size();
68 size_t loopCount = dstData.bufferDesc.dataLength / sizeof(int32_t);
69
70 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstData.bufferDesc.buffer);
71 for (size_t offset = 0; loopCount > 0; loopCount--) {
72 int64_t sum = 0;
73 for (size_t i = 0; i < srcListSize; i++) {
74 int32_t vol = srcDataList[i].volumeStart;
75 int32_t *srcPtr = reinterpret_cast<int32_t *>(srcDataList[i].bufferDesc.buffer) + offset;
76 sum += (*srcPtr * static_cast<int64_t>(vol)) >> VOLUME_SHIFT_NUMBER;
77 }
78 offset++;
79 sum = sum > INT32_MAX ? INT32_MAX : (sum < INT32_MIN ? INT32_MIN : sum);
80 *dstPtr++ = static_cast<int32_t>(sum);
81 }
82 }
83
84 // only use volumeStart, not smooth from volumeStart to volumeEnd
DataAccumulationFromVolume(const std::vector<AudioStreamData> & srcDataList,const AudioStreamData & dstData)85 bool FormatConverter::DataAccumulationFromVolume(const std::vector<AudioStreamData> &srcDataList,
86 const AudioStreamData &dstData)
87 {
88 size_t srcListSize = srcDataList.size();
89 for (size_t i = 0; i < srcListSize; i++) {
90 if (srcDataList[i].streamInfo.format != dstData.streamInfo.format ||
91 srcDataList[i].streamInfo.channels != STEREO ||
92 srcDataList[i].bufferDesc.bufLength != dstData.bufferDesc.bufLength ||
93 srcDataList[i].bufferDesc.dataLength != dstData.bufferDesc.dataLength) {
94 AUDIO_ERR_LOG("ProcessData failed, streamInfo are different: format %{public}d channels %{public}d "
95 "bufLength %{public}zu dataLength %{public}zu", srcDataList[i].streamInfo.format,
96 srcDataList[i].streamInfo.channels, srcDataList[i].bufferDesc.bufLength,
97 srcDataList[i].bufferDesc.dataLength);
98 return false;
99 }
100 }
101 // Assum using the same format and same size
102 CHECK_AND_RETURN_RET_LOG((dstData.streamInfo.format == SAMPLE_S16LE || dstData.streamInfo.format == SAMPLE_S32LE) &&
103 dstData.streamInfo.channels == STEREO, false, "ProcessData failed, streamInfo are not support");
104
105 if (dstData.streamInfo.format == SAMPLE_S16LE) {
106 MixS16Volume(srcDataList, dstData);
107 } else if (dstData.streamInfo.format == SAMPLE_S32LE) {
108 MixS32Volume(srcDataList, dstData);
109 }
110 return true;
111 }
112
S32MonoToS16Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)113 int32_t FormatConverter::S32MonoToS16Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
114 {
115 size_t quarter = sizeof(int32_t);
116 if (srcDesc.bufLength != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr ||
117 srcDesc.bufLength % quarter != 0) {
118 return -1;
119 }
120 int32_t *stcPtr = reinterpret_cast<int32_t *>(srcDesc.buffer);
121 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
122 size_t count = srcDesc.bufLength / quarter;
123
124 double maxInt32 = INT32_MAX;
125 double maxInt16 = INT16_MAX;
126 for (size_t idx = 0; idx < count; idx++) {
127 int16_t temp = static_cast<int16_t>((static_cast<double>(*stcPtr) / maxInt32) * maxInt16);
128 stcPtr++;
129 *(dstPtr++) = temp;
130 *(dstPtr++) = temp;
131 }
132 return 0;
133 }
134
S32StereoToS16Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)135 int32_t FormatConverter::S32StereoToS16Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
136 {
137 size_t half = 2;
138 if (srcDesc.bufLength / half != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr ||
139 dstDesc.bufLength % half != 0) {
140 return -1;
141 }
142 int32_t *stcPtr = reinterpret_cast<int32_t *>(srcDesc.buffer);
143 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
144 size_t count = srcDesc.bufLength / half / half;
145 double maxInt32 = INT32_MAX;
146 double maxInt16 = INT16_MAX;
147 for (size_t idx = 0; idx < count; idx++) {
148 int16_t temp = static_cast<int16_t>((static_cast<double>(*stcPtr) / maxInt32) * maxInt16);
149 stcPtr++;
150 *(dstPtr++) = temp;
151 }
152 return 0;
153 }
154
S16MonoToS16Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)155 int32_t FormatConverter::S16MonoToS16Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
156 {
157 size_t half = 2; // mono(1) -> stereo(2)
158 if (srcDesc.bufLength != dstDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
159 return -1;
160 }
161 int16_t *stcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
162 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
163 size_t count = srcDesc.bufLength / sizeof(int16_t);
164 for (size_t idx = 0; idx < count; idx++) {
165 *(dstPtr++) = *stcPtr;
166 *(dstPtr++) = *stcPtr++;
167 }
168 return 0;
169 }
170
S16StereoToS16Mono(const BufferDesc & srcDesc,const BufferDesc & dstDesc)171 int32_t FormatConverter::S16StereoToS16Mono(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
172 {
173 size_t half = 2; // stereo(2) -> mono(1)
174 if (dstDesc.bufLength != srcDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
175 return -1;
176 }
177 int16_t *stcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
178 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
179 size_t count = srcDesc.bufLength / half / sizeof(int16_t);
180 for (size_t idx = 0; idx < count; idx++) {
181 *(dstPtr++) = (*stcPtr + *(stcPtr + 1)) / 2; // To obtain mono channel, add left to right, then divide by 2
182 stcPtr += 2; // ptr++ on mono is equivalent to ptr+=2 on stereo
183 }
184 return 0;
185 }
186
S16StereoToS32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)187 int32_t FormatConverter::S16StereoToS32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
188 {
189 const size_t half = sizeof(int16_t);
190 if (srcDesc.bufLength != dstDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
191 return -1;
192 }
193 int16_t *srcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
194 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstDesc.buffer);
195 size_t count = srcDesc.bufLength / sizeof(int16_t);
196 double maxInt16 = INT16_MAX;
197 double maxInt32 = INT32_MAX;
198 for (size_t idx = 0; idx < count; idx++) {
199 int32_t temp = static_cast<int32_t>((static_cast<double>(*srcPtr) / maxInt16) * maxInt32);
200 srcPtr++;
201 *(dstPtr++) = temp;
202 }
203 return 0;
204 }
205
S16MonoToS32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)206 int32_t FormatConverter::S16MonoToS32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
207 {
208 const size_t quarter = sizeof(int32_t);
209 if (srcDesc.bufLength != dstDesc.bufLength / quarter || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
210 return -1;
211 }
212 int16_t *srcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
213 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstDesc.buffer);
214 size_t count = srcDesc.bufLength / sizeof(int16_t);
215 double maxInt16 = INT16_MAX;
216 double maxInt32 = INT32_MAX;
217 for (size_t idx = 0; idx < count; idx++) {
218 int32_t temp = static_cast<int32_t>((static_cast<double>(*srcPtr) / maxInt16) * maxInt32);
219 srcPtr++;
220 *(dstPtr++) = temp; // left
221 *(dstPtr++) = temp; // right
222 }
223 return 0;
224 }
225
S32MonoToS32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)226 int32_t FormatConverter::S32MonoToS32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
227 {
228 const size_t half = sizeof(int16_t);
229 if (srcDesc.bufLength != dstDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
230 return -1;
231 }
232 int32_t *srcPtr = reinterpret_cast<int32_t *>(srcDesc.buffer);
233 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstDesc.buffer);
234 size_t count = srcDesc.bufLength / sizeof(int32_t);
235
236 for (size_t idx = 0; idx < count; idx++) {
237 *(dstPtr++) = *srcPtr; // left
238 *(dstPtr++) = *srcPtr++; // right
239 }
240 return 0;
241 }
242
F32MonoToS32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)243 int32_t FormatConverter::F32MonoToS32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
244 {
245 const size_t half = 2;
246 if (srcDesc.bufLength != dstDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
247 return -1;
248 }
249 float *srcPtr = reinterpret_cast<float *>(srcDesc.buffer);
250 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstDesc.buffer);
251 size_t count = srcDesc.bufLength / sizeof(float);
252 for (size_t idx = 0; idx < count; idx++) {
253 int32_t temp = static_cast<int32_t>(CapMax(*(srcPtr++)) * (1 << INT32_FORMAT_SHIFT));
254 *(dstPtr++) = temp; // left
255 *(dstPtr++) = temp; // right
256 }
257 return 0;
258 }
259
F32StereoToS32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)260 int32_t FormatConverter::F32StereoToS32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
261 {
262 if (srcDesc.bufLength != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
263 return -1;
264 }
265 float *srcPtr = reinterpret_cast<float *>(srcDesc.buffer);
266 int32_t *dstPtr = reinterpret_cast<int32_t *>(dstDesc.buffer);
267 size_t count = srcDesc.bufLength / sizeof(float);
268 for (size_t idx = 0; idx < count; idx++) {
269 int32_t temp = static_cast<int32_t>(CapMax(*(srcPtr++)) * (1 << INT32_FORMAT_SHIFT));
270 *(dstPtr++) = temp;
271 }
272 return 0;
273 }
274
S16StereoToF32Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)275 int32_t FormatConverter::S16StereoToF32Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
276 {
277 size_t half = 2;
278 if (srcDesc.bufLength != dstDesc.bufLength / half || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
279 return -1;
280 }
281 int16_t *srcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
282 float *dstPtr = reinterpret_cast<float *>(dstDesc.buffer);
283 size_t count = srcDesc.bufLength / sizeof(int16_t);
284 const float FLOAT_SCALE = 1.0f / (1 << (BIT_16 - 1));
285 for (size_t idx = 0; idx < count; idx++) {
286 *dstPtr = (*srcPtr) * FLOAT_SCALE;
287 dstPtr++;
288 srcPtr++;
289 }
290 return 0;
291 }
292
S16StereoToF32Mono(const BufferDesc & srcDesc,const BufferDesc & dstDesc)293 int32_t FormatConverter::S16StereoToF32Mono(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
294 {
295 size_t half = 2;
296 if (srcDesc.bufLength != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr) {
297 return -1;
298 }
299 int16_t *srcPtr = reinterpret_cast<int16_t *>(srcDesc.buffer);
300 float *dstPtr = reinterpret_cast<float *>(dstDesc.buffer);
301 size_t count = srcDesc.bufLength / half / sizeof(int16_t);
302 const float FLOAT_SCALE = 1.0f / (1 << (BIT_16 - 1));
303 const size_t SRC_INCREMENT = 2;
304 for (size_t idx = 0; idx < count; idx++) {
305 *dstPtr = (static_cast<float>(*srcPtr + *(srcPtr + 1)) / half) * FLOAT_SCALE;
306 dstPtr++;
307 srcPtr += SRC_INCREMENT;
308 }
309 return 0;
310 }
311
F32MonoToS16Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)312 int32_t FormatConverter::F32MonoToS16Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
313 {
314 size_t quarter = 4;
315 if (srcDesc.bufLength != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr ||
316 srcDesc.bufLength % quarter != 0) {
317 return -1;
318 }
319 float *stcPtr = reinterpret_cast<float *>(srcDesc.buffer);
320 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
321 size_t count = srcDesc.bufLength / quarter;
322
323 for (size_t idx = 0; idx < count; idx++) {
324 int16_t temp = ConvertFromFloatTo16Bit(stcPtr);
325 stcPtr++;
326 *(dstPtr++) = temp;
327 *(dstPtr++) = temp;
328 }
329 return 0;
330 }
331
F32StereoToS16Stereo(const BufferDesc & srcDesc,const BufferDesc & dstDesc)332 int32_t FormatConverter::F32StereoToS16Stereo(const BufferDesc &srcDesc, const BufferDesc &dstDesc)
333 {
334 size_t half = 2;
335 if (srcDesc.bufLength / half != dstDesc.bufLength || srcDesc.buffer == nullptr || dstDesc.buffer == nullptr ||
336 dstDesc.bufLength % half != 0) {
337 return -1;
338 }
339 float *stcPtr = reinterpret_cast<float *>(srcDesc.buffer);
340 int16_t *dstPtr = reinterpret_cast<int16_t *>(dstDesc.buffer);
341 size_t count = srcDesc.bufLength / half / half;
342
343 for (size_t idx = 0; idx < count; idx++) {
344 int16_t temp = ConvertFromFloatTo16Bit(stcPtr);
345 stcPtr++;
346 *(dstPtr++) = temp;
347 }
348 return 0;
349 }
350
S32MonoToS16Mono(std::vector<char> & audioBuffer,std::vector<char> & audioBufferConverted)351 int32_t FormatConverter::S32MonoToS16Mono(std::vector<char> &audioBuffer, std::vector<char> &audioBufferConverted)
352 {
353 size_t half = 2;
354 int32_t size = audioBuffer.size();
355 if (size == 0) {
356 return -1;
357 }
358
359 audioBufferConverted.resize(size / half);
360 int32_t *stcPtr = reinterpret_cast<int32_t *>(audioBuffer.data());
361 int16_t *dstPtr = reinterpret_cast<int16_t *>(audioBufferConverted.data());
362 size_t count = size / sizeof(int32_t);
363
364 double maxInt32 = INT32_MAX;
365 double maxInt16 = INT16_MAX;
366 for (size_t idx = 0; idx < count; idx++) {
367 int16_t temp = static_cast<int16_t>((static_cast<double>(*stcPtr) / maxInt32) * maxInt16);
368 *(dstPtr++) = temp;
369 stcPtr++;
370 }
371 return 0;
372 }
373
S32StereoToS16Stereo(std::vector<char> & audioBuffer,std::vector<char> & audioBufferConverted)374 int32_t FormatConverter::S32StereoToS16Stereo(std::vector<char> &audioBuffer, std::vector<char> &audioBufferConverted)
375 {
376 size_t half = 2;
377 int32_t size = audioBuffer.size();
378 if (size == 0) {
379 return -1;
380 }
381
382 audioBufferConverted.resize(size / half);
383 int32_t *stcPtr = reinterpret_cast<int32_t *>(audioBuffer.data());
384 int16_t *dstPtr = reinterpret_cast<int16_t *>(audioBufferConverted.data());
385 size_t count = size / sizeof(int32_t);
386
387 double maxInt32 = INT32_MAX;
388 double maxInt16 = INT16_MAX;
389 for (size_t idx = 0; idx < count; idx++) {
390 int16_t temp = static_cast<int16_t>((static_cast<double>(*stcPtr) / maxInt32) * maxInt16);
391 *(dstPtr++) = temp;
392 stcPtr++;
393 }
394 return 0;
395 }
396
397 } // namespace AudioStandard
398 } // namespace OHOS
399