/******************************************************************************
 *                                                                            *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#include "ixheaacd_sbr_common.h"
#include <ixheaacd_type_def.h>

#include "ixheaacd_constants.h"
#include <ixheaacd_basic_ops32.h>
#include <ixheaacd_basic_ops16.h>
#include <ixheaacd_basic_ops40.h>
#include "ixheaacd_basic_ops.h"
#include "ixheaacd_common_rom.h"
#include "ixheaacd_basic_funcs.h"
#include "ixheaacd_defines.h"
#include <ixheaacd_aac_rom.h>
#include "ixheaacd_bitbuffer.h"
#include "ixheaacd_intrinsics.h"
#include "ixheaacd_pulsedata.h"

#include "ixheaacd_pns.h"
#include "ixheaacd_drc_data_struct.h"

#include "ixheaacd_lt_predict.h"

#include "ixheaacd_channelinfo.h"
#include "ixheaacd_drc_dec.h"

#include "ixheaacd_block.h"
#include "ixheaacd_channel.h"

#include <ixheaacd_basic_op.h>

#include "ixheaacd_tns.h"
#include "ixheaacd_sbrdecoder.h"
#include "ixheaacd_error_codes.h"

#include "ixheaacd_audioobjtypes.h"
#include "ixheaacd_latmdemux.h"

#include "ixheaacd_aacdec.h"

static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) {
  WORD32 out_val;

  b = ((UWORD32)(b << 24) >> 24);
  if (b >= 31) {
    if (a < 0)
      out_val = -1;
    else
      out_val = 0;
  } else {
    a += (1 << (b - 1));
    out_val = (WORD32)a >> b;
  }

  return out_val;
}

static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_drc(WORD32 a, WORD16 b) {
  WORD32 result;
  WORD64 temp_result;

  temp_result = (WORD64)a * (WORD64)b;

  if (temp_result < (WORD64)MIN_32)
    result = MIN_32;

  else if (temp_result > (WORD64)MAX_32)
    result = MAX_32;

  else
    result = (WORD32)(temp_result);

  return (result);
}
static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_drc(WORD32 a, WORD32 b,
                                                        WORD16 c) {
  WORD32 acc;

  acc = ixheaacd_mult32x16in32_drc(b, c);

  acc = ixheaacd_add32_sat(a, acc);

  return acc;
}

WORD32 ixheaacd_cnt_leading_ones(WORD32 a);

VOID ixheaacd_huff_sfb_table(WORD32 it_bit_buff, WORD16 *huff_index,
                             WORD32 *len, const UWORD16 *code_book_tbl,
                             const UWORD32 *idx_table) {
  UWORD32 temp = 0;
  UWORD32 temp1 = 0;
  WORD32 found = 0;
  UWORD32 mask = 0x80000000;

  WORD32 leading_ones;
  WORD32 max_len;
  WORD32 ixheaacd_drc_offset = 0;
  WORD32 length;
  UWORD32 code_word;
  WORD32 len_end;

  max_len = code_book_tbl[0];
  mask = mask - (1 << (31 - max_len));
  mask = mask << 1;

  temp = (UWORD32)((it_bit_buff & mask));

  len_end = code_book_tbl[0];
  leading_ones = ixheaacd_cnt_leading_ones(temp);
  do {
    ixheaacd_drc_offset = (idx_table[leading_ones] >> 20) & 0x1ff;
    length = code_book_tbl[ixheaacd_drc_offset + 1] & 0x1f;
    code_word = idx_table[leading_ones] & 0xfffff;
    temp1 = temp >> (32 - length);
    if (temp1 <= code_word) {
      ixheaacd_drc_offset = ixheaacd_drc_offset - (code_word - temp1);
      found = 1;
    } else {
      len_end = len_end + ((idx_table[leading_ones] >> 29) & 0x7);
      leading_ones = len_end;
    }
  } while (!found);
  *huff_index = code_book_tbl[ixheaacd_drc_offset + 1] >> 5;
  *len = length;
}

VOID ixheaacd_inverse_quantize(WORD32 *x_invquant, WORD no_band,
                               WORD32 *ixheaacd_pow_table_Q13,
                               WORD8 *scratch_in) {
  WORD32 j;
  WORD32 temp;
  WORD32 q_abs;

  for (j = no_band - 1; j >= 0; j--) {
    q_abs = *scratch_in++;
    temp = (ixheaacd_pow_table_Q13[q_abs]);
    *x_invquant++ = -temp;
  }
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word1(
    ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
    WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
    WORD32 *ixheaacd_pow_table_Q13, const UWORD32 *idx_table) {
  WORD32 sp1, sp2;
  WORD32 flush_cw;
  WORD32 i, value, norm_val, off;
  WORD idx, grp_idx;
  WORD32 out1, out2;
  WORD32 err_code = 0;
  WORD len_idx = 0;
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD16 index;
  WORD32 length;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;

  do {
    len_idx = offsets[1] - offsets[0];
    grp_idx = group_len;

    do {
      spec_coef = spec_coef + offsets[0];
      idx = len_idx;
      do {
        {
          UWORD32 read_word1;

          read_word1 = read_word << bit_pos;
          ixheaacd_huff_sfb_table(read_word1, &index, &length, code_book_tbl,
                                  idx_table);
          bit_pos += length;
          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);
        }

        out1 = index / 17;
        out2 = index - out1 * 17;
        flush_cw = read_word << bit_pos;

        sp1 = out1;
        sp2 = out2;

        if (out1) {
          if (flush_cw & 0x80000000) {
            out1 = -out1;
          }
          bit_pos++;
          flush_cw = (WORD32)flush_cw << 1;
        }

        if (out2) {
          bit_pos++;
          if (flush_cw & 0x80000000) {
            out2 = -out2;
          }
        }
        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                    it_bit_buff->ptr_bit_buf_end);

        if (sp1 == 16) {
          i = 4;
          value = ixheaacd_extu(read_word, bit_pos, 23);
          value = value | 0xfffffe00;
          norm_val = ixheaacd_norm32(value);

          i += (norm_val - 22);
          bit_pos += (norm_val - 21);
          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);

          off = ixheaacd_extu(read_word, bit_pos, 32 - i);

          bit_pos += i;

          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);
          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);

          i = off + ((WORD32)1 << i);

          if (i <= IQ_TABLE_SIZE_HALF)
            i = ixheaacd_pow_table_Q13[i];
          else {
            err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13);
          }

          if (out1 < 0) {
            out1 = -i;
          } else {
            out1 = i;
          }
          *spec_coef++ = out1;
        } else {
          if (out1 <= 0) {
            out1 = -out1;
            out1 = ixheaacd_pow_table_Q13[out1];
            *spec_coef++ = -out1;
          } else {
            out1 = ixheaacd_pow_table_Q13[out1];
            *spec_coef++ = out1;
          }
        }

        if (sp2 == 16) {
          i = 4;
          value = ixheaacd_extu(read_word, bit_pos, 23);
          value = value | 0xfffffe00;
          norm_val = ixheaacd_norm32(value);

          i += (norm_val - 22);

          bit_pos += (norm_val - 21);
          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);

          off = ixheaacd_extu(read_word, bit_pos, 32 - i);

          bit_pos += i;

          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);
          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                      it_bit_buff->ptr_bit_buf_end);

          i = off + ((WORD32)1 << i);

          if (i <= IQ_TABLE_SIZE_HALF)
            i = ixheaacd_pow_table_Q13[i];
          else {
            err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13);
          }

          if (out2 < 0) {
            out2 = -i;
          } else {
            out2 = i;
          }
          *spec_coef++ = out2;
        } else {
          if (out2 <= 0) {
            out2 = -out2;
            out2 = ixheaacd_pow_table_Q13[out2];
            *spec_coef++ = -out2;
          } else {
            out2 = ixheaacd_pow_table_Q13[out2];
            *spec_coef++ = out2;
          }
        }

        idx -= 2;
      } while (idx != 0);

      spec_coef += (MAX_BINS_SHORT - offsets[1]);
      grp_idx--;
    } while (grp_idx != 0);

    offsets++;
    spec_coef -= (MAX_BINS_SHORT * group_len);
    no_bands--;
  } while (no_bands >= 0);

  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);

  it_bit_buff->bit_pos = bit_pos;
  it_bit_buff->ptr_read_next = ptr_read_next;

  return err_code;
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_11(
    ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl,
    WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch,
    const UWORD32 *idx_table) {
  WORD32 sp1, sp2;
  WORD32 flush_cw;
  WORD32 i, value, norm_val, off;
  WORD idx;
  WORD32 out1, out2;
  WORD32 err_code = 0;
  WORD16 index;
  WORD32 length;
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;

  for (idx = width; idx != 0; idx -= 2) {
    {
      UWORD32 read_word1;

      read_word1 = read_word << bit_pos;
      ixheaacd_huff_sfb_table(read_word1, &index, &length, code_book_tbl,
                              idx_table);
      bit_pos += length;
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);
    }

    flush_cw = read_word << bit_pos;
    out1 = index / 17;
    out2 = index - out1 * 17;
    sp1 = out1;

    if (out1) {
      if (flush_cw & 0x80000000) {
        out1 = -out1;
      }

      bit_pos++;
      flush_cw = (WORD32)flush_cw << 1;
    }

    sp2 = out2;
    if (out2) {
      bit_pos++;
      if (flush_cw & 0x80000000) {
        out2 = -out2;
      }
    }

    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                it_bit_buff->ptr_bit_buf_end);

    if (sp1 == 16) {
      i = 4;
      value = ixheaacd_extu(read_word, bit_pos, 23);
      value = value | 0xfffffe00;
      norm_val = ixheaacd_norm32(value);
      i += (norm_val - 22);
      bit_pos += (norm_val - 21);

      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);

      off = ixheaacd_extu(read_word, bit_pos, 32 - i);

      bit_pos += i;
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);

      value = *ptr_scratch++;

      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);
      i = off + ((WORD32)1 << i);
      i += value;

      if (i <= IQ_TABLE_SIZE_HALF)
        i = ixheaacd_pow_table_Q13[i];
      else {
        err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13);
      }
      if (out1 < 0) {
        i = -i;
      }
      *x_invquant++ = i;
    } else {
      WORD8 temp = *ptr_scratch++;
      if (out1 <= 0) {
        out1 = temp - out1;
        out1 = ixheaacd_pow_table_Q13[out1];
        *x_invquant++ = -out1;
      } else {
        out1 += temp;
        out1 = ixheaacd_pow_table_Q13[out1];
        *x_invquant++ = out1;
      }
    }

    if (sp2 == 16) {
      i = 4;
      value = ixheaacd_extu(read_word, bit_pos, 23);
      value = value | 0xfffffe00;
      norm_val = ixheaacd_norm32(value);

      i += (norm_val - 22);

      bit_pos += (norm_val - 21);
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);

      off = ixheaacd_extu(read_word, bit_pos, 32 - i);

      bit_pos += i;
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);
      value = *ptr_scratch++;
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);

      i = off + ((WORD32)1 << i);
      i += value;
      if (i <= IQ_TABLE_SIZE_HALF)
        i = ixheaacd_pow_table_Q13[i];
      else {
        err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13);
      }

      if (out2 < 0) {
        i = -i;
      }
      *x_invquant++ = i;

    } else {
      WORD8 temp = *ptr_scratch++;
      if (out2 <= 0) {
        out2 = temp - out2;
        out2 = ixheaacd_pow_table_Q13[out2];
        *x_invquant++ = -out2;
      } else {
        out2 += temp;
        out2 = ixheaacd_pow_table_Q13[out2];
        *x_invquant++ = out2;
      }
    }
  }
  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);

  it_bit_buff->ptr_read_next = ptr_read_next;
  it_bit_buff->bit_pos = bit_pos;

  return err_code;
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_quad(
    ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
    WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
    WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table) {
  WORD idx, grp_idx;
  WORD idx_len;
  WORD32 *spec_orig;
  WORD16 index, length;
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;
  spec_orig = spec_coef;
  do {
    idx_len = offsets[1] - offsets[0];
    grp_idx = group_len;

    do {
      spec_coef = spec_coef + offsets[0];
      idx = idx_len;
      do {
        UWORD32 read_word1;

        read_word1 = read_word << bit_pos;
        ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl,
                                idx_table);
        bit_pos += length;
        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                    it_bit_buff->ptr_bit_buf_end);
        if (tbl_sign) {
          WORD32 temp_word;
          WORD32 w, x, y, z;
          temp_word = read_word << bit_pos;
          w = index / 27;
          index = index - w * 27;
          x = index / 9;
          index = index - x * 9;
          y = index / 3;
          z = index - y * 3;
          if (w) {
            w = ixheaacd_pow_table_Q13[w];
            if (temp_word & 0x80000000) w = -w;
            temp_word <<= 1;
            bit_pos++;
          }
          *spec_coef++ = w;

          if (x) {
            x = ixheaacd_pow_table_Q13[x];
            if (temp_word & 0x80000000) x = -x;
            temp_word <<= 1;
            bit_pos++;
          }
          *spec_coef++ = x;
          if (y) {
            y = ixheaacd_pow_table_Q13[y];
            if (temp_word & 0x80000000) y = -y;
            temp_word <<= 1;
            bit_pos++;
          }
          *spec_coef++ = y;
          if (z) {
            z = ixheaacd_pow_table_Q13[z];
            if (temp_word & 0x80000000) z = -z;
            temp_word <<= 1;
            bit_pos++;
          }
          *spec_coef++ = z;

        }

        else {
          WORD32 w, x, y, z;

          w = index / 27 - 1;
          index = index - (w + 1) * 27;
          x = index / 9 - 1;
          index = index - (x + 1) * 9;
          y = index / 3 - 1;
          z = index - ((y + 1) * 3) - 1;
          if (w < 0) {
            w = -w;
            w = ixheaacd_pow_table_Q13[w];
            w = -w;
          } else
            w = ixheaacd_pow_table_Q13[w];

          *spec_coef++ = w;

          if (x < 0) {
            x = -x;
            x = ixheaacd_pow_table_Q13[x];
            x = -x;
          } else
            x = ixheaacd_pow_table_Q13[x];

          *spec_coef++ = x;

          if (y < 0) {
            y = -y;
            y = ixheaacd_pow_table_Q13[y];
            y = -y;
          } else
            y = ixheaacd_pow_table_Q13[y];

          *spec_coef++ = y;

          if (z < 0) {
            z = -z;
            z = ixheaacd_pow_table_Q13[z];
            z = -z;
          } else
            z = ixheaacd_pow_table_Q13[z];

          *spec_coef++ = z;
        }

        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                    it_bit_buff->ptr_bit_buf_end);
        idx -= 4;
      } while (idx != 0);

      spec_coef += (MAX_BINS_SHORT - offsets[1]);
      grp_idx--;
    } while (grp_idx != 0);
    offsets++;
    spec_coef = spec_orig;
    no_bands--;
  } while (no_bands >= 0);

  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);
  it_bit_buff->ptr_read_next = ptr_read_next;
  it_bit_buff->bit_pos = bit_pos;

  return 0;
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_quad(
    ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl,
    WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch,
    WORD32 tbl_sign, const UWORD32 *idx_table) {
  WORD idx;
  WORD16 index, length;
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;

  for (idx = width; idx != 0; idx -= 4) {
    WORD32 ampres, ampres1;
    WORD32 ampres2, ampres3;
    UWORD32 read_word1;

    read_word1 = read_word << bit_pos;
    ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl,
                            idx_table);
    bit_pos += length;
    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                it_bit_buff->ptr_bit_buf_end);
    if (tbl_sign) {
      WORD32 w, x, y, z;
      WORD32 ampout0, ampout1, ampout2, ampout3;
      WORD32 temp_word;
      temp_word = read_word << bit_pos;

      w = index / 27;
      index = index - w * 27;
      x = index / 9;
      index = index - x * 9;
      y = index / 3;
      z = index - y * 3;

      ampout0 = w + *ptr_scratch++;
      ampout0 = ixheaacd_pow_table_Q13[ampout0];

      if (w) {
        if (temp_word & 0x80000000) {
          ampout0 = -ampout0;
        }
        temp_word = temp_word << 1;
        bit_pos++;
      } else {
        ampout0 = -ampout0;
      }

      ampout1 = x + *ptr_scratch++;
      ampout1 = ixheaacd_pow_table_Q13[ampout1];

      if (x) {
        if (temp_word & 0x80000000) {
          ampout1 = -ampout1;
        }
        temp_word = temp_word << 1;
        bit_pos++;
      } else {
        ampout1 = -ampout1;
      }

      ampout2 = y + *ptr_scratch++;
      ampout2 = ixheaacd_pow_table_Q13[ampout2];

      if (y) {
        if (temp_word & 0x80000000) {
          ampout2 = -ampout2;
        }
        temp_word = temp_word << 1;
        bit_pos++;
      } else {
        ampout2 = -ampout2;
      }

      ampout3 = z + *ptr_scratch++;
      ampout3 = ixheaacd_pow_table_Q13[ampout3];

      if (z) {
        if (temp_word & 0x80000000) {
          ampout3 = -ampout3;
        }
        temp_word = temp_word << 1;
        bit_pos++;
      } else {
        ampout3 = -ampout3;
      }
      *x_invquant++ = ampout0;
      *x_invquant++ = ampout1;
      *x_invquant++ = ampout2;
      *x_invquant++ = ampout3;
    } else {
      WORD32 w, x, y, z;
      ampres = *ptr_scratch++;
      ampres1 = *ptr_scratch++;
      ampres2 = *ptr_scratch++;
      ampres3 = *ptr_scratch++;

      w = index / 27 - 1;
      index = index - (w + 1) * 27;
      x = index / 9 - 1;
      index = index - (x + 1) * 9;
      y = index / 3 - 1;
      z = index - ((y + 1) * 3) - 1;
      if (w <= 0) {
        ampres = ampres - w;
        ampres = ixheaacd_pow_table_Q13[ampres];
        ampres = -ampres;
      } else {
        ampres += w;
        ampres = ixheaacd_pow_table_Q13[ampres];
      }

      if (x <= 0) {
        ampres1 = ampres1 - x;
        ampres1 = ixheaacd_pow_table_Q13[ampres1];
        ampres1 = -ampres1;
      } else {
        ampres1 += x;
        ampres1 = ixheaacd_pow_table_Q13[ampres1];
      }

      if (y <= 0) {
        ampres2 = ampres2 - y;
        ampres2 = ixheaacd_pow_table_Q13[ampres2];
        ampres2 = -ampres2;
      } else {
        ampres2 += y;
        ampres2 = ixheaacd_pow_table_Q13[ampres2];
      }

      if (z <= 0) {
        ampres3 = ampres3 - z;
        ampres3 = ixheaacd_pow_table_Q13[ampres3];
        ampres3 = -ampres3;
      } else {
        ampres3 += z;
        ampres3 = ixheaacd_pow_table_Q13[ampres3];
      }

      *x_invquant++ = ampres;
      *x_invquant++ = ampres1;
      *x_invquant++ = ampres2;
      *x_invquant++ = ampres3;
    }

    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                it_bit_buff->ptr_bit_buf_end);
  }

  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);
  it_bit_buff->ptr_read_next = ptr_read_next;
  it_bit_buff->bit_pos = bit_pos;

  return 0;
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_pair(
    ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
    WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
    WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table,
    WORD32 huff_mode)

{
  WORD idx, grp_idx;
  WORD len_idx;
  WORD16 index, length;
  WORD32 y, z;
  WORD32 *spec_orig = spec_coef;

  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;

  do {
    len_idx = offsets[1] - offsets[0];
    grp_idx = group_len;
    do {
      spec_coef += offsets[0];
      idx = len_idx;
      do {
        UWORD32 read_word1;
        read_word1 = read_word << bit_pos;
        ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl,
                                idx_table);
        bit_pos += length;
        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                    it_bit_buff->ptr_bit_buf_end);
        if (tbl_sign) {
          WORD32 temp_word;
          temp_word = read_word << bit_pos;
          y = index / huff_mode;
          z = index - huff_mode * y;
          if (y) {
            y = ixheaacd_pow_table_Q13[y];
            if (temp_word & 0x80000000) y = -y;

            temp_word = temp_word << 1;
            bit_pos++;
          }
          *spec_coef++ = y;

          if (z) {
            z = ixheaacd_pow_table_Q13[z];
            if (temp_word & 0x80000000) {
              z = -z;
            }
            temp_word <<= 1;
            bit_pos++;
          }
          *spec_coef++ = z;
        } else {
          y = (index / huff_mode) - 4;
          z = index - ((y + 4) * huff_mode) - 4;
          if (y < 0) {
            y = -y;
            y = ixheaacd_pow_table_Q13[y];
            y = -y;
          } else
            y = ixheaacd_pow_table_Q13[y];

          if (z < 0) {
            z = -z;
            z = ixheaacd_pow_table_Q13[z];
            z = -z;
          } else
            z = ixheaacd_pow_table_Q13[z];

          *spec_coef++ = y;
          *spec_coef++ = z;
        }
        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                    it_bit_buff->ptr_bit_buf_end);
        idx -= 2;
      } while (idx != 0);

      spec_coef += (MAX_BINS_SHORT - offsets[1]);
      grp_idx--;
    } while (grp_idx != 0);

    offsets++;
    spec_coef = spec_orig;
    no_bands--;
  } while (no_bands >= 0);

  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);
  it_bit_buff->ptr_read_next = ptr_read_next;
  it_bit_buff->bit_pos = bit_pos;

  return 0;
}

static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_pair(
    ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl,
    WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch,
    WORD32 tbl_sign, const UWORD32 *idx_table, WORD32 huff_mode)

{
  WORD32 ampres;
  WORD idx;
  WORD16 index, length;
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
  WORD32 bit_pos = it_bit_buff->bit_pos;
  WORD32 read_word;
  WORD32 increment;

  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
                                       &increment);
  ptr_read_next += increment;

  for (idx = width; idx != 0; idx -= 2) {
    {
      UWORD32 read_word1;
      read_word1 = read_word << bit_pos;
      ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl,
                              idx_table);
      bit_pos += length;
      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);
    }

    if (tbl_sign) {
      WORD32 out0, out1, temp_word;
      WORD32 ampout0, ampout1;

      ampout0 = *ptr_scratch++;
      ampout1 = *ptr_scratch++;
      out0 = index / huff_mode;
      out1 = index - huff_mode * out0;
      ampout0 += out0;
      ampout0 = ixheaacd_pow_table_Q13[ampout0];

      ampout1 += out1;
      ampout1 = ixheaacd_pow_table_Q13[ampout1];
      temp_word = read_word << bit_pos;
      if (out0) {
        if (temp_word & 0x80000000) {
          ampout0 = -(ampout0);
        }

        bit_pos++;
        temp_word = temp_word << 1;
      } else {
        ampout0 = -(ampout0);
      }

      if (out1) {
        if (temp_word & 0x80000000) {
          ampout1 = -(ampout1);
        }
        bit_pos++;
      } else {
        ampout1 = -(ampout1);
      }

      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                  it_bit_buff->ptr_bit_buf_end);
      *x_invquant++ = ampout0;
      *x_invquant++ = ampout1;
    } else {
      WORD32 y, z;
      y = (index / huff_mode) - 4;
      z = index - ((y + 4) * huff_mode) - 4;

      ampres = *ptr_scratch++;
      if (y <= 0) {
        ampres = ampres - y;
        ampres = ixheaacd_pow_table_Q13[ampres];
        *x_invquant++ = -ampres;
      } else {
        ampres += y;
        *x_invquant++ = ixheaacd_pow_table_Q13[ampres];
      }
      ampres = *ptr_scratch++;
      if (z <= 0) {
        ampres = ampres - z;
        ampres = ixheaacd_pow_table_Q13[ampres];
        *x_invquant++ = -ampres;
      } else {
        ampres += z;
        *x_invquant++ = ixheaacd_pow_table_Q13[ampres];
      }
    }
    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
                                it_bit_buff->ptr_bit_buf_end);
  }

  ptr_read_next = ptr_read_next - increment;
  ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
                               it_bit_buff->ptr_bit_buf_end);
  it_bit_buff->ptr_read_next = ptr_read_next;
  it_bit_buff->bit_pos = bit_pos;

  return 0;
}

WORD ixheaacd_decode_huffman(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no,
                             WORD32 *spec_coef, WORD16 *sfb_offset, WORD start,
                             WORD sfb, WORD group_len,
                             ia_aac_dec_tables_struct *ptr_aac_tables) {
  WORD ret_val = 0;
  WORD start_bit_pos = it_bit_buff->bit_pos;
  UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;
  const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[cb_no]);
  WORD32 huff_mode;
  const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[cb_no]);
  WORD32 *pow_table =
      (WORD32 *)ptr_aac_tables->pstr_block_tables->ixheaacd_pow_table_Q13;
  WORD32 no_bands = sfb - start - 1;
  WORD16 *band_offset = sfb_offset + start;

  if (cb_no == 11) {
    const UWORD32 *idx_table =
        ptr_aac_tables->pstr_huffmann_tables->idx_table_hf11;
    const UWORD16 *cb_table =
        ptr_aac_tables->pstr_huffmann_tables->input_table_cb11;

    ret_val = ixheaacd_huffman_dec_word1(it_bit_buff, spec_coef, band_offset,
                                         no_bands, group_len, cb_table,
                                         pow_table, idx_table);

  } else if (cb_no <= 4) {
    WORD32 tbl_sign = 0;

    if (cb_no > 2) {
      tbl_sign = 1;
    }
    ret_val = ixheaacd_huffman_dec_quad(it_bit_buff, spec_coef, band_offset,
                                        no_bands, group_len, cb_table,
                                        pow_table, tbl_sign, idx_table);
  }

  else if (cb_no <= 10) {
    WORD32 tbl_sign = 0;
    huff_mode = 9;
    if (cb_no > 6) {
      if (cb_no > 8)
        huff_mode = 13;
      else
        huff_mode = 8;
      tbl_sign = 1;
    }
    ret_val = ixheaacd_huffman_dec_pair(
        it_bit_buff, spec_coef, band_offset, no_bands, group_len, cb_table,
        pow_table, tbl_sign, idx_table, huff_mode);
  }

  {
    WORD bits_cons;
    bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
                (it_bit_buff->bit_pos - start_bit_pos);
    it_bit_buff->cnt_bits -= bits_cons;
  }
  return ret_val;
}

WORD ixheaacd_huffman_dec_word2(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no,
                                WORD32 width,
                                ia_aac_dec_tables_struct *ptr_aac_tables,
                                WORD32 *x_invquant, WORD8 *scratch_ptr) {
  WORD ret_val = 0;
  WORD32 huff_mode;
  WORD start_bit_pos = it_bit_buff->bit_pos;
  WORD32 cnt_bits = it_bit_buff->cnt_bits;
  WORD32 *pow_table =
      (WORD32 *)ptr_aac_tables->pstr_block_tables->ixheaacd_pow_table_Q13;
  UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;

  const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[cb_no]);
  const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[cb_no]);

  if (cb_no == 11) {
    const UWORD16 *cb_table =
        ptr_aac_tables->pstr_huffmann_tables->input_table_cb11;

    ret_val = ixheaacd_huffman_dec_word2_11(
        it_bit_buff, width, cb_table, x_invquant, pow_table, scratch_ptr,
        ptr_aac_tables->pstr_huffmann_tables->idx_table_hf11);
  } else if (cb_no <= 4) {
    WORD32 tbl_sign = 0;
    if (cb_no > 2) tbl_sign = 1;
    ret_val = ixheaacd_huffman_dec_word2_quad(it_bit_buff, width, cb_table,
                                              x_invquant, pow_table,
                                              scratch_ptr, tbl_sign, idx_table);
  } else if (cb_no <= 10) {
    WORD32 tbl_sign = 0;
    huff_mode = 9;
    if (cb_no > 6) {
      if (cb_no > 8) {
        huff_mode = 13;
      } else {
        huff_mode = 8;
      }

      tbl_sign = 1;
    }
    ret_val = ixheaacd_huffman_dec_word2_pair(
        it_bit_buff, width, cb_table, x_invquant, pow_table, scratch_ptr,
        tbl_sign, idx_table, huff_mode);
  }

  {
    WORD bits_cons;
    if (it_bit_buff->bit_pos <= 7) {
      bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
                  (it_bit_buff->bit_pos - start_bit_pos);
      it_bit_buff->cnt_bits = cnt_bits - bits_cons;
    } else {
      it_bit_buff->ptr_read_next += (it_bit_buff->bit_pos) >> 3;
      it_bit_buff->bit_pos = it_bit_buff->bit_pos & 0x7;

      bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
                  ((it_bit_buff->bit_pos - start_bit_pos));
      it_bit_buff->cnt_bits = cnt_bits - bits_cons;
    }
  }
  return ret_val;
}

void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out,
                           const WORD16 *window, WORD16 q_shift, WORD16 size,
                           WORD16 stride) {
  WORD32 accu;
  WORD32 i;
  WORD16 rounding_fac = -0x2000;

  WORD32 *window_i = (WORD32 *)window;

  WORD16 *ptr_out1, *ptr_out2;

  WORD32 *pwin1, *pwin2;
  WORD32 *pCoef = &coef[size * 2 - 1 - 0];

  pwin1 = &window_i[size - 1 - 0];
  pwin2 = &window_i[size + 0];

  ptr_out1 = &out[stride * (size - 1 - 0)];
  ptr_out2 = &out[stride * (size + 0)];

  for (i = 0; i < size; i++) {
    WORD32 win1, win2, coeff;
    WORD32 prev_data = *prev++;

    win1 = *pwin1--;
    coeff = *pCoef--;
    win2 = *pwin2++;

    accu = ixheaacd_sub32_sat(
        ixheaacd_shl32_dir_sat_limit(ixheaacd_mult32_shl(coeff, win1), q_shift),
        ixheaacd_mac32x16in32_shl(rounding_fac, win2, (WORD16)(prev_data)));

    accu = ixheaacd_add32_sat(accu, accu);
    accu = ixheaacd_add32_sat(accu, accu);

    *ptr_out1 = ixheaacd_shr32(accu, 16);
    ptr_out1 -= stride;

    accu = ixheaacd_sub32_sat(
        ixheaacd_shl32_dir_sat_limit(
            ixheaacd_mult32_shl(ixheaacd_negate32(coeff), win2), q_shift),
        ixheaacd_mac32x16in32_shl(rounding_fac, win1, (WORD16)(prev_data)));

    accu = ixheaacd_add32_sat(accu, accu);
    accu = ixheaacd_add32_sat(accu, accu);

    *ptr_out2 = ixheaacd_shr32(accu, 16);
    ptr_out2 += stride;
  }
}

VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out,
                                const WORD16 *window, WORD16 q_shift,
                                WORD16 size, WORD16 ch_fac) {
  WORD32 accu;
  WORD32 i;
  WORD16 rounding_fac = -0x2000;

  for (i = 0; i < size; i++) {
    WORD16 window1, window2;

    window1 = window[2 * size - 2 * i - 1];
    window2 = window[2 * size - 2 * i - 2];
    accu = ixheaacd_sub32_sat(
        ixheaacd_shl32_dir_sat_limit(
            ixheaacd_mult32x16in32(coef[size * 2 - 1 - i], window2), q_shift),
        ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window1));
    out[ch_fac * (size - i - 1)] =
        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
    accu = ixheaacd_sub32_sat(
        ixheaacd_shl32_dir_sat_limit(
            ixheaacd_mult32x16in32(ixheaacd_negate32(coef[size * 2 - 1 - i]),
                                   window1),
            q_shift),
        ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window2));
    out[ch_fac * (size + i)] =
        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
  }
}

VOID ixheaacd_over_lap_add2_dec(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                const WORD16 *window, WORD16 q_shift,
                                WORD16 size, WORD16 ch_fac) {
  WORD32 accu;
  WORD32 i;

  for (i = 0; i < size; i++) {
    accu = ixheaacd_sub32_sat(
        ixheaacd_mult32x16in32(coef[size + i], window[2 * i]),
        ixheaacd_mult32x16in32(prev[size - 1 - i], window[2 * i + 1]));
    out[ch_fac * i] = ixheaacd_shr32_drc(accu, 16 - (q_shift + 1));
  }

  for (i = 0; i < size; i++) {
    accu = ixheaacd_sub32_sat(
        ixheaacd_mult32x16in32(ixheaacd_negate32_sat(coef[size * 2 - 1 - i]),
                               window[2 * size - 2 * i - 1]),
        ixheaacd_mult32x16in32(prev[i], window[2 * size - 2 * i - 2]));
    out[ch_fac * (i + size)] = ixheaacd_shr32_drc(accu, 16 - (q_shift + 1));
  }
}

VOID ixheaacd_process_single_scf(WORD32 scale_factor, WORD32 *x_invquant,
                                 WORD32 width, WORD32 *ptr_scale_table,
                                 WORD32 total_channels, WORD32 object_type,
                                 WORD32 aac_sf_data_resil_flag) {
  WORD32 j;

  WORD32 temp1;
  WORD32 q_factor;
  WORD32 buffer1;
  WORD16 scale_short;

  object_type = 0;
  aac_sf_data_resil_flag = 0;

  if (scale_factor < 24) {
    for (j = width; j > 0; j--) {
      *x_invquant++ = 0;
    }
  } else {
    WORD32 shift;

    if (total_channels > 2)
      q_factor = 34 - (scale_factor >> 2);
    else
      q_factor = 37 - (scale_factor >> 2);

    scale_short = ptr_scale_table[(scale_factor & 0x0003)];
    shift = q_factor;
    if (shift > 0) {
      if (scale_short == (WORD16)0x8000) {
        for (j = width; j > 0; j--) {
          temp1 = *x_invquant;
          buffer1 = ixheaacd_mult32x16in32_shl_sat(temp1, scale_short);
          buffer1 = ixheaacd_shr32(buffer1, shift);
          *x_invquant++ = buffer1;
        }
      } else {
        for (j = width; j > 0; j--) {
          temp1 = *x_invquant;
          buffer1 = ixheaacd_mult32x16in32_shl(temp1, scale_short);
          buffer1 = ixheaacd_shr32(buffer1, shift);
          *x_invquant++ = buffer1;
        }
      }
    } else {
      shift = -shift;
      if (shift > 0) {
        if (scale_short == (WORD16)0x8000) {
          for (j = width; j > 0; j--) {
            temp1 = *x_invquant;
            temp1 = ixheaacd_shl32(temp1, shift - 1);
            buffer1 = ixheaacd_mult32x16in32_shl_sat(temp1, scale_short);
            buffer1 = ixheaacd_shl32(buffer1, 1);
            *x_invquant++ = buffer1;
          }
        } else {
          for (j = width; j > 0; j--) {
            temp1 = *x_invquant;
            temp1 = ixheaacd_shl32(temp1, shift - 1);
            buffer1 = ixheaacd_mult32x16in32_shl(temp1, scale_short);
            buffer1 = ixheaacd_shl32(buffer1, 1);
            *x_invquant++ = buffer1;
          }
        }

      } else {
        if (scale_short == (WORD16)0x8000) {
          for (j = width; j > 0; j--) {
            temp1 = *x_invquant;
            buffer1 = ixheaacd_mult32x16in32_shl_sat(temp1, scale_short);
            *x_invquant++ = buffer1;
          }
        } else {
          for (j = width; j > 0; j--) {
            temp1 = *x_invquant;
            buffer1 = ixheaacd_mult32x16in32_shl(temp1, scale_short);
            *x_invquant++ = buffer1;
          }
        }
      }
    }
  }
}

VOID ixheaacd_scale_factor_process_dec(WORD32 *x_invquant, WORD16 *scale_fact,
                                       WORD no_band, WORD8 *width,
                                       WORD32 *ptr_scale_table,
                                       WORD32 total_channels,
                                       WORD32 object_type,
                                       WORD32 aac_sf_data_resil_flag) {
  WORD32 i;
  WORD16 scale_factor;

  for (i = no_band - 1; i >= 0; i--) {
    scale_factor = *scale_fact++;
    ixheaacd_process_single_scf(scale_factor, x_invquant, *width,
                                ptr_scale_table, total_channels, object_type,
                                aac_sf_data_resil_flag);

    x_invquant += *width;
    width++;
  }
}

void ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD32 length,
                                WORD32 shift_val) {
  WORD32 i;
  WORD32 temp1, temp2;
  WORD32 *temp_ptr = &p_spectrum[0];
  length = length >> 2;

  for (i = length - 1; i >= 0; i--) {
    temp1 = *temp_ptr;
    temp2 = *(temp_ptr + 1);
    *temp_ptr++ = temp1 >> shift_val;
    temp1 = *(temp_ptr + 1);
    *temp_ptr++ = temp2 >> shift_val;
    temp2 = *(temp_ptr + 1);
    *temp_ptr++ = temp1 >> shift_val;
    *temp_ptr++ = temp2 >> shift_val;
  }
}
