Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung 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 (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /*********************** MPEG surround encoder library *************************
     96 
     97    Author(s):   Karsten Linzmeier
     98 
     99    Description: Noiseless Coding
    100                 Huffman encoder
    101 
    102 *******************************************************************************/
    103 
    104 /* Includes ******************************************************************/
    105 #include "sacenc_nlc_enc.h"
    106 
    107 #include "genericStds.h"
    108 #include "fixpoint_math.h"
    109 
    110 #include "sacenc_const.h"
    111 #include "sacenc_huff_tab.h"
    112 #include "sacenc_paramextract.h"
    113 
    114 /* Defines *******************************************************************/
    115 #define PAIR_SHIFT 4
    116 #define PAIR_MASK 0xf
    117 
    118 #define PBC_MIN_BANDS 5
    119 
    120 typedef enum {
    121   BACKWARDS = 0x0,
    122   FORWARDS = 0x1
    123 
    124 } DIRECTION;
    125 
    126 typedef enum {
    127   DIFF_FREQ = 0x0,
    128   DIFF_TIME = 0x1
    129 
    130 } DIFF_TYPE;
    131 
    132 typedef enum {
    133   HUFF_1D = 0x0,
    134   HUFF_2D = 0x1
    135 
    136 } CODING_SCHEME;
    137 
    138 typedef enum {
    139   FREQ_PAIR = 0x0,
    140   TIME_PAIR = 0x1
    141 
    142 } PAIRING;
    143 
    144 /* Data Types ****************************************************************/
    145 
    146 /* Constants *****************************************************************/
    147 static const UCHAR lavHuffVal[4] = {0, 2, 6, 7};
    148 static const UCHAR lavHuffLen[4] = {1, 2, 3, 3};
    149 
    150 static const UCHAR lav_step_CLD[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3};
    151 static const UCHAR lav_step_ICC[] = {0, 0, 1, 1, 2, 2, 3, 3};
    152 
    153 /* Function / Class Declarations *********************************************/
    154 
    155 /* Function / Class Definition ***********************************************/
    156 static void split_lsb(const SHORT *const in_data, SHORT offset,
    157                       const INT num_val, SHORT *const out_data_lsb,
    158                       SHORT *const out_data_msb) {
    159   int i;
    160 
    161   for (i = 0; i < num_val; i++) {
    162     SHORT val = in_data[i] + offset;
    163     if (out_data_lsb != NULL) out_data_lsb[i] = val & 0x0001;
    164     if (out_data_msb != NULL) out_data_msb[i] = val >> 1;
    165   }
    166 }
    167 
    168 static void apply_lsb_coding(HANDLE_FDK_BITSTREAM strm,
    169                              const SHORT *const in_data_lsb, const UINT num_lsb,
    170                              const INT num_val) {
    171   int i;
    172 
    173   for (i = 0; i < num_val; i++) {
    174     FDKwriteBits(strm, in_data_lsb[i], num_lsb);
    175   }
    176 }
    177 
    178 static void calc_diff_freq(const SHORT *const in_data, SHORT *const out_data,
    179                            const INT num_val) {
    180   int i;
    181   out_data[0] = in_data[0];
    182 
    183   for (i = 1; i < num_val; i++) {
    184     out_data[i] = in_data[i] - in_data[i - 1];
    185   }
    186 }
    187 
    188 static void calc_diff_time(const SHORT *const in_data,
    189                            const SHORT *const prev_data, SHORT *const out_data,
    190                            const INT num_val) {
    191   int i;
    192   out_data[0] = in_data[0];
    193   out_data[1] = prev_data[0];
    194 
    195   for (i = 0; i < num_val; i++) {
    196     out_data[i + 2] = in_data[i] - prev_data[i];
    197   }
    198 }
    199 
    200 static INT sym_check(SHORT data[2], const INT lav, SHORT *const pSym_bits) {
    201   UCHAR symBits = 0;
    202   int sum_val = data[0] + data[1];
    203   int diff_val = data[0] - data[1];
    204   int num_sbits = 0;
    205 
    206   if (sum_val != 0) {
    207     int sum_neg = (sum_val < 0) ? 1 : 0;
    208     if (sum_neg) {
    209       sum_val = -sum_val;
    210       diff_val = -diff_val;
    211     }
    212     symBits = (symBits << 1) | sum_neg;
    213     num_sbits++;
    214   }
    215 
    216   if (diff_val != 0) {
    217     int diff_neg = (diff_val < 0) ? 1 : 0;
    218     if (diff_neg) {
    219       diff_val = -diff_val;
    220     }
    221     symBits = (symBits << 1) | diff_neg;
    222     num_sbits++;
    223   }
    224 
    225   if (pSym_bits != NULL) {
    226     *pSym_bits = symBits;
    227   }
    228 
    229   if (sum_val % 2) {
    230     data[0] = lav - sum_val / 2;
    231     data[1] = lav - diff_val / 2;
    232   } else {
    233     data[0] = sum_val / 2;
    234     data[1] = diff_val / 2;
    235   }
    236 
    237   return num_sbits;
    238 }
    239 
    240 static INT ilog2(UINT i) {
    241   int l = 0;
    242 
    243   if (i) i--;
    244   while (i > 0) {
    245     i >>= 1;
    246     l++;
    247   }
    248 
    249   return l;
    250 }
    251 
    252 static SHORT calc_pcm_bits(const SHORT num_val, const SHORT num_levels) {
    253   SHORT num_complete_chunks = 0, rest_chunk_size = 0;
    254   SHORT max_grp_len = 0, bits_pcm = 0;
    255   int chunk_levels, i;
    256 
    257   switch (num_levels) {
    258     case 3:
    259       max_grp_len = 5;
    260       break;
    261     case 6:
    262       max_grp_len = 5;
    263       break;
    264     case 7:
    265       max_grp_len = 6;
    266       break;
    267     case 11:
    268       max_grp_len = 2;
    269       break;
    270     case 13:
    271       max_grp_len = 4;
    272       break;
    273     case 19:
    274       max_grp_len = 4;
    275       break;
    276     case 25:
    277       max_grp_len = 3;
    278       break;
    279     case 51:
    280       max_grp_len = 4;
    281       break;
    282     default:
    283       max_grp_len = 1;
    284   }
    285 
    286   num_complete_chunks = num_val / max_grp_len;
    287   rest_chunk_size = num_val % max_grp_len;
    288 
    289   chunk_levels = 1;
    290   for (i = 1; i <= max_grp_len; i++) {
    291     chunk_levels *= num_levels;
    292   }
    293 
    294   bits_pcm = (SHORT)(ilog2(chunk_levels) * num_complete_chunks);
    295   bits_pcm += (SHORT)(ilog2(num_levels) * rest_chunk_size);
    296 
    297   return bits_pcm;
    298 }
    299 
    300 static void apply_pcm_coding(HANDLE_FDK_BITSTREAM strm,
    301                              const SHORT *const in_data_1,
    302                              const SHORT *const in_data_2, const SHORT offset,
    303                              const SHORT num_val, const SHORT num_levels) {
    304   SHORT i = 0, j = 0, idx = 0;
    305   SHORT max_grp_len = 0, grp_len = 0, next_val = 0;
    306   int grp_val = 0, chunk_levels = 0;
    307 
    308   SHORT pcm_chunk_size[7] = {0};
    309 
    310   switch (num_levels) {
    311     case 3:
    312       max_grp_len = 5;
    313       break;
    314     case 5:
    315       max_grp_len = 3;
    316       break;
    317     case 6:
    318       max_grp_len = 5;
    319       break;
    320     case 7:
    321       max_grp_len = 6;
    322       break;
    323     case 9:
    324       max_grp_len = 5;
    325       break;
    326     case 11:
    327       max_grp_len = 2;
    328       break;
    329     case 13:
    330       max_grp_len = 4;
    331       break;
    332     case 19:
    333       max_grp_len = 4;
    334       break;
    335     case 25:
    336       max_grp_len = 3;
    337       break;
    338     case 51:
    339       max_grp_len = 4;
    340       break;
    341     default:
    342       max_grp_len = 1;
    343   }
    344 
    345   chunk_levels = 1;
    346   for (i = 1; i <= max_grp_len; i++) {
    347     chunk_levels *= num_levels;
    348     pcm_chunk_size[i] = ilog2(chunk_levels);
    349   }
    350 
    351   for (i = 0; i < num_val; i += max_grp_len) {
    352     grp_len = FDKmin(max_grp_len, num_val - i);
    353     grp_val = 0;
    354     for (j = 0; j < grp_len; j++) {
    355       idx = i + j;
    356       if (in_data_2 == NULL) {
    357         next_val = in_data_1[idx];
    358       } else if (in_data_1 == NULL) {
    359         next_val = in_data_2[idx];
    360       } else {
    361         next_val = ((idx % 2) ? in_data_2[idx / 2] : in_data_1[idx / 2]);
    362       }
    363       next_val += offset;
    364       grp_val = grp_val * num_levels + next_val;
    365     }
    366 
    367     FDKwriteBits(strm, grp_val, pcm_chunk_size[grp_len]);
    368   }
    369 }
    370 
    371 static UINT huff_enc_1D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type,
    372                         const INT dim1, SHORT *const in_data,
    373                         const SHORT num_val, const SHORT p0_flag) {
    374   int i, offset = 0;
    375   UINT huffBits = 0;
    376 
    377   HUFF_ENTRY part0 = {0};
    378   const HUFF_ENTRY *pHuffTab = NULL;
    379 
    380   switch (data_type) {
    381     case t_CLD:
    382       pHuffTab = fdk_sacenc_huffCLDTab.h1D[dim1];
    383       break;
    384     case t_ICC:
    385       pHuffTab = fdk_sacenc_huffICCTab.h1D[dim1];
    386       break;
    387   }
    388 
    389   if (p0_flag) {
    390     switch (data_type) {
    391       case t_CLD:
    392         part0 = fdk_sacenc_huffPart0Tab.cld[in_data[0]];
    393         break;
    394       case t_ICC:
    395         part0 = fdk_sacenc_huffPart0Tab.icc[in_data[0]];
    396         break;
    397     }
    398     huffBits += FDKwriteBits(strm, HUFF_VALUE(part0), HUFF_LENGTH(part0));
    399     offset = 1;
    400   }
    401 
    402   for (i = offset; i < num_val; i++) {
    403     int id_sign = 0;
    404     int id = in_data[i];
    405 
    406     if (id != 0) {
    407       id_sign = 0;
    408       if (id < 0) {
    409         id = -id;
    410         id_sign = 1;
    411       }
    412     }
    413 
    414     huffBits +=
    415         FDKwriteBits(strm, HUFF_VALUE(pHuffTab[id]), HUFF_LENGTH(pHuffTab[id]));
    416 
    417     if (id != 0) {
    418       huffBits += FDKwriteBits(strm, id_sign, 1);
    419     }
    420   } /* for i */
    421 
    422   return huffBits;
    423 }
    424 
    425 static void getHuffEntry(const INT lav, const DATA_TYPE data_type, const INT i,
    426                          const SHORT tab_idx_2D[2], const SHORT in_data[][2],
    427                          HUFF_ENTRY *const pEntry, HUFF_ENTRY *const pEscape) {
    428   const HUFF_CLD_TAB_2D *pCLD2dTab =
    429       &fdk_sacenc_huffCLDTab.h2D[tab_idx_2D[0]][tab_idx_2D[1]];
    430   const HUFF_ICC_TAB_2D *pICC2dTab =
    431       &fdk_sacenc_huffICCTab.h2D[tab_idx_2D[0]][tab_idx_2D[1]];
    432 
    433   switch (lav) {
    434     case 1: {
    435       const LAV1_2D *pLav1 = NULL;
    436       switch (data_type) {
    437         case t_CLD:
    438           pLav1 = NULL;
    439           break;
    440         case t_ICC:
    441           pLav1 = &pICC2dTab->lav1;
    442           break;
    443       }
    444       if (pLav1 != NULL) {
    445         *pEntry = pLav1->entry[in_data[i][0]][in_data[i][1]];
    446         *pEscape = pLav1->escape;
    447       }
    448     } break;
    449     case 3: {
    450       const LAV3_2D *pLav3 = NULL;
    451       switch (data_type) {
    452         case t_CLD:
    453           pLav3 = &pCLD2dTab->lav3;
    454           break;
    455         case t_ICC:
    456           pLav3 = &pICC2dTab->lav3;
    457           break;
    458       }
    459       if (pLav3 != NULL) {
    460         *pEntry = pLav3->entry[in_data[i][0]][in_data[i][1]];
    461         *pEscape = pLav3->escape;
    462       }
    463     } break;
    464     case 5: {
    465       const LAV5_2D *pLav5 = NULL;
    466       switch (data_type) {
    467         case t_CLD:
    468           pLav5 = &pCLD2dTab->lav5;
    469           break;
    470         case t_ICC:
    471           pLav5 = &pICC2dTab->lav5;
    472           break;
    473       }
    474       if (pLav5 != NULL) {
    475         *pEntry = pLav5->entry[in_data[i][0]][in_data[i][1]];
    476         *pEscape = pLav5->escape;
    477       }
    478     } break;
    479     case 7: {
    480       const LAV7_2D *pLav7 = NULL;
    481       switch (data_type) {
    482         case t_CLD:
    483           pLav7 = &pCLD2dTab->lav7;
    484           break;
    485         case t_ICC:
    486           pLav7 = &pICC2dTab->lav7;
    487           break;
    488       }
    489       if (pLav7 != NULL) {
    490         *pEntry = pLav7->entry[in_data[i][0]][in_data[i][1]];
    491         *pEscape = pLav7->escape;
    492       }
    493     } break;
    494     case 9: {
    495       const LAV9_2D *pLav9 = NULL;
    496       switch (data_type) {
    497         case t_CLD:
    498           pLav9 = &pCLD2dTab->lav9;
    499           break;
    500         case t_ICC:
    501           pLav9 = NULL;
    502           break;
    503       }
    504       if (pLav9 != NULL) {
    505         *pEntry = pLav9->entry[in_data[i][0]][in_data[i][1]];
    506         *pEscape = pLav9->escape;
    507       }
    508     } break;
    509   }
    510 }
    511 
    512 static UINT huff_enc_2D(HANDLE_FDK_BITSTREAM strm, const DATA_TYPE data_type,
    513                         SHORT tab_idx_2D[2], SHORT lav_idx, SHORT in_data[][2],
    514                         SHORT num_val, SHORT stride, SHORT *p0_data[2]) {
    515   SHORT i = 0, lav = 0, num_sbits = 0, sym_bits = 0, escIdx = 0;
    516   SHORT esc_data[2][MAXBANDS] = {{0}};
    517 
    518   UINT huffBits = 0;
    519 
    520   const HUFF_ENTRY *pHuffEntry = NULL;
    521 
    522   switch (data_type) {
    523     case t_CLD:
    524       lav = 2 * lav_idx + 3; /* LAV */
    525       pHuffEntry = fdk_sacenc_huffPart0Tab.cld;
    526       break;
    527     case t_ICC:
    528       lav = 2 * lav_idx + 1; /* LAV */
    529       pHuffEntry = fdk_sacenc_huffPart0Tab.icc;
    530       break;
    531   }
    532 
    533   /* Partition 0 */
    534   if (p0_data[0] != NULL) {
    535     HUFF_ENTRY entry = pHuffEntry[*p0_data[0]];
    536     huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry));
    537   }
    538   if (p0_data[1] != NULL) {
    539     HUFF_ENTRY entry = pHuffEntry[*p0_data[1]];
    540     huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry));
    541   }
    542 
    543   for (i = 0; i < num_val; i += stride) {
    544     HUFF_ENTRY entry = {0};
    545     HUFF_ENTRY escape = {0};
    546 
    547     esc_data[0][escIdx] = in_data[i][0] + lav;
    548     esc_data[1][escIdx] = in_data[i][1] + lav;
    549 
    550     num_sbits = sym_check(in_data[i], lav, &sym_bits);
    551 
    552     getHuffEntry(lav, data_type, i, tab_idx_2D, in_data, &entry, &escape);
    553 
    554     huffBits += FDKwriteBits(strm, HUFF_VALUE(entry), HUFF_LENGTH(entry));
    555 
    556     if ((HUFF_VALUE(entry) == HUFF_VALUE(escape)) &&
    557         (HUFF_LENGTH(entry) == HUFF_LENGTH(escape))) {
    558       escIdx++;
    559     } else {
    560       huffBits += FDKwriteBits(strm, sym_bits, num_sbits);
    561     }
    562   } /* for i */
    563 
    564   if (escIdx > 0) {
    565     huffBits += calc_pcm_bits(2 * escIdx, (2 * lav + 1));
    566     if (strm != NULL) {
    567       apply_pcm_coding(strm, esc_data[0], esc_data[1], 0 /*offset*/, 2 * escIdx,
    568                        (2 * lav + 1));
    569     }
    570   }
    571 
    572   return huffBits;
    573 }
    574 
    575 static SCHAR get_next_lav_step(const INT lav, const DATA_TYPE data_type) {
    576   SCHAR lav_step = 0;
    577 
    578   switch (data_type) {
    579     case t_CLD:
    580       lav_step = (lav > 9) ? -1 : lav_step_CLD[lav];
    581       break;
    582     case t_ICC:
    583       lav_step = (lav > 7) ? -1 : lav_step_ICC[lav];
    584       break;
    585   }
    586 
    587   return lav_step;
    588 }
    589 
    590 static INT diff_type_offset(const DIFF_TYPE diff_type) {
    591   int offset = 0;
    592   switch (diff_type) {
    593     case DIFF_FREQ:
    594       offset = 0;
    595       break;
    596     case DIFF_TIME:
    597       offset = 2;
    598       break;
    599   }
    600   return offset;
    601 }
    602 
    603 static SHORT calc_huff_bits(SHORT *in_data_1, SHORT *in_data_2,
    604                             const DATA_TYPE data_type,
    605                             const DIFF_TYPE diff_type_1,
    606                             const DIFF_TYPE diff_type_2, const SHORT num_val,
    607                             SHORT *const lav_idx, SHORT *const cdg_scheme) {
    608   SHORT tab_idx_2D[2][2] = {{0}};
    609   SHORT tab_idx_1D[2] = {0};
    610   SHORT df_rest_flag[2] = {0};
    611   SHORT p0_flag[2] = {0};
    612 
    613   SHORT pair_vec[MAXBANDS][2] = {{0}};
    614 
    615   SHORT *p0_data_1[2] = {NULL};
    616   SHORT *p0_data_2[2] = {NULL};
    617 
    618   SHORT i = 0;
    619   SHORT lav_fp[2] = {0};
    620 
    621   SHORT bit_count_1D = 0;
    622   SHORT bit_count_2D_freq = 0;
    623   SHORT bit_count_min = 0;
    624 
    625   SHORT num_val_1_short = 0;
    626   SHORT num_val_2_short = 0;
    627 
    628   SHORT *in_data_1_short = NULL;
    629   SHORT *in_data_2_short = NULL;
    630 
    631   /* 1D Huffman coding */
    632   bit_count_1D = 1; /* HUFF_1D */
    633 
    634   num_val_1_short = num_val;
    635   num_val_2_short = num_val;
    636 
    637   if (in_data_1 != NULL) {
    638     in_data_1_short = in_data_1 + diff_type_offset(diff_type_1);
    639   }
    640   if (in_data_2 != NULL) {
    641     in_data_2_short = in_data_2 + diff_type_offset(diff_type_2);
    642   }
    643 
    644   p0_flag[0] = (diff_type_1 == DIFF_FREQ);
    645   p0_flag[1] = (diff_type_2 == DIFF_FREQ);
    646 
    647   tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1;
    648   tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1;
    649 
    650   if (in_data_1 != NULL) {
    651     bit_count_1D += huff_enc_1D(NULL, data_type, tab_idx_1D[0], in_data_1_short,
    652                                 num_val_1_short, p0_flag[0]);
    653   }
    654   if (in_data_2 != NULL) {
    655     bit_count_1D += huff_enc_1D(NULL, data_type, tab_idx_1D[1], in_data_2_short,
    656                                 num_val_2_short, p0_flag[1]);
    657   }
    658 
    659   bit_count_min = bit_count_1D;
    660   *cdg_scheme = HUFF_1D << PAIR_SHIFT;
    661   lav_idx[0] = lav_idx[1] = -1;
    662 
    663   /* Huffman 2D frequency pairs */
    664   bit_count_2D_freq = 1; /* HUFF_2D */
    665 
    666   num_val_1_short = num_val;
    667   num_val_2_short = num_val;
    668 
    669   if (in_data_1 != NULL) {
    670     in_data_1_short = in_data_1 + diff_type_offset(diff_type_1);
    671   }
    672   if (in_data_2 != NULL) {
    673     in_data_2_short = in_data_2 + diff_type_offset(diff_type_2);
    674   }
    675 
    676   lav_fp[0] = lav_fp[1] = 0;
    677 
    678   p0_data_1[0] = NULL;
    679   p0_data_1[1] = NULL;
    680   p0_data_2[0] = NULL;
    681   p0_data_2[1] = NULL;
    682 
    683   if (in_data_1 != NULL) {
    684     if (diff_type_1 == DIFF_FREQ) {
    685       p0_data_1[0] = &in_data_1[0];
    686       p0_data_1[1] = NULL;
    687 
    688       num_val_1_short -= 1;
    689       in_data_1_short += 1;
    690     }
    691 
    692     df_rest_flag[0] = num_val_1_short % 2;
    693 
    694     if (df_rest_flag[0]) num_val_1_short -= 1;
    695 
    696     for (i = 0; i < num_val_1_short - 1; i += 2) {
    697       pair_vec[i][0] = in_data_1_short[i];
    698       pair_vec[i][1] = in_data_1_short[i + 1];
    699 
    700       lav_fp[0] = FDKmax(lav_fp[0], fAbs(pair_vec[i][0]));
    701       lav_fp[0] = FDKmax(lav_fp[0], fAbs(pair_vec[i][1]));
    702     }
    703 
    704     tab_idx_2D[0][0] = (diff_type_1 == DIFF_TIME) ? 1 : 0;
    705     tab_idx_2D[0][1] = 0;
    706 
    707     tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1;
    708 
    709     lav_fp[0] = get_next_lav_step(lav_fp[0], data_type);
    710 
    711     if (lav_fp[0] != -1) bit_count_2D_freq += lavHuffLen[lav_fp[0]];
    712   }
    713 
    714   if (in_data_2 != NULL) {
    715     if (diff_type_2 == DIFF_FREQ) {
    716       p0_data_2[0] = NULL;
    717       p0_data_2[1] = &in_data_2[0];
    718 
    719       num_val_2_short -= 1;
    720       in_data_2_short += 1;
    721     }
    722 
    723     df_rest_flag[1] = num_val_2_short % 2;
    724 
    725     if (df_rest_flag[1]) num_val_2_short -= 1;
    726 
    727     for (i = 0; i < num_val_2_short - 1; i += 2) {
    728       pair_vec[i + 1][0] = in_data_2_short[i];
    729       pair_vec[i + 1][1] = in_data_2_short[i + 1];
    730 
    731       lav_fp[1] = FDKmax(lav_fp[1], fAbs(pair_vec[i + 1][0]));
    732       lav_fp[1] = FDKmax(lav_fp[1], fAbs(pair_vec[i + 1][1]));
    733     }
    734 
    735     tab_idx_2D[1][0] = (diff_type_2 == DIFF_TIME) ? 1 : 0;
    736     tab_idx_2D[1][1] = 0;
    737 
    738     tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1;
    739 
    740     lav_fp[1] = get_next_lav_step(lav_fp[1], data_type);
    741 
    742     if (lav_fp[1] != -1) bit_count_2D_freq += lavHuffLen[lav_fp[1]];
    743   }
    744 
    745   if ((lav_fp[0] != -1) && (lav_fp[1] != -1)) {
    746     if (in_data_1 != NULL) {
    747       bit_count_2D_freq +=
    748           huff_enc_2D(NULL, data_type, tab_idx_2D[0], lav_fp[0], pair_vec,
    749                       num_val_1_short, 2, p0_data_1);
    750     }
    751     if (in_data_2 != NULL) {
    752       bit_count_2D_freq +=
    753           huff_enc_2D(NULL, data_type, tab_idx_2D[1], lav_fp[1], pair_vec + 1,
    754                       num_val_2_short, 2, p0_data_2);
    755     }
    756     if (in_data_1 != NULL) {
    757       if (df_rest_flag[0])
    758         bit_count_2D_freq +=
    759             huff_enc_1D(NULL, data_type, tab_idx_1D[0],
    760                         in_data_1_short + num_val_1_short, 1, 0);
    761     }
    762     if (in_data_2 != NULL) {
    763       if (df_rest_flag[1])
    764         bit_count_2D_freq +=
    765             huff_enc_1D(NULL, data_type, tab_idx_1D[1],
    766                         in_data_2_short + num_val_2_short, 1, 0);
    767     }
    768 
    769     if (bit_count_2D_freq < bit_count_min) {
    770       bit_count_min = bit_count_2D_freq;
    771       *cdg_scheme = HUFF_2D << PAIR_SHIFT | FREQ_PAIR;
    772       lav_idx[0] = lav_fp[0];
    773       lav_idx[1] = lav_fp[1];
    774     }
    775   }
    776 
    777   return bit_count_min;
    778 }
    779 
    780 static void apply_huff_coding(HANDLE_FDK_BITSTREAM strm, SHORT *const in_data_1,
    781                               SHORT *const in_data_2, const DATA_TYPE data_type,
    782                               const DIFF_TYPE diff_type_1,
    783                               const DIFF_TYPE diff_type_2, const SHORT num_val,
    784                               const SHORT *const lav_idx,
    785                               const SHORT cdg_scheme) {
    786   SHORT tab_idx_2D[2][2] = {{0}};
    787   SHORT tab_idx_1D[2] = {0};
    788   SHORT df_rest_flag[2] = {0};
    789   SHORT p0_flag[2] = {0};
    790 
    791   SHORT pair_vec[MAXBANDS][2] = {{0}};
    792 
    793   SHORT *p0_data_1[2] = {NULL};
    794   SHORT *p0_data_2[2] = {NULL};
    795 
    796   SHORT i = 0;
    797 
    798   SHORT num_val_1_short = num_val;
    799   SHORT num_val_2_short = num_val;
    800 
    801   SHORT *in_data_1_short = NULL;
    802   SHORT *in_data_2_short = NULL;
    803 
    804   /* Offset */
    805   if (in_data_1 != NULL) {
    806     in_data_1_short = in_data_1 + diff_type_offset(diff_type_1);
    807   }
    808   if (in_data_2 != NULL) {
    809     in_data_2_short = in_data_2 + diff_type_offset(diff_type_2);
    810   }
    811 
    812   /* Signalize coding scheme */
    813   FDKwriteBits(strm, cdg_scheme >> PAIR_SHIFT, 1);
    814 
    815   switch (cdg_scheme >> PAIR_SHIFT) {
    816     case HUFF_1D:
    817 
    818       p0_flag[0] = (diff_type_1 == DIFF_FREQ);
    819       p0_flag[1] = (diff_type_2 == DIFF_FREQ);
    820 
    821       tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1;
    822       tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1;
    823 
    824       if (in_data_1 != NULL) {
    825         huff_enc_1D(strm, data_type, tab_idx_1D[0], in_data_1_short,
    826                     num_val_1_short, p0_flag[0]);
    827       }
    828       if (in_data_2 != NULL) {
    829         huff_enc_1D(strm, data_type, tab_idx_1D[1], in_data_2_short,
    830                     num_val_2_short, p0_flag[1]);
    831       }
    832       break; /* HUFF_1D */
    833 
    834     case HUFF_2D:
    835 
    836       switch (cdg_scheme & PAIR_MASK) {
    837         case FREQ_PAIR:
    838 
    839           if (in_data_1 != NULL) {
    840             if (diff_type_1 == DIFF_FREQ) {
    841               p0_data_1[0] = &in_data_1[0];
    842               p0_data_1[1] = NULL;
    843 
    844               num_val_1_short -= 1;
    845               in_data_1_short += 1;
    846             }
    847 
    848             df_rest_flag[0] = num_val_1_short % 2;
    849 
    850             if (df_rest_flag[0]) num_val_1_short -= 1;
    851 
    852             for (i = 0; i < num_val_1_short - 1; i += 2) {
    853               pair_vec[i][0] = in_data_1_short[i];
    854               pair_vec[i][1] = in_data_1_short[i + 1];
    855             }
    856 
    857             tab_idx_2D[0][0] = (diff_type_1 == DIFF_TIME) ? 1 : 0;
    858             tab_idx_2D[0][1] = 0;
    859 
    860             tab_idx_1D[0] = (diff_type_1 == DIFF_FREQ) ? 0 : 1;
    861           } /* if( in_data_1 != NULL ) */
    862 
    863           if (in_data_2 != NULL) {
    864             if (diff_type_2 == DIFF_FREQ) {
    865               p0_data_2[0] = NULL;
    866               p0_data_2[1] = &in_data_2[0];
    867 
    868               num_val_2_short -= 1;
    869               in_data_2_short += 1;
    870             }
    871 
    872             df_rest_flag[1] = num_val_2_short % 2;
    873 
    874             if (df_rest_flag[1]) num_val_2_short -= 1;
    875 
    876             for (i = 0; i < num_val_2_short - 1; i += 2) {
    877               pair_vec[i + 1][0] = in_data_2_short[i];
    878               pair_vec[i + 1][1] = in_data_2_short[i + 1];
    879             }
    880 
    881             tab_idx_2D[1][0] = (diff_type_2 == DIFF_TIME) ? 1 : 0;
    882             tab_idx_2D[1][1] = 0;
    883 
    884             tab_idx_1D[1] = (diff_type_2 == DIFF_FREQ) ? 0 : 1;
    885           } /* if( in_data_2 != NULL ) */
    886 
    887           if (in_data_1 != NULL) {
    888             FDKwriteBits(strm, lavHuffVal[lav_idx[0]], lavHuffLen[lav_idx[0]]);
    889             huff_enc_2D(strm, data_type, tab_idx_2D[0], lav_idx[0], pair_vec,
    890                         num_val_1_short, 2, p0_data_1);
    891             if (df_rest_flag[0]) {
    892               huff_enc_1D(strm, data_type, tab_idx_1D[0],
    893                           in_data_1_short + num_val_1_short, 1, 0);
    894             }
    895           }
    896           if (in_data_2 != NULL) {
    897             FDKwriteBits(strm, lavHuffVal[lav_idx[1]], lavHuffLen[lav_idx[1]]);
    898             huff_enc_2D(strm, data_type, tab_idx_2D[1], lav_idx[1],
    899                         pair_vec + 1, num_val_2_short, 2, p0_data_2);
    900             if (df_rest_flag[1]) {
    901               huff_enc_1D(strm, data_type, tab_idx_1D[1],
    902                           in_data_2_short + num_val_2_short, 1, 0);
    903             }
    904           }
    905           break; /* FREQ_PAIR */
    906 
    907         case TIME_PAIR:
    908 
    909           if ((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ)) {
    910             p0_data_1[0] = &in_data_1[0];
    911             p0_data_1[1] = &in_data_2[0];
    912 
    913             in_data_1_short += 1;
    914             in_data_2_short += 1;
    915 
    916             num_val_1_short -= 1;
    917           }
    918 
    919           for (i = 0; i < num_val_1_short; i++) {
    920             pair_vec[i][0] = in_data_1_short[i];
    921             pair_vec[i][1] = in_data_2_short[i];
    922           }
    923 
    924           tab_idx_2D[0][0] =
    925               ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) ? 1
    926                                                                          : 0;
    927           tab_idx_2D[0][1] = 1;
    928 
    929           FDKwriteBits(strm, lavHuffVal[lav_idx[0]], lavHuffLen[lav_idx[0]]);
    930 
    931           huff_enc_2D(strm, data_type, tab_idx_2D[0], lav_idx[0], pair_vec,
    932                       num_val_1_short, 1, p0_data_1);
    933 
    934           break; /* TIME_PAIR */
    935       }          /* switch( cdg_scheme & PAIR_MASK ) */
    936 
    937       break; /* HUFF_2D */
    938 
    939     default:
    940       break;
    941   } /* switch( cdg_scheme >> PAIR_SHIFT ) */
    942 }
    943 
    944 INT fdk_sacenc_ecDataPairEnc(HANDLE_FDK_BITSTREAM strm,
    945                              SHORT aaInData[][MAXBANDS],
    946                              SHORT aHistory[MAXBANDS],
    947                              const DATA_TYPE data_type, const INT setIdx,
    948                              const INT startBand, const INT dataBands,
    949                              const INT coarse_flag,
    950                              const INT independency_flag) {
    951   SHORT reset = 0, pb = 0;
    952   SHORT quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
    953 
    954   SHORT splitLsb_flag = 0;
    955   SHORT pcmCoding_flag = 0;
    956 
    957   SHORT allowDiffTimeBack_flag = !independency_flag || (setIdx > 0);
    958 
    959   SHORT num_lsb_bits = -1;
    960   SHORT num_pcm_bits = -1;
    961 
    962   SHORT quant_data_lsb[2][MAXBANDS];
    963   SHORT quant_data_msb[2][MAXBANDS];
    964 
    965   SHORT quant_data_hist_lsb[MAXBANDS];
    966   SHORT quant_data_hist_msb[MAXBANDS];
    967 
    968   SHORT data_diff_freq[2][MAXBANDS];
    969   SHORT data_diff_time[2][MAXBANDS + 2];
    970 
    971   SHORT *p_quant_data_msb[2];
    972   SHORT *p_quant_data_hist_msb = NULL;
    973 
    974   SHORT min_bits_all = 0;
    975   SHORT min_found = 0;
    976 
    977   SHORT min_bits_df_df = -1;
    978   SHORT min_bits_df_dt = -1;
    979   SHORT min_bits_dtbw_df = -1;
    980   SHORT min_bits_dt_dt = -1;
    981 
    982   SHORT lav_df_df[2] = {-1, -1};
    983   SHORT lav_df_dt[2] = {-1, -1};
    984   SHORT lav_dtbw_df[2] = {-1, -1};
    985   SHORT lav_dt_dt[2] = {-1, -1};
    986 
    987   SHORT coding_scheme_df_df = 0;
    988   SHORT coding_scheme_df_dt = 0;
    989   SHORT coding_scheme_dtbw_df = 0;
    990   SHORT coding_scheme_dt_dt = 0;
    991 
    992   switch (data_type) {
    993     case t_CLD:
    994       if (coarse_flag) {
    995         splitLsb_flag = 0;
    996         quant_levels = 15;
    997         quant_offset = 7;
    998       } else {
    999         splitLsb_flag = 0;
   1000         quant_levels = 31;
   1001         quant_offset = 15;
   1002       }
   1003       break;
   1004     case t_ICC:
   1005       if (coarse_flag) {
   1006         splitLsb_flag = 0;
   1007         quant_levels = 4;
   1008         quant_offset = 0;
   1009       } else {
   1010         splitLsb_flag = 0;
   1011         quant_levels = 8;
   1012         quant_offset = 0;
   1013       }
   1014       break;
   1015   } /* switch( data_type ) */
   1016 
   1017   /* Split off LSB */
   1018   if (splitLsb_flag) {
   1019     split_lsb(aaInData[setIdx] + startBand, quant_offset, dataBands,
   1020               quant_data_lsb[0], quant_data_msb[0]);
   1021 
   1022     split_lsb(aaInData[setIdx + 1] + startBand, quant_offset, dataBands,
   1023               quant_data_lsb[1], quant_data_msb[1]);
   1024 
   1025     p_quant_data_msb[0] = quant_data_msb[0];
   1026     p_quant_data_msb[1] = quant_data_msb[1];
   1027 
   1028     num_lsb_bits = 2 * dataBands;
   1029   } else if (quant_offset != 0) {
   1030     for (pb = 0; pb < dataBands; pb++) {
   1031       quant_data_msb[0][pb] = aaInData[setIdx][startBand + pb] + quant_offset;
   1032       quant_data_msb[1][pb] =
   1033           aaInData[setIdx + 1][startBand + pb] + quant_offset;
   1034     }
   1035 
   1036     p_quant_data_msb[0] = quant_data_msb[0];
   1037     p_quant_data_msb[1] = quant_data_msb[1];
   1038 
   1039     num_lsb_bits = 0;
   1040   } else {
   1041     p_quant_data_msb[0] = aaInData[setIdx] + startBand;
   1042     p_quant_data_msb[1] = aaInData[setIdx + 1] + startBand;
   1043 
   1044     num_lsb_bits = 0;
   1045   }
   1046 
   1047   if (allowDiffTimeBack_flag) {
   1048     if (splitLsb_flag) {
   1049       split_lsb(aHistory + startBand, quant_offset, dataBands,
   1050                 quant_data_hist_lsb, quant_data_hist_msb);
   1051 
   1052       p_quant_data_hist_msb = quant_data_hist_msb;
   1053     } else if (quant_offset != 0) {
   1054       for (pb = 0; pb < dataBands; pb++) {
   1055         quant_data_hist_msb[pb] = aHistory[startBand + pb] + quant_offset;
   1056       }
   1057       p_quant_data_hist_msb = quant_data_hist_msb;
   1058     } else {
   1059       p_quant_data_hist_msb = aHistory + startBand;
   1060     }
   1061   }
   1062 
   1063   /* Calculate frequency differences */
   1064   calc_diff_freq(p_quant_data_msb[0], data_diff_freq[0], dataBands);
   1065 
   1066   calc_diff_freq(p_quant_data_msb[1], data_diff_freq[1], dataBands);
   1067 
   1068   /* Calculate time differences */
   1069   if (allowDiffTimeBack_flag) {
   1070     calc_diff_time(p_quant_data_msb[0], p_quant_data_hist_msb,
   1071                    data_diff_time[0], dataBands);
   1072   }
   1073 
   1074   calc_diff_time(p_quant_data_msb[1], p_quant_data_msb[0], data_diff_time[1],
   1075                  dataBands);
   1076 
   1077   /* Calculate coding scheme with minumum bit consumption */
   1078 
   1079   /**********************************************************/
   1080   num_pcm_bits = calc_pcm_bits(2 * dataBands, quant_levels);
   1081   num_pcm_val = 2 * dataBands;
   1082 
   1083   /**********************************************************/
   1084 
   1085   min_bits_all = num_pcm_bits;
   1086 
   1087   /**********************************************************/
   1088   /**********************************************************/
   1089 
   1090   /**********************************************************/
   1091   min_bits_df_df =
   1092       calc_huff_bits(data_diff_freq[0], data_diff_freq[1], data_type, DIFF_FREQ,
   1093                      DIFF_FREQ, dataBands, lav_df_df, &coding_scheme_df_df);
   1094 
   1095   min_bits_df_df += 2;
   1096 
   1097   min_bits_df_df += num_lsb_bits;
   1098 
   1099   if (min_bits_df_df < min_bits_all) {
   1100     min_bits_all = min_bits_df_df;
   1101   }
   1102   /**********************************************************/
   1103 
   1104   /**********************************************************/
   1105   min_bits_df_dt =
   1106       calc_huff_bits(data_diff_freq[0], data_diff_time[1], data_type, DIFF_FREQ,
   1107                      DIFF_TIME, dataBands, lav_df_dt, &coding_scheme_df_dt);
   1108 
   1109   min_bits_df_dt += 2;
   1110 
   1111   min_bits_df_dt += num_lsb_bits;
   1112 
   1113   if (min_bits_df_dt < min_bits_all) {
   1114     min_bits_all = min_bits_df_dt;
   1115   }
   1116   /**********************************************************/
   1117 
   1118   /**********************************************************/
   1119   /**********************************************************/
   1120 
   1121   if (allowDiffTimeBack_flag) {
   1122     /**********************************************************/
   1123     min_bits_dtbw_df = calc_huff_bits(
   1124         data_diff_time[0], data_diff_freq[1], data_type, DIFF_TIME, DIFF_FREQ,
   1125         dataBands, lav_dtbw_df, &coding_scheme_dtbw_df);
   1126 
   1127     min_bits_dtbw_df += 2;
   1128 
   1129     min_bits_dtbw_df += num_lsb_bits;
   1130 
   1131     if (min_bits_dtbw_df < min_bits_all) {
   1132       min_bits_all = min_bits_dtbw_df;
   1133     }
   1134     /**********************************************************/
   1135 
   1136     /**********************************************************/
   1137     min_bits_dt_dt = calc_huff_bits(data_diff_time[0], data_diff_time[1],
   1138                                     data_type, DIFF_TIME, DIFF_TIME, dataBands,
   1139                                     lav_dt_dt, &coding_scheme_dt_dt);
   1140 
   1141     min_bits_dt_dt += 2;
   1142 
   1143     min_bits_dt_dt += num_lsb_bits;
   1144 
   1145     if (min_bits_dt_dt < min_bits_all) {
   1146       min_bits_all = min_bits_dt_dt;
   1147     }
   1148     /**********************************************************/
   1149 
   1150   } /* if( allowDiffTimeBack_flag ) */
   1151 
   1152   /***************************/
   1153   /* Start actual coding now */
   1154   /***************************/
   1155 
   1156   /* PCM or Diff/Huff Coding? */
   1157   pcmCoding_flag = (min_bits_all == num_pcm_bits);
   1158 
   1159   FDKwriteBits(strm, pcmCoding_flag, 1);
   1160 
   1161   if (pcmCoding_flag) {
   1162     /* Grouped PCM Coding */
   1163     apply_pcm_coding(strm, aaInData[setIdx] + startBand,
   1164                      aaInData[setIdx + 1] + startBand, quant_offset,
   1165                      num_pcm_val, quant_levels);
   1166   } else {
   1167     /* Diff/Huff Coding */
   1168 
   1169     min_found = 0;
   1170 
   1171     /*******************************************/
   1172     if (min_bits_all == min_bits_df_df) {
   1173       FDKwriteBits(strm, DIFF_FREQ, 1);
   1174       FDKwriteBits(strm, DIFF_FREQ, 1);
   1175 
   1176       apply_huff_coding(strm, data_diff_freq[0], data_diff_freq[1], data_type,
   1177                         DIFF_FREQ, DIFF_FREQ, dataBands, lav_df_df,
   1178                         coding_scheme_df_df);
   1179 
   1180       min_found = 1;
   1181     }
   1182     /*******************************************/
   1183 
   1184     /*******************************************/
   1185     if (!min_found && (min_bits_all == min_bits_df_dt)) {
   1186       FDKwriteBits(strm, DIFF_FREQ, 1);
   1187       FDKwriteBits(strm, DIFF_TIME, 1);
   1188 
   1189       apply_huff_coding(strm, data_diff_freq[0], data_diff_time[1], data_type,
   1190                         DIFF_FREQ, DIFF_TIME, dataBands, lav_df_dt,
   1191                         coding_scheme_df_dt);
   1192 
   1193       min_found = 1;
   1194     }
   1195     /*******************************************/
   1196 
   1197     /*******************************************/
   1198     /*******************************************/
   1199 
   1200     if (allowDiffTimeBack_flag) {
   1201       /*******************************************/
   1202       if (!min_found && (min_bits_all == min_bits_dtbw_df)) {
   1203         FDKwriteBits(strm, DIFF_TIME, 1);
   1204         FDKwriteBits(strm, DIFF_FREQ, 1);
   1205 
   1206         apply_huff_coding(strm, data_diff_time[0], data_diff_freq[1], data_type,
   1207                           DIFF_TIME, DIFF_FREQ, dataBands, lav_dtbw_df,
   1208                           coding_scheme_dtbw_df);
   1209 
   1210         min_found = 1;
   1211       }
   1212       /*******************************************/
   1213 
   1214       /*******************************************/
   1215       if (!min_found && (min_bits_all == min_bits_dt_dt)) {
   1216         FDKwriteBits(strm, DIFF_TIME, 1);
   1217         FDKwriteBits(strm, DIFF_TIME, 1);
   1218 
   1219         apply_huff_coding(strm, data_diff_time[0], data_diff_time[1], data_type,
   1220                           DIFF_TIME, DIFF_TIME, dataBands, lav_dt_dt,
   1221                           coding_scheme_dt_dt);
   1222       }
   1223       /*******************************************/
   1224 
   1225     } /* if( allowDiffTimeBack_flag ) */
   1226 
   1227     /* LSB coding */
   1228     if (splitLsb_flag) {
   1229       apply_lsb_coding(strm, quant_data_lsb[0], 1, dataBands);
   1230 
   1231       apply_lsb_coding(strm, quant_data_lsb[1], 1, dataBands);
   1232     }
   1233 
   1234   } /* Diff/Huff/LSB coding */
   1235 
   1236   return reset;
   1237 }
   1238 
   1239 INT fdk_sacenc_ecDataSingleEnc(HANDLE_FDK_BITSTREAM strm,
   1240                                SHORT aaInData[][MAXBANDS],
   1241                                SHORT aHistory[MAXBANDS],
   1242                                const DATA_TYPE data_type, const INT setIdx,
   1243                                const INT startBand, const INT dataBands,
   1244                                const INT coarse_flag,
   1245                                const INT independency_flag) {
   1246   SHORT reset = 0, pb = 0;
   1247   SHORT quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
   1248 
   1249   SHORT splitLsb_flag = 0;
   1250   SHORT pcmCoding_flag = 0;
   1251 
   1252   SHORT allowDiffTimeBack_flag = !independency_flag || (setIdx > 0);
   1253 
   1254   SHORT num_lsb_bits = -1;
   1255   SHORT num_pcm_bits = -1;
   1256 
   1257   SHORT quant_data_lsb[MAXBANDS];
   1258   SHORT quant_data_msb[MAXBANDS];
   1259 
   1260   SHORT quant_data_hist_lsb[MAXBANDS];
   1261   SHORT quant_data_hist_msb[MAXBANDS];
   1262 
   1263   SHORT data_diff_freq[MAXBANDS];
   1264   SHORT data_diff_time[MAXBANDS + 2];
   1265 
   1266   SHORT *p_quant_data_msb;
   1267   SHORT *p_quant_data_hist_msb = NULL;
   1268 
   1269   SHORT min_bits_all = 0;
   1270   SHORT min_found = 0;
   1271 
   1272   SHORT min_bits_df = -1;
   1273   SHORT min_bits_dt = -1;
   1274 
   1275   SHORT lav_df[2] = {-1, -1};
   1276   SHORT lav_dt[2] = {-1, -1};
   1277 
   1278   SHORT coding_scheme_df = 0;
   1279   SHORT coding_scheme_dt = 0;
   1280 
   1281   switch (data_type) {
   1282     case t_CLD:
   1283       if (coarse_flag) {
   1284         splitLsb_flag = 0;
   1285         quant_levels = 15;
   1286         quant_offset = 7;
   1287       } else {
   1288         splitLsb_flag = 0;
   1289         quant_levels = 31;
   1290         quant_offset = 15;
   1291       }
   1292       break;
   1293     case t_ICC:
   1294       if (coarse_flag) {
   1295         splitLsb_flag = 0;
   1296         quant_levels = 4;
   1297         quant_offset = 0;
   1298       } else {
   1299         splitLsb_flag = 0;
   1300         quant_levels = 8;
   1301         quant_offset = 0;
   1302       }
   1303       break;
   1304   } /* switch( data_type ) */
   1305 
   1306   /* Split off LSB */
   1307   if (splitLsb_flag) {
   1308     split_lsb(aaInData[setIdx] + startBand, quant_offset, dataBands,
   1309               quant_data_lsb, quant_data_msb);
   1310 
   1311     p_quant_data_msb = quant_data_msb;
   1312     num_lsb_bits = dataBands;
   1313   } else if (quant_offset != 0) {
   1314     for (pb = 0; pb < dataBands; pb++) {
   1315       quant_data_msb[pb] = aaInData[setIdx][startBand + pb] + quant_offset;
   1316     }
   1317 
   1318     p_quant_data_msb = quant_data_msb;
   1319     num_lsb_bits = 0;
   1320   } else {
   1321     p_quant_data_msb = aaInData[setIdx] + startBand;
   1322     num_lsb_bits = 0;
   1323   }
   1324 
   1325   if (allowDiffTimeBack_flag) {
   1326     if (splitLsb_flag) {
   1327       split_lsb(aHistory + startBand, quant_offset, dataBands,
   1328                 quant_data_hist_lsb, quant_data_hist_msb);
   1329 
   1330       p_quant_data_hist_msb = quant_data_hist_msb;
   1331     } else if (quant_offset != 0) {
   1332       for (pb = 0; pb < dataBands; pb++) {
   1333         quant_data_hist_msb[pb] = aHistory[startBand + pb] + quant_offset;
   1334       }
   1335       p_quant_data_hist_msb = quant_data_hist_msb;
   1336     } else {
   1337       p_quant_data_hist_msb = aHistory + startBand;
   1338     }
   1339   }
   1340 
   1341   /* Calculate frequency differences */
   1342   calc_diff_freq(p_quant_data_msb, data_diff_freq, dataBands);
   1343 
   1344   /* Calculate time differences */
   1345   if (allowDiffTimeBack_flag) {
   1346     calc_diff_time(p_quant_data_msb, p_quant_data_hist_msb, data_diff_time,
   1347                    dataBands);
   1348   }
   1349 
   1350   /* Calculate coding scheme with minumum bit consumption */
   1351 
   1352   /**********************************************************/
   1353   num_pcm_bits = calc_pcm_bits(dataBands, quant_levels);
   1354   num_pcm_val = dataBands;
   1355 
   1356   /**********************************************************/
   1357 
   1358   min_bits_all = num_pcm_bits;
   1359 
   1360   /**********************************************************/
   1361   /**********************************************************/
   1362 
   1363   /**********************************************************/
   1364   min_bits_df = calc_huff_bits(data_diff_freq, NULL, data_type, DIFF_FREQ,
   1365                                DIFF_FREQ, dataBands, lav_df, &coding_scheme_df);
   1366 
   1367   if (allowDiffTimeBack_flag) min_bits_df += 1;
   1368 
   1369   min_bits_df += num_lsb_bits;
   1370 
   1371   if (min_bits_df < min_bits_all) {
   1372     min_bits_all = min_bits_df;
   1373   }
   1374   /**********************************************************/
   1375 
   1376   /**********************************************************/
   1377   if (allowDiffTimeBack_flag) {
   1378     min_bits_dt =
   1379         calc_huff_bits(data_diff_time, NULL, data_type, DIFF_TIME, DIFF_TIME,
   1380                        dataBands, lav_dt, &coding_scheme_dt);
   1381 
   1382     min_bits_dt += 1;
   1383     min_bits_dt += num_lsb_bits;
   1384 
   1385     if (min_bits_dt < min_bits_all) {
   1386       min_bits_all = min_bits_dt;
   1387     }
   1388   } /* if( allowDiffTimeBack_flag ) */
   1389 
   1390   /***************************/
   1391   /* Start actual coding now */
   1392   /***************************/
   1393 
   1394   /* PCM or Diff/Huff Coding? */
   1395   pcmCoding_flag = (min_bits_all == num_pcm_bits);
   1396 
   1397   FDKwriteBits(strm, pcmCoding_flag, 1);
   1398 
   1399   if (pcmCoding_flag) {
   1400     /* Grouped PCM Coding */
   1401     apply_pcm_coding(strm, aaInData[setIdx] + startBand, NULL, quant_offset,
   1402                      num_pcm_val, quant_levels);
   1403   } else {
   1404     /* Diff/Huff Coding */
   1405 
   1406     min_found = 0;
   1407 
   1408     /*******************************************/
   1409     if (min_bits_all == min_bits_df) {
   1410       if (allowDiffTimeBack_flag) {
   1411         FDKwriteBits(strm, DIFF_FREQ, 1);
   1412       }
   1413 
   1414       apply_huff_coding(strm, data_diff_freq, NULL, data_type, DIFF_FREQ,
   1415                         DIFF_FREQ, dataBands, lav_df, coding_scheme_df);
   1416 
   1417       min_found = 1;
   1418     } /* if( min_bits_all == min_bits_df ) */
   1419     /*******************************************/
   1420 
   1421     /*******************************************/
   1422     if (allowDiffTimeBack_flag) {
   1423       /*******************************************/
   1424       if (!min_found && (min_bits_all == min_bits_dt)) {
   1425         FDKwriteBits(strm, DIFF_TIME, 1);
   1426 
   1427         apply_huff_coding(strm, data_diff_time, NULL, data_type, DIFF_TIME,
   1428                           DIFF_TIME, dataBands, lav_dt, coding_scheme_dt);
   1429       }
   1430       /*******************************************/
   1431 
   1432     } /* if( allowDiffTimeBack_flag ) */
   1433 
   1434     /* LSB coding */
   1435     if (splitLsb_flag) {
   1436       apply_lsb_coding(strm, quant_data_lsb, 1, dataBands);
   1437     }
   1438 
   1439   } /* Diff/Huff/LSB coding */
   1440 
   1441   return reset;
   1442 }
   1443