Coverage Report

Created: 2025-11-16 06:35

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