libxaac/encoder/ixheaace_bits_count.c
2023-10-12 19:24:54 +05:30

948 lines
24 KiB
C

/******************************************************************************
* *
* 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 <limits.h>
#include <stdlib.h>
#include "ixheaac_type_def.h"
#include "ixheaac_constants.h"
#include "impd_drc_common_enc.h"
#include "impd_drc_uni_drc.h"
#include "impd_drc_tables.h"
#include "impd_drc_api.h"
#include "ixheaace_api.h"
#include "ixheaace_aac_constants.h"
#include "ixheaac_basic_ops32.h"
#include "ixheaac_basic_ops16.h"
#include "ixheaac_basic_ops40.h"
#include "ixheaac_basic_ops.h"
#include "ixheaace_bitbuffer.h"
#include "ixheaace_psy_const.h"
#include "ixheaace_tns.h"
#include "ixheaace_tns_params.h"
#include "ixheaace_rom.h"
#include "ixheaace_bits_count.h"
#include "ixheaace_common_rom.h"
#include "ixheaace_common_utils.h"
VOID ia_enhaacplus_enc_count1_2_3_4_5_6_7_8_9_10_11(const WORD16 *values, const WORD32 width,
WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bits1_2, bits3_4, bits5_6, bits7_8, bits9_10, bit11, sc;
WORD32 temp_0, temp_1, temp_2, temp_3;
(VOID) invalid_bitcnt;
bits1_2 = 0;
bits3_4 = 0;
bits5_6 = 0;
bits7_8 = 0;
bits9_10 = 0;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 4) {
temp_0 = values[i + 0];
temp_1 = values[i + 1];
temp_2 = values[i + 2];
temp_3 = values[i + 3];
bits1_2 +=
EXPAND(pstr_huffman_tbl->huff_ltab1_2[temp_0 + 1][temp_1 + 1][temp_2 + 1][temp_3 + 1]);
bits5_6 += EXPAND(pstr_huffman_tbl->huff_ltab5_6[temp_0 + 4][temp_1 + 4]);
bits5_6 += EXPAND(pstr_huffman_tbl->huff_ltab5_6[temp_2 + 4][temp_3 + 4]);
sc += (temp_0 != 0) + (temp_1 != 0) + (temp_2 != 0) + (temp_3 != 0);
temp_0 = abs32(temp_0);
temp_1 = abs32(temp_1);
temp_2 = abs32(temp_2);
temp_3 = abs32(temp_3);
bits3_4 += EXPAND(pstr_huffman_tbl->huff_ltab3_4[temp_0][temp_1][temp_2][temp_3]);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_2][temp_3]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_2][temp_3]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_2][temp_3]);
}
bitcnt[1] = HI_EXPLTAB(bits1_2);
bitcnt[2] = LO_EXPLTAB(bits1_2);
bitcnt[3] = HI_EXPLTAB(bits3_4) + sc;
bitcnt[4] = LO_EXPLTAB(bits3_4) + sc;
bitcnt[5] = HI_EXPLTAB(bits5_6);
bitcnt[6] = LO_EXPLTAB(bits5_6);
bitcnt[7] = HI_EXPLTAB(bits7_8) + sc;
bitcnt[8] = LO_EXPLTAB(bits7_8) + sc;
bitcnt[9] = HI_EXPLTAB(bits9_10) + sc;
bitcnt[10] = LO_EXPLTAB(bits9_10) + sc;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count3_4_5_6_7_8_9_10_11(const WORD16 *values, const WORD32 width,
WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bits3_4, bits5_6, bits7_8, bits9_10, bit11, sc;
WORD32 temp_0, temp_1, temp_2, temp_3;
bits3_4 = 0;
bits5_6 = 0;
bits7_8 = 0;
bits9_10 = 0;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 4) {
temp_0 = values[i + 0];
temp_1 = values[i + 1];
temp_2 = values[i + 2];
temp_3 = values[i + 3];
bits5_6 += EXPAND(pstr_huffman_tbl->huff_ltab5_6[temp_0 + 4][temp_1 + 4]);
bits5_6 += EXPAND(pstr_huffman_tbl->huff_ltab5_6[temp_2 + 4][temp_3 + 4]);
temp_0 = abs32(temp_0);
temp_1 = abs32(temp_1);
temp_2 = abs32(temp_2);
temp_3 = abs32(temp_3);
bits3_4 += EXPAND(pstr_huffman_tbl->huff_ltab3_4[temp_0][temp_1][temp_2][temp_3]);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_2][temp_3]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_2][temp_3]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_2][temp_3]);
sc += (temp_0 > 0) + (temp_1 > 0) + (temp_2 > 0) + (temp_3 > 0);
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = HI_EXPLTAB(bits3_4) + sc;
bitcnt[4] = LO_EXPLTAB(bits3_4) + sc;
bitcnt[5] = HI_EXPLTAB(bits5_6);
bitcnt[6] = LO_EXPLTAB(bits5_6);
bitcnt[7] = HI_EXPLTAB(bits7_8) + sc;
bitcnt[8] = LO_EXPLTAB(bits7_8) + sc;
bitcnt[9] = HI_EXPLTAB(bits9_10) + sc;
bitcnt[10] = LO_EXPLTAB(bits9_10) + sc;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count5_6_7_8_9_10_11(const WORD16 *values, const WORD32 width,
WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bits5_6, bits7_8, bits9_10, bit11, sc;
WORD32 temp_0, temp_1;
bits5_6 = 0;
bits7_8 = 0;
bits9_10 = 0;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 2) {
temp_0 = values[i + 0];
temp_1 = values[i + 1];
bits5_6 += EXPAND(pstr_huffman_tbl->huff_ltab5_6[temp_0 + 4][temp_1 + 4]);
temp_0 = abs32(temp_0);
temp_1 = abs32(temp_1);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
sc += (temp_0 > 0) + (temp_1 > 0);
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = invalid_bitcnt;
bitcnt[4] = invalid_bitcnt;
bitcnt[5] = HI_EXPLTAB(bits5_6);
bitcnt[6] = LO_EXPLTAB(bits5_6);
bitcnt[7] = HI_EXPLTAB(bits7_8) + sc;
bitcnt[8] = LO_EXPLTAB(bits7_8) + sc;
bitcnt[9] = HI_EXPLTAB(bits9_10) + sc;
bitcnt[10] = LO_EXPLTAB(bits9_10) + sc;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count7_8_9_10_11(const WORD16 *values, const WORD32 width,
WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bits7_8, bits9_10, bit11, sc;
WORD32 temp_0, temp_1;
bits7_8 = 0;
bits9_10 = 0;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 2) {
temp_0 = abs32(values[i + 0]);
temp_1 = abs32(values[i + 1]);
bits7_8 += EXPAND(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
sc += (temp_0 > 0) + (temp_1 > 0);
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = invalid_bitcnt;
bitcnt[4] = invalid_bitcnt;
bitcnt[5] = invalid_bitcnt;
bitcnt[6] = invalid_bitcnt;
bitcnt[7] = HI_EXPLTAB(bits7_8) + sc;
bitcnt[8] = LO_EXPLTAB(bits7_8) + sc;
bitcnt[9] = HI_EXPLTAB(bits9_10) + sc;
bitcnt[10] = LO_EXPLTAB(bits9_10) + sc;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count9_10_11(const WORD16 *values, const WORD32 width,
WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bits9_10, bit11, sc;
WORD32 temp_0, temp_1;
bits9_10 = 0;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 2) {
temp_0 = abs32(values[i + 0]);
temp_1 = abs32(values[i + 1]);
bits9_10 += EXPAND(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
sc += (temp_0 > 0) + (temp_1 > 0);
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = invalid_bitcnt;
bitcnt[4] = invalid_bitcnt;
bitcnt[5] = invalid_bitcnt;
bitcnt[6] = invalid_bitcnt;
bitcnt[7] = invalid_bitcnt;
bitcnt[8] = invalid_bitcnt;
bitcnt[9] = HI_EXPLTAB(bits9_10) + sc;
bitcnt[10] = LO_EXPLTAB(bits9_10) + sc;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count11(const WORD16 *values, const WORD32 width, WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bit11, sc;
WORD32 temp_0, temp_1;
bit11 = 0;
sc = 0;
for (i = 0; i < width; i += 2) {
temp_0 = abs32(values[i + 0]);
temp_1 = abs32(values[i + 1]);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[temp_0][temp_1]);
sc += (temp_0 > 0) + (temp_1 > 0);
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = invalid_bitcnt;
bitcnt[4] = invalid_bitcnt;
bitcnt[5] = invalid_bitcnt;
bitcnt[6] = invalid_bitcnt;
bitcnt[7] = invalid_bitcnt;
bitcnt[8] = invalid_bitcnt;
bitcnt[9] = invalid_bitcnt;
bitcnt[10] = invalid_bitcnt;
bitcnt[11] = bit11 + sc;
}
static VOID ia_enhaacplus_enc_count_esc(const WORD16 *values, const WORD32 width, WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 invalid_bitcnt) {
WORD32 i;
WORD32 bit11, ec, sc;
WORD32 temp_0, temp_1, t00, t01;
bit11 = 0;
sc = 0;
ec = 0;
for (i = 0; i < width; i += 2) {
temp_0 = abs32(values[i + 0]);
temp_1 = abs32(values[i + 1]);
sc += (temp_0 > 0) + (temp_1 > 0);
t00 = MIN(temp_0, 16);
t01 = MIN(temp_1, 16);
bit11 += EXPAND(pstr_huffman_tbl->huff_ltab11[t00][t01]);
if (temp_0 >= 16) {
ec += 5;
while ((temp_0 >>= 1) >= 16) {
ec += 2;
}
}
if (temp_1 >= 16) {
ec += 5;
while ((temp_1 >>= 1) >= 16) {
ec += 2;
}
}
}
bitcnt[1] = invalid_bitcnt;
bitcnt[2] = invalid_bitcnt;
bitcnt[3] = invalid_bitcnt;
bitcnt[4] = invalid_bitcnt;
bitcnt[5] = invalid_bitcnt;
bitcnt[6] = invalid_bitcnt;
bitcnt[7] = invalid_bitcnt;
bitcnt[8] = invalid_bitcnt;
bitcnt[9] = invalid_bitcnt;
bitcnt[10] = invalid_bitcnt;
bitcnt[11] = bit11 + sc + ec;
}
typedef VOID (*COUNT_FUNCTION)(const WORD16 *values, const WORD32 width, WORD32 *bitcnt,
ixheaace_huffman_tables *pstr_huffman_tbl, WORD32 invalid_bitcnt);
static COUNT_FUNCTION ia_enhaacplus_enc_count_func_tab[CODE_BCK_ESC_LAV + 1] = {
ia_enhaacplus_enc_count1_2_3_4_5_6_7_8_9_10_11, /* 0 */
ia_enhaacplus_enc_count1_2_3_4_5_6_7_8_9_10_11, /* 1 */
ia_enhaacplus_enc_count3_4_5_6_7_8_9_10_11, /* 2 */
ia_enhaacplus_enc_count5_6_7_8_9_10_11, /* 3 */
ia_enhaacplus_enc_count5_6_7_8_9_10_11, /* 4 */
ia_enhaacplus_enc_count7_8_9_10_11, /* 5 */
ia_enhaacplus_enc_count7_8_9_10_11, /* 6 */
ia_enhaacplus_enc_count7_8_9_10_11, /* 7 */
ia_enhaacplus_enc_count9_10_11, /* 8 */
ia_enhaacplus_enc_count9_10_11, /* 9 */
ia_enhaacplus_enc_count9_10_11, /* 10 */
ia_enhaacplus_enc_count9_10_11, /* 11 */
ia_enhaacplus_enc_count9_10_11, /* 12 */
ia_enhaacplus_enc_count11, /* 13 */
ia_enhaacplus_enc_count11, /* 14 */
ia_enhaacplus_enc_count11, /* 15 */
ia_enhaacplus_enc_count_esc /* 16 */
};
VOID ia_enhaacplus_enc_bitcount(const WORD16 *ptr_values, const WORD32 width, WORD32 max_val,
WORD32 *bit_cnt, ixheaace_huffman_tables *pstr_huffman_tbl,
WORD32 aot) {
WORD32 invalid_bitcnt;
if (max_val == 0) {
*bit_cnt = 0;
} else {
switch (aot) {
case AOT_AAC_LC:
case AOT_SBR:
case AOT_PS:
*bit_cnt = INVALID_BITCOUNT_LC;
break;
case AOT_AAC_LD:
case AOT_AAC_ELD:
*bit_cnt = INVALID_BITCOUNT_LD;
break;
}
}
invalid_bitcnt = *bit_cnt;
max_val = MIN(max_val, CODE_BCK_ESC_LAV);
ia_enhaacplus_enc_count_func_tab[max_val](ptr_values, width, bit_cnt, pstr_huffman_tbl,
invalid_bitcnt);
}
VOID ia_enhaacplus_enc_code_values(WORD16 *ptr_values, WORD32 width, WORD32 code_book,
ixheaace_bit_buf_handle pstr_bitstream,
ixheaace_huffman_tables *pstr_huffman_tbl) {
WORD32 i, temp_0, temp_1, temp_2, temp_3, t00, t01;
WORD32 code_word, code_length;
WORD32 sign, sign_length;
WORD16 *ptr_temp_values = ptr_values;
switch (code_book) {
case CODE_BCK_ZERO_NO:
break;
case CODE_BCK_1_NO:
width = width >> 2;
for (i = width - 1; i >= 0; i--) {
temp_0 = *ptr_temp_values++;
temp_1 = *ptr_temp_values++;
temp_2 = *ptr_temp_values++;
temp_3 = *ptr_temp_values++;
code_word = pstr_huffman_tbl->huff_ctab1[temp_0 + 1][temp_1 + 1][temp_2 + 1][temp_3 + 1];
code_length = HI_LTAB(
pstr_huffman_tbl->huff_ltab1_2[temp_0 + 1][temp_1 + 1][temp_2 + 1][temp_3 + 1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
}
break;
case CODE_BCK_2_NO:
width = width >> 2;
for (i = width - 1; i >= 0; i--) {
temp_0 = *ptr_temp_values++;
temp_1 = *ptr_temp_values++;
temp_2 = *ptr_temp_values++;
temp_3 = *ptr_temp_values++;
code_word = pstr_huffman_tbl->huff_ctab2[temp_0 + 1][temp_1 + 1][temp_2 + 1][temp_3 + 1];
code_length = LO_LTAB(
pstr_huffman_tbl->huff_ltab1_2[temp_0 + 1][temp_1 + 1][temp_2 + 1][temp_3 + 1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
}
break;
case CODE_BCK_3_NO:
for (i = 0; i < width; i += 4) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
temp_2 = ptr_values[i + 2];
if (temp_2 != 0) {
sign_length++;
sign <<= 1;
if (temp_2 < 0) {
sign |= 1;
temp_2 = abs32(temp_2);
}
}
temp_3 = ptr_values[i + 3];
if (temp_3 != 0) {
sign_length++;
sign <<= 1;
if (temp_3 < 0) {
sign |= 1;
temp_3 = abs32(temp_3);
}
}
code_word = pstr_huffman_tbl->huff_ctab3[temp_0][temp_1][temp_2][temp_3];
code_length = HI_LTAB(pstr_huffman_tbl->huff_ltab3_4[temp_0][temp_1][temp_2][temp_3]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_4_NO:
for (i = 0; i < width; i += 4) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
temp_2 = ptr_values[i + 2];
if (temp_2 != 0) {
sign_length++;
sign <<= 1;
if (temp_2 < 0) {
sign |= 1;
temp_2 = abs32(temp_2);
}
}
temp_3 = ptr_values[i + 3];
if (temp_3 != 0) {
sign_length++;
sign <<= 1;
if (temp_3 < 0) {
sign |= 1;
temp_3 = abs32(temp_3);
}
}
code_word = pstr_huffman_tbl->huff_ctab4[temp_0][temp_1][temp_2][temp_3];
code_length = LO_LTAB(pstr_huffman_tbl->huff_ltab3_4[temp_0][temp_1][temp_2][temp_3]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_5_NO:
width = width >> 1;
for (i = width - 1; i >= 0; i--) {
temp_0 = *ptr_temp_values++;
temp_1 = *ptr_temp_values++;
code_word = pstr_huffman_tbl->huff_ctab5[temp_0 + 4][temp_1 + 4];
code_length = HI_LTAB(pstr_huffman_tbl->huff_ltab5_6[temp_0 + 4][temp_1 + 4]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
}
break;
case CODE_BCK_6_NO:
width = width >> 1;
for (i = width - 1; i >= 0; i--) {
temp_0 = *ptr_temp_values++;
temp_1 = *ptr_temp_values++;
code_word = pstr_huffman_tbl->huff_ctab6[temp_0 + 4][temp_1 + 4];
code_length = LO_LTAB(pstr_huffman_tbl->huff_ltab5_6[temp_0 + 4][temp_1 + 4]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
}
break;
case CODE_BCK_7_NO:
for (i = 0; i < width; i += 2) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
code_word = pstr_huffman_tbl->huff_ctab7[temp_0][temp_1];
code_length = HI_LTAB(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_8_NO:
for (i = 0; i < width; i += 2) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
code_word = pstr_huffman_tbl->huff_ctab8[temp_0][temp_1];
code_length = LO_LTAB(pstr_huffman_tbl->huff_ltab7_8[temp_0][temp_1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_9_NO:
for (i = 0; i < width; i += 2) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
code_word = pstr_huffman_tbl->huff_ctab9[temp_0][temp_1];
code_length = HI_LTAB(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_10_NO:
for (i = 0; i < width; i += 2) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
code_word = pstr_huffman_tbl->huff_ctab10[temp_0][temp_1];
code_length = LO_LTAB(pstr_huffman_tbl->huff_ltab9_10[temp_0][temp_1]);
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
}
break;
case CODE_BCK_ESC_NO:
for (i = 0; i < width; i += 2) {
sign = 0;
sign_length = 0;
temp_0 = ptr_values[i + 0];
if (temp_0 != 0) {
sign_length++;
sign <<= 1;
if (temp_0 < 0) {
sign |= 1;
temp_0 = abs32(temp_0);
}
}
temp_1 = ptr_values[i + 1];
if (temp_1 != 0) {
sign_length++;
sign <<= 1;
if (temp_1 < 0) {
sign |= 1;
temp_1 = abs32(temp_1);
}
}
t00 = MIN(temp_0, 16);
t01 = MIN(temp_1, 16);
code_word = pstr_huffman_tbl->huff_ctab11[t00][t01];
code_length = pstr_huffman_tbl->huff_ltab11[t00][t01];
ixheaace_write_bits(pstr_bitstream, code_word, (UWORD8)code_length);
ixheaace_write_bits(pstr_bitstream, sign, (UWORD8)sign_length);
if (temp_0 >= 16) {
WORD32 n, p;
n = 0;
p = temp_0;
while ((p >>= 1) >= 16) {
ixheaace_write_bits(pstr_bitstream, 1, 1);
n++;
}
ixheaace_write_bits(pstr_bitstream, 0, 1);
ixheaace_write_bits(pstr_bitstream, temp_0 - (1 << (n + 4)), (UWORD8)(n + 4));
}
if (temp_1 >= 16) {
WORD32 n, p;
n = 0;
p = temp_1;
while ((p >>= 1) >= 16) {
ixheaace_write_bits(pstr_bitstream, 1, 1);
n++;
}
ixheaace_write_bits(pstr_bitstream, 0, 1);
ixheaace_write_bits(pstr_bitstream, temp_1 - (1 << (n + 4)), (UWORD8)(n + 4));
}
}
break;
default:
break;
}
}
VOID ia_enhaacplus_enc_code_scale_factor_delta(WORD32 delta,
ixheaace_bit_buf_handle h_bitstream,
ixheaace_huffman_tables *pstr_huffman_tbl) {
WORD32 code_word, code_length;
code_word = pstr_huffman_tbl->huff_ctabscf[delta + CODE_BCK_SCF_LAV];
code_length = pstr_huffman_tbl->huff_ltabscf[delta + CODE_BCK_SCF_LAV];
ixheaace_write_bits(h_bitstream, code_word, (UWORD8)code_length);
}