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