/******************************************************************************
 *                                                                            *
 * 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 <string.h>
#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_bitbuffer.h"
#include "ixheaacd_defines.h"
#include "ixheaacd_aac_rom.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_sbrdecoder.h"

#include "ixheaacd_audioobjtypes.h"
#include "ixheaacd_sbrdecsettings.h"
#include "ixheaacd_memory_standards.h"
#include "ixheaacd_error_codes.h"

#include "ixheaacd_defines.h"

#include "ixheaacd_sbr_scale.h"
#include "ixheaacd_lpp_tran.h"
#include "ixheaacd_env_extr_part.h"
#include "ixheaacd_sbr_rom.h"

#include "ixheaacd_hybrid.h"
#include "ixheaacd_ps_dec.h"
#include "ixheaacd_ps_bitdec.h"

#include "ixheaacd_pulsedata.h"

#include "ixheaacd_pns.h"

#include "ixheaacd_channelinfo.h"

#include "ixheaacd_env_extr.h"
#include "ixheaacd_common_rom.h"
#include "ixheaacd_block.h"
#include "ixheaacd_channel.h"
#include "ixheaacd_audioobjtypes.h"
#include "ixheaacd_latmdemux.h"
#include "ixheaacd_aacdec.h"
#include "ixheaacd_mps_polyphase.h"
#include "ixheaacd_config.h"
#include "ixheaacd_mps_dec.h"
#include "ixheaacd_struct_def.h"
#include "ixheaacd_headerdecode.h"

#include "ixheaacd_multichannel.h"

#include "ixheaacd_basic_op.h"
#include "ixheaacd_intrinsics.h"

static PLATFORM_INLINE UWORD32
ixheaacd_aac_showbits_7(ia_bit_buf_struct *it_bit_buff) {
  UWORD8 *v = it_bit_buff->ptr_read_next;
  UWORD32 b = 0;
  UWORD32 x;
  b = ((WORD32)v[0] << 8);
  if (it_bit_buff->bit_pos < 6) {
    b |= (WORD32)(v[1]);
  }
  x = (UWORD32)b << (15 + 8 - it_bit_buff->bit_pos);
  x = (UWORD32)x >> (25);

  return x;
}

WORD ixheaacd_get_channel_mask(
    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec) {
  WORD ixheaacd_drc_offset = 0, channel_mask = 0;
  WORD flag1 = 0, flag2 = 0;
  WORD ch_idx;
  WORD *ptr_slot_element = p_obj_enhaacplus_dec->aac_config.slot_element;
  WORD *ptr_element_type = p_obj_enhaacplus_dec->aac_config.element_type;

  memset(ptr_slot_element, 0, sizeof(WORD) * MAX_BS_ELEMENT);

  for (ch_idx = 0; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 1) {
      channel_mask += 0x3;
      ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
      ixheaacd_drc_offset += 2;
      flag1 = ch_idx + 1;
      break;
    }
  }

  for (ch_idx = 0; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 0) {
      channel_mask += 0x4;
      ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
      ixheaacd_drc_offset += 1;
      flag2 = ch_idx + 1;
      break;
    }
  }
  for (ch_idx = 0; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 3) {
      channel_mask += 0x8;
      ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
      ixheaacd_drc_offset += 1;
      break;
    }
  }
  for (ch_idx = flag1; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 1) {
      channel_mask += 0x30;
      ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
      ixheaacd_drc_offset += 2;
      flag1 = ch_idx + 1;
      break;
    }
  }
  for (ch_idx = flag2; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 0) {
      channel_mask += 0x100;
      ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
      ixheaacd_drc_offset += 1;
      break;
    }
  }
  for (ch_idx = flag1; ch_idx < MAX_BS_ELEMENT; ch_idx++) {
    if (ptr_element_type[ch_idx] == 1) {
      {
        channel_mask += (0x40 + 0x80);
        ptr_slot_element[ch_idx] = ixheaacd_drc_offset;
        ixheaacd_drc_offset += 2;
        break;
      }
    }
  }

  return channel_mask;
}

VOID ixheaacd_read_data_stream_element(ia_bit_buf_struct *it_bit_buff,
                                       WORD32 *byte_align_bits,
                                       ia_drc_dec_struct *drc_handle) {
  ia_bit_buf_struct temp_bs = {0};
  WORD32 count = ixheaacd_read_bits_buf(it_bit_buff, 13);
  WORD32 cnt = (count & 0xff);
  WORD32 start_pos = 0;

  if (cnt == 255) {
    cnt += ixheaacd_read_bits_buf(it_bit_buff, 8);
  }

  if ((count & 0x0100) >> 8) {
    ixheaacd_byte_align(it_bit_buff, byte_align_bits);
  }

  {
    memcpy(&temp_bs, it_bit_buff, sizeof(ia_bit_buf_struct));
    start_pos = temp_bs.cnt_bits;

    if (ixheaacd_read_bits_buf(&temp_bs, 8) == DVB_ANC_DATA_SYNC_BYTE) {
      int dmx_level_present, compression_present;
      int coarse_gain_present, fine_grain_present;

      ixheaacd_read_bits_buf(&temp_bs, 8);

      ixheaacd_read_bits_buf(&temp_bs, 3);
      dmx_level_present = ixheaacd_read_bits_buf(&temp_bs, 1);
      ixheaacd_read_bits_buf(&temp_bs, 1);
      compression_present = ixheaacd_read_bits_buf(&temp_bs, 1);
      coarse_gain_present = ixheaacd_read_bits_buf(&temp_bs, 1);
      fine_grain_present = ixheaacd_read_bits_buf(&temp_bs, 1);

      if (dmx_level_present) ixheaacd_read_bits_buf(&temp_bs, 8);

      if (compression_present) ixheaacd_read_bits_buf(&temp_bs, 16);

      if (coarse_gain_present) ixheaacd_read_bits_buf(&temp_bs, 16);

      if (fine_grain_present) ixheaacd_read_bits_buf(&temp_bs, 16);

      if (!drc_handle->dvb_anc_data_present && temp_bs.cnt_bits >= 0) {
        drc_handle->dvb_anc_data_pos = start_pos;
        drc_handle->dvb_anc_data_present = 1;
      }
    }
  }

  if (it_bit_buff->cnt_bits < (cnt << 3)) {
    longjmp(*(it_bit_buff->xaac_jmp_buf),
            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
  }
  it_bit_buff->ptr_read_next += cnt;
  it_bit_buff->cnt_bits -= ((cnt) << 3);
}

VOID ixheaacd_read_fill_element(ia_bit_buf_struct *it_bit_buff,
                                ia_drc_dec_struct *drc_dummy,
                                ia_drc_dec_struct *ptr_drc_dec) {
  WORD32 count;
  count = ixheaacd_read_bits_buf(it_bit_buff, 4);

  if ((count - 15) == 0) {
    count = ixheaacd_read_bits_buf(it_bit_buff, 8);
    count = (count + 14);
  }

  if (count > 0) {
    WORD32 extension_type;

    extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);

    if (extension_type == EXT_DYNAMIC_RANGE) {
      ptr_drc_dec->drc_element_found = 1;
      count -=
          ixheaacd_dec_drc_read_element(ptr_drc_dec, drc_dummy, it_bit_buff);

    } else {
      ixheaacd_read_bits_buf(it_bit_buff, 4);

      if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
        longjmp(*(it_bit_buff->xaac_jmp_buf),
                IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
      }
      it_bit_buff->ptr_read_next += count - 1;
      it_bit_buff->cnt_bits -= ((count - 1) << 3);
    }
  }
}

WORD32 ixheaacd_get_element_index_tag(
    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD ch_idx1,
    WORD *ch_idx, WORD *channel, WORD *ele_idx_order, WORD total_elements,
    WORD8 *element_used, WORD total_channels, ia_drc_dec_struct *pstr_drc_dec,
    ia_drc_dec_struct *drc_dummy) {
  WORD element_tag, j;
  ia_aac_dec_state_struct *p_state_enhaacplus_dec =
      p_obj_enhaacplus_dec->p_state_aac;

  ia_bit_buf_struct *it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream;
  WORD element_idx;
  WORD element_type;

  ia_aac_decoder_struct *aac_dec_handle =
      p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx1];

  *ch_idx = ch_idx1;

  if (p_state_enhaacplus_dec->bs_format != LOAS_BSFORMAT) {
    if (ch_idx1 == 0) {
      ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
    }
  }
  {
    if (ch_idx1 == 0) {
      aac_dec_handle->byte_align_bits = it_bit_buff->cnt_bits;
    }
  }

  if (it_bit_buff->cnt_bits < 3) {
    it_bit_buff->cnt_bits = -1;
    return (WORD16)(
        (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
  }

  element_tag = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 7);
  ixheaacd_read_bidirection(it_bit_buff, -7);

  element_idx = (element_tag & 0xF);
  element_type = (element_tag >> 4) & 0x7;

  p_obj_enhaacplus_dec->aac_config.str_prog_config.alignment_bits =
      it_bit_buff->bit_pos;

  while (element_type == 4 || element_type == 5 || element_type == 6) {
    WORD type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);

    if (it_bit_buff->cnt_bits < 3) {
      it_bit_buff->cnt_bits = -1;
      return (WORD16)(
          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
    }

    if (type == 4) {
      ixheaacd_read_data_stream_element(
          it_bit_buff, &aac_dec_handle->byte_align_bits, pstr_drc_dec);
    }
    if (type == 5) {
      WORD32 error_code = 0;
      error_code = ixheaacd_decode_pce(
          it_bit_buff, &p_obj_enhaacplus_dec->aac_config.ui_pce_found_in_hdr,
          &p_obj_enhaacplus_dec->aac_config.str_prog_config);
      if (error_code != 0) {
        if (error_code < 0) return error_code;
        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
      }
    }
    if (type == 6) {
      ixheaacd_read_fill_element(it_bit_buff, drc_dummy, pstr_drc_dec);
    }

    if (it_bit_buff->cnt_bits < 7) {
      it_bit_buff->cnt_bits = -1;
      return (WORD16)(
          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
    }

    element_tag = (WORD)ixheaacd_aac_showbits_7(it_bit_buff);
    element_idx = (element_tag & 0xF);
    element_type = (element_tag >> 4) & 0x7;
  }

  if (total_elements == 2 && total_channels == 2 &&
      p_state_enhaacplus_dec->p_config->ui_pce_found_in_hdr == 2 &&
      ch_idx1 == 0) {
    ixheaacd_fill_prog_config_slots(p_state_enhaacplus_dec);
  }

  *channel = 1;
  if (element_type == 1) {
    *channel = 2;
  }

  for (j = 0; j < total_elements; j++) {
    if (p_obj_enhaacplus_dec->aac_config.element_type[j] == element_type &&
        (element_idx == ele_idx_order[j]) && (element_used[j] == 0)) {
      *ch_idx = j;
      element_used[j] = 1;
      break;
    }
  }

  if (j == total_elements) {
    if (it_bit_buff->cnt_bits < 0) {
      return (WORD16)(
          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
    }

    ixheaacd_read_bidirection(
        it_bit_buff, (WORD16)(it_bit_buff->cnt_bits - it_bit_buff->size));
    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
  } else
    return 0;
}
