mirror of
https://github.com/ittiam-systems/libxaac.git
synced 2026-04-02 20:30:47 +07:00
948 lines
24 KiB
C
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);
|
|
}
|