FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
audiodsp.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <stdint.h>
20 
21 #include "libavutil/attributes.h"
22 #include "libavutil/common.h"
23 #include "audiodsp.h"
24 
25 static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini,
26  uint32_t maxi, uint32_t maxisign)
27 {
28  if (a > mini)
29  return mini;
30  else if ((a ^ (1U << 31)) > maxisign)
31  return maxi;
32  else
33  return a;
34 }
35 
36 static void vector_clipf_c_opposite_sign(float *dst, const float *src,
37  float *min, float *max, int len)
38 {
39  int i;
40  uint32_t mini = *(uint32_t *) min;
41  uint32_t maxi = *(uint32_t *) max;
42  uint32_t maxisign = maxi ^ (1U << 31);
43  uint32_t *dsti = (uint32_t *) dst;
44  const uint32_t *srci = (const uint32_t *) src;
45 
46  for (i = 0; i < len; i += 8) {
47  dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign);
48  dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign);
49  dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign);
50  dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign);
51  dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign);
52  dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign);
53  dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign);
54  dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign);
55  }
56 }
57 
58 static void vector_clipf_c(float *dst, const float *src,
59  float min, float max, int len)
60 {
61  int i;
62 
63  if (min < 0 && max > 0) {
64  vector_clipf_c_opposite_sign(dst, src, &min, &max, len);
65  } else {
66  for (i = 0; i < len; i += 8) {
67  dst[i] = av_clipf(src[i], min, max);
68  dst[i + 1] = av_clipf(src[i + 1], min, max);
69  dst[i + 2] = av_clipf(src[i + 2], min, max);
70  dst[i + 3] = av_clipf(src[i + 3], min, max);
71  dst[i + 4] = av_clipf(src[i + 4], min, max);
72  dst[i + 5] = av_clipf(src[i + 5], min, max);
73  dst[i + 6] = av_clipf(src[i + 6], min, max);
74  dst[i + 7] = av_clipf(src[i + 7], min, max);
75  }
76  }
77 }
78 
79 static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2,
80  int order)
81 {
82  int res = 0;
83 
84  while (order--)
85  res += *v1++ **v2++;
86 
87  return res;
88 }
89 
90 static void vector_clip_int32_c(int32_t *dst, const int32_t *src, int32_t min,
91  int32_t max, unsigned int len)
92 {
93  do {
94  *dst++ = av_clip(*src++, min, max);
95  *dst++ = av_clip(*src++, min, max);
96  *dst++ = av_clip(*src++, min, max);
97  *dst++ = av_clip(*src++, min, max);
98  *dst++ = av_clip(*src++, min, max);
99  *dst++ = av_clip(*src++, min, max);
100  *dst++ = av_clip(*src++, min, max);
101  *dst++ = av_clip(*src++, min, max);
102  len -= 8;
103  } while (len > 0);
104 }
105 
107 {
111 
112  if (ARCH_ARM)
114  if (ARCH_PPC)
116  if (ARCH_X86)
118 }