Coverage Report

Created: 2024-11-21 06:52

/src/mpg123/src/libmpg123/tabinit.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
  tabinit.c: initialize tables...
3
4
  copyright ?-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
5
  see COPYING and AUTHORS files in distribution or http://mpg123.org
6
  initially written by Michael Hipp
7
*/
8
9
#include "mpg123lib_intern.h"
10
#include "../common/debug.h"
11
12
// The (normally precomputed) cos tables.
13
#include "costabs.h"
14
#ifdef RUNTIME_TABLES
15
#include "init_costabs.h"
16
#else
17
const
18
#endif
19
real *INT123_pnts[] = { cos64,cos32,cos16,cos8,cos4 };
20
21
static const long intwinbase[] = {
22
     0,    -1,    -1,    -1,    -1,    -1,    -1,    -2,    -2,    -2,
23
    -2,    -3,    -3,    -4,    -4,    -5,    -5,    -6,    -7,    -7,
24
    -8,    -9,   -10,   -11,   -13,   -14,   -16,   -17,   -19,   -21,
25
   -24,   -26,   -29,   -31,   -35,   -38,   -41,   -45,   -49,   -53,
26
   -58,   -63,   -68,   -73,   -79,   -85,   -91,   -97,  -104,  -111,
27
  -117,  -125,  -132,  -139,  -147,  -154,  -161,  -169,  -176,  -183,
28
  -190,  -196,  -202,  -208,  -213,  -218,  -222,  -225,  -227,  -228,
29
  -228,  -227,  -224,  -221,  -215,  -208,  -200,  -189,  -177,  -163,
30
  -146,  -127,  -106,   -83,   -57,   -29,     2,    36,    72,   111,
31
   153,   197,   244,   294,   347,   401,   459,   519,   581,   645,
32
   711,   779,   848,   919,   991,  1064,  1137,  1210,  1283,  1356,
33
  1428,  1498,  1567,  1634,  1698,  1759,  1817,  1870,  1919,  1962,
34
  2001,  2032,  2057,  2075,  2085,  2087,  2080,  2063,  2037,  2000,
35
  1952,  1893,  1822,  1739,  1644,  1535,  1414,  1280,  1131,   970,
36
   794,   605,   402,   185,   -45,  -288,  -545,  -814, -1095, -1388,
37
 -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
38
 -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209,
39
 -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959,
40
 -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092,
41
 -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
42
   -70,   998,  2122,  3300,  4533,  5818,  7154,  8540,  9975, 11455,
43
 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289,
44
 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617,
45
 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684,
46
 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
47
 73415, 73908, 74313, 74630, 74856, 74992, 75038 };
48
49
#ifdef OPT_MMXORSSE
50
#if !defined(OPT_X86_64) && !defined(OPT_NEON) && !defined(OPT_NEON64) && !defined(OPT_AVX)
51
void INT123_make_decode_tables_mmx_asm(long scaleval, float* decwin_mmx, float *decwins);
52
void INT123_make_decode_tables_mmx(mpg123_handle *fr)
53
{
54
  debug("MMX decode tables");
55
  /* Take care: The scale should be like before, when we didn't have float output all around. */
56
  INT123_make_decode_tables_mmx_asm((long)((fr->lastscale < 0 ? fr->p.outscale : fr->lastscale)*SHORT_SCALE), fr->decwin_mmx, fr->decwins);
57
  debug("MMX decode tables done");
58
}
59
#else
60
61
/* This mimics round() as defined in C99. We stay C89. */
62
static int rounded(double f)
63
0
{
64
0
  return (int)(f>0 ? floor(f+0.5) : ceil(f-0.5));
65
0
}
66
67
/* x86-64 doesn't use asm version */
68
void INT123_make_decode_tables_mmx(mpg123_handle *fr)
69
0
{
70
0
  int i,j,val;
71
0
  int idx = 0;
72
0
  short *ptr = (short *)fr->decwins;
73
  /* Scale is always based on 1.0 . */
74
0
  double scaleval = -0.5*(fr->lastscale < 0 ? fr->p.outscale : fr->lastscale);
75
0
  debug1("MMX decode tables with scaleval %g", scaleval);
76
0
  for(i=0,j=0;i<256;i++,j++,idx+=32)
77
0
  {
78
0
    if(idx < 512+16)
79
0
    fr->decwin_mmx[idx+16] = fr->decwin_mmx[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval);
80
    
81
0
    if(i % 32 == 31)
82
0
    idx -= 1023;
83
0
    if(i % 64 == 63)
84
0
    scaleval = - scaleval;
85
0
  }
86
  
87
0
  for( /* i=256 */ ;i<512;i++,j--,idx+=32)
88
0
  {
89
0
    if(idx < 512+16)
90
0
    fr->decwin_mmx[idx+16] = fr->decwin_mmx[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval);
91
    
92
0
    if(i % 32 == 31)
93
0
    idx -= 1023;
94
0
    if(i % 64 == 63)
95
0
    scaleval = - scaleval;
96
0
  }
97
  
98
0
  for(i=0; i<512; i++) {
99
0
    if(i&1) val = rounded(fr->decwin_mmx[i]*0.5);
100
0
    else val = rounded(fr->decwin_mmx[i]*-0.5);
101
0
    if(val > 32767) val = 32767;
102
0
    else if(val < -32768) val = -32768;
103
0
    ptr[i] = val;
104
0
  }
105
0
  for(i=512; i<512+32; i++) {
106
0
    if(i&1) val = rounded(fr->decwin_mmx[i]*0.5);
107
0
    else val = 0;
108
0
    if(val > 32767) val = 32767;
109
0
    else if(val < -32768) val = -32768;
110
0
    ptr[i] = val;
111
0
  }
112
0
  for(i=0; i<512; i++) {
113
0
    val = rounded(fr->decwin_mmx[511-i]*-0.5);
114
0
    if(val > 32767) val = 32767;
115
0
    else if(val < -32768) val = -32768;
116
0
    ptr[512+32+i] = val;
117
0
  }
118
0
  debug("decode tables done");
119
0
}
120
#endif
121
#endif
122
123
#ifdef REAL_IS_FIXED
124
/* Need saturating multiplication that keeps table values in 32 bit range,
125
   with the option to swap sign at will (so -2**31 is out).
126
   This code is far from the decoder core and so assembly optimization might
127
   be overkill. */
128
static int32_t sat_mul32(int32_t a, int32_t b)
129
{
130
  int64_t prod = (int64_t)a * (int64_t)b;
131
  /* TODO: record the clipping? An extra flag? */
132
  if(prod >  2147483647L) return  2147483647L;
133
  if(prod < -2147483647L) return -2147483647L;
134
  return (int32_t)prod;
135
}
136
#endif
137
138
void INT123_make_decode_tables(mpg123_handle *fr)
139
0
{
140
0
  int i,j;
141
0
  int idx = 0;
142
0
  double scaleval;
143
#ifdef REAL_IS_FIXED
144
  real scaleval_long;
145
#endif
146
  /* Scale is always based on 1.0 . */
147
0
  scaleval = -0.5*(fr->lastscale < 0 ? fr->p.outscale : fr->lastscale);
148
0
  debug1("decode tables with scaleval %g", scaleval);
149
#ifdef REAL_IS_FIXED
150
  scaleval_long = DOUBLE_TO_REAL_15(scaleval);
151
  debug1("decode table with fixed scaleval %li", (long)scaleval_long);
152
  if(scaleval_long > 28618 || scaleval_long < -28618)
153
  {
154
    /* TODO: Limit the scaleval itself or limit the multiplication afterwards?
155
       The former basically disables significant amplification for fixed-point
156
       decoders, but avoids (possibly subtle) distortion. */
157
    /* This would limit the amplification instead:
158
       scaleval_long = scaleval_long < 0 ? -28618 : 28618; */
159
    if(NOQUIET) warning("Desired amplification may introduce distortion.");
160
  }
161
#endif
162
0
  for(i=0,j=0;i<256;i++,j++,idx+=32)
163
0
  {
164
0
    if(idx < 512+16)
165
#ifdef REAL_IS_FIXED
166
    fr->decwin[idx+16] = fr->decwin[idx] =
167
      REAL_SCALE_WINDOW(sat_mul32(intwinbase[j],scaleval_long));
168
#else
169
0
    fr->decwin[idx+16] = fr->decwin[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval);
170
0
#endif
171
172
0
    if(i % 32 == 31)
173
0
    idx -= 1023;
174
0
    if(i % 64 == 63)
175
#ifdef REAL_IS_FIXED
176
    scaleval_long = - scaleval_long;
177
#else
178
0
    scaleval = - scaleval;
179
0
#endif
180
0
  }
181
182
0
  for( /* i=256 */ ;i<512;i++,j--,idx+=32)
183
0
  {
184
0
    if(idx < 512+16)
185
#ifdef REAL_IS_FIXED
186
    fr->decwin[idx+16] = fr->decwin[idx] =
187
      REAL_SCALE_WINDOW(sat_mul32(intwinbase[j],scaleval_long));
188
#else
189
0
    fr->decwin[idx+16] = fr->decwin[idx] = DOUBLE_TO_REAL((double) intwinbase[j] * scaleval);
190
0
#endif
191
192
0
    if(i % 32 == 31)
193
0
    idx -= 1023;
194
0
    if(i % 64 == 63)
195
#ifdef REAL_IS_FIXED
196
    scaleval_long = - scaleval_long;
197
#else
198
0
    scaleval = - scaleval;
199
0
#endif
200
0
  }
201
0
#if defined(OPT_X86_64) || defined(OPT_ALTIVEC) || defined(OPT_SSE) || defined(OPT_SSE_VINTAGE) || defined(OPT_ARM) || defined(OPT_NEON) || defined(OPT_NEON64) || defined(OPT_AVX)
202
0
  if(  fr->cpu_opts.type == x86_64
203
0
    || fr->cpu_opts.type == altivec
204
0
    || fr->cpu_opts.type == sse
205
0
    || fr->cpu_opts.type == sse_vintage
206
0
    || fr->cpu_opts.type == arm
207
0
    || fr->cpu_opts.type == neon
208
0
    || fr->cpu_opts.type == neon64
209
0
    || fr->cpu_opts.type == avx )
210
0
  { /* for float SSE / AltiVec / ARM decoder */
211
0
    for(i=512; i<512+32; i++)
212
0
    {
213
0
      fr->decwin[i] = (i&1) ? fr->decwin[i] : 0;
214
0
    }
215
0
    for(i=0; i<512; i++)
216
0
    {
217
0
      fr->decwin[512+32+i] = -fr->decwin[511-i];
218
0
    }
219
#if defined(OPT_NEON) || defined(OPT_NEON64)
220
    if(fr->cpu_opts.type == neon || fr->cpu_opts.type == neon64)
221
    {
222
      for(i=0; i<512; i+=2)
223
      {
224
        fr->decwin[i] = -fr->decwin[i];
225
      }
226
    }
227
#endif
228
0
  }
229
0
#endif
230
0
  debug("decode tables done");
231
0
}
232
233
#ifndef NO_8BIT
234
int INT123_make_conv16to8_table(mpg123_handle *fr)
235
0
{
236
0
  int i;
237
0
  int mode = fr->af.dec_enc;
238
239
  /*
240
   * ????: 8.0 is right but on SB cards '2.0' is a better value ???
241
   */
242
0
  const double mul = 8.0;
243
244
0
  if(!fr->conv16to8_buf){
245
0
    fr->conv16to8_buf = (unsigned char *) malloc(8192);
246
0
    if(!fr->conv16to8_buf) {
247
0
      fr->err = MPG123_ERR_16TO8TABLE;
248
0
      if(NOQUIET) error("Can't allocate 16 to 8 converter table!");
249
0
      return -1;
250
0
    }
251
0
    fr->conv16to8 = fr->conv16to8_buf + 4096;
252
0
  }
253
254
0
  switch(mode)
255
0
  {
256
0
  case MPG123_ENC_ULAW_8:
257
0
  {
258
0
    double m=127.0 / log(256.0);
259
0
    int c1;
260
261
0
    for(i=-4096;i<4096;i++)
262
0
    {
263
      /* dunno whether this is a valid transformation rule ?!?!? */
264
0
      if(i < 0)
265
0
      c1 = 127 - (int) (log( 1.0 - 255.0 * (double) i*mul / 32768.0 ) * m);
266
0
      else
267
0
      c1 = 255 - (int) (log( 1.0 + 255.0 * (double) i*mul / 32768.0 ) * m);
268
0
      if(c1 < 0 || c1 > 255)
269
0
      {
270
0
        if(NOQUIET) error2("Converror %d %d",i,c1);
271
0
        return -1;
272
0
      }
273
0
      if(c1 == 0)
274
0
      c1 = 2;
275
0
      fr->conv16to8[i] = (unsigned char) c1;
276
0
    }
277
0
  }
278
0
  break;
279
0
  case MPG123_ENC_SIGNED_8:
280
0
    for(i=-4096;i<4096;i++)
281
0
    fr->conv16to8[i] = i>>5;
282
0
  break;
283
0
  case MPG123_ENC_UNSIGNED_8:
284
0
    for(i=-4096;i<4096;i++)
285
0
    fr->conv16to8[i] = (i>>5)+128;
286
0
  break;
287
0
  case MPG123_ENC_ALAW_8:
288
0
  {
289
    /*
290
      Let's believe Wikipedia (http://en.wikipedia.org/wiki/G.711) that this
291
      is the correct table:
292
293
      s0000000wxyza...  n000wxyz  [0-31] -> [0-15]
294
      s0000001wxyza...  n001wxyz  [32-63] -> [16-31]
295
      s000001wxyzab...  n010wxyz  [64-127] -> [32-47]
296
      s00001wxyzabc...  n011wxyz  [128-255] -> [48-63]
297
      s0001wxyzabcd...  n100wxyz  [256-511] -> [64-79]
298
      s001wxyzabcde...  n101wxyz  [512-1023] -> [80-95]
299
      s01wxyzabcdef...  n110wxyz  [1024-2047] -> [96-111]
300
      s1wxyzabcdefg...  n111wxyz  [2048-4095] -> [112-127]
301
302
      Let's extend to -4096, too.
303
      Also, bytes are xored with 0x55 for transmission.
304
305
      Since it sounds OK, I assume it is fine;-)
306
    */
307
0
    for(i=0; i<64; ++i)
308
0
    fr->conv16to8[i] = ((unsigned int)i)>>1;
309
0
    for(i=64; i<128; ++i)
310
0
    fr->conv16to8[i] = ((((unsigned int)i)>>2) & 0xf) | (2<<4);
311
0
    for(i=128; i<256; ++i)
312
0
    fr->conv16to8[i] = ((((unsigned int)i)>>3) & 0xf) | (3<<4);
313
0
    for(i=256; i<512; ++i)
314
0
    fr->conv16to8[i] = ((((unsigned int)i)>>4) & 0xf) | (4<<4);
315
0
    for(i=512; i<1024; ++i)
316
0
    fr->conv16to8[i] = ((((unsigned int)i)>>5) & 0xf) | (5<<4);
317
0
    for(i=1024; i<2048; ++i)
318
0
    fr->conv16to8[i] = ((((unsigned int)i)>>6) & 0xf) | (6<<4);
319
0
    for(i=2048; i<4096; ++i)
320
0
    fr->conv16to8[i] = ((((unsigned int)i)>>7) & 0xf) | (7<<4);
321
322
0
    for(i=-4095; i<0; ++i)
323
0
    fr->conv16to8[i] = fr->conv16to8[-i] | 0x80;
324
325
0
    fr->conv16to8[-4096] = fr->conv16to8[-4095];
326
327
0
    for(i=-4096;i<4096;i++)
328
0
    {
329
      /* fr->conv16to8[i] = - i>>5; */
330
      /* fprintf(stderr, "table %i %i\n", i<<AUSHIFT, fr->conv16to8[i]); */
331
0
      fr->conv16to8[i] ^= 0x55;
332
0
    }
333
0
  }
334
0
  break;
335
0
  default:
336
0
    fr->err = MPG123_ERR_16TO8TABLE;
337
0
    if(NOQUIET) error("Unknown 8 bit encoding choice.");
338
0
    return -1;
339
0
  break;
340
0
  }
341
342
0
  return 0;
343
0
}
344
#endif
345