Coverage Report

Created: 2025-12-14 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libFDK/src/nlc_dec.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/******************* Library for basic calculation routines ********************
96
97
   Author(s):   Omer Osman
98
99
   Description: SAC/SAOC Dec Noiseless Coding
100
101
*******************************************************************************/
102
103
#include "nlc_dec.h"
104
#include "FDK_tools_rom.h"
105
106
/* MAX_PARAMETER_BANDS defines array length in huffdec */
107
108
#ifndef min
109
101k
#define min(a, b) (((a) < (b)) ? (a) : (b))
110
#endif
111
112
15.7k
ERROR_t sym_restoreIPD(HANDLE_FDK_BITSTREAM strm, int lav, SCHAR data[2]) {
113
15.7k
  int sum_val = data[0] + data[1];
114
15.7k
  int diff_val = data[0] - data[1];
115
116
15.7k
  if (sum_val > lav) {
117
6.52k
    data[0] = -sum_val + (2 * lav + 1);
118
6.52k
    data[1] = -diff_val;
119
9.22k
  } else {
120
9.22k
    data[0] = sum_val;
121
9.22k
    data[1] = diff_val;
122
9.22k
  }
123
124
15.7k
  if (data[0] - data[1] != 0) {
125
8.87k
    ULONG sym_bit;
126
8.87k
    sym_bit = FDKreadBits(strm, 1);
127
8.87k
    if (sym_bit) {
128
2.56k
      int tmp;
129
2.56k
      tmp = data[0];
130
2.56k
      data[0] = data[1];
131
2.56k
      data[1] = tmp;
132
2.56k
    }
133
8.87k
  }
134
135
15.7k
  return HUFFDEC_OK;
136
15.7k
}
137
138
27.6k
static int ilog2(unsigned int i) {
139
27.6k
  int l = 0;
140
141
27.6k
  if (i) i--;
142
119k
  while (i > 0) {
143
91.8k
    i >>= 1;
144
91.8k
    l++;
145
91.8k
  }
146
147
27.6k
  return l;
148
27.6k
}
149
150
static ERROR_t pcm_decode(HANDLE_FDK_BITSTREAM strm, SCHAR* out_data_1,
151
                          SCHAR* out_data_2, int offset, int num_val,
152
26.2k
                          int num_levels) {
153
26.2k
  int i = 0, j = 0, idx = 0;
154
26.2k
  int max_grp_len = 0, next_val = 0;
155
26.2k
  ULONG tmp;
156
157
26.2k
  int pcm_chunk_size[7] = {0};
158
159
26.2k
  switch (num_levels) {
160
243
    case 3:
161
243
      max_grp_len = 5;
162
243
      break;
163
72
    case 7:
164
72
      max_grp_len = 6;
165
72
      break;
166
36
    case 11:
167
36
      max_grp_len = 2;
168
36
      break;
169
0
    case 13:
170
0
      max_grp_len = 4;
171
0
      break;
172
10
    case 19:
173
10
      max_grp_len = 4;
174
10
      break;
175
0
    case 25:
176
0
      max_grp_len = 3;
177
0
      break;
178
0
    case 51:
179
0
      max_grp_len = 4;
180
0
      break;
181
9.95k
    case 4:
182
14.3k
    case 8:
183
22.4k
    case 15:
184
25.0k
    case 16:
185
25.0k
    case 26:
186
25.8k
    case 31:
187
25.8k
      max_grp_len = 1;
188
25.8k
      break;
189
0
    default:
190
0
      return HUFFDEC_NOTOK;
191
26.2k
  }
192
193
26.2k
  tmp = 1;
194
53.9k
  for (i = 1; i <= max_grp_len; i++) {
195
27.6k
    tmp *= num_levels;
196
27.6k
    pcm_chunk_size[i] = ilog2(tmp);
197
27.6k
  }
198
199
127k
  for (i = 0; i < num_val; i += max_grp_len) {
200
101k
    int grp_len, grp_val, data;
201
101k
    grp_len = min(max_grp_len, num_val - i);
202
101k
    data = FDKreadBits(strm, pcm_chunk_size[grp_len]);
203
204
101k
    grp_val = data;
205
206
203k
    for (j = 0; j < grp_len; j++) {
207
101k
      idx = i + (grp_len - j - 1);
208
101k
      next_val = grp_val % num_levels;
209
210
101k
      if (out_data_2 == NULL) {
211
36.3k
        out_data_1[idx] = next_val - offset;
212
65.6k
      } else if (out_data_1 == NULL) {
213
0
        out_data_2[idx] = next_val - offset;
214
65.6k
      } else {
215
65.6k
        if (idx % 2) {
216
32.8k
          out_data_2[idx / 2] = next_val - offset;
217
32.8k
        } else {
218
32.8k
          out_data_1[idx / 2] = next_val - offset;
219
32.8k
        }
220
65.6k
      }
221
222
101k
      grp_val = (grp_val - next_val) / num_levels;
223
101k
    }
224
101k
  }
225
226
26.2k
  return HUFFDEC_OK;
227
26.2k
}
228
229
static ERROR_t huff_read(HANDLE_FDK_BITSTREAM strm,
230
                         const SHORT (*nodeTab)[MAX_ENTRIES][2],
231
305k
                         int* out_data) {
232
305k
  int node = 0;
233
305k
  int len = 0;
234
235
791k
  do {
236
791k
    ULONG next_bit;
237
791k
    next_bit = FDKreadBits(strm, 1);
238
791k
    len++;
239
791k
    node = (*nodeTab)[node][next_bit];
240
791k
  } while (node > 0);
241
242
305k
  *out_data = node;
243
244
305k
  return HUFFDEC_OK;
245
305k
}
246
247
static ERROR_t huff_read_2D(HANDLE_FDK_BITSTREAM strm,
248
                            const SHORT (*nodeTab)[MAX_ENTRIES][2],
249
122k
                            SCHAR out_data[2], int* escape) {
250
122k
  ERROR_t err = HUFFDEC_OK;
251
252
122k
  int huff_2D_8bit = 0;
253
122k
  int node = 0;
254
255
122k
  if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
256
0
    goto bail;
257
0
  }
258
122k
  *escape = (node == 0);
259
260
122k
  if (*escape) {
261
542
    out_data[0] = 0;
262
542
    out_data[1] = 1;
263
122k
  } else {
264
122k
    huff_2D_8bit = -(node + 1);
265
122k
    out_data[0] = huff_2D_8bit >> 4;
266
122k
    out_data[1] = huff_2D_8bit & 0xf;
267
122k
  }
268
269
122k
bail:
270
122k
  return err;
271
122k
}
272
273
45.5k
static ERROR_t sym_restore(HANDLE_FDK_BITSTREAM strm, int lav, SCHAR data[2]) {
274
45.5k
  ULONG sym_bit = 0;
275
276
45.5k
  int sum_val = data[0] + data[1];
277
45.5k
  int diff_val = data[0] - data[1];
278
279
45.5k
  if (sum_val > lav) {
280
18.4k
    data[0] = -sum_val + (2 * lav + 1);
281
18.4k
    data[1] = -diff_val;
282
27.1k
  } else {
283
27.1k
    data[0] = sum_val;
284
27.1k
    data[1] = diff_val;
285
27.1k
  }
286
287
45.5k
  if (data[0] + data[1] != 0) {
288
25.9k
    sym_bit = FDKreadBits(strm, 1);
289
25.9k
    if (sym_bit) {
290
9.56k
      data[0] = -data[0];
291
9.56k
      data[1] = -data[1];
292
9.56k
    }
293
25.9k
  }
294
295
45.5k
  if (data[0] - data[1] != 0) {
296
26.8k
    sym_bit = FDKreadBits(strm, 1);
297
26.8k
    if (sym_bit) {
298
12.1k
      int tmp;
299
12.1k
      tmp = data[0];
300
12.1k
      data[0] = data[1];
301
12.1k
      data[1] = tmp;
302
12.1k
    }
303
26.8k
  }
304
305
45.5k
  return HUFFDEC_OK;
306
45.5k
}
307
308
static ERROR_t huff_dec_1D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type,
309
                           const INT dim1, SCHAR* out_data, const INT num_val,
310
                           const INT p0_flag)
311
312
30.8k
{
313
30.8k
  ERROR_t err = HUFFDEC_OK;
314
30.8k
  int i = 0, node = 0, offset = 0;
315
30.8k
  int od = 0, od_sign = 0;
316
30.8k
  ULONG data = 0;
317
30.8k
  int bitsAvail = 0;
318
319
30.8k
  const SHORT(*partTab)[MAX_ENTRIES][2] = NULL;
320
30.8k
  const SHORT(*nodeTab)[MAX_ENTRIES][2] = NULL;
321
322
30.8k
  switch (data_type) {
323
7.98k
    case t_CLD:
324
7.98k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.cld[0][0];
325
7.98k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h1D[dim1]->nodeTab[0][0];
326
7.98k
      break;
327
15.8k
    case t_ICC:
328
15.8k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.icc[0][0];
329
15.8k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h1D[dim1]->nodeTab[0][0];
330
15.8k
      break;
331
0
    case t_OLD:
332
0
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.old[0][0];
333
0
      nodeTab = (HANDLE_HUFF_NODE)&huffOLDNodes.h1D[dim1]->nodeTab[0][0];
334
0
      break;
335
6.96k
    case t_IPD:
336
6.96k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.ipd[0][0];
337
6.96k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h1D[dim1].nodeTab[0][0];
338
6.96k
      break;
339
0
    default:
340
0
      FDK_ASSERT(0);
341
0
      err = HUFFDEC_NOTOK;
342
0
      goto bail;
343
30.8k
  }
344
345
30.8k
  if (p0_flag) {
346
10.0k
    if ((err = huff_read(strm, partTab, &node)) != HUFFDEC_OK) {
347
0
      goto bail;
348
0
    }
349
350
10.0k
    out_data[0] = -(node + 1);
351
10.0k
    offset = 1;
352
10.0k
  }
353
354
134k
  for (i = offset; i < num_val; i++) {
355
105k
    bitsAvail = FDKgetValidBits(strm);
356
105k
    if (bitsAvail < 1) {
357
1.25k
      err = HUFFDEC_NOTOK;
358
1.25k
      goto bail;
359
1.25k
    }
360
361
104k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
362
0
      goto bail;
363
0
    }
364
104k
    od = -(node + 1);
365
366
104k
    if (data_type != t_IPD) {
367
77.5k
      if (od != 0) {
368
24.6k
        bitsAvail = FDKgetValidBits(strm);
369
24.6k
        if (bitsAvail < 1) {
370
65
          err = HUFFDEC_NOTOK;
371
65
          goto bail;
372
65
        }
373
374
24.5k
        data = FDKreadBits(strm, 1);
375
24.5k
        od_sign = data;
376
377
24.5k
        if (od_sign) od = -od;
378
24.5k
      }
379
77.5k
    }
380
381
103k
    out_data[i] = od;
382
103k
  }
383
384
30.8k
bail:
385
30.8k
  return err;
386
30.8k
}
387
388
static ERROR_t huff_dec_2D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type,
389
                           const INT dim1, const INT dim2, SCHAR out_data[][2],
390
                           const INT num_val, const INT stride,
391
32.9k
                           SCHAR* p0_data[2]) {
392
32.9k
  ERROR_t err = HUFFDEC_OK;
393
32.9k
  int i = 0, lav = 0, escape = 0, escCntr = 0;
394
32.9k
  int node = 0;
395
32.9k
  unsigned long data = 0;
396
397
32.9k
  SCHAR esc_data[2][28] = {{0}};
398
32.9k
  int escIdx[28] = {0};
399
32.9k
  const SHORT(*nodeTab)[MAX_ENTRIES][2] = NULL;
400
401
  /* LAV */
402
32.9k
  if ((err =
403
32.9k
           huff_read(strm, (HANDLE_HUFF_NODE)&FDK_huffLavIdxNodes.nodeTab[0][0],
404
32.9k
                     &node)) != HUFFDEC_OK) {
405
0
    goto bail;
406
0
  }
407
32.9k
  data = -(node + 1);
408
409
32.9k
  switch (data_type) {
410
16.3k
    case t_CLD:
411
16.3k
      lav = 2 * data + 3; /* 3, 5, 7, 9 */
412
16.3k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.cld[0][0];
413
16.3k
      break;
414
9.36k
    case t_ICC:
415
9.36k
      lav = 2 * data + 1; /* 1, 3, 5, 7 */
416
9.36k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.icc[0][0];
417
9.36k
      break;
418
0
    case t_OLD:
419
0
      lav = 3 * data + 3;
420
0
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.old[0][0];
421
0
      break;
422
7.29k
    case t_IPD:
423
7.29k
      if (data == 0)
424
2.87k
        data = 3;
425
4.42k
      else
426
4.42k
        data--;
427
7.29k
      lav = 2 * data + 1; /* 1, 3, 5, 7 */
428
7.29k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.ipd[0][0];
429
7.29k
      break;
430
0
    default:
431
0
      FDK_ASSERT(0);
432
0
      err = HUFFDEC_NOTOK;
433
0
      goto bail;
434
32.9k
  }
435
436
  /* Partition 0 */
437
32.9k
  if (p0_data[0] != NULL) {
438
20.5k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
439
0
      goto bail;
440
0
    }
441
20.5k
    *p0_data[0] = -(node + 1);
442
20.5k
  }
443
32.9k
  if (p0_data[1] != NULL) {
444
14.5k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
445
0
      goto bail;
446
0
    }
447
14.5k
    *p0_data[1] = -(node + 1);
448
14.5k
  }
449
450
32.9k
  switch (data_type) {
451
16.3k
    case t_CLD:
452
16.3k
      switch (lav) {
453
3.62k
        case 3:
454
3.62k
          nodeTab =
455
3.62k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav3[0][0];
456
3.62k
          break;
457
920
        case 5:
458
920
          nodeTab =
459
920
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav5[0][0];
460
920
          break;
461
4.95k
        case 7:
462
4.95k
          nodeTab =
463
4.95k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav7[0][0];
464
4.95k
          break;
465
6.82k
        case 9:
466
6.82k
          nodeTab =
467
6.82k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav9[0][0];
468
6.82k
          break;
469
16.3k
      }
470
16.3k
      break;
471
16.3k
    case t_ICC:
472
9.36k
      switch (lav) {
473
3.72k
        case 1:
474
3.72k
          nodeTab =
475
3.72k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav1[0][0];
476
3.72k
          break;
477
1.89k
        case 3:
478
1.89k
          nodeTab =
479
1.89k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav3[0][0];
480
1.89k
          break;
481
703
        case 5:
482
703
          nodeTab =
483
703
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav5[0][0];
484
703
          break;
485
3.04k
        case 7:
486
3.04k
          nodeTab =
487
3.04k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav7[0][0];
488
3.04k
          break;
489
9.36k
      }
490
9.36k
      break;
491
9.36k
    case t_OLD:
492
0
      switch (lav) {
493
0
        case 3:
494
0
          nodeTab = (HANDLE_HUFF_NODE)&huffOLDNodes.h2D[dim1][dim2]->lav3[0][0];
495
0
          break;
496
0
        case 6:
497
0
          nodeTab = (HANDLE_HUFF_NODE)&huffOLDNodes.h2D[dim1][dim2]->lav6[0][0];
498
0
          break;
499
0
        case 9:
500
0
          nodeTab = (HANDLE_HUFF_NODE)&huffOLDNodes.h2D[dim1][dim2]->lav9[0][0];
501
0
          break;
502
0
        case 12:
503
0
          nodeTab =
504
0
              (HANDLE_HUFF_NODE)&huffOLDNodes.h2D[dim1][dim2]->lav12[0][0];
505
0
          break;
506
0
      }
507
0
      break;
508
7.29k
    case t_IPD:
509
7.29k
      switch (lav) {
510
3.74k
        case 1:
511
3.74k
          nodeTab =
512
3.74k
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav1[0][0];
513
3.74k
          break;
514
210
        case 3:
515
210
          nodeTab =
516
210
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav3[0][0];
517
210
          break;
518
469
        case 5:
519
469
          nodeTab =
520
469
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav5[0][0];
521
469
          break;
522
2.87k
        case 7:
523
2.87k
          nodeTab =
524
2.87k
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav7[0][0];
525
2.87k
          break;
526
7.29k
      }
527
7.29k
      break;
528
7.29k
    default:
529
0
      break;
530
32.9k
  }
531
532
94.8k
  for (i = 0; i < num_val; i += stride) {
533
61.8k
    if ((err = huff_read_2D(strm, nodeTab, out_data[i], &escape)) !=
534
61.8k
        HUFFDEC_OK) {
535
0
      goto bail;
536
0
    }
537
538
61.8k
    if (escape) {
539
542
      escIdx[escCntr++] = i;
540
61.3k
    } else {
541
61.3k
      if (data_type == t_IPD) {
542
15.7k
        if ((err = sym_restoreIPD(strm, lav, out_data[i])) != HUFFDEC_OK) {
543
0
          goto bail;
544
0
        }
545
45.5k
      } else {
546
45.5k
        if ((err = sym_restore(strm, lav, out_data[i])) != HUFFDEC_OK) {
547
0
          goto bail;
548
0
        }
549
45.5k
      }
550
61.3k
    }
551
61.8k
  } /* i */
552
553
32.9k
  if (escCntr > 0) {
554
361
    if ((err = pcm_decode(strm, esc_data[0], esc_data[1], 0, 2 * escCntr,
555
361
                          (2 * lav + 1))) != HUFFDEC_OK) {
556
0
      goto bail;
557
0
    }
558
559
903
    for (i = 0; i < escCntr; i++) {
560
542
      out_data[escIdx[i]][0] = esc_data[0][i] - lav;
561
542
      out_data[escIdx[i]][1] = esc_data[1][i] - lav;
562
542
    }
563
361
  }
564
32.9k
bail:
565
32.9k
  return err;
566
32.9k
}
567
568
static ERROR_t huff_decode(HANDLE_FDK_BITSTREAM strm, SCHAR* out_data_1,
569
                           SCHAR* out_data_2, DATA_TYPE data_type,
570
                           DIFF_TYPE diff_type_1, DIFF_TYPE diff_type_2,
571
41.3k
                           int num_val, PAIRING* pairing_scheme, int ldMode) {
572
41.3k
  ERROR_t err = HUFFDEC_OK;
573
41.3k
  CODING_SCHEME coding_scheme = HUFF_1D;
574
41.3k
  DIFF_TYPE diff_type;
575
576
41.3k
  int i = 0;
577
578
41.3k
  SCHAR pair_vec[28][2];
579
580
41.3k
  SCHAR* p0_data_1[2] = {NULL, NULL};
581
41.3k
  SCHAR* p0_data_2[2] = {NULL, NULL};
582
583
41.3k
  int p0_flag[2];
584
585
41.3k
  int num_val_1_int = num_val;
586
41.3k
  int num_val_2_int = num_val;
587
588
41.3k
  SCHAR* out_data_1_int = out_data_1;
589
41.3k
  SCHAR* out_data_2_int = out_data_2;
590
591
41.3k
  int df_rest_flag_1 = 0;
592
41.3k
  int df_rest_flag_2 = 0;
593
594
41.3k
  int hufYY1;
595
41.3k
  int hufYY2;
596
41.3k
  int hufYY;
597
598
  /* Coding scheme */
599
41.3k
  coding_scheme = (CODING_SCHEME)FDKreadBits(strm, 1);
600
601
41.3k
  if (coding_scheme == HUFF_2D) {
602
26.0k
    if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ldMode == 0)) {
603
15.2k
      *pairing_scheme = (PAIRING)FDKreadBits(strm, 1);
604
15.2k
    } else {
605
10.8k
      *pairing_scheme = FREQ_PAIR;
606
10.8k
    }
607
26.0k
  }
608
609
41.3k
  {
610
41.3k
    hufYY1 = diff_type_1;
611
41.3k
    hufYY2 = diff_type_2;
612
41.3k
  }
613
614
41.3k
  switch (coding_scheme) {
615
15.2k
    case HUFF_1D:
616
15.2k
      p0_flag[0] = (diff_type_1 == DIFF_FREQ);
617
15.2k
      p0_flag[1] = (diff_type_2 == DIFF_FREQ);
618
15.2k
      if (out_data_1 != NULL) {
619
15.2k
        if ((err = huff_dec_1D(strm, data_type, hufYY1, out_data_1,
620
15.2k
                               num_val_1_int, p0_flag[0])) != HUFFDEC_OK) {
621
607
          goto bail;
622
607
        }
623
15.2k
      }
624
14.6k
      if (out_data_2 != NULL) {
625
4.57k
        if ((err = huff_dec_1D(strm, data_type, hufYY2, out_data_2,
626
4.57k
                               num_val_2_int, p0_flag[1])) != HUFFDEC_OK) {
627
22
          goto bail;
628
22
        }
629
4.57k
      }
630
631
14.6k
      break; /* HUFF_1D */
632
633
26.0k
    case HUFF_2D:
634
635
26.0k
      switch (*pairing_scheme) {
636
15.0k
        case FREQ_PAIR:
637
638
15.0k
          if (out_data_1 != NULL) {
639
15.0k
            if (diff_type_1 == DIFF_FREQ) {
640
10.0k
              p0_data_1[0] = &out_data_1[0];
641
10.0k
              p0_data_1[1] = NULL;
642
643
10.0k
              num_val_1_int -= 1;
644
10.0k
              out_data_1_int += 1;
645
10.0k
            }
646
15.0k
            df_rest_flag_1 = num_val_1_int % 2;
647
15.0k
            if (df_rest_flag_1) num_val_1_int -= 1;
648
15.0k
            if (num_val_1_int < 0) {
649
3
              err = HUFFDEC_NOTOK;
650
3
              goto bail;
651
3
            }
652
15.0k
          }
653
15.0k
          if (out_data_2 != NULL) {
654
6.96k
            if (diff_type_2 == DIFF_FREQ) {
655
4.06k
              p0_data_2[0] = NULL;
656
4.06k
              p0_data_2[1] = &out_data_2[0];
657
658
4.06k
              num_val_2_int -= 1;
659
4.06k
              out_data_2_int += 1;
660
4.06k
            }
661
6.96k
            df_rest_flag_2 = num_val_2_int % 2;
662
6.96k
            if (df_rest_flag_2) num_val_2_int -= 1;
663
6.96k
            if (num_val_2_int < 0) {
664
2
              err = HUFFDEC_NOTOK;
665
2
              goto bail;
666
2
            }
667
6.96k
          }
668
669
15.0k
          if (out_data_1 != NULL) {
670
15.0k
            if ((err = huff_dec_2D(strm, data_type, hufYY1, FREQ_PAIR, pair_vec,
671
15.0k
                                   num_val_1_int, 2, p0_data_1)) !=
672
15.0k
                HUFFDEC_OK) {
673
0
              goto bail;
674
0
            }
675
15.0k
            if (df_rest_flag_1) {
676
6.71k
              if ((err = huff_dec_1D(strm, data_type, hufYY1,
677
6.71k
                                     out_data_1_int + num_val_1_int, 1, 0)) !=
678
6.71k
                  HUFFDEC_OK) {
679
293
                goto bail;
680
293
              }
681
6.71k
            }
682
15.0k
          }
683
14.7k
          if (out_data_2 != NULL) {
684
6.89k
            if ((err = huff_dec_2D(strm, data_type, hufYY2, FREQ_PAIR,
685
6.89k
                                   pair_vec + 1, num_val_2_int, 2,
686
6.89k
                                   p0_data_2)) != HUFFDEC_OK) {
687
0
              goto bail;
688
0
            }
689
6.89k
            if (df_rest_flag_2) {
690
4.31k
              if ((err = huff_dec_1D(strm, data_type, hufYY2,
691
4.31k
                                     out_data_2_int + num_val_2_int, 1, 0)) !=
692
4.31k
                  HUFFDEC_OK) {
693
402
                goto bail;
694
402
              }
695
4.31k
            }
696
6.89k
          }
697
698
14.3k
          if (out_data_1 != NULL) {
699
45.8k
            for (i = 0; i < num_val_1_int - 1; i += 2) {
700
31.5k
              out_data_1_int[i] = pair_vec[i][0];
701
31.5k
              out_data_1_int[i + 1] = pair_vec[i][1];
702
31.5k
            }
703
14.3k
          }
704
14.3k
          if (out_data_2 != NULL) {
705
21.7k
            for (i = 0; i < num_val_2_int - 1; i += 2) {
706
15.2k
              out_data_2_int[i] = pair_vec[i + 1][0];
707
15.2k
              out_data_2_int[i + 1] = pair_vec[i + 1][1];
708
15.2k
            }
709
6.49k
          }
710
14.3k
          break; /* FREQ_PAIR */
711
712
11.0k
        case TIME_PAIR:
713
11.0k
          if (((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ))) {
714
10.4k
            p0_data_1[0] = &out_data_1[0];
715
10.4k
            p0_data_1[1] = &out_data_2[0];
716
717
10.4k
            out_data_1_int += 1;
718
10.4k
            out_data_2_int += 1;
719
720
10.4k
            num_val_1_int -= 1;
721
10.4k
          }
722
723
11.0k
          if ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) {
724
8.53k
            diff_type = DIFF_TIME;
725
8.53k
          } else {
726
2.54k
            diff_type = DIFF_FREQ;
727
2.54k
          }
728
11.0k
          { hufYY = diff_type; }
729
730
11.0k
          if ((err = huff_dec_2D(strm, data_type, hufYY, TIME_PAIR, pair_vec,
731
11.0k
                                 num_val_1_int, 1, p0_data_1)) != HUFFDEC_OK) {
732
0
            goto bail;
733
0
          }
734
735
24.4k
          for (i = 0; i < num_val_1_int; i++) {
736
13.4k
            out_data_1_int[i] = pair_vec[i][0];
737
13.4k
            out_data_2_int[i] = pair_vec[i][1];
738
13.4k
          }
739
740
11.0k
          break; /* TIME_PAIR */
741
742
0
        default:
743
0
          break;
744
26.0k
      }
745
746
25.3k
      break; /* HUFF_2D */
747
748
25.3k
    default:
749
0
      break;
750
41.3k
  }
751
41.3k
bail:
752
41.3k
  return err;
753
41.3k
}
754
755
static void diff_freq_decode(const SCHAR* const diff_data,
756
54.2k
                             SCHAR* const out_data, const int num_val) {
757
54.2k
  int i = 0;
758
54.2k
  out_data[0] = diff_data[0];
759
760
254k
  for (i = 1; i < num_val; i++) {
761
200k
    out_data[i] = out_data[i - 1] + diff_data[i];
762
200k
  }
763
54.2k
}
764
765
static void diff_time_decode_backwards(const SCHAR* const prev_data,
766
                                       const SCHAR* const diff_data,
767
                                       SCHAR* const out_data,
768
                                       const int mixed_diff_type,
769
17.0k
                                       const int num_val) {
770
17.0k
  int i = 0; /* default start value*/
771
772
17.0k
  if (mixed_diff_type) {
773
3.87k
    out_data[0] = diff_data[0];
774
3.87k
    i = 1; /* new start value */
775
3.87k
  }
776
124k
  for (; i < num_val; i++) {
777
107k
    out_data[i] = prev_data[i] + diff_data[i];
778
107k
  }
779
17.0k
}
780
781
static void diff_time_decode_forwards(const SCHAR* const prev_data,
782
                                      const SCHAR* const diff_data,
783
                                      SCHAR* const out_data,
784
                                      const int mixed_diff_type,
785
8.74k
                                      const int num_val) {
786
8.74k
  int i = 0; /* default start value*/
787
788
8.74k
  if (mixed_diff_type) {
789
4.05k
    out_data[0] = diff_data[0];
790
4.05k
    i = 1; /* new start value */
791
4.05k
  }
792
27.3k
  for (; i < num_val; i++) {
793
18.5k
    out_data[i] = prev_data[i] - diff_data[i];
794
18.5k
  }
795
8.74k
}
796
797
static ERROR_t attach_lsb(HANDLE_FDK_BITSTREAM strm, SCHAR* in_data_msb,
798
                          int offset, int num_lsb, int num_val,
799
62.1k
                          SCHAR* out_data) {
800
62.1k
  int i = 0, lsb = 0;
801
62.1k
  ULONG data = 0;
802
803
329k
  for (i = 0; i < num_val; i++) {
804
267k
    int msb;
805
267k
    msb = in_data_msb[i];
806
807
267k
    if (num_lsb > 0) {
808
50.4k
      data = FDKreadBits(strm, num_lsb);
809
50.4k
      lsb = data;
810
811
50.4k
      out_data[i] = ((msb << num_lsb) | lsb) - offset;
812
50.4k
    } else
813
216k
      out_data[i] = msb - offset;
814
267k
  }
815
816
62.1k
  return HUFFDEC_OK; /* dummy */
817
62.1k
}
818
819
ERROR_t EcDataPairDec(DECODER_TYPE DECODER, HANDLE_FDK_BITSTREAM strm,
820
                      SCHAR* aaOutData1, SCHAR* aaOutData2, SCHAR* aHistory,
821
                      DATA_TYPE data_type, int startBand, int dataBands,
822
                      int pair_flag, int coarse_flag,
823
                      int allowDiffTimeBack_flag)
824
825
67.2k
{
826
67.2k
  ERROR_t err = HUFFDEC_OK;
827
828
  // int allowDiffTimeBack_flag = !independency_flag || (setIdx > 0);
829
67.2k
  int attachLsb_flag = 0;
830
67.2k
  int pcmCoding_flag = 0;
831
832
67.2k
  int mixed_time_pair = 0, numValPcm = 0;
833
67.2k
  int quant_levels = 0, quant_offset = 0;
834
67.2k
  ULONG data = 0;
835
836
67.2k
  SCHAR aaDataPair[2][28] = {{0}};
837
67.2k
  SCHAR aaDataDiff[2][28] = {{0}};
838
839
67.2k
  SCHAR aHistoryMsb[28] = {0};
840
841
67.2k
  SCHAR* pDataVec[2] = {NULL, NULL};
842
843
67.2k
  DIFF_TYPE diff_type[2] = {DIFF_FREQ, DIFF_FREQ};
844
67.2k
  PAIRING pairing = FREQ_PAIR;
845
67.2k
  DIRECTION direction = BACKWARDS;
846
847
67.2k
  switch (data_type) {
848
26.0k
    case t_CLD:
849
26.0k
      if (coarse_flag) {
850
16.1k
        attachLsb_flag = 0;
851
16.1k
        quant_levels = 15;
852
16.1k
        quant_offset = 7;
853
16.1k
      } else {
854
9.89k
        attachLsb_flag = 0;
855
9.89k
        quant_levels = 31;
856
9.89k
        quant_offset = 15;
857
9.89k
      }
858
859
26.0k
      break;
860
861
28.5k
    case t_ICC:
862
28.5k
      if (coarse_flag) {
863
16.5k
        attachLsb_flag = 0;
864
16.5k
        quant_levels = 4;
865
16.5k
        quant_offset = 0;
866
16.5k
      } else {
867
12.0k
        attachLsb_flag = 0;
868
12.0k
        quant_levels = 8;
869
12.0k
        quant_offset = 0;
870
12.0k
      }
871
872
28.5k
      break;
873
874
0
    case t_OLD:
875
0
      if (coarse_flag) {
876
0
        attachLsb_flag = 0;
877
0
        quant_levels = 8;
878
0
        quant_offset = 0;
879
0
      } else {
880
0
        attachLsb_flag = 0;
881
0
        quant_levels = 16;
882
0
        quant_offset = 0;
883
0
      }
884
0
      break;
885
886
0
    case t_NRG:
887
0
      if (coarse_flag) {
888
0
        attachLsb_flag = 0;
889
0
        quant_levels = 32;
890
0
        quant_offset = 0;
891
0
      } else {
892
0
        attachLsb_flag = 0;
893
0
        quant_levels = 64;
894
0
        quant_offset = 0;
895
0
      }
896
0
      break;
897
898
12.5k
    case t_IPD:
899
12.5k
      if (!coarse_flag) {
900
8.40k
        attachLsb_flag = 1;
901
8.40k
        quant_levels = 16;
902
8.40k
        quant_offset = 0;
903
8.40k
      } else {
904
4.17k
        attachLsb_flag = 0;
905
4.17k
        quant_levels = 8;
906
4.17k
        quant_offset = 0;
907
4.17k
      }
908
12.5k
      break;
909
910
0
    default:
911
0
      return HUFFDEC_NOTOK;
912
67.2k
  }
913
914
67.2k
  data = FDKreadBits(strm, 1);
915
67.2k
  pcmCoding_flag = data;
916
917
67.2k
  if (pcmCoding_flag) {
918
25.8k
    if (pair_flag) {
919
18.3k
      pDataVec[0] = aaDataPair[0];
920
18.3k
      pDataVec[1] = aaDataPair[1];
921
18.3k
      numValPcm = 2 * dataBands;
922
18.3k
    } else {
923
7.54k
      pDataVec[0] = aaDataPair[0];
924
7.54k
      pDataVec[1] = NULL;
925
7.54k
      numValPcm = dataBands;
926
7.54k
    }
927
928
25.8k
    err = pcm_decode(strm, pDataVec[0], pDataVec[1], quant_offset, numValPcm,
929
25.8k
                     quant_levels);
930
25.8k
    if (err != HUFFDEC_OK) return HUFFDEC_NOTOK;
931
932
41.3k
  } else { /* Differential/Huffman/LSB Coding */
933
934
41.3k
    if (pair_flag) {
935
22.7k
      pDataVec[0] = aaDataDiff[0];
936
22.7k
      pDataVec[1] = aaDataDiff[1];
937
22.7k
    } else {
938
18.6k
      pDataVec[0] = aaDataDiff[0];
939
18.6k
      pDataVec[1] = NULL;
940
18.6k
    }
941
942
41.3k
    diff_type[0] = DIFF_FREQ;
943
41.3k
    diff_type[1] = DIFF_FREQ;
944
945
41.3k
    direction = BACKWARDS;
946
41.3k
    {
947
41.3k
      if (pair_flag || allowDiffTimeBack_flag) {
948
36.3k
        data = FDKreadBits(strm, 1);
949
36.3k
        diff_type[0] = (DIFF_TYPE)data;
950
36.3k
      }
951
952
41.3k
      if (pair_flag &&
953
22.7k
          ((diff_type[0] == DIFF_FREQ) || allowDiffTimeBack_flag)) {
954
17.5k
        data = FDKreadBits(strm, 1);
955
17.5k
        diff_type[1] = (DIFF_TYPE)data;
956
17.5k
      }
957
41.3k
    }
958
    /* Huffman decoding */
959
41.3k
    err = huff_decode(strm, pDataVec[0], pDataVec[1], data_type, diff_type[0],
960
41.3k
                      diff_type[1], dataBands, &pairing,
961
41.3k
                      (DECODER == SAOC_DECODER));
962
41.3k
    if (err != HUFFDEC_OK) {
963
1.32k
      return HUFFDEC_NOTOK;
964
1.32k
    }
965
966
40.0k
    {
967
      /* Differential decoding */
968
40.0k
      if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
969
24.2k
        if (DECODER == SAOC_DECODER) {
970
2.30k
          direction = BACKWARDS;
971
21.9k
        } else {
972
21.9k
          if (pair_flag) {
973
14.2k
            if ((diff_type[0] == DIFF_TIME) && !allowDiffTimeBack_flag) {
974
5.13k
              direction = FORWARDS;
975
9.12k
            } else if (diff_type[1] == DIFF_TIME) {
976
5.01k
              direction = BACKWARDS;
977
5.01k
            } else {
978
4.10k
              data = FDKreadBits(strm, 1);
979
4.10k
              direction = (DIRECTION)data;
980
4.10k
            }
981
14.2k
          } else {
982
7.67k
            direction = BACKWARDS;
983
7.67k
          }
984
21.9k
        }
985
24.2k
      }
986
987
40.0k
      mixed_time_pair =
988
40.0k
          (diff_type[0] != diff_type[1]) && (pairing == TIME_PAIR);
989
990
40.0k
      if (direction == BACKWARDS) {
991
31.2k
        if (diff_type[0] == DIFF_FREQ) {
992
21.4k
          diff_freq_decode(aaDataDiff[0], aaDataPair[0], dataBands);
993
21.4k
        } else {
994
9.83k
          int i;
995
87.2k
          for (i = 0; i < dataBands; i++) {
996
77.3k
            aHistoryMsb[i] = aHistory[i + startBand] + quant_offset;
997
77.3k
            if (attachLsb_flag) {
998
21.3k
              aHistoryMsb[i] >>= 1;
999
21.3k
            }
1000
77.3k
          }
1001
9.83k
          diff_time_decode_backwards(aHistoryMsb, aaDataDiff[0], aaDataPair[0],
1002
9.83k
                                     mixed_time_pair, dataBands);
1003
9.83k
        }
1004
31.2k
        if (diff_type[1] == DIFF_FREQ) {
1005
24.0k
          diff_freq_decode(aaDataDiff[1], aaDataPair[1], dataBands);
1006
24.0k
        } else {
1007
7.19k
          diff_time_decode_backwards(aaDataPair[0], aaDataDiff[1],
1008
7.19k
                                     aaDataPair[1], mixed_time_pair, dataBands);
1009
7.19k
        }
1010
31.2k
      } else {
1011
        /* diff_type[1] MUST BE DIFF_FREQ */
1012
8.74k
        diff_freq_decode(aaDataDiff[1], aaDataPair[1], dataBands);
1013
1014
8.74k
        if (diff_type[0] == DIFF_FREQ) {
1015
0
          diff_freq_decode(aaDataDiff[0], aaDataPair[0], dataBands);
1016
8.74k
        } else {
1017
8.74k
          diff_time_decode_forwards(aaDataPair[1], aaDataDiff[0], aaDataPair[0],
1018
8.74k
                                    mixed_time_pair, dataBands);
1019
8.74k
        }
1020
8.74k
      }
1021
40.0k
    }
1022
1023
    /* LSB decoding */
1024
40.0k
    err = attach_lsb(strm, aaDataPair[0], quant_offset, attachLsb_flag ? 1 : 0,
1025
40.0k
                     dataBands, aaDataPair[0]);
1026
40.0k
    if (err != HUFFDEC_OK) goto bail;
1027
1028
40.0k
    if (pair_flag) {
1029
22.1k
      err = attach_lsb(strm, aaDataPair[1], quant_offset,
1030
22.1k
                       attachLsb_flag ? 1 : 0, dataBands, aaDataPair[1]);
1031
22.1k
      if (err != HUFFDEC_OK) goto bail;
1032
22.1k
    }
1033
40.0k
  } /* End: Differential/Huffman/LSB Coding */
1034
1035
  /* Copy data to output arrays */
1036
65.8k
  FDKmemcpy(aaOutData1 + startBand, aaDataPair[0], sizeof(SCHAR) * dataBands);
1037
65.8k
  if (pair_flag) {
1038
40.4k
    FDKmemcpy(aaOutData2 + startBand, aaDataPair[1], sizeof(SCHAR) * dataBands);
1039
40.4k
  }
1040
1041
65.8k
bail:
1042
65.8k
  return err;
1043
65.8k
}
1044
1045
ERROR_t huff_dec_reshape(HANDLE_FDK_BITSTREAM strm, int* out_data,
1046
3.86k
                         int num_val) {
1047
3.86k
  ERROR_t err = HUFFDEC_OK;
1048
3.86k
  int val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0;
1049
3.86k
  SCHAR rl_data[2] = {0};
1050
1051
64.7k
  while (val_rcvd < num_val) {
1052
61.1k
    err = huff_read_2D(strm,
1053
61.1k
                       (HANDLE_HUFF_NODE)&FDK_huffReshapeNodes.nodeTab[0][0],
1054
61.1k
                       rl_data, &dummy);
1055
61.1k
    if (err != HUFFDEC_OK) goto bail;
1056
61.1k
    val = rl_data[0];
1057
61.1k
    len = rl_data[1] + 1;
1058
61.1k
    if (val_rcvd + len > num_val) {
1059
216
      err = HUFFDEC_NOTOK;
1060
216
      goto bail;
1061
216
    }
1062
178k
    for (i = val_rcvd; i < val_rcvd + len; i++) {
1063
117k
      out_data[i] = val;
1064
117k
    }
1065
60.8k
    val_rcvd += len;
1066
60.8k
  }
1067
3.86k
bail:
1068
3.86k
  return err;
1069
3.86k
}