xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_sbr_crc.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker 
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker 
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_crc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
35*15dc779aSAndroid Build Coastguard Worker 
ixheaace_crc_advance(UWORD16 crc_poly,UWORD16 crc_mask,UWORD16 * ptr_crc,UWORD32 b_value,WORD32 b_bits)36*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_crc_advance(UWORD16 crc_poly, UWORD16 crc_mask, UWORD16 *ptr_crc,
37*15dc779aSAndroid Build Coastguard Worker                                  UWORD32 b_value, WORD32 b_bits) {
38*15dc779aSAndroid Build Coastguard Worker   WORD32 i = b_bits - 1;
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker   while (i >= 0) {
41*15dc779aSAndroid Build Coastguard Worker     UWORD16 flag = (*ptr_crc) & crc_mask ? 1 : 0;
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker     flag ^= (b_value & (1 << i) ? 1 : 0);
44*15dc779aSAndroid Build Coastguard Worker 
45*15dc779aSAndroid Build Coastguard Worker     (*ptr_crc) <<= 1;
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker     if (flag) {
48*15dc779aSAndroid Build Coastguard Worker       (*ptr_crc) ^= crc_poly;
49*15dc779aSAndroid Build Coastguard Worker     }
50*15dc779aSAndroid Build Coastguard Worker     i--;
51*15dc779aSAndroid Build Coastguard Worker   }
52*15dc779aSAndroid Build Coastguard Worker }
53*15dc779aSAndroid Build Coastguard Worker 
ixheaace_init_sbr_bitstream(ixheaace_pstr_common_data pstr_cmon_data,UWORD8 * ptr_memory_base,WORD32 memory_size,WORD32 crc_active,ixheaace_sbr_codec_type sbr_codec)54*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_init_sbr_bitstream(ixheaace_pstr_common_data pstr_cmon_data,
55*15dc779aSAndroid Build Coastguard Worker                                  UWORD8 *ptr_memory_base, WORD32 memory_size, WORD32 crc_active,
56*15dc779aSAndroid Build Coastguard Worker                                  ixheaace_sbr_codec_type sbr_codec) {
57*15dc779aSAndroid Build Coastguard Worker   ixheaace_reset_bitbuf(&pstr_cmon_data->str_sbr_bit_buf, ptr_memory_base, memory_size);
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->str_tmp_write_bit_buf = pstr_cmon_data->str_sbr_bit_buf;
60*15dc779aSAndroid Build Coastguard Worker   if (HEAAC_SBR == sbr_codec) {
61*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 0, SI_FILL_EXTENTION_BITS);
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker     if (crc_active) {
64*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 0, SI_CRC_BITS_SBR);
65*15dc779aSAndroid Build Coastguard Worker     }
66*15dc779aSAndroid Build Coastguard Worker   }
67*15dc779aSAndroid Build Coastguard Worker }
68*15dc779aSAndroid Build Coastguard Worker 
ixheaace_assemble_sbr_bitstream(ixheaace_pstr_common_data pstr_cmon_data,ixheaace_sbr_codec_type sbr_codec)69*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_assemble_sbr_bitstream(ixheaace_pstr_common_data pstr_cmon_data,
70*15dc779aSAndroid Build Coastguard Worker                                      ixheaace_sbr_codec_type sbr_codec) {
71*15dc779aSAndroid Build Coastguard Worker   UWORD16 crc_reg = CRCINIT_SBR;
72*15dc779aSAndroid Build Coastguard Worker   WORD32 num_crc_bits, i;
73*15dc779aSAndroid Build Coastguard Worker   WORD32 sbr_load = 0;
74*15dc779aSAndroid Build Coastguard Worker 
75*15dc779aSAndroid Build Coastguard Worker   sbr_load = pstr_cmon_data->sbr_hdr_bits + pstr_cmon_data->sbr_data_bits;
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker   if (HEAAC_SBR == sbr_codec) {
78*15dc779aSAndroid Build Coastguard Worker     sbr_load += SI_FILL_EXTENTION_BITS;
79*15dc779aSAndroid Build Coastguard Worker   }
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker   if (pstr_cmon_data->sbr_crc_len) {
82*15dc779aSAndroid Build Coastguard Worker     sbr_load += SI_CRC_BITS_SBR;
83*15dc779aSAndroid Build Coastguard Worker   }
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker   if (USAC_SBR != sbr_codec) {
86*15dc779aSAndroid Build Coastguard Worker     pstr_cmon_data->sbr_fill_bits = (8 - (sbr_load) % 8) % 8;
87*15dc779aSAndroid Build Coastguard Worker 
88*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 0,
89*15dc779aSAndroid Build Coastguard Worker                         (UWORD8)pstr_cmon_data->sbr_fill_bits);
90*15dc779aSAndroid Build Coastguard Worker   }
91*15dc779aSAndroid Build Coastguard Worker   if (pstr_cmon_data->sbr_crc_len) {
92*15dc779aSAndroid Build Coastguard Worker     ixheaace_bit_buf tmp_crc_buf = pstr_cmon_data->str_sbr_bit_buf;
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker     ixheaace_readbits(&tmp_crc_buf, SI_FILL_EXTENTION_BITS);
95*15dc779aSAndroid Build Coastguard Worker 
96*15dc779aSAndroid Build Coastguard Worker     ixheaace_readbits(&tmp_crc_buf, SI_CRC_BITS_SBR);
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker     num_crc_bits = pstr_cmon_data->sbr_hdr_bits + pstr_cmon_data->sbr_data_bits +
99*15dc779aSAndroid Build Coastguard Worker                    pstr_cmon_data->sbr_fill_bits;
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker     i = 0;
102*15dc779aSAndroid Build Coastguard Worker     while (i < num_crc_bits) {
103*15dc779aSAndroid Build Coastguard Worker       UWORD32 bit;
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker       bit = ixheaace_readbits(&tmp_crc_buf, 1);
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker       ixheaace_crc_advance(CRC_POLYNOMIAL_SBR, CRC_MASK_SBR, &crc_reg, bit, 1);
108*15dc779aSAndroid Build Coastguard Worker 
109*15dc779aSAndroid Build Coastguard Worker       i++;
110*15dc779aSAndroid Build Coastguard Worker     }
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker     crc_reg &= (CRC_RANGE_SBR);
113*15dc779aSAndroid Build Coastguard Worker   }
114*15dc779aSAndroid Build Coastguard Worker 
115*15dc779aSAndroid Build Coastguard Worker   if (pstr_cmon_data->sbr_crc_len) {
116*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(&pstr_cmon_data->str_tmp_write_bit_buf, SI_FIL_CRC_SBR,
117*15dc779aSAndroid Build Coastguard Worker                         SI_FILL_EXTENTION_BITS);
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker     ixheaace_write_bits(&pstr_cmon_data->str_tmp_write_bit_buf, crc_reg, SI_CRC_BITS_SBR);
120*15dc779aSAndroid Build Coastguard Worker   } else {
121*15dc779aSAndroid Build Coastguard Worker     if (HEAAC_SBR == sbr_codec) {
122*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(&pstr_cmon_data->str_tmp_write_bit_buf, SI_FIL_SBR,
123*15dc779aSAndroid Build Coastguard Worker                           SI_FILL_EXTENTION_BITS);
124*15dc779aSAndroid Build Coastguard Worker     }
125*15dc779aSAndroid Build Coastguard Worker   }
126*15dc779aSAndroid Build Coastguard Worker }
127