Coverage Report

Created: 2025-11-24 06:13

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
96.8k
#define min(a, b) (((a) < (b)) ? (a) : (b))
110
#endif
111
112
14.6k
ERROR_t sym_restoreIPD(HANDLE_FDK_BITSTREAM strm, int lav, SCHAR data[2]) {
113
14.6k
  int sum_val = data[0] + data[1];
114
14.6k
  int diff_val = data[0] - data[1];
115
116
14.6k
  if (sum_val > lav) {
117
6.10k
    data[0] = -sum_val + (2 * lav + 1);
118
6.10k
    data[1] = -diff_val;
119
8.55k
  } else {
120
8.55k
    data[0] = sum_val;
121
8.55k
    data[1] = diff_val;
122
8.55k
  }
123
124
14.6k
  if (data[0] - data[1] != 0) {
125
8.31k
    ULONG sym_bit;
126
8.31k
    sym_bit = FDKreadBits(strm, 1);
127
8.31k
    if (sym_bit) {
128
2.40k
      int tmp;
129
2.40k
      tmp = data[0];
130
2.40k
      data[0] = data[1];
131
2.40k
      data[1] = tmp;
132
2.40k
    }
133
8.31k
  }
134
135
14.6k
  return HUFFDEC_OK;
136
14.6k
}
137
138
25.3k
static int ilog2(unsigned int i) {
139
25.3k
  int l = 0;
140
141
25.3k
  if (i) i--;
142
109k
  while (i > 0) {
143
84.3k
    i >>= 1;
144
84.3k
    l++;
145
84.3k
  }
146
147
25.3k
  return l;
148
25.3k
}
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
24.0k
                          int num_levels) {
153
24.0k
  int i = 0, j = 0, idx = 0;
154
24.0k
  int max_grp_len = 0, next_val = 0;
155
24.0k
  ULONG tmp;
156
157
24.0k
  int pcm_chunk_size[7] = {0};
158
159
24.0k
  switch (num_levels) {
160
231
    case 3:
161
231
      max_grp_len = 5;
162
231
      break;
163
53
    case 7:
164
53
      max_grp_len = 6;
165
53
      break;
166
53
    case 11:
167
53
      max_grp_len = 2;
168
53
      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
8.79k
    case 4:
182
12.9k
    case 8:
183
20.4k
    case 15:
184
22.8k
    case 16:
185
22.8k
    case 26:
186
23.7k
    case 31:
187
23.7k
      max_grp_len = 1;
188
23.7k
      break;
189
0
    default:
190
0
      return HUFFDEC_NOTOK;
191
24.0k
  }
192
193
24.0k
  tmp = 1;
194
49.3k
  for (i = 1; i <= max_grp_len; i++) {
195
25.3k
    tmp *= num_levels;
196
25.3k
    pcm_chunk_size[i] = ilog2(tmp);
197
25.3k
  }
198
199
120k
  for (i = 0; i < num_val; i += max_grp_len) {
200
96.8k
    int grp_len, grp_val, data;
201
96.8k
    grp_len = min(max_grp_len, num_val - i);
202
96.8k
    data = FDKreadBits(strm, pcm_chunk_size[grp_len]);
203
204
96.8k
    grp_val = data;
205
206
194k
    for (j = 0; j < grp_len; j++) {
207
97.6k
      idx = i + (grp_len - j - 1);
208
97.6k
      next_val = grp_val % num_levels;
209
210
97.6k
      if (out_data_2 == NULL) {
211
36.2k
        out_data_1[idx] = next_val - offset;
212
61.4k
      } else if (out_data_1 == NULL) {
213
0
        out_data_2[idx] = next_val - offset;
214
61.4k
      } else {
215
61.4k
        if (idx % 2) {
216
30.7k
          out_data_2[idx / 2] = next_val - offset;
217
30.7k
        } else {
218
30.7k
          out_data_1[idx / 2] = next_val - offset;
219
30.7k
        }
220
61.4k
      }
221
222
97.6k
      grp_val = (grp_val - next_val) / num_levels;
223
97.6k
    }
224
96.8k
  }
225
226
24.0k
  return HUFFDEC_OK;
227
24.0k
}
228
229
static ERROR_t huff_read(HANDLE_FDK_BITSTREAM strm,
230
                         const SHORT (*nodeTab)[MAX_ENTRIES][2],
231
280k
                         int* out_data) {
232
280k
  int node = 0;
233
280k
  int len = 0;
234
235
724k
  do {
236
724k
    ULONG next_bit;
237
724k
    next_bit = FDKreadBits(strm, 1);
238
724k
    len++;
239
724k
    node = (*nodeTab)[node][next_bit];
240
724k
  } while (node > 0);
241
242
280k
  *out_data = node;
243
244
280k
  return HUFFDEC_OK;
245
280k
}
246
247
static ERROR_t huff_read_2D(HANDLE_FDK_BITSTREAM strm,
248
                            const SHORT (*nodeTab)[MAX_ENTRIES][2],
249
110k
                            SCHAR out_data[2], int* escape) {
250
110k
  ERROR_t err = HUFFDEC_OK;
251
252
110k
  int huff_2D_8bit = 0;
253
110k
  int node = 0;
254
255
110k
  if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
256
0
    goto bail;
257
0
  }
258
110k
  *escape = (node == 0);
259
260
110k
  if (*escape) {
261
665
    out_data[0] = 0;
262
665
    out_data[1] = 1;
263
109k
  } else {
264
109k
    huff_2D_8bit = -(node + 1);
265
109k
    out_data[0] = huff_2D_8bit >> 4;
266
109k
    out_data[1] = huff_2D_8bit & 0xf;
267
109k
  }
268
269
110k
bail:
270
110k
  return err;
271
110k
}
272
273
43.0k
static ERROR_t sym_restore(HANDLE_FDK_BITSTREAM strm, int lav, SCHAR data[2]) {
274
43.0k
  ULONG sym_bit = 0;
275
276
43.0k
  int sum_val = data[0] + data[1];
277
43.0k
  int diff_val = data[0] - data[1];
278
279
43.0k
  if (sum_val > lav) {
280
18.0k
    data[0] = -sum_val + (2 * lav + 1);
281
18.0k
    data[1] = -diff_val;
282
25.0k
  } else {
283
25.0k
    data[0] = sum_val;
284
25.0k
    data[1] = diff_val;
285
25.0k
  }
286
287
43.0k
  if (data[0] + data[1] != 0) {
288
25.0k
    sym_bit = FDKreadBits(strm, 1);
289
25.0k
    if (sym_bit) {
290
8.37k
      data[0] = -data[0];
291
8.37k
      data[1] = -data[1];
292
8.37k
    }
293
25.0k
  }
294
295
43.0k
  if (data[0] - data[1] != 0) {
296
25.6k
    sym_bit = FDKreadBits(strm, 1);
297
25.6k
    if (sym_bit) {
298
10.3k
      int tmp;
299
10.3k
      tmp = data[0];
300
10.3k
      data[0] = data[1];
301
10.3k
      data[1] = tmp;
302
10.3k
    }
303
25.6k
  }
304
305
43.0k
  return HUFFDEC_OK;
306
43.0k
}
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
28.0k
{
313
28.0k
  ERROR_t err = HUFFDEC_OK;
314
28.0k
  int i = 0, node = 0, offset = 0;
315
28.0k
  int od = 0, od_sign = 0;
316
28.0k
  ULONG data = 0;
317
28.0k
  int bitsAvail = 0;
318
319
28.0k
  const SHORT(*partTab)[MAX_ENTRIES][2] = NULL;
320
28.0k
  const SHORT(*nodeTab)[MAX_ENTRIES][2] = NULL;
321
322
28.0k
  switch (data_type) {
323
8.01k
    case t_CLD:
324
8.01k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.cld[0][0];
325
8.01k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h1D[dim1]->nodeTab[0][0];
326
8.01k
      break;
327
13.8k
    case t_ICC:
328
13.8k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.icc[0][0];
329
13.8k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h1D[dim1]->nodeTab[0][0];
330
13.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.18k
    case t_IPD:
336
6.18k
      partTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.ipd[0][0];
337
6.18k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h1D[dim1].nodeTab[0][0];
338
6.18k
      break;
339
0
    default:
340
0
      FDK_ASSERT(0);
341
0
      err = HUFFDEC_NOTOK;
342
0
      goto bail;
343
28.0k
  }
344
345
28.0k
  if (p0_flag) {
346
9.74k
    if ((err = huff_read(strm, partTab, &node)) != HUFFDEC_OK) {
347
0
      goto bail;
348
0
    }
349
350
9.74k
    out_data[0] = -(node + 1);
351
9.74k
    offset = 1;
352
9.74k
  }
353
354
127k
  for (i = offset; i < num_val; i++) {
355
100k
    bitsAvail = FDKgetValidBits(strm);
356
100k
    if (bitsAvail < 1) {
357
935
      err = HUFFDEC_NOTOK;
358
935
      goto bail;
359
935
    }
360
361
99.2k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
362
0
      goto bail;
363
0
    }
364
99.2k
    od = -(node + 1);
365
366
99.2k
    if (data_type != t_IPD) {
367
74.1k
      if (od != 0) {
368
21.9k
        bitsAvail = FDKgetValidBits(strm);
369
21.9k
        if (bitsAvail < 1) {
370
69
          err = HUFFDEC_NOTOK;
371
69
          goto bail;
372
69
        }
373
374
21.8k
        data = FDKreadBits(strm, 1);
375
21.8k
        od_sign = data;
376
377
21.8k
        if (od_sign) od = -od;
378
21.8k
      }
379
74.1k
    }
380
381
99.2k
    out_data[i] = od;
382
99.2k
  }
383
384
28.0k
bail:
385
28.0k
  return err;
386
28.0k
}
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
29.4k
                           SCHAR* p0_data[2]) {
392
29.4k
  ERROR_t err = HUFFDEC_OK;
393
29.4k
  int i = 0, lav = 0, escape = 0, escCntr = 0;
394
29.4k
  int node = 0;
395
29.4k
  unsigned long data = 0;
396
397
29.4k
  SCHAR esc_data[2][28] = {{0}};
398
29.4k
  int escIdx[28] = {0};
399
29.4k
  const SHORT(*nodeTab)[MAX_ENTRIES][2] = NULL;
400
401
  /* LAV */
402
29.4k
  if ((err =
403
29.4k
           huff_read(strm, (HANDLE_HUFF_NODE)&FDK_huffLavIdxNodes.nodeTab[0][0],
404
29.4k
                     &node)) != HUFFDEC_OK) {
405
0
    goto bail;
406
0
  }
407
29.4k
  data = -(node + 1);
408
409
29.4k
  switch (data_type) {
410
14.8k
    case t_CLD:
411
14.8k
      lav = 2 * data + 3; /* 3, 5, 7, 9 */
412
14.8k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.cld[0][0];
413
14.8k
      break;
414
7.87k
    case t_ICC:
415
7.87k
      lav = 2 * data + 1; /* 1, 3, 5, 7 */
416
7.87k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.icc[0][0];
417
7.87k
      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
6.74k
    case t_IPD:
423
6.74k
      if (data == 0)
424
2.65k
        data = 3;
425
4.08k
      else
426
4.08k
        data--;
427
6.74k
      lav = 2 * data + 1; /* 1, 3, 5, 7 */
428
6.74k
      nodeTab = (HANDLE_HUFF_NODE)&FDK_huffPart0Nodes.ipd[0][0];
429
6.74k
      break;
430
0
    default:
431
0
      FDK_ASSERT(0);
432
0
      err = HUFFDEC_NOTOK;
433
0
      goto bail;
434
29.4k
  }
435
436
  /* Partition 0 */
437
29.4k
  if (p0_data[0] != NULL) {
438
18.5k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
439
0
      goto bail;
440
0
    }
441
18.5k
    *p0_data[0] = -(node + 1);
442
18.5k
  }
443
29.4k
  if (p0_data[1] != NULL) {
444
12.9k
    if ((err = huff_read(strm, nodeTab, &node)) != HUFFDEC_OK) {
445
0
      goto bail;
446
0
    }
447
12.9k
    *p0_data[1] = -(node + 1);
448
12.9k
  }
449
450
29.4k
  switch (data_type) {
451
14.8k
    case t_CLD:
452
14.8k
      switch (lav) {
453
3.49k
        case 3:
454
3.49k
          nodeTab =
455
3.49k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav3[0][0];
456
3.49k
          break;
457
1.00k
        case 5:
458
1.00k
          nodeTab =
459
1.00k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav5[0][0];
460
1.00k
          break;
461
3.85k
        case 7:
462
3.85k
          nodeTab =
463
3.85k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav7[0][0];
464
3.85k
          break;
465
6.49k
        case 9:
466
6.49k
          nodeTab =
467
6.49k
              (HANDLE_HUFF_NODE)&FDK_huffCLDNodes.h2D[dim1][dim2]->lav9[0][0];
468
6.49k
          break;
469
14.8k
      }
470
14.8k
      break;
471
14.8k
    case t_ICC:
472
7.87k
      switch (lav) {
473
3.29k
        case 1:
474
3.29k
          nodeTab =
475
3.29k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav1[0][0];
476
3.29k
          break;
477
1.39k
        case 3:
478
1.39k
          nodeTab =
479
1.39k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav3[0][0];
480
1.39k
          break;
481
513
        case 5:
482
513
          nodeTab =
483
513
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav5[0][0];
484
513
          break;
485
2.66k
        case 7:
486
2.66k
          nodeTab =
487
2.66k
              (HANDLE_HUFF_NODE)&FDK_huffICCNodes.h2D[dim1][dim2]->lav7[0][0];
488
2.66k
          break;
489
7.87k
      }
490
7.87k
      break;
491
7.87k
    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
6.74k
    case t_IPD:
509
6.74k
      switch (lav) {
510
3.44k
        case 1:
511
3.44k
          nodeTab =
512
3.44k
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav1[0][0];
513
3.44k
          break;
514
192
        case 3:
515
192
          nodeTab =
516
192
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav3[0][0];
517
192
          break;
518
453
        case 5:
519
453
          nodeTab =
520
453
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav5[0][0];
521
453
          break;
522
2.65k
        case 7:
523
2.65k
          nodeTab =
524
2.65k
              (HANDLE_HUFF_NODE)&FDK_huffIPDNodes.h2D[dim1][dim2].lav7[0][0];
525
2.65k
          break;
526
6.74k
      }
527
6.74k
      break;
528
6.74k
    default:
529
0
      break;
530
29.4k
  }
531
532
87.8k
  for (i = 0; i < num_val; i += stride) {
533
58.3k
    if ((err = huff_read_2D(strm, nodeTab, out_data[i], &escape)) !=
534
58.3k
        HUFFDEC_OK) {
535
0
      goto bail;
536
0
    }
537
538
58.3k
    if (escape) {
539
665
      escIdx[escCntr++] = i;
540
57.7k
    } else {
541
57.7k
      if (data_type == t_IPD) {
542
14.6k
        if ((err = sym_restoreIPD(strm, lav, out_data[i])) != HUFFDEC_OK) {
543
0
          goto bail;
544
0
        }
545
43.0k
      } else {
546
43.0k
        if ((err = sym_restore(strm, lav, out_data[i])) != HUFFDEC_OK) {
547
0
          goto bail;
548
0
        }
549
43.0k
      }
550
57.7k
    }
551
58.3k
  } /* i */
552
553
29.4k
  if (escCntr > 0) {
554
347
    if ((err = pcm_decode(strm, esc_data[0], esc_data[1], 0, 2 * escCntr,
555
347
                          (2 * lav + 1))) != HUFFDEC_OK) {
556
0
      goto bail;
557
0
    }
558
559
1.01k
    for (i = 0; i < escCntr; i++) {
560
665
      out_data[escIdx[i]][0] = esc_data[0][i] - lav;
561
665
      out_data[escIdx[i]][1] = esc_data[1][i] - lav;
562
665
    }
563
347
  }
564
29.4k
bail:
565
29.4k
  return err;
566
29.4k
}
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
37.4k
                           int num_val, PAIRING* pairing_scheme, int ldMode) {
572
37.4k
  ERROR_t err = HUFFDEC_OK;
573
37.4k
  CODING_SCHEME coding_scheme = HUFF_1D;
574
37.4k
  DIFF_TYPE diff_type;
575
576
37.4k
  int i = 0;
577
578
37.4k
  SCHAR pair_vec[28][2];
579
580
37.4k
  SCHAR* p0_data_1[2] = {NULL, NULL};
581
37.4k
  SCHAR* p0_data_2[2] = {NULL, NULL};
582
583
37.4k
  int p0_flag[2];
584
585
37.4k
  int num_val_1_int = num_val;
586
37.4k
  int num_val_2_int = num_val;
587
588
37.4k
  SCHAR* out_data_1_int = out_data_1;
589
37.4k
  SCHAR* out_data_2_int = out_data_2;
590
591
37.4k
  int df_rest_flag_1 = 0;
592
37.4k
  int df_rest_flag_2 = 0;
593
594
37.4k
  int hufYY1;
595
37.4k
  int hufYY2;
596
37.4k
  int hufYY;
597
598
  /* Coding scheme */
599
37.4k
  coding_scheme = (CODING_SCHEME)FDKreadBits(strm, 1);
600
601
37.4k
  if (coding_scheme == HUFF_2D) {
602
23.2k
    if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ldMode == 0)) {
603
13.4k
      *pairing_scheme = (PAIRING)FDKreadBits(strm, 1);
604
13.4k
    } else {
605
9.88k
      *pairing_scheme = FREQ_PAIR;
606
9.88k
    }
607
23.2k
  }
608
609
37.4k
  {
610
37.4k
    hufYY1 = diff_type_1;
611
37.4k
    hufYY2 = diff_type_2;
612
37.4k
  }
613
614
37.4k
  switch (coding_scheme) {
615
14.2k
    case HUFF_1D:
616
14.2k
      p0_flag[0] = (diff_type_1 == DIFF_FREQ);
617
14.2k
      p0_flag[1] = (diff_type_2 == DIFF_FREQ);
618
14.2k
      if (out_data_1 != NULL) {
619
14.2k
        if ((err = huff_dec_1D(strm, data_type, hufYY1, out_data_1,
620
14.2k
                               num_val_1_int, p0_flag[0])) != HUFFDEC_OK) {
621
622
          goto bail;
622
622
        }
623
14.2k
      }
624
13.5k
      if (out_data_2 != NULL) {
625
4.28k
        if ((err = huff_dec_1D(strm, data_type, hufYY2, out_data_2,
626
4.28k
                               num_val_2_int, p0_flag[1])) != HUFFDEC_OK) {
627
22
          goto bail;
628
22
        }
629
4.28k
      }
630
631
13.5k
      break; /* HUFF_1D */
632
633
23.2k
    case HUFF_2D:
634
635
23.2k
      switch (*pairing_scheme) {
636
13.5k
        case FREQ_PAIR:
637
638
13.5k
          if (out_data_1 != NULL) {
639
13.5k
            if (diff_type_1 == DIFF_FREQ) {
640
9.28k
              p0_data_1[0] = &out_data_1[0];
641
9.28k
              p0_data_1[1] = NULL;
642
643
9.28k
              num_val_1_int -= 1;
644
9.28k
              out_data_1_int += 1;
645
9.28k
            }
646
13.5k
            df_rest_flag_1 = num_val_1_int % 2;
647
13.5k
            if (df_rest_flag_1) num_val_1_int -= 1;
648
13.5k
            if (num_val_1_int < 0) {
649
1
              err = HUFFDEC_NOTOK;
650
1
              goto bail;
651
1
            }
652
13.5k
          }
653
13.5k
          if (out_data_2 != NULL) {
654
6.20k
            if (diff_type_2 == DIFF_FREQ) {
655
3.66k
              p0_data_2[0] = NULL;
656
3.66k
              p0_data_2[1] = &out_data_2[0];
657
658
3.66k
              num_val_2_int -= 1;
659
3.66k
              out_data_2_int += 1;
660
3.66k
            }
661
6.20k
            df_rest_flag_2 = num_val_2_int % 2;
662
6.20k
            if (df_rest_flag_2) num_val_2_int -= 1;
663
6.20k
            if (num_val_2_int < 0) {
664
2
              err = HUFFDEC_NOTOK;
665
2
              goto bail;
666
2
            }
667
6.20k
          }
668
669
13.5k
          if (out_data_1 != NULL) {
670
13.5k
            if ((err = huff_dec_2D(strm, data_type, hufYY1, FREQ_PAIR, pair_vec,
671
13.5k
                                   num_val_1_int, 2, p0_data_1)) !=
672
13.5k
                HUFFDEC_OK) {
673
0
              goto bail;
674
0
            }
675
13.5k
            if (df_rest_flag_1) {
676
5.83k
              if ((err = huff_dec_1D(strm, data_type, hufYY1,
677
5.83k
                                     out_data_1_int + num_val_1_int, 1, 0)) !=
678
5.83k
                  HUFFDEC_OK) {
679
252
                goto bail;
680
252
              }
681
5.83k
            }
682
13.5k
          }
683
13.2k
          if (out_data_2 != NULL) {
684
6.17k
            if ((err = huff_dec_2D(strm, data_type, hufYY2, FREQ_PAIR,
685
6.17k
                                   pair_vec + 1, num_val_2_int, 2,
686
6.17k
                                   p0_data_2)) != HUFFDEC_OK) {
687
0
              goto bail;
688
0
            }
689
6.17k
            if (df_rest_flag_2) {
690
3.74k
              if ((err = huff_dec_1D(strm, data_type, hufYY2,
691
3.74k
                                     out_data_2_int + num_val_2_int, 1, 0)) !=
692
3.74k
                  HUFFDEC_OK) {
693
108
                goto bail;
694
108
              }
695
3.74k
            }
696
6.17k
          }
697
698
13.1k
          if (out_data_1 != NULL) {
699
43.0k
            for (i = 0; i < num_val_1_int - 1; i += 2) {
700
29.8k
              out_data_1_int[i] = pair_vec[i][0];
701
29.8k
              out_data_1_int[i + 1] = pair_vec[i][1];
702
29.8k
            }
703
13.1k
          }
704
13.1k
          if (out_data_2 != NULL) {
705
20.6k
            for (i = 0; i < num_val_2_int - 1; i += 2) {
706
14.5k
              out_data_2_int[i] = pair_vec[i + 1][0];
707
14.5k
              out_data_2_int[i + 1] = pair_vec[i + 1][1];
708
14.5k
            }
709
6.06k
          }
710
13.1k
          break; /* FREQ_PAIR */
711
712
9.78k
        case TIME_PAIR:
713
9.78k
          if (((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ))) {
714
9.24k
            p0_data_1[0] = &out_data_1[0];
715
9.24k
            p0_data_1[1] = &out_data_2[0];
716
717
9.24k
            out_data_1_int += 1;
718
9.24k
            out_data_2_int += 1;
719
720
9.24k
            num_val_1_int -= 1;
721
9.24k
          }
722
723
9.78k
          if ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) {
724
7.55k
            diff_type = DIFF_TIME;
725
7.55k
          } else {
726
2.22k
            diff_type = DIFF_FREQ;
727
2.22k
          }
728
9.78k
          { hufYY = diff_type; }
729
730
9.78k
          if ((err = huff_dec_2D(strm, data_type, hufYY, TIME_PAIR, pair_vec,
731
9.78k
                                 num_val_1_int, 1, p0_data_1)) != HUFFDEC_OK) {
732
0
            goto bail;
733
0
          }
734
735
22.8k
          for (i = 0; i < num_val_1_int; i++) {
736
13.0k
            out_data_1_int[i] = pair_vec[i][0];
737
13.0k
            out_data_2_int[i] = pair_vec[i][1];
738
13.0k
          }
739
740
9.78k
          break; /* TIME_PAIR */
741
742
0
        default:
743
0
          break;
744
23.2k
      }
745
746
22.9k
      break; /* HUFF_2D */
747
748
22.9k
    default:
749
0
      break;
750
37.4k
  }
751
37.4k
bail:
752
37.4k
  return err;
753
37.4k
}
754
755
static void diff_freq_decode(const SCHAR* const diff_data,
756
49.9k
                             SCHAR* const out_data, const int num_val) {
757
49.9k
  int i = 0;
758
49.9k
  out_data[0] = diff_data[0];
759
760
243k
  for (i = 1; i < num_val; i++) {
761
194k
    out_data[i] = out_data[i - 1] + diff_data[i];
762
194k
  }
763
49.9k
}
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
15.2k
                                       const int num_val) {
770
15.2k
  int i = 0; /* default start value*/
771
772
15.2k
  if (mixed_diff_type) {
773
3.25k
    out_data[0] = diff_data[0];
774
3.25k
    i = 1; /* new start value */
775
3.25k
  }
776
110k
  for (; i < num_val; i++) {
777
95.3k
    out_data[i] = prev_data[i] + diff_data[i];
778
95.3k
  }
779
15.2k
}
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
7.74k
                                      const int num_val) {
786
7.74k
  int i = 0; /* default start value*/
787
788
7.74k
  if (mixed_diff_type) {
789
3.76k
    out_data[0] = diff_data[0];
790
3.76k
    i = 1; /* new start value */
791
3.76k
  }
792
25.8k
  for (; i < num_val; i++) {
793
18.0k
    out_data[i] = prev_data[i] - diff_data[i];
794
18.0k
  }
795
7.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
56.6k
                          SCHAR* out_data) {
800
56.6k
  int i = 0, lsb = 0;
801
56.6k
  ULONG data = 0;
802
803
310k
  for (i = 0; i < num_val; i++) {
804
253k
    int msb;
805
253k
    msb = in_data_msb[i];
806
807
253k
    if (num_lsb > 0) {
808
47.4k
      data = FDKreadBits(strm, num_lsb);
809
47.4k
      lsb = data;
810
811
47.4k
      out_data[i] = ((msb << num_lsb) | lsb) - offset;
812
47.4k
    } else
813
206k
      out_data[i] = msb - offset;
814
253k
  }
815
816
56.6k
  return HUFFDEC_OK; /* dummy */
817
56.6k
}
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
61.2k
{
826
61.2k
  ERROR_t err = HUFFDEC_OK;
827
828
  // int allowDiffTimeBack_flag = !independency_flag || (setIdx > 0);
829
61.2k
  int attachLsb_flag = 0;
830
61.2k
  int pcmCoding_flag = 0;
831
832
61.2k
  int mixed_time_pair = 0, numValPcm = 0;
833
61.2k
  int quant_levels = 0, quant_offset = 0;
834
61.2k
  ULONG data = 0;
835
836
61.2k
  SCHAR aaDataPair[2][28] = {{0}};
837
61.2k
  SCHAR aaDataDiff[2][28] = {{0}};
838
839
61.2k
  SCHAR aHistoryMsb[28] = {0};
840
841
61.2k
  SCHAR* pDataVec[2] = {NULL, NULL};
842
843
61.2k
  DIFF_TYPE diff_type[2] = {DIFF_FREQ, DIFF_FREQ};
844
61.2k
  PAIRING pairing = FREQ_PAIR;
845
61.2k
  DIRECTION direction = BACKWARDS;
846
847
61.2k
  switch (data_type) {
848
24.2k
    case t_CLD:
849
24.2k
      if (coarse_flag) {
850
15.0k
        attachLsb_flag = 0;
851
15.0k
        quant_levels = 15;
852
15.0k
        quant_offset = 7;
853
15.0k
      } else {
854
9.22k
        attachLsb_flag = 0;
855
9.22k
        quant_levels = 31;
856
9.22k
        quant_offset = 15;
857
9.22k
      }
858
859
24.2k
      break;
860
861
25.3k
    case t_ICC:
862
25.3k
      if (coarse_flag) {
863
14.4k
        attachLsb_flag = 0;
864
14.4k
        quant_levels = 4;
865
14.4k
        quant_offset = 0;
866
14.4k
      } else {
867
10.8k
        attachLsb_flag = 0;
868
10.8k
        quant_levels = 8;
869
10.8k
        quant_offset = 0;
870
10.8k
      }
871
872
25.3k
      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
11.6k
    case t_IPD:
899
11.6k
      if (!coarse_flag) {
900
7.75k
        attachLsb_flag = 1;
901
7.75k
        quant_levels = 16;
902
7.75k
        quant_offset = 0;
903
7.75k
      } else {
904
3.86k
        attachLsb_flag = 0;
905
3.86k
        quant_levels = 8;
906
3.86k
        quant_offset = 0;
907
3.86k
      }
908
11.6k
      break;
909
910
0
    default:
911
0
      return HUFFDEC_NOTOK;
912
61.2k
  }
913
914
61.2k
  data = FDKreadBits(strm, 1);
915
61.2k
  pcmCoding_flag = data;
916
917
61.2k
  if (pcmCoding_flag) {
918
23.7k
    if (pair_flag) {
919
16.4k
      pDataVec[0] = aaDataPair[0];
920
16.4k
      pDataVec[1] = aaDataPair[1];
921
16.4k
      numValPcm = 2 * dataBands;
922
16.4k
    } else {
923
7.29k
      pDataVec[0] = aaDataPair[0];
924
7.29k
      pDataVec[1] = NULL;
925
7.29k
      numValPcm = dataBands;
926
7.29k
    }
927
928
23.7k
    err = pcm_decode(strm, pDataVec[0], pDataVec[1], quant_offset, numValPcm,
929
23.7k
                     quant_levels);
930
23.7k
    if (err != HUFFDEC_OK) return HUFFDEC_NOTOK;
931
932
37.4k
  } else { /* Differential/Huffman/LSB Coding */
933
934
37.4k
    if (pair_flag) {
935
20.4k
      pDataVec[0] = aaDataDiff[0];
936
20.4k
      pDataVec[1] = aaDataDiff[1];
937
20.4k
    } else {
938
17.0k
      pDataVec[0] = aaDataDiff[0];
939
17.0k
      pDataVec[1] = NULL;
940
17.0k
    }
941
942
37.4k
    diff_type[0] = DIFF_FREQ;
943
37.4k
    diff_type[1] = DIFF_FREQ;
944
945
37.4k
    direction = BACKWARDS;
946
37.4k
    {
947
37.4k
      if (pair_flag || allowDiffTimeBack_flag) {
948
32.6k
        data = FDKreadBits(strm, 1);
949
32.6k
        diff_type[0] = (DIFF_TYPE)data;
950
32.6k
      }
951
952
37.4k
      if (pair_flag &&
953
20.4k
          ((diff_type[0] == DIFF_FREQ) || allowDiffTimeBack_flag)) {
954
15.7k
        data = FDKreadBits(strm, 1);
955
15.7k
        diff_type[1] = (DIFF_TYPE)data;
956
15.7k
      }
957
37.4k
    }
958
    /* Huffman decoding */
959
37.4k
    err = huff_decode(strm, pDataVec[0], pDataVec[1], data_type, diff_type[0],
960
37.4k
                      diff_type[1], dataBands, &pairing,
961
37.4k
                      (DECODER == SAOC_DECODER));
962
37.4k
    if (err != HUFFDEC_OK) {
963
1.00k
      return HUFFDEC_NOTOK;
964
1.00k
    }
965
966
36.4k
    {
967
      /* Differential decoding */
968
36.4k
      if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
969
21.7k
        if (DECODER == SAOC_DECODER) {
970
2.32k
          direction = BACKWARDS;
971
19.4k
        } else {
972
19.4k
          if (pair_flag) {
973
12.6k
            if ((diff_type[0] == DIFF_TIME) && !allowDiffTimeBack_flag) {
974
4.62k
              direction = FORWARDS;
975
8.07k
            } else if (diff_type[1] == DIFF_TIME) {
976
4.25k
              direction = BACKWARDS;
977
4.25k
            } else {
978
3.81k
              data = FDKreadBits(strm, 1);
979
3.81k
              direction = (DIRECTION)data;
980
3.81k
            }
981
12.6k
          } else {
982
6.72k
            direction = BACKWARDS;
983
6.72k
          }
984
19.4k
        }
985
21.7k
      }
986
987
36.4k
      mixed_time_pair =
988
36.4k
          (diff_type[0] != diff_type[1]) && (pairing == TIME_PAIR);
989
990
36.4k
      if (direction == BACKWARDS) {
991
28.7k
        if (diff_type[0] == DIFF_FREQ) {
992
19.9k
          diff_freq_decode(aaDataDiff[0], aaDataPair[0], dataBands);
993
19.9k
        } else {
994
8.80k
          int i;
995
75.5k
          for (i = 0; i < dataBands; i++) {
996
66.7k
            aHistoryMsb[i] = aHistory[i + startBand] + quant_offset;
997
66.7k
            if (attachLsb_flag) {
998
19.9k
              aHistoryMsb[i] >>= 1;
999
19.9k
            }
1000
66.7k
          }
1001
8.80k
          diff_time_decode_backwards(aHistoryMsb, aaDataDiff[0], aaDataPair[0],
1002
8.80k
                                     mixed_time_pair, dataBands);
1003
8.80k
        }
1004
28.7k
        if (diff_type[1] == DIFF_FREQ) {
1005
22.2k
          diff_freq_decode(aaDataDiff[1], aaDataPair[1], dataBands);
1006
22.2k
        } else {
1007
6.48k
          diff_time_decode_backwards(aaDataPair[0], aaDataDiff[1],
1008
6.48k
                                     aaDataPair[1], mixed_time_pair, dataBands);
1009
6.48k
        }
1010
28.7k
      } else {
1011
        /* diff_type[1] MUST BE DIFF_FREQ */
1012
7.74k
        diff_freq_decode(aaDataDiff[1], aaDataPair[1], dataBands);
1013
1014
7.74k
        if (diff_type[0] == DIFF_FREQ) {
1015
0
          diff_freq_decode(aaDataDiff[0], aaDataPair[0], dataBands);
1016
7.74k
        } else {
1017
7.74k
          diff_time_decode_forwards(aaDataPair[1], aaDataDiff[0], aaDataPair[0],
1018
7.74k
                                    mixed_time_pair, dataBands);
1019
7.74k
        }
1020
7.74k
      }
1021
36.4k
    }
1022
1023
    /* LSB decoding */
1024
36.4k
    err = attach_lsb(strm, aaDataPair[0], quant_offset, attachLsb_flag ? 1 : 0,
1025
36.4k
                     dataBands, aaDataPair[0]);
1026
36.4k
    if (err != HUFFDEC_OK) goto bail;
1027
1028
36.4k
    if (pair_flag) {
1029
20.1k
      err = attach_lsb(strm, aaDataPair[1], quant_offset,
1030
20.1k
                       attachLsb_flag ? 1 : 0, dataBands, aaDataPair[1]);
1031
20.1k
      if (err != HUFFDEC_OK) goto bail;
1032
20.1k
    }
1033
36.4k
  } /* End: Differential/Huffman/LSB Coding */
1034
1035
  /* Copy data to output arrays */
1036
60.1k
  FDKmemcpy(aaOutData1 + startBand, aaDataPair[0], sizeof(SCHAR) * dataBands);
1037
60.1k
  if (pair_flag) {
1038
36.5k
    FDKmemcpy(aaOutData2 + startBand, aaDataPair[1], sizeof(SCHAR) * dataBands);
1039
36.5k
  }
1040
1041
60.1k
bail:
1042
60.1k
  return err;
1043
60.1k
}
1044
1045
ERROR_t huff_dec_reshape(HANDLE_FDK_BITSTREAM strm, int* out_data,
1046
3.30k
                         int num_val) {
1047
3.30k
  ERROR_t err = HUFFDEC_OK;
1048
3.30k
  int val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0;
1049
3.30k
  SCHAR rl_data[2] = {0};
1050
1051
55.3k
  while (val_rcvd < num_val) {
1052
52.2k
    err = huff_read_2D(strm,
1053
52.2k
                       (HANDLE_HUFF_NODE)&FDK_huffReshapeNodes.nodeTab[0][0],
1054
52.2k
                       rl_data, &dummy);
1055
52.2k
    if (err != HUFFDEC_OK) goto bail;
1056
52.2k
    val = rl_data[0];
1057
52.2k
    len = rl_data[1] + 1;
1058
52.2k
    if (val_rcvd + len > num_val) {
1059
152
      err = HUFFDEC_NOTOK;
1060
152
      goto bail;
1061
152
    }
1062
153k
    for (i = val_rcvd; i < val_rcvd + len; i++) {
1063
101k
      out_data[i] = val;
1064
101k
    }
1065
52.0k
    val_rcvd += len;
1066
52.0k
  }
1067
3.30k
bail:
1068
3.30k
  return err;
1069
3.30k
}