/****************************************************************************** * * * Copyright (C) 2023 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 #include "ixheaac_type_def.h" #include "ixheaac_constants.h" #include "ixheaace_aac_constants.h" #include "ixheaace_bitbuffer.h" static VOID ia_enhaacplus_enc_update_bitbuf_word_ptr(ixheaace_bit_buf_handle pstr_bit_buf, UWORD8 **p_bitbuf_word, WORD32 cnt) { *p_bitbuf_word += cnt; if (*p_bitbuf_word > pstr_bit_buf->ptr_bit_buf_end) { *p_bitbuf_word -= (pstr_bit_buf->ptr_bit_buf_end - pstr_bit_buf->ptr_bit_buf_base + 1); } if (*p_bitbuf_word < pstr_bit_buf->ptr_bit_buf_base) { *p_bitbuf_word += (pstr_bit_buf->ptr_bit_buf_end - pstr_bit_buf->ptr_bit_buf_base + 1); } } ixheaace_bit_buf_handle ia_enhaacplus_enc_create_bitbuffer(ixheaace_bit_buf_handle pstr_bit_buf, UWORD8 *ptr_bit_buf_base, UWORD32 bitbuf_size) { pstr_bit_buf->ptr_bit_buf_base = ptr_bit_buf_base; pstr_bit_buf->ptr_bit_buf_end = ptr_bit_buf_base + bitbuf_size - 1; pstr_bit_buf->ptr_read_next = ptr_bit_buf_base; pstr_bit_buf->ptr_write_next = ptr_bit_buf_base; pstr_bit_buf->write_position = 7; pstr_bit_buf->read_position = 7; pstr_bit_buf->cnt_bits = 0; pstr_bit_buf->size = bitbuf_size * 8; return pstr_bit_buf; } VOID ia_enhaacplus_enc_delete_bitbuffer(ixheaace_bit_buf_handle pstr_bit_buf) { pstr_bit_buf = NULL; } VOID ixheaace_reset_bitbuf(ixheaace_bit_buf_handle pstr_bit_buf, UWORD8 *ptr_bit_buf_base, UWORD32 bitbuf_size) { pstr_bit_buf->ptr_bit_buf_base = ptr_bit_buf_base; pstr_bit_buf->ptr_bit_buf_end = ptr_bit_buf_base + bitbuf_size - 1; pstr_bit_buf->ptr_read_next = ptr_bit_buf_base; pstr_bit_buf->ptr_write_next = ptr_bit_buf_base; pstr_bit_buf->read_position = 7; pstr_bit_buf->write_position = 7; pstr_bit_buf->cnt_bits = 0; } VOID ixheaace_copy_bitbuf_to_and_fro(ixheaace_bit_buf_handle h_bitbuf_src, ixheaace_bit_buf_handle h_bitbuf_dst) { WORD32 i; WORD32 bytes_to_go_src = (WORD32)(h_bitbuf_src->ptr_bit_buf_end - h_bitbuf_src->ptr_bit_buf_base); UWORD8 *dst = &h_bitbuf_dst->ptr_bit_buf_base[0]; UWORD8 *src = &h_bitbuf_src->ptr_bit_buf_base[0]; WORD32 temp321, temp322; UWORD8 temp1, temp2, temp3; WORD32 count; WORD32 remaining; count = bytes_to_go_src >> 1; remaining = bytes_to_go_src - (count << 1); for (i = count - 1; i >= 0; i--) { temp1 = *src; temp2 = *dst; temp3 = *(src + 1); *dst++ = temp1; temp1 = *dst; *src++ = temp2; *dst++ = temp3; *src++ = temp1; } if (remaining) for (i = remaining - 1; i >= 0; i--) { temp1 = *src; temp2 = *dst; *dst++ = temp1; *src++ = temp2; } src = h_bitbuf_src->ptr_read_next; dst = h_bitbuf_dst->ptr_read_next; h_bitbuf_dst->ptr_read_next = src; h_bitbuf_src->ptr_read_next = dst; src = h_bitbuf_src->ptr_write_next; dst = h_bitbuf_dst->ptr_write_next; h_bitbuf_dst->ptr_write_next = src; h_bitbuf_src->ptr_write_next = dst; temp321 = h_bitbuf_dst->read_position; temp322 = h_bitbuf_src->read_position; h_bitbuf_dst->read_position = temp322; h_bitbuf_src->read_position = temp321; temp321 = h_bitbuf_dst->write_position; temp322 = h_bitbuf_src->write_position; h_bitbuf_dst->write_position = temp322; h_bitbuf_src->write_position = temp321; temp321 = h_bitbuf_dst->cnt_bits; temp322 = h_bitbuf_src->cnt_bits; h_bitbuf_dst->cnt_bits = temp322; h_bitbuf_src->cnt_bits = temp321; } VOID ia_enhaacplus_enc_copy_bitbuf(ixheaace_bit_buf_handle h_bitbuf_src, ixheaace_bit_buf_handle h_bitbuf_dst) { WORD32 i; WORD32 bytes_to_go_src = (WORD32)(h_bitbuf_src->ptr_bit_buf_end - h_bitbuf_src->ptr_bit_buf_base); for (i = 0; i < bytes_to_go_src; i++) { h_bitbuf_dst->ptr_bit_buf_base[i] = h_bitbuf_src->ptr_bit_buf_base[i]; } h_bitbuf_dst->ptr_read_next = h_bitbuf_src->ptr_read_next; h_bitbuf_dst->ptr_write_next = h_bitbuf_src->ptr_write_next; h_bitbuf_dst->read_position = h_bitbuf_src->read_position; h_bitbuf_dst->write_position = h_bitbuf_src->write_position; h_bitbuf_dst->cnt_bits = h_bitbuf_src->cnt_bits; } WORD32 ia_enhaacplus_enc_get_bits_available(ixheaace_bit_buf_handle pstr_bit_buf_handle) { return pstr_bit_buf_handle->cnt_bits; } UWORD32 ixheaace_readbits(ixheaace_bit_buf_handle pstr_bit_buf, UWORD8 no_bits_to_read) { UWORD32 return_value; if (no_bits_to_read >= 25) { return 0; } pstr_bit_buf->cnt_bits -= no_bits_to_read; pstr_bit_buf->read_position -= no_bits_to_read; return_value = (UWORD32)*pstr_bit_buf->ptr_read_next; while (pstr_bit_buf->read_position < 0) { pstr_bit_buf->read_position += 8; pstr_bit_buf->ptr_read_next++; if (pstr_bit_buf->ptr_read_next > pstr_bit_buf->ptr_bit_buf_end) { pstr_bit_buf->ptr_read_next = pstr_bit_buf->ptr_bit_buf_base; } return_value <<= 8; return_value |= (UWORD32)*pstr_bit_buf->ptr_read_next; } return_value = return_value << (31 - no_bits_to_read - pstr_bit_buf->read_position) >> (32 - no_bits_to_read); return (return_value); } VOID ia_enhaacplus_enc_wind_bitbuffer_bidirectional(ixheaace_bit_buf_handle pstr_bit_buf, WORD32 offset) { if (offset != 0) { WORD32 buff_offset; pstr_bit_buf->read_position -= offset; buff_offset = (pstr_bit_buf->read_position) >> 3; pstr_bit_buf->read_position -= buff_offset << 3; if (buff_offset) { ia_enhaacplus_enc_update_bitbuf_word_ptr(pstr_bit_buf, &pstr_bit_buf->ptr_read_next, -buff_offset); } pstr_bit_buf->cnt_bits -= offset; } }