aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_bitbuffer.c
diff options
context:
space:
mode:
authorRay Essick <essick@google.com>2018-05-02 10:47:09 -0700
committerRay Essick <essick@google.com>2018-05-04 11:48:02 -0700
commit48f5fd9660a58bf2d89387f25cf4b7c8573fb756 (patch)
treebb4ed2a352b740845970f7183a62e13e49999568 /decoder/ixheaacd_bitbuffer.c
parent61cd144fc5134a6fca3c399630a9b0f79ac66bd7 (diff)
downloadlibxaac-48f5fd9660a58bf2d89387f25cf4b7c8573fb756.tar.gz
Import xHE-AAC decoder from Ittiam
Clean copy of version XHEAAC_V1_36 as delivered 2018/4/13 Sole change is to map cr/lf line termination to unix lf. Added appropriate LICENSE, MODULE_LICENSE_APACHE2, and NOTICE files as part of folding into internal master. Bug: 77287124 Test: CTS audio/media Change-Id: I3c8d124033f967b29d6e384cce5c843ee17a7bb1
Diffstat (limited to 'decoder/ixheaacd_bitbuffer.c')
-rw-r--r--decoder/ixheaacd_bitbuffer.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/decoder/ixheaacd_bitbuffer.c b/decoder/ixheaacd_bitbuffer.c
new file mode 100644
index 0000000..847815f
--- /dev/null
+++ b/decoder/ixheaacd_bitbuffer.c
@@ -0,0 +1,281 @@
+/******************************************************************************
+ * *
+ * 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_basic_op.h>
+#include "ixheaacd_intrinsics.h"
+#include "ixheaacd_bitbuffer.h"
+
+#include "ixheaacd_adts_crc_check.h"
+
+VOID ixheaacd_byte_align(ia_bit_buf_struct *it_bit_buff,
+ WORD32 *align_bits_cnt) {
+ WORD alignment;
+ alignment = (WORD)((*align_bits_cnt - it_bit_buff->cnt_bits) & 0x07);
+
+ if (alignment) {
+ ixheaacd_read_bits_buf(it_bit_buff, (8 - alignment));
+ }
+
+ *align_bits_cnt = it_bit_buff->cnt_bits;
+}
+
+WORD32 ixheaacd_show_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) {
+ UWORD32 ret_val;
+ UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
+ WORD bit_pos = it_bit_buff->bit_pos;
+
+ ret_val = (UWORD32)*ptr_read_next;
+
+ bit_pos -= no_of_bits;
+ while (bit_pos < 0) {
+ bit_pos += 8;
+ ptr_read_next++;
+
+ if (ptr_read_next > it_bit_buff->ptr_bit_buf_end) {
+ ptr_read_next = it_bit_buff->ptr_bit_buf_base;
+ }
+
+ ret_val <<= 8;
+
+ ret_val |= (UWORD32)*ptr_read_next;
+ }
+
+ ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits);
+
+ return ret_val;
+}
+
+WORD32 ixheaacd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) {
+ UWORD32 ret_val;
+ UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
+ WORD bit_pos = it_bit_buff->bit_pos;
+
+ if (no_of_bits == 0) {
+ return 0;
+ }
+
+ it_bit_buff->cnt_bits -= no_of_bits;
+ ret_val = (UWORD32)*ptr_read_next;
+
+ bit_pos -= no_of_bits;
+ while (bit_pos < 0) {
+ bit_pos += 8;
+ ptr_read_next++;
+
+ if (ptr_read_next > it_bit_buff->ptr_bit_buf_end) {
+ ptr_read_next = it_bit_buff->ptr_bit_buf_base;
+ }
+
+ ret_val <<= 8;
+
+ ret_val |= (UWORD32)*ptr_read_next;
+ }
+
+ ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits);
+ it_bit_buff->ptr_read_next = ptr_read_next;
+ it_bit_buff->bit_pos = (WORD16)bit_pos;
+ return ret_val;
+}
+
+UWORD32 ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos,
+ WORD32 *readword) {
+ UWORD8 *v = *ptr_read_next;
+ WORD32 bits_consumed = *bit_pos;
+
+ if ((bits_consumed -= 8) >= 0) {
+ *readword = (*readword << 8) | *v;
+ v++;
+ } else {
+ bits_consumed += 8;
+ }
+ *bit_pos = bits_consumed;
+ *ptr_read_next = v;
+ return 1;
+}
+
+UWORD32 ixheaacd_aac_read_2bytes(UWORD8 **ptr_read_next, WORD32 *bit_pos,
+ WORD32 *readword) {
+ UWORD8 *v = *ptr_read_next;
+ WORD32 bits_consumed = *bit_pos;
+
+ if ((bits_consumed - 16) >= 0) {
+ *readword = (*readword << 8) | *v;
+ v++;
+ *readword = (*readword << 8) | *v;
+ v++;
+ bits_consumed -= 16;
+
+ } else if ((bits_consumed - 8) >= 0) {
+ *readword = (*readword << 8) | *v;
+ v++;
+ bits_consumed -= 8;
+ }
+
+ *bit_pos = bits_consumed;
+ *ptr_read_next = v;
+ return 1;
+}
+
+UWORD32 ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next,
+ WORD16 *ptr_bit_pos, WORD32 *readword) {
+ UWORD8 *v = *ptr_read_next;
+ WORD16 bits_consumed = *ptr_bit_pos;
+
+ while (bits_consumed >= 8) {
+ if ((bits_consumed -= 8) >= 0) {
+ {
+ *readword = (*readword << 8) | *v;
+ v++;
+ }
+ } else {
+ bits_consumed += 8;
+ }
+ }
+ *ptr_bit_pos = bits_consumed;
+ *ptr_read_next = v;
+ return 1;
+}
+
+UWORD32 ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos,
+ WORD32 *readword, UWORD8 *p_bit_buf_end) {
+ UWORD8 *v = *ptr_read_next;
+ WORD32 bits_consumed = *ptr_bit_pos;
+
+ if ((bits_consumed -= 8) >= 0) {
+ if (p_bit_buf_end < v)
+ bits_consumed += 8;
+ else {
+ *readword = (*readword << 8) | *v;
+ v++;
+ }
+ } else {
+ bits_consumed += 8;
+ }
+ *ptr_bit_pos = bits_consumed;
+ *ptr_read_next = v;
+ return 1;
+}
+
+WORD32 ixheaacd_aac_read_bit(ia_bit_buf_struct *it_bit_buff) {
+ UWORD8 ret_val;
+ UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
+ WORD bit_pos = it_bit_buff->bit_pos;
+ UWORD32 temp;
+ WORD no_of_bits = 1;
+
+ if (bit_pos < 0) {
+ bit_pos = 7;
+ ptr_read_next--;
+ }
+
+ it_bit_buff->cnt_bits += no_of_bits;
+ ret_val = *ptr_read_next;
+ bit_pos -= no_of_bits;
+
+ temp = (ret_val << 24) << (bit_pos + no_of_bits);
+ it_bit_buff->ptr_read_next = ptr_read_next;
+ it_bit_buff->bit_pos = (WORD16)bit_pos;
+
+ return temp >> (32 - no_of_bits);
+}
+
+WORD32 ixheaacd_aac_read_bit_rev(ia_bit_buf_struct *it_bit_buff) {
+ UWORD8 ret_val;
+ UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
+ WORD bit_pos = it_bit_buff->bit_pos;
+ UWORD32 temp;
+ WORD no_of_bits = 1;
+
+ if (bit_pos >= 8) {
+ bit_pos -= 8;
+ ptr_read_next++;
+ }
+
+ it_bit_buff->cnt_bits -= no_of_bits;
+ ret_val = *ptr_read_next;
+ bit_pos += no_of_bits;
+
+ temp = (ret_val << 24) << (bit_pos - no_of_bits);
+ it_bit_buff->ptr_read_next = ptr_read_next;
+ it_bit_buff->bit_pos = (WORD16)bit_pos;
+
+ return temp >> (32 - no_of_bits);
+}
+
+VOID ixheaacd_write_bit(ia_bit_buf_struct *it_bit_buff, WORD32 value,
+ WORD32 no_of_bits)
+
+{
+ WORD32 mask;
+
+ if (no_of_bits == 0) return;
+
+ mask = 0x1;
+ mask <<= no_of_bits - 1;
+
+ it_bit_buff->bit_count += no_of_bits;
+
+ while (no_of_bits > 0) {
+ while (no_of_bits > 0 && it_bit_buff->valid_bits < 8) {
+ it_bit_buff->byte <<= 1;
+ if (value & mask) it_bit_buff->byte |= 0x1;
+ value <<= 1;
+ no_of_bits--;
+ it_bit_buff->valid_bits++;
+ }
+ if (it_bit_buff->valid_bits == 8) {
+ *it_bit_buff->byte_ptr++ = it_bit_buff->byte;
+ it_bit_buff->byte = 0;
+ it_bit_buff->valid_bits = 0;
+ }
+ }
+}
+
+WORD32 ixheaacd_read_bit(ia_bit_buf_struct *it_bit_buff, WORD32 no_of_bits) {
+ UWORD32 ret_val;
+ UWORD8 *ptr_read_next = it_bit_buff->byte_ptr;
+
+ if (no_of_bits == 0) {
+ return 0;
+ }
+
+ ret_val = ixheaacd_aac_showbits_32(ptr_read_next);
+ it_bit_buff->byte_ptr += (no_of_bits >> 3);
+
+ if (it_bit_buff->valid_bits != 8) {
+ UWORD8 *v = it_bit_buff->byte_ptr;
+ ret_val = (ret_val << (8 - it_bit_buff->valid_bits)) |
+ (*v >> it_bit_buff->valid_bits);
+ }
+
+ it_bit_buff->valid_bits -= (no_of_bits % 8);
+
+ ret_val = ret_val >> (32 - no_of_bits);
+
+ return ret_val;
+}