diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 8e37844b9a69e8b386dcd0cd8576f99396bf96fd..6c57d317032c5782d19194496ff34c94360294a9 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -132,7 +132,6 @@ - diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index f247d199eba36b4b9c2e75593421e64bfdf9a25a..4996023dc7d526d432f3d72194c48f4ff900a726 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -1,646 +1,217 @@ - + - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_evs_c - - - common_all_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_ivas_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_ivas_c - - - - common_ivas_c - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - - common_h - + + + + + - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - common_h - - - - - {890c2f45-9385-4fce-859b-6a65469e8dc0} - - - {201ea764-9626-4dca-9cc4-5b4106f8b8b2} - - - {fbb860e2-79d0-45b1-ada1-c3a0a369ce2c} - - - {b95b7bed-a666-4a00-9332-2b528638503e} - + \ No newline at end of file diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c deleted file mode 100644 index 5b11e8d263f1a6e7aadbc35d95a7e33f6c173ccf..0000000000000000000000000000000000000000 --- a/lib_com/bitstream.c +++ /dev/null @@ -1,4052 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "stat_enc.h" -#include "stat_dec.h" -#include "rom_com.h" -#include "mime.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" -#include "prot_fx_enc.h" -#ifdef DEBUGGING -#include "debug.h" -#ifdef DBG_BITSTREAM_ANALYSIS -#include -#endif -#endif - -#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ - - -/*-------------------------------------------------------------------* - * rate2AMRWB_IOmode() - * - * lookup AMRWB IO mode - *-------------------------------------------------------------------*/ - -static Word16 rate2AMRWB_IOmode( - Word32 brate /* i : bitrate */ -) -{ - switch ( brate ) - { - /* EVS AMR-WB IO modes */ - case SID_1k75: - return AMRWB_IO_SID; - case ACELP_6k60: - return AMRWB_IO_6600; - case ACELP_8k85: - return AMRWB_IO_8850; - case ACELP_12k65: - return AMRWB_IO_1265; - case ACELP_14k25: - return AMRWB_IO_1425; - case ACELP_15k85: - return AMRWB_IO_1585; - case ACELP_18k25: - return AMRWB_IO_1825; - case ACELP_19k85: - return AMRWB_IO_1985; - case ACELP_23k05: - return AMRWB_IO_2305; - case ACELP_23k85: - return AMRWB_IO_2385; - default: - break; - } - - return -1; -} - -/*-------------------------------------------------------------------* - * rate2EVSmode() - * - * lookup EVS mode - *-------------------------------------------------------------------*/ -Word16 rate2EVSmode_float( - const Word32 brate, /* i : bitrate */ - Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ -) -{ - if ( is_amr_wb != NULL ) - { - *is_amr_wb = 0; - } - - switch ( brate ) - { - /* EVS Primary modes */ - case FRAME_NO_DATA: - return NO_DATA_TYPE; - case SID_2k40: - return PRIMARY_SID; - case PPP_NELP_2k80: - return PRIMARY_2800; - case ACELP_7k20: - return PRIMARY_7200; - case ACELP_8k00: - return PRIMARY_8000; - case ACELP_9k60: - return PRIMARY_9600; - case ACELP_13k20: - return PRIMARY_13200; - case ACELP_16k40: - return PRIMARY_16400; - case ACELP_24k40: - return PRIMARY_24400; - case ACELP_32k: - return PRIMARY_32000; - case ACELP_48k: - return PRIMARY_48000; - case ACELP_64k: - return PRIMARY_64000; - case HQ_96k: - return PRIMARY_96000; - case HQ_128k: - return PRIMARY_128000; - default: - break; - } - - if ( is_amr_wb != NULL ) - { - *is_amr_wb = 1; - } - - return rate2AMRWB_IOmode( brate ); -} - -/*-------------------------------------------------------------------* - * ind_list_realloc() - * - * Re-allocate the list of indices - *-------------------------------------------------------------------*/ - -ivas_error ind_list_realloc( - INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ - const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ -) -{ - Word16 i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; - INDICE_HANDLE new_ind_list; - BSTR_ENC_HANDLE hBstr; - - IF( st_ivas == NULL ) - { - return IVAS_ERR_OK; - } - - /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ - IF( old_ind_list == st_ivas->ind_list_metadata ) - { - is_metadata = 1; - ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; - } - ELSE - { - is_metadata = 0; - ivas_max_num_indices = st_ivas->ivas_max_num_indices; - } - move16(); - move16(); - - /* allocate new buffer of indices */ - IF( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - /* move indices from the old list to the new list */ - FOR( i = 0; i < s_min( max_num_indices, ivas_max_num_indices ); i++ ) - { - IF( GT_16( old_ind_list[i].nb_bits, -1 ) ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); -#endif - move16(); - move16(); - } - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; - move16(); - } - - /* reset nb_bits of all other indices to -1 */ - FOR( ; i < max_num_indices; i++ ) - { - new_ind_list[i].nb_bits = -1; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); -#endif - move16(); - } - - /* update parameters in all SCE elements */ - FOR( n = 0; n < st_ivas->nSCE; n++ ) - { - /* get the pointer to hBstr */ - IF( is_metadata ) - { - hBstr = st_ivas->hSCE[n]->hMetaData; - } - ELSE - { - hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; - } - - IF( hBstr != NULL ) - { - /* get the current position inside the old list */ - ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); - - /* set pointers in the new list */ - *( hBstr->ivas_ind_list_zero ) = new_ind_list; - hBstr->ind_list = &new_ind_list[ind_list_pos]; - - /* set the new maximum number of indices */ - *( hBstr->ivas_max_num_indices ) = max_num_indices; - move16(); - } - } - - /* update parameters in all CPE elements */ - FOR( n = 0; n < st_ivas->nCPE; n++ ) - { - /* get the pointer to hBstr */ - IF( is_metadata ) - { - n_channels = 1; - } - ELSE - { - n_channels = CPE_CHANNELS; - } - move16(); - - FOR( ch = 0; ch < n_channels; ch++ ) - { - IF( is_metadata ) - { - hBstr = st_ivas->hCPE[n]->hMetaData; - } - ELSE - { - hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; - } - - IF( hBstr != NULL ) - { - /* get the current position inside the old list */ - ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); - - /* set pointers in the new list */ - *( hBstr->ivas_ind_list_zero ) = new_ind_list; - hBstr->ind_list = &new_ind_list[ind_list_pos]; - - /* set the new maximum number of indices */ - *( hBstr->ivas_max_num_indices ) = max_num_indices; - move16(); - } - } - } - - /* free the old list */ - free( old_ind_list ); - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * get_ivas_max_num_indices() - * - * Get the maximum allowed number of indices in the encoder - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -Word16 get_ivas_max_num_indices_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -) -{ - test(); - test(); - IF( EQ_16( ivas_format, STEREO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 450; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1350; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MONO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 450; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 550; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 620; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 670; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 780; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 880; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1300; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 1020; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1160; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 1220; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1720; - } - ELSE - { - return 2000; - } - } - ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 950; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1450; - } - ELSE - { - return 1650; - } - } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 1250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1650; - } - ELSE - { - return 1850; - } - } - ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 250; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 350; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 400; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 650; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 750; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 1150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 1420; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 2120; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 2250; - } - ELSE - { - return 2450; - } - } - - return 2450; -} -/*-----------------------------------------------------------------------* - * get_BWE_max_num_indices() - * - * Get the maximum number of indices in the BWE - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -Word16 get_BWE_max_num_indices( - const Word32 extl_brate /* i : extensiona layer bitrate */ -) -{ - /* set the maximum number of indices in the BWE */ - if ( extl_brate < SWB_BWE_16k ) - { - return 30; - } - else - { - return 150; - } -} - - -/*-----------------------------------------------------------------------* - * get_ivas_max_num_indices_metadata() - * - * Set the maximum allowed number of metadata indices in the list - *-----------------------------------------------------------------------*/ - -/*! r: maximum number of indices */ -Word16 get_ivas_max_num_indices_metadata_fx( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -) -{ - /* set the maximum required number of metadata indices */ - test(); - IF( EQ_16( ivas_format, MONO_FORMAT ) ) - { - return 0; - } - ELSE IF( EQ_16( ivas_format, STEREO_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 60; - } - ELSE - { - return 80; - } - } - ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 20; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 65; - } - ELSE - { - return 80; - } - } - ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 200; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 300; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 500; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 1050; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 2000; - } - ELSE - { - return 2500; - } - } - ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 125; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 205; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 240; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 305; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 425; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 630; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 850; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1000; - } - ELSE - { - return 1750; - } - } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) - { - return 125 + 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) - { - return 205 + 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 240 + 150; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) - { - return 305 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) - { - return 425 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) - { - return 630 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) - { - return 850 + 30; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) - { - return 1000 + 30; - } - ELSE - { - return 1750 + 30; - } - } - ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) - { - IF( LE_32( ivas_total_brate, IVAS_13k2 ) ) - { - return 80; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) - { - return 100; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) - { - return 210; - } - ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) - { - return 220; - } - ELSE - { - return 300; - } - } - - return 50; -} -/*-------------------------------------------------------------------* - * move_indices() - * - * Move indices inside the buffer or among two buffers - *-------------------------------------------------------------------*/ - -void move_indices( - INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ - INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const Word16 nb_indices /* i : number of moved indices */ -) -{ - Word16 i; - - if ( new_ind_list < old_ind_list ) - { - for ( i = 0; i < nb_indices; i++ ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; - -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); -#endif - old_ind_list[i].nb_bits = -1; - } - } - else if ( new_ind_list > old_ind_list ) - { - for ( i = nb_indices - 1; i >= 0; i-- ) - { - new_ind_list[i].id = old_ind_list[i].id; - new_ind_list[i].value = old_ind_list[i].value; - new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); -#endif - - old_ind_list[i].nb_bits = -1; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); -#endif - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * check_ind_list_limits() - * - * Check, if the maximum number of indices has been reached -> reallocate - * Check, if we will not overwrite an existing indice -> adjust the location - *-------------------------------------------------------------------*/ - -ivas_error check_ind_list_limits( - BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ -) -{ - Indice *ivas_ind_list_zero, *ivas_ind_list_last; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); - - /* check, if the maximum number of indices has been reached and re-allocate the buffer */ - /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ - IF( GE_16( (Word16) ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) - { - - /* reallocate the buffer of indices with increased limit */ - IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* check, if we will not overwrite an existing indice */ - IF( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) - { - IF( hBstr->nb_ind_tot == 0 ) - { - /* move the pointer to the next available empty slot */ - ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; - WHILE( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) - { - hBstr->ind_list++; - } - - IF( hBstr->ind_list >= ivas_ind_list_last ) - { - - /* no available empty slot -> need to re-allocate the buffer */ - IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE - { -#ifdef DEBUGGING - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); -#else - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); -#endif - } - } - - return error; -} - -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) -const char *named_indices_table[] = { - "IND_IVAS_FORMAT", - "IND_SMODE_OMASA", - "IND_SMODE", - "IND_SID_TYPE", - "IND_BWIDTH", - "IND_CORE", - "IND_PPP_NELP_MODE", - "IND_ACELP_16KHZ", - "IND_ACELP_SIGNALLING", - "IND_SHARP_FLAG", - "IND_MDCT_CORE", - "IND_TCX_CORE", - "IND_BWE_FLAG", - "IND_HQ_SWITCHING_FLG", - "IND_LAST_L_FRAME", - "IND_VAD_FLAG", - "IND_HQ_BWIDTH", - "IND_TC_SUBFR", - "IND_TC_SUBFR", - "IND_TC_SUBFR", - "IND_TC_SUBFR", - "IND_GSC_IVAS_SP", - "IND_LSF_PREDICTOR_SELECT_BIT", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_LSF", - "IND_MID_FRAME_LSF_INDEX", - "IND_ISF_0_0", - "IND_ISF_0_1", - "IND_ISF_0_2", - "IND_ISF_0_3", - "IND_ISF_0_4", - "IND_ISF_1_0", - "IND_ISF_1_1", - "IND_ISF_1_2", - "IND_ISF_1_3", - "IND_ISF_1_4", - "IND_IC_LSF_PRED", - "IND_GSC_ATTACK", - "IND_GSC_SWB_SPEECH", - "IND_NOISE_LEVEL", - "IND_HF_NOISE", - "IND_PIT_CONTR_IDX", - "IND_FEC_CLAS", - "IND_FEC_ENR", - "IND_FEC_POS", - "IND_ES_PRED", - "IND_HARM_FLAG_ACELP", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "IND_ALG_CDBK_4T64_2_24KBIT", - "TAG_ALG_CDBK_4T64_24KBIT_END", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "IND_HF_GAIN_MODIFICATION", - "TAG_ACELP_SUBFR_LOOP_END", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_MEAN_GAIN2", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_TMP", - "IND_Y_GAIN_HF", - "IND_HQ_VOICING_FLAG", - "IND_HQ_SWB_CLAS", - "IND_NF_IDX", - "IND_LC_MODE", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_YNRM", - "IND_SWB_FENV_HQ", - "IND_SWB_FENV_HQ", - "IND_SWB_FENV_HQ", - "IND_SWB_FENV_HQ", - "IND_SWB_FENV_HQ", - "IND_FB_FENV_HQ", - "IND_FB_FENV_HQ", - "IND_FB_FENV_HQ", - "IND_FB_FENV_HQ", - "IND_FB_FENV_HQ", - "IND_DELTA_ENV_HQ", - "IND_HVQ_BWE_NL", - "IND_HVQ_BWE_NL", - "IND_NUM_PEAKS", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_POS_IDX", - "IND_FLAGN", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_PG_IDX", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_PEAKS", - "IND_HVQ_NF_GAIN", - "IND_HVQ_NF_GAIN", - "IND_HQ2_SWB_CLAS", - "IND_HQ2_DENG_MODE", - "IND_HQ2_DENG_8SMODE", - "IND_HQ2_DENG_8SMODE_N0", - "IND_HQ2_DENG_8SMODE_N1", - "IND_HQ2_DENG_8SPOS", - "IND_HQ2_DENG_8SDEPTH", - "IND_HQ2_DENG_HMODE", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_DIFF_ENERGY", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_P2A_FLAGS", - "IND_HQ2_LAST_BA_MAX_BAND", - "IND_HQ2_LAST_BA_MAX_BAND", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_START", - "IND_RC_END", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_HVQ_PVQ_GAIN", - "IND_NOISINESS", - "IND_ENERGY", - "IND_CNG_HO", - "IND_SID_BW", - "IND_CNG_ENV1", - "IND_WB_FENV", - "IND_WB_CLASS", - "IND_IG1", - "IND_IG2A", - "IND_IG2B", - "IND_NELP_FID", - "IND_DELTALAG", - "IND_POWER", - "IND_AMP0", - "IND_AMP1", - "IND_GLOBAL_ALIGNMENT", - "IND_PVQ_FINE_GAIN", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_UV_FLAG", - "IND_SHB_SUBGAIN", - "IND_SHB_FRAMEGAIN", - "IND_STEREO_ICBWE_MSFLAG", - "IND_SHB_ENER_SF", - "IND_SHB_RES_GS", - "IND_SHB_RES_GS", - "IND_SHB_RES_GS", - "IND_SHB_RES_GS", - "IND_SHB_RES_GS", - "IND_SHB_VF", - "IND_SHB_LSF", - "IND_SHB_LSF", - "IND_SHB_LSF", - "IND_SHB_LSF", - "IND_SHB_LSF", - "IND_SHB_MIRROR", - "IND_SHB_GRID", - "IND_SWB_CLASS", - "IND_SWB_TENV", - "IND_SWB_TENV", - "IND_SWB_TENV", - "IND_SWB_TENV", - "IND_SWB_FENV", - "IND_SWB_FENV", - "IND_SWB_FENV", - "IND_SWB_FENV", - "IND_SHB_CNG_GAIN", - "IND_DITHERING", - "IND_FB_SLOPE", - "IND_HQ2_SPT_SHORTEN", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_TCQ", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_SUBBAND_GAIN", - "IND_HQ2_DUMMY", - "IND_LAGINDICES", - "IND_NOISEG", - "IND_AUDIO_GAIN", - "IND_AUDIO_DELAY", - "IND_AUDIO_DELAY", - "IND_AUDIO_DELAY", - "IND_AUDIO_DELAY", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "IND_NQ2", - "TAG_HR_BWE_LOOP_END", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_CELP_SUBFRAME", - "IND_CORE_SWITCHING_AUDIO_DELAY", - "IND_CORE_SWITCHING_AUDIO_GAIN", - "IND_STEREO_ICBWE_REF", - "IND_STEREO_ICBWE_SP", - "IND_STEREO_ICBWE_GS", - "IND_STEREO_REFCHAN", - "IND_STEREO_CORRSTATS", - "IND_STEREO_GD", - "IND_STEREO_LRTD_FLAG", - "IND_STEREO_LPC_REUSE", - "IND_STEREO_TD_ALPHA", - "IND_STEREO_2ND_CODER_T", - "IND_UNUSED" -}; -#endif - - -/*-------------------------------------------------------------------* - * push_indice() - * - * Push a new indice into the buffer - *-------------------------------------------------------------------*/ - -ivas_error push_indice( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - Word16 id, /* i : ID of the indice */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - Word16 i; - Word16 j; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { -#ifdef DEBUGGING - return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); -#else - return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices!\n" ); -#endif - } - - /* find the location in the list of indices based on ID */ - i = hBstr->nb_ind_tot; - move16(); - test(); - WHILE( i > 0 && ( id < hBstr->ind_list[i - 1].id ) ) - { - test(); - i = sub( i, 1 ); - } - - /* shift indices, if the new ID is to be written somewhere inside the list */ - IF( i < hBstr->nb_ind_tot ) - { - FOR( j = hBstr->nb_ind_tot; j > i; j-- ) - { - hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; - hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); -#endif - move16(); - move16(); - move16(); - } - } - - - /* store the new indice in the list */ - hBstr->ind_list[i].id = id; - hBstr->ind_list[i].value = value; - hBstr->ind_list[i].nb_bits = nb_bits; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); -#endif - move16(); - move16(); - move16(); - - /* updates */ - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * push_next_indice() - * - * Push a new indice into the buffer at the next position - *-------------------------------------------------------------------*/ -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) -ivas_error push_next_indice_( - const char *caller, -#else -ivas_error push_next_indice( -#endif - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - Word16 prev_id; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* get the id of the previous indice -> it will be re-used */ - IF( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - } - ELSE - { - prev_id = 0; - } - move16(); - - /* store the values in the list */ - hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; - hBstr->ind_list[hBstr->nb_ind_tot].value = value; - hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; - move16(); - move16(); - move16(); - -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); -#endif - - /* updates */ - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * push_next_bits() - * Push a bit buffer into the buffer at the next position - *-------------------------------------------------------------------*/ -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) -ivas_error push_next_bits_( - const char *caller, -#else -ivas_error push_next_bits( -#endif - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ - const Word16 nb_bits /* i : number of bits to pack */ -) -{ - UWord16 code; - Word16 i, nb_bits_m15; - Indice *ptr; - Word16 prev_id; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - /* get the id of the previous indice -> will be re-used */ - IF( hBstr->nb_ind_tot > 0 ) - { - prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; - move16(); - } - ELSE - { - prev_id = 0; - move16(); - } - nb_bits_m15 = sub( nb_bits, 15 ); - - FOR( i = 0; i < nb_bits_m15; i += 16 ) - { - code = (UWord16) L_or( L_shl( bits[i], 15 ), L_or( L_shl( bits[i + 1], 14 ), L_or( L_shl( bits[i + 2], 13 ), L_or( L_shl( bits[i + 3], 12 ), L_or( L_shl( bits[i + 4], 11 ), L_or( L_shl( bits[i + 5], 10 ), L_or( L_shl( bits[i + 6], 9 ), L_or( L_shl( bits[i + 7], 8 ), L_or( L_shl( bits[i + 8], 7 ), L_or( L_shl( bits[i + 9], 6 ), L_or( L_shl( bits[i + 10], 5 ), L_or( L_shl( bits[i + 11], 4 ), L_or( L_shl( bits[i + 12], 3 ), L_or( L_shl( bits[i + 13], 2 ), L_or( L_shl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); - - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { -#ifdef DEBUGGING - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); -#else - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); -#endif - } - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - ptr->value = code; - ptr->nb_bits = 16; - ptr->id = prev_id; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( ptr->function_name, caller, 100 ); -#endif - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - move16(); - move16(); - move16(); - move16(); - - ++ptr; - } - - FOR( ; i < nb_bits; ++i ) - { - /* check the limits of the list of indices */ - IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) - { -#ifdef DEBUGGING - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); -#else - return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); -#endif - } - ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; - - ptr->value = bits[i]; - ptr->nb_bits = 1; - ptr->id = prev_id; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( ptr->function_name, caller, 100 ); -#endif - hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); - move16(); - move16(); - move16(); - move16(); - - ++ptr; - } - - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * find_indice() - * - * Find indice based on its id - *-------------------------------------------------------------------*/ - -/*! r: result: index of the indice in the list, -1 if not found */ -Word16 find_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const Word16 id, /* i : ID of the indice */ - UWord16 *value, /* o : value of the quantized indice */ - Word16 *nb_bits /* o : number of bits used to quantize the indice */ -) -{ - Word16 i; - - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) - { - *value = hBstr->ind_list[i].value; - *nb_bits = hBstr->ind_list[i].nb_bits; - return i; - } - } - - return -1; -} - - -/*-------------------------------------------------------------------* - * delete_indice() - * - * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) - *-------------------------------------------------------------------*/ - -/*! r: number of deleted indices */ -UWord16 delete_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const Word16 id /* i : ID of the indice */ -) -{ - Word16 i, j; - - j = 0; - for ( i = 0; i < hBstr->nb_ind_tot; i++ ) - { - if ( hBstr->ind_list[i].id == id ) - { - hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; - continue; - } - - if ( j < i ) - { - /* shift the indice left */ - hBstr->ind_list[j].id = hBstr->ind_list[i].id; - hBstr->ind_list[j].value = hBstr->ind_list[i].value; - hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); -#endif - } - - j++; - } - - hBstr->nb_ind_tot = j; - - for ( ; j < i; j++ ) - { - /* reset the shifted indices at the end of the list */ - hBstr->ind_list[j].nb_bits = -1; -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); -#endif - } - - return i - j; -} - - -/*-------------------------------------------------------------------* - * get_next_indice() - * - * Get the next indice from the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -UWord16 get_next_indice( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - UWord16 value; - Word16 i; - Word32 nbits_total; - - assert( nb_bits <= 16 ); - - nbits_total = st->total_brate / FRAMES_PER_SEC; - /* detect corrupted bitstream */ - if ( st->next_bit_pos + nb_bits > nbits_total ) - { - st->BER_detect = 1; - return ( 0 ); - } - - value = 0; - for ( i = 0; i < nb_bits; i++ ) - { - value <<= 1; - value += st->bit_stream[st->next_bit_pos + i]; - } - - /* update the position in the bitstream */ - st->next_bit_pos += nb_bits; - - return value; -} - -/*-------------------------------------------------------------------* - * get_next_indice_tmp() - * - * update the total number of bits and the position in the bitstream - *-------------------------------------------------------------------*/ - -void get_next_indice_tmp( - Decoder_State *st, /* o : decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - /* update the position in the bitstream */ - st->next_bit_pos += nb_bits; - - return; -} - -/*-------------------------------------------------------------------* - * get_indice() - * - * Get indice at specific position in the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -UWord16 get_indice( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 pos, /* i : absolute position in the bitstream (update after the read) */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -) -{ - UWord16 value; - Word16 i; - Word32 nbits_total; - - assert( nb_bits <= 16 ); - - nbits_total = st->total_brate / FRAMES_PER_SEC; - - /* detect corrupted bitstream */ - if ( pos + nb_bits > nbits_total ) - { - st->BER_detect = 1; - return ( 0 ); - } - - value = 0; - for ( i = 0; i < nb_bits; i++ ) - { - value <<= 1; - value += st->bit_stream[pos + i]; - } - return value; -} - -/*-------------------------------------------------------------------* - * get_indice_st() - * - * Get indice at specific position in the buffer - *-------------------------------------------------------------------*/ - -/*! r: value of the indice */ -UWord16 get_indice_st( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 pos, /* i : absolute position in the bitstream */ - const Word16 nb_bits /* i : number of bits to quantize the indice */ -) -{ - UWord16 value; - Word16 i; - - assert( nb_bits <= 16 ); - - /* detect corrupted bitstream */ - IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), Mpy_32_32( element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ) ) - { - st->BER_detect = 1; - move16(); - return ( 0 ); - } - - value = 0; - move16(); - FOR( i = 0; i < nb_bits; i++ ) - { - value = shl( value, 1 ); - value = add( value, st->bit_stream[pos + i] ); - } - - return value; -} -#define WMC_TOOL_SKIP - -/*-------------------------------------------------------------------* - * reset_indices_dec() - * - * Reset the buffer of decoder indices - *-------------------------------------------------------------------*/ -void reset_indices_dec( - Decoder_State *st ) -{ - st->next_bit_pos = 0; - move16(); - - return; -} -/*-------------------------------------------------------------------* - * write_indices_to_stream() - * - * writing forward or backward to a serial stream - *-------------------------------------------------------------------*/ -static Word16 write_indices_to_stream_fx( - Indice *ind_list, - UWord16 **pt_stream, - const Word16 inc, - const Word16 num_indices ) -{ - Word16 i, k; - Word16 value, nb_bits; - UWord16 mask; - - FOR( i = 0; i < num_indices; i++ ) - { - value = ind_list[i].value; - nb_bits = ind_list[i].nb_bits; - move16(); - move16(); - - IF( nb_bits > 0 ) - { - /* mask from MSB to LSB */ - mask = (UWord16) L_shl( 1, sub( nb_bits, 1 ) ); - - /* write bit by bit */ - FOR( k = 0; k < nb_bits; k++ ) - { - IF( L_and( value, mask ) ) - { - **pt_stream = 1; - move16(); - *pt_stream += inc; - } - ELSE - { - **pt_stream = 0; - move16(); - *pt_stream += inc; - } - - mask = (UWord16) L_shr( mask, 1 ); - } - } - } - return 0; -} - -/*-------------------------------------------------------------------* - * write_indices_element() - * - * Bitstream writing function of one element (one SCE or one CPE) - *-------------------------------------------------------------------*/ -static ivas_error write_indices_element_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - UWord16 **pt_stream, /* i : pointer to bitstream buffer */ - const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ - const Word16 element_id /* i : id of the SCE or CPE */ -) -{ - Word16 ch; - Encoder_State **sts = NULL; - UWord16 *pt_stream_loc; - UWord16 *pt_stream_backup; - UWord16 *pt_stream_end; - Word16 nb_bits_tot_metadata; - Word16 nb_ind_tot_metadata; - - Indice *ind_list_metadata; - Word16 n, n_channels; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ind_list_metadata = NULL; - nb_ind_tot_metadata = 0; - move16(); - - IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - sts = st_ivas->hSCE[0]->hCoreCoder; - nb_bits_tot_metadata = 0; - move16(); - } - ELSE - { - nb_bits_tot_metadata = 0; - move16(); - test(); - test(); - IF( is_SCE && st_ivas->hSCE[element_id] != NULL ) - { - sts = st_ivas->hSCE[element_id]->hCoreCoder; - - IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) - { - nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; - ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; - nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; - move16(); - move16(); - } - } - ELSE IF( !is_SCE && st_ivas->hCPE[element_id] != NULL ) - { - sts = st_ivas->hCPE[element_id]->hCoreCoder; - - IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) - { - nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; - ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; - nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; - move16(); - move16(); - } - } - } - - n_channels = 1; - move16(); - if ( GT_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) - { - n_channels = CPE_CHANNELS; - move16(); - } - - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - *----------------------------------------------------------------*/ - - pt_stream_loc = *pt_stream; - pt_stream_end = pt_stream_loc; - - FOR( n = 0; n < n_channels; n++ ) - { - /* write the metadata buffer */ - test(); - IF( n == 0 && nb_bits_tot_metadata != 0 ) - { - pt_stream_backup = pt_stream_loc; - - FOR( ch = 0; ch < n_channels; ch++ ) - { - pt_stream_loc += sts[ch]->hBstr->nb_bits_tot; - } - pt_stream_loc += nb_bits_tot_metadata - 1; - pt_stream_end = pt_stream_loc + 1; - - write_indices_to_stream_fx( ind_list_metadata, &pt_stream_loc, -1, - nb_ind_tot_metadata ); - - /* restore previous pointer position */ - pt_stream_loc = pt_stream_backup; - } - write_indices_to_stream_fx( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, - sts[n]->hBstr->nb_ind_tot ); - - if ( pt_stream_loc > pt_stream_end ) - { - pt_stream_end = pt_stream_loc; - } - } - -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - if ( is_SCE ) /* EVS and SCE */ - { - static FILE *f1 = 0; - - if ( f1 == 0 ) - f1 = fopen( "bitstream_text", "w" ); - - for ( int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++ ) - { - Indice *ind_list = sts[0]->hBstr->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); - } - - if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) - { - for ( int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++ ) - { - Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); - } - } - } - else - { - static FILE *f1 = 0; - - if ( f1 == 0 ) - f1 = fopen( "bitstream_text", "w" ); - - - for ( n = 0; n < n_channels; n++ ) - { - for ( int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++ ) - { - Indice *ind_list = sts[n]->hBstr->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value ); - } - } - - if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) - { - for ( int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++ ) - { - Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value ); - } - } - } -#endif - - /*----------------------------------------------------------------* - * Clearing of indices - * Reset index pointers - *----------------------------------------------------------------*/ - - IF( is_SCE ) /* EVS and SCE */ - { - IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) - { - reset_indices_enc_fx( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); - } - - reset_indices_enc_fx( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); - } - ELSE - { - IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) - { - reset_indices_enc_fx( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); - } - - FOR( n = 0; n < n_channels; n++ ) - { - reset_indices_enc_fx( sts[n]->hBstr, sts[n]->hBstr->nb_ind_tot ); - } - } - - /* update pointer */ - *pt_stream = pt_stream_end; - - return error; -} - -/*-------------------------------------------------------------------* - * write_indices_ivas() - * - * Write the buffer of indices to a serial bitstream buffer, - * each bit represented as a uint16_t of value 0 or 1 - *-------------------------------------------------------------------*/ -ivas_error write_indices_ivas_fx( - Encoder_Struct *st_ivas, /* i/o: encoder state structure */ - UWord16 *bit_stream, /* i/o: output bitstream */ - UWord16 *num_bits /* i : number of indices written to output */ -) -{ - Word16 i, n; - UWord16 *pt_stream; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - pt_stream = bit_stream; - FOR( i = 0; i < MAX_BITS_PER_FRAME; ++i ) - { - bit_stream[i] = 0; - move16(); - } - - - /*-----------------------------------------------------------------* - * Encode Payload - *-----------------------------------------------------------------*/ - - FOR( n = 0; n < st_ivas->nSCE; n++ ) - { - write_indices_element_fx( st_ivas, &pt_stream, 1, n ); - } - - FOR( n = 0; n < st_ivas->nCPE; n++ ) - { - write_indices_element_fx( st_ivas, &pt_stream, 0, n ); - } - - *num_bits = (UWord16) ( pt_stream - bit_stream ); - move16(); - - return error; -} - -/*-------------------------------------------------------------------* - * decoder_selectCodec() - * - * - *-------------------------------------------------------------------*/ - -static void decoder_selectCodec( - Decoder_State *st, /* i/o: decoder state structure */ - const Word32 total_brate, /* i : total bitrate */ - const Word16 bit0 /* i : first bit */ -) -{ - /* set the AMR-WB IO flag */ - if ( rate2AMRWB_IOmode( total_brate ) != -1 ) - { - st->Opt_AMR_WB = 1; - } - else if ( total_brate != FRAME_NO_DATA ) - { - st->Opt_AMR_WB = 0; - } - - if ( st->Opt_AMR_WB ) - { - st->codec_mode = MODE1; - } - else - { - st->codec_mode = get_codec_mode( total_brate ); - - if ( st->codec_mode == -1 ) - { - switch ( total_brate ) - { - case 0: - st->codec_mode = st->last_codec_mode; - break; - case 2400: - st->codec_mode = st->last_codec_mode; - break; - case 2800: - st->codec_mode = MODE1; - break; - default: /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bitrates */ - st->codec_mode = st->last_codec_mode; - st->bfi = 1; - break; - } - } - } - - if ( st->ini_frame == 0 ) - { - if ( st->codec_mode == -1 ) - { - st->codec_mode = MODE1; - } - st->last_codec_mode = st->codec_mode; - } - - /* set SID/CNG type */ - if ( total_brate == SID_2k40 ) - { - if ( bit0 == 0 ) - { - st->cng_type = LP_CNG; - - /* force MODE1 when selecting LP_CNG */ - st->codec_mode = MODE1; - } - else if ( bit0 == 1 ) - { - st->cng_type = FD_CNG; - if ( st->last_codec_mode == MODE2 && st->last_total_brate == ACELP_13k20 ) - { - st->codec_mode = MODE1; - } - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * reset_elements() - * - * Simulate packet losses by reading FEC pattern from external file - *-------------------------------------------------------------------*/ - -Decoder_State **reset_elements( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 k, n; - Decoder_State **sts = NULL; /* to avoid compilation warning */ - - FOR( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - - sts[0]->bfi = 0; - sts[0]->BER_detect = 0; - sts[0]->mdct_sw_enable = 0; - sts[0]->mdct_sw = 0; - - move16(); - move16(); - move16(); - move16(); - - reset_indices_dec( sts[0] ); - } - - FOR( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->bfi = 0; - sts[n]->BER_detect = 0; - sts[n]->mdct_sw_enable = 0; - sts[n]->mdct_sw = 0; - - move16(); - move16(); - move16(); - move16(); - - reset_indices_dec( sts[n] ); - } - } - - return sts; /* return last decoder state */ -} - -/*-------------------------------------------------------------------* - * ivas_set_bitstream_pointers() - * - * Set bitstream pointers for every SCE/CPE Core-Decoder - *-------------------------------------------------------------------*/ - -void ivas_set_bitstream_pointers( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 k, num_bits; - Decoder_State **sts; - - num_bits = 0; - - /* set bitstream pointers for SCEs */ - for ( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (Word16) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); - } - - /* set bitstream pointers for CPEs */ - for ( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (Word16) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); - } - - return; -} - - -/*-------------------------------------------------------------------* - * read_indices() - * - * Read indices from an ITU-T G.192 bitstream to the buffer - * Simulate packet losses by inserting frame erasures - *-------------------------------------------------------------------*/ - -/*! r: 1 = reading OK, 0 = problem */ -ivas_error read_indices_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 bit_stream[], /* i : bitstream buffer */ - UWord16 num_bits, /* i : number of bits in bitstream */ - Word16 *prev_ft_speech, - Word16 *CNG, - Word16 bfi /* i : bad frame indicator */ -) -{ - Word16 k; - Decoder_State **sts; - Word32 total_brate = 0; - move32(); - Word16 curr_ft_good_sp, curr_ft_bad_sp; - Word16 g192_sid_first, sid_upd_bad, sid_update; - Word16 speech_bad, speech_lost; - Word16 n; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - st_ivas->BER_detect = 0; - move16(); - st_ivas->num_bits = num_bits; - move16(); - sts = reset_elements( st_ivas ); - - st_ivas->bfi = bfi; - move16(); - - /* convert the frame length to total bitrate */ - total_brate = imult3216( num_bits, FRAMES_PER_SEC ); - move32(); - - /* verify that a valid num bits value is present in the G.192 file */ - /* only AMRWB, EVS or IVAS bitrates or 0(NO DATA) are allowed in G.192 file frame reading */ - IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - k = 0; - move16(); - - test(); - WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( total_brate, ivas_brate_tbl[k] ) ) - { - k = add( k, 1 ); - } - - test(); - test(); - test(); - test(); - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && ( LT_16( k, SIZE_IVAS_BRATE_TBL ) || LE_32( total_brate, SID_2k40 ) ) ) - { - st_ivas->element_mode_init = IVAS_SCE; - move16(); - } - ELSE IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) && LE_32( total_brate, SID_2k40 ) ) - { - st_ivas->element_mode_init = IVAS_SCE; - move16(); - } - ELSE IF( EQ_16( k, SIZE_IVAS_BRATE_TBL ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); - } - ELSE - { - st_ivas->element_mode_init = -1; - move16(); - } - } - ELSE /* AMRWB or EVS */ - { - st_ivas->element_mode_init = EVS_MONO; - move16(); - - IF( rate2EVSmode_float( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); - } - } - - /* G.192 RX DTX handler*/ - /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA as properly as possible for the ITU-T G.192 format */ - /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ - curr_ft_good_sp = 0; - move16(); - curr_ft_bad_sp = 0; - move16(); - - IF( is_DTXrate( total_brate ) == 0 ) - { - IF( st_ivas->bfi == 0 ) - { - curr_ft_good_sp = 1; - move16(); - } - ELSE - { - curr_ft_bad_sp = 1; - move16(); - } - } - - sid_update = 0; - move16(); - sid_upd_bad = 0; - move16(); - IF( EQ_16( is_SIDrate( total_brate ), 1 ) ) - { - IF( st_ivas->bfi == 0 ) - { - sid_update = 1; - move16(); - } - ELSE - { - sid_upd_bad = 1; /* this frame type may happen in ETSI/3GPP CS cases, a corrupt SID frames */ - move16(); - } - } - - /* all zero indices/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ - /* all zero indices/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ - test(); - IF( EQ_32( total_brate, SID_1k75 ) && EQ_16( sid_update, 1 ) ) - { - /* valid sid_update received, check for very risky but formally valid content */ - Word16 sum = 0; - move16(); - FOR( k = 0; k < num_bits; ++k ) - { - sum = add( sum, extract_l( EQ_32( bit_stream[k], 1 ) ) ); /* check of 35 zeroes */ - } - if ( sum == 0 ) - { /* all zeros */ - sid_upd_bad = 1; /* initial signal as corrupt (BER likely) */ - move16(); - } - } - - /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, - it declares every bad synch marked frame initially as a lost_speech frame, - and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. - While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. - - Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . - */ - IF( sid_upd_bad ) - { - sid_upd_bad = 0; - move16(); - total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ - move32(); - } - - g192_sid_first = 0; - move16(); - - test(); - test(); - test(); - test(); - if ( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) && EQ_16( sts[0]->core, AMR_WB_CORE ) && *prev_ft_speech && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) - { - g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ - /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: - the very first SID_FIRST detection is based on a past EVS active frame - and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, - due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding - */ - move16(); - } - - speech_bad = 0; - move16(); - - test(); - if ( st_ivas->bfi != 0 && ( is_DTXrate( total_brate ) == 0 ) ) - { - speech_bad = 1; /* initial ft assumption, CNG_state decides what to do */ - move16(); - } - - speech_lost = 0; - move16(); - - test(); - if ( total_brate == FRAME_NO_DATA && st_ivas->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ - { - speech_lost = 1; /* initial ft assumption, CNG_state decides what to do */ - move16(); - } - - /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame - as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ - IF( *CNG != 0 ) - { - /* We were in CNG synthesis */ - if ( curr_ft_good_sp != 0 ) - { - /* only a good speech frame makes you leave CNG synthesis */ - *CNG = 0; - move16(); - } - } - ELSE - { - /* We were in SPEECH synthesis */ - /* only a received/detected SID frame can make the decoder enter into CNG synthsis */ - test(); - test(); - if ( g192_sid_first || sid_update || sid_upd_bad ) - { - *CNG = 1; - move16(); - } - } - - /* set bfi, total_brate pair for proper decoding */ - /* handle the G.192 _simulated_ untransmitted NO_DATA frame, setting for decoder SPEECH synthesis */ - test(); - test(); - if ( *CNG == 0 && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) - { - st_ivas->bfi = 1; /* SPEECH PLC code will now become active as in a real system */ - /* total_brate= 0 */ - move16(); - } - - /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ - test(); - test(); - test(); - test(); - IF( ( - NE_16( bfi, FRAMEMODE_FUTURE ) && - ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ - ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ - { - st_ivas->bfi = 0; /* bfi=0 needed to activate CNG code */ - move16(); - total_brate = FRAME_NO_DATA; - move32(); - } - - /* update for next frame's G.192 file format's odd SID_FIRST detection (primarily for AMRWBIO) */ - test(); - *prev_ft_speech = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); - move16(); - - /* st->total brate= total_brate; updated in a good frame below */ - - FOR( k = 0; k < st_ivas->nCPE; k++ ) - { - sts = st_ivas->hCPE[k]->hCoreCoder; - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->bfi = st_ivas->bfi; - move16(); - } - } - - FOR( k = 0; k < st_ivas->nSCE; k++ ) - { - sts = st_ivas->hSCE[k]->hCoreCoder; - sts[0]->bfi = st_ivas->bfi; - move16(); - } - - IF( st_ivas->bfi == 0 ) - { - /* select Mode 1 or Mode 2 */ - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) /* EVS mono */ - { - decoder_selectCodec( sts[0], total_brate, bit_stream[0] ); - st_ivas->hDecoderConfig->Opt_AMR_WB = sts[0]->Opt_AMR_WB; - move16(); - } - ELSE /* IVAS */ - { - st_ivas->codec_mode = MODE1; - move16(); - st_ivas->hDecoderConfig->Opt_AMR_WB = 0; - move16(); - } - } - - /* GOOD frame */ - test(); - if ( st_ivas->bfi == 0 || EQ_16( st_ivas->bfi, FRAMEMODE_FUTURE ) ) - { - /* GOOD frame - convert ITU-T G.192 words to short values */ - st_ivas->hDecoderConfig->ivas_total_brate = total_brate; - move32(); - } - - st_ivas->bit_stream = bit_stream; - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - ivas_set_bitstream_pointers( st_ivas ); - } - - return error; -} -#undef WMC_TOOL_SKIP diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index ce8d9018e020c3f0aa0e9864fbe5092c9d0caee1..77ce24079f60050f0d8ca1ae0b364dcea437d284 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -31,114 +31,180 @@ *******************************************************************************************************/ /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 ====================================================================================*/ -#include #include -#include +#include #include "options.h" -#include "ivas_cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ -#include "ivas_prot_fx.h" -#include "basop_util.h" +#include "cnst.h" +#include "prot_fx.h" +#include "stat_enc.h" +#include "stat_dec.h" #include "rom_com.h" #include "mime.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" +#include "ivas_prot_fx.h" +#include "prot_fx_enc.h" +#ifdef DEBUGGING +#include "debug.h" +#ifdef DBG_BITSTREAM_ANALYSIS +#include +#endif +#endif #ifdef DEBUGGING + +#define FEC_SEED 12558 + /*-------------------------------------------------------------------* * Global variables *--------------------------------------------------------------------*/ -int16_t FEC_seed = 12558; /* Seed for random FEC generator */ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ -float FEC_random = 0; /* FEC rate in percent (for simulation of FEC) */ +#endif + +#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ + /*-------------------------------------------------------------------* - * file_read_FECpattern() + * BRATE2IDX_fx() * - * Simulate packet losses by reading FEC pattern from external file + * Convert Bitrate to Index Value *-------------------------------------------------------------------*/ -static int16_t file_read_FECpattern( void ) +Word16 BRATE2IDX_fx( + const Word32 brate ) { - int16_t bfi = 0; - /* FEC pattern file provided */ - if ( FEC_pattern != NULL ) - { - int16_t tmp = 0; - if ( fread( &tmp, sizeof( int16_t ), 1, FEC_pattern ) != 1 ) - { - if ( feof( FEC_pattern ) != 0 ) - { - tmp = 0; - fseek( FEC_pattern, 0L, SEEK_SET ); - } - else - { - fprintf( stderr, "\nError reading the FEC pattern file !" ); - exit( -1 ); - } - } - - if ( tmp == 2609 || tmp == 1 || tmp == SYNC_BAD_FRAME ) - { - bfi = 1; - } - else - { - bfi = 0; - } - } + Word32 L_temp; + Word32 L_idx; +#define START 9 + extern const Word16 bit_rates_div50[]; - /* random FEC simulation requested */ - else if ( FEC_random > 0 ) - { - float ftmp = (float) /*own_random*/ Random( &FEC_seed ) + 32768.0f; - if ( ftmp <= FEC_random / 100.0f * 65535.0f ) - { - bfi = 1; - } - else - { - bfi = 0; - } - } + /* This is a Fast Bit Rate Value to Index Value Binary Search */ + L_temp = L_msu0( brate, bit_rates_div50[START], 50 ); + L_temp = L_min( 6, L_max( -6, L_temp ) ); + L_idx = L_add( L_temp, START ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + L_temp = L_min( 3, L_max( -3, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + L_temp = L_min( 1, L_max( -2, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); + if ( L_temp != 0 ) + L_idx = L_add( L_idx, 1 ); - return bfi; + return (Word16) L_idx; } -#endif + + /*-------------------------------------------------------------------* - * pack_bit() + * BRATE2IDX16k_fx() * - * insert a bit into packed octet + * Convert Bitrate to Index Value *-------------------------------------------------------------------*/ -void pack_bit( - const Word16 bit, /* i: bit to be packed */ - UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ - UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ -) + +Word16 BRATE2IDX16k_fx( + Word32 brate ) { - if ( EQ_16( *omask, 0x80 ) ) - { - **pt = 0; - move16(); - } - IF( bit != 0 ) + Word32 L_temp, L_idx; +#define START_16K 5 + extern const Word16 bit_rates_16k_div50[]; + + if ( EQ_32( brate, ACELP_16k40 ) ) { - **pt = (UWord8) s_or( **pt, *omask ); + brate = ACELP_14k80; move16(); } - *omask = (UWord8) shr( *omask, 1 ); + + /* This is a Fast Bit Rate Value to Index Value Binary Search */ + L_temp = L_msu0( brate, bit_rates_16k_div50[START_16K], 50 ); + L_temp = L_min( 3, L_max( -3, L_temp ) ); + L_idx = L_add( L_temp, START_16K ); + L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); + L_temp = L_min( 2, L_max( -2, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); + L_temp = L_min( 1, L_max( -1, L_temp ) ); + L_idx = L_add( L_temp, L_idx ); + + return (Word16) L_idx; +} + + +/*-------------------------------------------------------------------* + * BIT_ALLOC_IDX_fx() + *-------------------------------------------------------------------*/ + +Word32 BIT_ALLOC_IDX_fx( + const Word32 brate, + Word16 ctype, + const Word16 sfrm, + const Word16 tc ) +{ + Word32 L_temp; + Word16 temp; + + if ( ctype == INACTIVE ) /* no sub(ctype, INACTIVE) because it is '0' */ + ctype = GENERIC; move16(); - IF( *omask == 0 ) + L_temp = L_mac0( -1l * 256, 1 * 256, ctype ); + + temp = BRATE2IDX_fx( brate ); + L_temp = L_mac0( L_temp, 4 * 256, temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); + /* So either 'temp' x 4 when 'tc < 0', 'temp' x 10 otherwise */ + + L_temp = L_mac0( L_temp, 1 * 256, s_max( 0, tc ) ); + + L_temp = L_mac0( L_temp, s_max( 0, sfrm ), 1 ); + if ( sfrm < 0 ) + L_temp = L_shr( L_temp, 2 ); + L_temp = L_shr( L_temp, 6 ); + + return L_temp; +} + + +/*-------------------------------------------------------------------* + * BIT_ALLOC_IDX_16KHZ_fx() + *-------------------------------------------------------------------*/ + +Word32 BIT_ALLOC_IDX_16KHZ_fx( + const Word32 brate, + const Word16 ctype, + const Word16 sfrm, + const Word16 tc ) +{ + Word32 L_temp; + Word16 temp; + /* 'ctype' = + TRANSITION => 2 + GENERIC => 1 + ALL Other => 0 + */ + L_temp = L_and( shr( 0x0240l, shl( ctype, 1 ) ), 3 ); + + temp = BRATE2IDX16k_fx( brate ); + L_temp = L_mac0( L_temp, 3, temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); + /* So either 'temp' x 3 when 'tc < 0', 'temp' x 7 otherwise */ + + L_temp = L_mac0( L_temp, 1, s_max( 0, tc ) ); + + IF( sfrm >= 0 ) { - *omask = 0x80; - move16(); - ( *pt )++; + /* Mult by 5 */ + L_temp = L_add( L_temp, L_shl( L_temp, 2 ) ); + L_temp = L_mac0( L_temp, shr( sfrm, 6 ), 1 ); } - return; + return L_temp; } @@ -147,13 +213,14 @@ void pack_bit( * * lookup AMRWB IO mode *-------------------------------------------------------------------*/ + static Word16 rate2AMRWB_IOmode( - Word32 brate /* i: bitrate */ + Word32 brate /* i : bitrate */ ) { SWITCH( brate ) { - /* EVS AMR-WB IO modes */ + /* EVS AMR-WB IO modes */ case SID_1k75: return AMRWB_IO_SID; case ACELP_6k60: @@ -177,16 +244,19 @@ static Word16 rate2AMRWB_IOmode( default: break; } + return -1; } + /*-------------------------------------------------------------------* * rate2EVSmode() * * lookup EVS mode *-------------------------------------------------------------------*/ + Word16 rate2EVSmode( - const Word32 brate, /* i: bitrate */ + const Word32 brate, /* i : bitrate */ Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ) { @@ -195,9 +265,10 @@ Word16 rate2EVSmode( *is_amr_wb = 0; move16(); } + SWITCH( brate ) { - /* EVS Primary modes */ + /* EVS Primary modes */ case FRAME_NO_DATA: return NO_DATA_TYPE; case SID_2k40: @@ -227,157 +298,3655 @@ Word16 rate2EVSmode( case HQ_128k: return PRIMARY_128000; default: - BREAK; + break; } + if ( is_amr_wb != NULL ) { *is_amr_wb = 1; move16(); } + return rate2AMRWB_IOmode( brate ); } -/*-------------------------------------------------------------------* - * push_indice( ) - * - * Push a new indice into the buffer - *-------------------------------------------------------------------*/ /*-------------------------------------------------------------------* - * get_next_indice_fx( ) + * ind_list_realloc() * - * Get the next indice from the buffer + * Re-allocate the list of indices *-------------------------------------------------------------------*/ -UWord16 get_next_indice_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +ivas_error ind_list_realloc( + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ) { - UWord16 value; - Word16 i; - Word16 nbits_total; + Word16 i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; + INDICE_HANDLE new_ind_list; + BSTR_ENC_HANDLE hBstr; - assert( nb_bits <= 16 ); - value = 0; + IF( st_ivas == NULL ) + { + return IVAS_ERR_OK; + } + + /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ + IF( old_ind_list == st_ivas->ind_list_metadata ) + { + is_metadata = 1; + ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; + } + ELSE + { + is_metadata = 0; + ivas_max_num_indices = st_ivas->ivas_max_num_indices; + } + move16(); move16(); - nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - /* detect corrupted bitstream */ - IF( GT_16( add( st_fx->next_bit_pos, nb_bits ), nbits_total ) ) + /* allocate new buffer of indices */ + IF( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) { - st_fx->BER_detect = 1; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + FOR( i = 0; i < s_min( max_num_indices, ivas_max_num_indices ); i++ ) + { + IF( GT_16( old_ind_list[i].nb_bits, -1 ) ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + move16(); + move16(); + } + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; move16(); - return ( 0 ); } - FOR( i = 0; i < nb_bits; i++ ) + /* reset nb_bits of all other indices to -1 */ + FOR( ; i < max_num_indices; i++ ) { - value = (UWord16) L_shl( value, 1 ); - value = (UWord16) L_add( value, st_fx->bit_stream[add( st_fx->next_bit_pos, i )] ); + new_ind_list[i].nb_bits = -1; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); +#endif + move16(); } - /* update the position in the bitstream */ - st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); - move16(); - return value; -} + /* update parameters in all SCE elements */ + FOR( n = 0; n < st_ivas->nSCE; n++ ) + { + /* get the pointer to hBstr */ + IF( is_metadata ) + { + hBstr = st_ivas->hSCE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; + } -/*-------------------------------------------------------------------* - * get_next_indice_1_fx( ) - * - * Get the next 1-bit indice from the buffer - *-------------------------------------------------------------------*/ + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); -UWord16 get_next_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx /* i/o: decoder state structure */ -) -{ - Word16 nbits_total; - nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - /* detect corrupted bitstream */ - test(); - test(); - test(); - IF( ( GT_16( add( st_fx->next_bit_pos, 1 ), nbits_total ) && EQ_16( st_fx->codec_mode, MODE1 ) ) || - ( GT_16( add( st_fx->next_bit_pos, 1 ), add( nbits_total, 2 * 8 ) ) && EQ_16( st_fx->codec_mode, MODE2 ) ) /* add two zero bytes for arithmetic coder flush */ - ) + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } + + /* update parameters in all CPE elements */ + FOR( n = 0; n < st_ivas->nCPE; n++ ) { - st_fx->BER_detect = 1; + /* get the pointer to hBstr */ + IF( is_metadata ) + { + n_channels = 1; + } + ELSE + { + n_channels = CPE_CHANNELS; + } move16(); - return ( 0 ); + + FOR( ch = 0; ch < n_channels; ch++ ) + { + IF( is_metadata ) + { + hBstr = st_ivas->hCPE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; + } + + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } } - return st_fx->bit_stream[st_fx->next_bit_pos++]; + /* free the old list */ + free( old_ind_list ); + + return IVAS_ERR_OK; } -/*-------------------------------------------------------------------* - * get_next_indice_tmp() + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices() * - * update the total number of bits and the position in the bitstream + * Get the maximum allowed number of indices in the encoder + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +Word16 get_ivas_max_num_indices_fx( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +) +{ + test(); + test(); + IF( EQ_16( ivas_format, STEREO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 450; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1350; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MONO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 450; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 550; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 620; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 670; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 780; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 880; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1300; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 1020; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1160; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 1220; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1720; + } + ELSE + { + return 2000; + } + } + ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 950; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1450; + } + ELSE + { + return 1650; + } + } + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 1250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1650; + } + ELSE + { + return 1850; + } + } + ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 250; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 350; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 400; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 650; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 750; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_80k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 1150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 1420; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 2120; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 2250; + } + ELSE + { + return 2450; + } + } + + return 2450; +} +/*-----------------------------------------------------------------------* + * get_BWE_max_num_indices() + * + * Get the maximum number of indices in the BWE + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ +) +{ + /* set the maximum number of indices in the BWE */ + if ( extl_brate < SWB_BWE_16k ) + { + return 30; + } + else + { + return 150; + } +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices_metadata() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +/*! r: maximum number of indices */ +Word16 get_ivas_max_num_indices_metadata_fx( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + test(); + IF( EQ_16( ivas_format, MONO_FORMAT ) ) + { + return 0; + } + ELSE IF( EQ_16( ivas_format, STEREO_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 60; + } + ELSE + { + return 80; + } + } + ELSE IF( EQ_16( ivas_format, ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 20; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 65; + } + ELSE + { + return 80; + } + } + ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 200; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 300; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 500; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 1050; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 2000; + } + ELSE + { + return 2500; + } + } + ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 125; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 205; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 240; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 305; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 425; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 630; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 850; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1000; + } + ELSE + { + return 1750; + } + } + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_32k ) ) + { + return 125 + 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_48k ) ) + { + return 205 + 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 240 + 150; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_128k ) ) + { + return 305 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_160k ) ) + { + return 425 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_192k ) ) + { + return 630 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_256k ) ) + { + return 850 + 30; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_384k ) ) + { + return 1000 + 30; + } + ELSE + { + return 1750 + 30; + } + } + ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) + { + IF( LE_32( ivas_total_brate, IVAS_13k2 ) ) + { + return 80; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_24k4 ) ) + { + return 100; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_64k ) ) + { + return 210; + } + ELSE IF( LE_32( ivas_total_brate, IVAS_96k ) ) + { + return 220; + } + ELSE + { + return 300; + } + } + + return 50; +} + + +/*-------------------------------------------------------------------* + * move_indices() + * + * Move indices inside the buffer or among two buffers + *-------------------------------------------------------------------*/ + +void move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const Word16 nb_indices /* i : number of moved indices */ +) +{ + Word16 i; + + IF( new_ind_list < old_ind_list ) + { + FOR( i = 0; i < nb_indices; i++ ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); + move16(); + move16(); + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + old_ind_list[i].nb_bits = -1; + move16(); + } + } + ELSE IF( new_ind_list > old_ind_list ) + { + FOR( i = nb_indices - 1; i >= 0; i-- ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); + move16(); + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); +#endif + + old_ind_list[i].nb_bits = -1; + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); +#endif + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * check_ind_list_limits() + * + * Check, if the maximum number of indices has been reached -> reallocate + * Check, if we will not overwrite an existing indice -> adjust the location + *-------------------------------------------------------------------*/ + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + Indice *ivas_ind_list_zero, *ivas_ind_list_last; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + IF( GE_16( (Word16) ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) + { + + /* reallocate the buffer of indices with increased limit */ + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* check, if we will not overwrite an existing indice */ + IF( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) + { + IF( hBstr->nb_ind_tot == 0 ) + { + /* move the pointer to the next available empty slot */ + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + WHILE( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) + { + hBstr->ind_list++; + } + + IF( hBstr->ind_list >= ivas_ind_list_last ) + { + + /* no available empty slot -> need to re-allocate the buffer */ + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE + { +#ifdef DEBUGGING + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); +#else + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); +#endif + } + } + + return error; +} + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +const char *named_indices_table[] = { + "IND_IVAS_FORMAT", + "IND_SMODE_OMASA", + "IND_SMODE", + "IND_SID_TYPE", + "IND_BWIDTH", + "IND_CORE", + "IND_PPP_NELP_MODE", + "IND_ACELP_16KHZ", + "IND_ACELP_SIGNALLING", + "IND_SHARP_FLAG", + "IND_MDCT_CORE", + "IND_TCX_CORE", + "IND_BWE_FLAG", + "IND_HQ_SWITCHING_FLG", + "IND_LAST_L_FRAME", + "IND_VAD_FLAG", + "IND_HQ_BWIDTH", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_GSC_IVAS_SP", + "IND_LSF_PREDICTOR_SELECT_BIT", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_MID_FRAME_LSF_INDEX", + "IND_ISF_0_0", + "IND_ISF_0_1", + "IND_ISF_0_2", + "IND_ISF_0_3", + "IND_ISF_0_4", + "IND_ISF_1_0", + "IND_ISF_1_1", + "IND_ISF_1_2", + "IND_ISF_1_3", + "IND_ISF_1_4", + "IND_IC_LSF_PRED", + "IND_GSC_ATTACK", + "IND_GSC_SWB_SPEECH", + "IND_NOISE_LEVEL", + "IND_HF_NOISE", + "IND_PIT_CONTR_IDX", + "IND_FEC_CLAS", + "IND_FEC_ENR", + "IND_FEC_POS", + "IND_ES_PRED", + "IND_HARM_FLAG_ACELP", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "TAG_ALG_CDBK_4T64_24KBIT_END", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "TAG_ACELP_SUBFR_LOOP_END", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_HF", + "IND_HQ_VOICING_FLAG", + "IND_HQ_SWB_CLAS", + "IND_NF_IDX", + "IND_LC_MODE", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_DELTA_ENV_HQ", + "IND_HVQ_BWE_NL", + "IND_HVQ_BWE_NL", + "IND_NUM_PEAKS", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_FLAGN", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_NF_GAIN", + "IND_HVQ_NF_GAIN", + "IND_HQ2_SWB_CLAS", + "IND_HQ2_DENG_MODE", + "IND_HQ2_DENG_8SMODE", + "IND_HQ2_DENG_8SMODE_N0", + "IND_HQ2_DENG_8SMODE_N1", + "IND_HQ2_DENG_8SPOS", + "IND_HQ2_DENG_8SDEPTH", + "IND_HQ2_DENG_HMODE", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_END", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_NOISINESS", + "IND_ENERGY", + "IND_CNG_HO", + "IND_SID_BW", + "IND_CNG_ENV1", + "IND_WB_FENV", + "IND_WB_CLASS", + "IND_IG1", + "IND_IG2A", + "IND_IG2B", + "IND_NELP_FID", + "IND_DELTALAG", + "IND_POWER", + "IND_AMP0", + "IND_AMP1", + "IND_GLOBAL_ALIGNMENT", + "IND_PVQ_FINE_GAIN", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_SHB_SUBGAIN", + "IND_SHB_FRAMEGAIN", + "IND_STEREO_ICBWE_MSFLAG", + "IND_SHB_ENER_SF", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_VF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_MIRROR", + "IND_SHB_GRID", + "IND_SWB_CLASS", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SHB_CNG_GAIN", + "IND_DITHERING", + "IND_FB_SLOPE", + "IND_HQ2_SPT_SHORTEN", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_DUMMY", + "IND_LAGINDICES", + "IND_NOISEG", + "IND_AUDIO_GAIN", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "TAG_HR_BWE_LOOP_END", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_AUDIO_DELAY", + "IND_CORE_SWITCHING_AUDIO_GAIN", + "IND_STEREO_ICBWE_REF", + "IND_STEREO_ICBWE_SP", + "IND_STEREO_ICBWE_GS", + "IND_STEREO_REFCHAN", + "IND_STEREO_CORRSTATS", + "IND_STEREO_GD", + "IND_STEREO_LRTD_FLAG", + "IND_STEREO_LPC_REUSE", + "IND_STEREO_TD_ALPHA", + "IND_STEREO_2ND_CODER_T", + "IND_UNUSED" +}; +#endif + + +/*-------------------------------------------------------------------* + * push_indice() + * + * Push a new indice into the buffer + *-------------------------------------------------------------------*/ + +ivas_error push_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 i; + Word16 j; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices!\n" ); +#endif + } + + /* find the location in the list of indices based on ID */ + i = hBstr->nb_ind_tot; + move16(); + test(); + WHILE( i > 0 && ( id < hBstr->ind_list[i - 1].id ) ) + { + test(); + i = sub( i, 1 ); + } + + /* shift indices, if the new ID is to be written somewhere inside the list */ + IF( i < hBstr->nb_ind_tot ) + { + FOR( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); +#endif + move16(); + move16(); + move16(); + } + } + + + /* store the new indice in the list */ + hBstr->ind_list[i].id = id; + hBstr->ind_list[i].value = value; + hBstr->ind_list[i].nb_bits = nb_bits; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); +#endif + move16(); + move16(); + move16(); + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); + + return error; +} + +/*-------------------------------------------------------------------* + * push_next_indice() + * + * Push a new indice into the buffer at the next position + *-------------------------------------------------------------------*/ +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_indice_( + const char *caller, +#else +ivas_error push_next_indice( +#endif + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* get the id of the previous indice -> it will be re-used */ + IF( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + ELSE + { + prev_id = 0; + } + move16(); + + /* store the values in the list */ + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; + move16(); + move16(); + move16(); + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); +#endif + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); + + return error; +} + + +/*-------------------------------------------------------------------* + * push_next_bits() + * Push a bit buffer into the buffer at the next position + *-------------------------------------------------------------------*/ + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +ivas_error push_next_bits_( + const char *caller, +#else +ivas_error push_next_bits( +#endif + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ + const Word16 nb_bits /* i : number of bits to pack */ +) +{ + UWord16 code; + Word16 i, nb_bits_m15; + Indice *ptr; + Word16 prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used */ + IF( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + move16(); + } + ELSE + { + prev_id = 0; + move16(); + } + nb_bits_m15 = sub( nb_bits, 15 ); + + FOR( i = 0; i < nb_bits_m15; i += 16 ) + { + code = (UWord16) L_or( L_shl( bits[i], 15 ), L_or( L_shl( bits[i + 1], 14 ), L_or( L_shl( bits[i + 2], 13 ), L_or( L_shl( bits[i + 3], 12 ), L_or( L_shl( bits[i + 4], 11 ), L_or( L_shl( bits[i + 5], 10 ), L_or( L_shl( bits[i + 6], 9 ), L_or( L_shl( bits[i + 7], 8 ), L_or( L_shl( bits[i + 8], 7 ), L_or( L_shl( bits[i + 9], 6 ), L_or( L_shl( bits[i + 10], 5 ), L_or( L_shl( bits[i + 11], 4 ), L_or( L_shl( bits[i + 12], 3 ), L_or( L_shl( bits[i + 13], 2 ), L_or( L_shl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); + + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); +#endif + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = code; + ptr->nb_bits = 16; + ptr->id = prev_id; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( ptr->function_name, caller, 100 ); +#endif + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + move16(); + move16(); + move16(); + move16(); + + ++ptr; + } + + FOR( ; i < nb_bits; ++i ) + { + /* check the limits of the list of indices */ + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) + { +#ifdef DEBUGGING + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); +#else + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices!\n" ); +#endif + } + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + ptr->value = bits[i]; + ptr->nb_bits = 1; + ptr->id = prev_id; +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( ptr->function_name, caller, 100 ); +#endif + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + move16(); + move16(); + move16(); + move16(); + + ++ptr; + } + + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + + return error; +} + + +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +Word16 find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + Word16 i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +UWord16 delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const Word16 id /* i : ID of the indice */ +) +{ + Word16 i, j; + + j = 0; + FOR( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + IF( EQ_16( hBstr->ind_list[i].id, id ) ) + { + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; + move16(); + continue; + } + + IF( LT_16( j, i ) ) + { + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + move16(); + move16(); + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); +#endif + } + + j++; + } + + hBstr->nb_ind_tot = j; + + FOR( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + move16(); +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); +#endif + } + + return i - j; +} + + +/*-------------------------------------------------------------------* + * get_next_indice() + * + * Get the next indice from the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +UWord16 get_next_indice_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +) +{ + UWord16 value; + Word16 i; + Word16 nbits_total; + + assert( nb_bits <= 16 ); + value = 0; + move16(); + + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + /* detect corrupted bitstream */ + IF( GT_16( add( st_fx->next_bit_pos, nb_bits ), nbits_total ) ) + { + st_fx->BER_detect = 1; + move16(); + return ( 0 ); + } + + FOR( i = 0; i < nb_bits; i++ ) + { + value = (UWord16) L_shl( value, 1 ); + value = (UWord16) L_add( value, st_fx->bit_stream[add( st_fx->next_bit_pos, i )] ); + } + + /* update the position in the bitstream */ + st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); + move16(); + + return value; +} + + +/*-------------------------------------------------------------------* + * get_next_indice_1() + * + * Get the next 1-bit indice from the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +UWord16 get_next_indice_1_fx( + Decoder_State *st_fx /* i/o: decoder state structure */ +) +{ + Word16 nbits_total; + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + /* detect corrupted bitstream */ + test(); + test(); + test(); + IF( ( GT_16( add( st_fx->next_bit_pos, 1 ), nbits_total ) && EQ_16( st_fx->codec_mode, MODE1 ) ) || + ( GT_16( add( st_fx->next_bit_pos, 1 ), add( nbits_total, 2 * 8 ) ) && EQ_16( st_fx->codec_mode, MODE2 ) ) /* add two zero bytes for arithmetic coder flush */ + ) + { + st_fx->BER_detect = 1; + move16(); + return ( 0 ); + } + + return st_fx->bit_stream[st_fx->next_bit_pos++]; +} + + +/*-------------------------------------------------------------------* + * get_next_indice_tmp() + * + * update the total number of bits and the position in the bitstream + *-------------------------------------------------------------------*/ + +void get_next_indice_tmp_fx( + Decoder_State *st_fx, /* o : decoder state structure */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +) +{ + /* update the position in the bitstream */ + st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * get_indice() + * + * Get indice at specific position in the buffer *-------------------------------------------------------------------*/ -void get_next_indice_tmp_fx( - Decoder_State *st_fx, /* o : decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ +/*! r: value of the indice */ +UWord16 get_indice_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 pos, /* i : absolute position in the bitstream (update after the read) */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { - /* update the position in the bitstream */ - st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); + UWord16 value; + Word16 i; + Word32 nbits_total; + + assert( nb_bits <= 16 ); + + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + /* detect corrupted bitstream */ + IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), nbits_total ) ) + { + st_fx->BER_detect = 1; + move16(); + return ( 0 ); + } + + value = 0; + move16(); + FOR( i = 0; i < nb_bits; i++ ) + { + value = lshl( value, 1 ); + value = add( value, st_fx->bit_stream[pos + i] ); + } + + return value; +} + + +/*-------------------------------------------------------------------* + * get_indice_st() + * + * Get indice at specific position in the buffer + *-------------------------------------------------------------------*/ + +/*! r: value of the indice */ +UWord16 get_indice_st( + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 pos, /* i : absolute position in the bitstream */ + const Word16 nb_bits /* i : number of bits to quantize the indice */ +) +{ + UWord16 value; + Word16 i; + + assert( nb_bits <= 16 ); + + /* detect corrupted bitstream */ + IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), Mpy_32_32( element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ) ) + { + st->BER_detect = 1; + move16(); + return ( 0 ); + } + + value = 0; move16(); + FOR( i = 0; i < nb_bits; i++ ) + { + value = shl( value, 1 ); + value = add( value, st->bit_stream[pos + i] ); + } + + return value; } + /*-------------------------------------------------------------------* * get_indice_1_fx( ) * * Get a 1-bit indice at specific position in the buffer *-------------------------------------------------------------------*/ -UWord16 get_indice_1_fx( /* o : value of the indice */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 pos /* i : absolute position in the bitstream (update after the read) */ +/*! r: value of the indice */ +UWord16 get_indice_1_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + Word16 pos /* i : absolute position in the bitstream (update after the read) */ ) { Word16 nbits_total; + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /* detect corrupted bitstream */ IF( GT_16( add( pos, 1 ), nbits_total ) ) { - st_fx->BER_detect = 1; - move16(); - return ( 0 ); + st_fx->BER_detect = 1; + move16(); + return ( 0 ); + } + + return st_fx->bit_stream[pos]; +} + + +/*-------------------------------------------------------------------* + * reset_indices_enc_fx() + * + * Reset the buffer of indices + *-------------------------------------------------------------------*/ + +void reset_indices_enc_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ + const Word16 max_num_indices /* i : max number of indices */ +) +{ + Word16 i; + + hBstr->nb_ind_tot = 0; + move16(); + hBstr->nb_bits_tot = 0; + move16(); + FOR( i = 0; i < max_num_indices; i++ ) + { + hBstr->ind_list[i].nb_bits = -1; + move16(); + } + + return; +} + + +/*-------------------------------------------------------------------* + * reset_indices_dec() + * + * Reset the buffer of decoder indices + *-------------------------------------------------------------------*/ + +void reset_indices_dec( + Decoder_State *st ) +{ + st->next_bit_pos = 0; + move16(); + + return; +} + + +/*-------------------------------------------------------------------* + * write_indices_to_stream() + * + * writing forward or backward to a serial stream + *-------------------------------------------------------------------*/ + +static Word16 write_indices_to_stream_fx( + Indice *ind_list, + UWord16 **pt_stream, + const Word16 inc, + const Word16 num_indices ) +{ + Word16 i, k; + Word16 value, nb_bits; + UWord16 mask; + + FOR( i = 0; i < num_indices; i++ ) + { + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; + move16(); + move16(); + + IF( nb_bits > 0 ) + { + /* mask from MSB to LSB */ + mask = (UWord16) L_shl( 1, sub( nb_bits, 1 ) ); + + /* write bit by bit */ + FOR( k = 0; k < nb_bits; k++ ) + { + IF( L_and( value, mask ) ) + { + **pt_stream = 1; + move16(); + *pt_stream += inc; + } + ELSE + { + **pt_stream = 0; + move16(); + *pt_stream += inc; + } + + mask = (UWord16) L_shr( mask, 1 ); + } + } + } + + return 0; +} + + +/*-------------------------------------------------------------------* + * write_indices_element() + * + * Bitstream writing function of one element (one SCE or one CPE) + *-------------------------------------------------------------------*/ + +static ivas_error write_indices_element_fx( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + UWord16 **pt_stream, /* i : pointer to bitstream buffer */ + const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ + const Word16 element_id /* i : id of the SCE or CPE */ +) +{ + Word16 ch; + Encoder_State **sts = NULL; + UWord16 *pt_stream_loc; + UWord16 *pt_stream_backup; + UWord16 *pt_stream_end; + Word16 nb_bits_tot_metadata; + Word16 nb_ind_tot_metadata; + + Indice *ind_list_metadata; + Word16 n, n_channels; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ind_list_metadata = NULL; + nb_ind_tot_metadata = 0; + move16(); + + IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MONO_FORMAT ) ) + { + sts = st_ivas->hSCE[0]->hCoreCoder; + nb_bits_tot_metadata = 0; + move16(); + } + ELSE + { + nb_bits_tot_metadata = 0; + move16(); + test(); + test(); + IF( is_SCE && st_ivas->hSCE[element_id] != NULL ) + { + sts = st_ivas->hSCE[element_id]->hCoreCoder; + + IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; + move16(); + move16(); + } + } + ELSE IF( !is_SCE && st_ivas->hCPE[element_id] != NULL ) + { + sts = st_ivas->hCPE[element_id]->hCoreCoder; + + IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; + ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; + move16(); + move16(); + } + } + } + + n_channels = 1; + move16(); + if ( GT_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) + { + n_channels = CPE_CHANNELS; + move16(); + } + + /*----------------------------------------------------------------* + * Bitstream packing (conversion of individual indices into a serial stream) + *----------------------------------------------------------------*/ + + pt_stream_loc = *pt_stream; + pt_stream_end = pt_stream_loc; + + FOR( n = 0; n < n_channels; n++ ) + { + /* write the metadata buffer */ + test(); + IF( n == 0 && nb_bits_tot_metadata != 0 ) + { + pt_stream_backup = pt_stream_loc; + + FOR( ch = 0; ch < n_channels; ch++ ) + { + pt_stream_loc += sts[ch]->hBstr->nb_bits_tot; + } + pt_stream_loc += nb_bits_tot_metadata - 1; + pt_stream_end = pt_stream_loc + 1; + + write_indices_to_stream_fx( ind_list_metadata, &pt_stream_loc, -1, + nb_ind_tot_metadata ); + + /* restore previous pointer position */ + pt_stream_loc = pt_stream_backup; + } + write_indices_to_stream_fx( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, + sts[n]->hBstr->nb_ind_tot ); + + if ( pt_stream_loc > pt_stream_end ) + { + pt_stream_end = pt_stream_loc; + } + } + +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) + if ( is_SCE ) /* EVS and SCE */ + { + static FILE *f1 = 0; + + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); + + for ( int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[0]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } + + if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + for ( int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++ ) + { + Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } + } + } + else + { + static FILE *f1 = 0; + + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); + + + for ( n = 0; n < n_channels; n++ ) + { + for ( int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[n]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value ); + } + } + + if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + for ( int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++ ) + { + Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value ); + } + } + } +#endif + + /*----------------------------------------------------------------* + * Clearing of indices + * Reset index pointers + *----------------------------------------------------------------*/ + + IF( is_SCE ) /* EVS and SCE */ + { + IF( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + reset_indices_enc_fx( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); + } + + reset_indices_enc_fx( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot ); + } + ELSE + { + IF( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + reset_indices_enc_fx( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); + } + + FOR( n = 0; n < n_channels; n++ ) + { + reset_indices_enc_fx( sts[n]->hBstr, sts[n]->hBstr->nb_ind_tot ); + } + } + + /* update pointer */ + *pt_stream = pt_stream_end; + + return error; +} + + +/*-------------------------------------------------------------------* + * write_indices_ivas() + * + * Write the buffer of indices to a serial bitstream buffer, + * each bit represented as a uint16_t of value 0 or 1 + *-------------------------------------------------------------------*/ + +ivas_error write_indices_ivas_fx( + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ + UWord16 *bit_stream, /* i/o: output bitstream */ + UWord16 *num_bits /* i : number of indices written to output */ +) +{ + Word16 i, n; + UWord16 *pt_stream; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + pt_stream = bit_stream; + FOR( i = 0; i < MAX_BITS_PER_FRAME; ++i ) + { + bit_stream[i] = 0; + move16(); + } + + /*-----------------------------------------------------------------* + * Encode Payload + *-----------------------------------------------------------------*/ + + FOR( n = 0; n < st_ivas->nSCE; n++ ) + { + write_indices_element_fx( st_ivas, &pt_stream, 1, n ); + } + + FOR( n = 0; n < st_ivas->nCPE; n++ ) + { + write_indices_element_fx( st_ivas, &pt_stream, 0, n ); } - return st_fx->bit_stream[pos]; + *num_bits = (UWord16) ( pt_stream - bit_stream ); + move16(); + + return error; } + /*-------------------------------------------------------------------* - * reset_indices_enc_fx() + * decoder_selectCodec() + * * - * Reset the buffer of indices *-------------------------------------------------------------------*/ -void reset_indices_enc_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - const Word16 max_num_indices /* i : max number of indices */ +static void decoder_selectCodec( + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate */ + const Word16 bit0 /* i : first bit */ ) { - Word16 i; + /* set the AMR-WB IO flag */ + IF( rate2AMRWB_IOmode( total_brate ) != -1 ) + { + st->Opt_AMR_WB = 1; + move16(); + } + ELSE IF( total_brate != FRAME_NO_DATA ) + { + st->Opt_AMR_WB = 0; + move16(); + } - hBstr->nb_ind_tot = 0; - move16(); - hBstr->nb_bits_tot = 0; - move16(); - FOR( i = 0; i < max_num_indices; i++ ) + IF( st->Opt_AMR_WB ) { - hBstr->ind_list[i].nb_bits = -1; + st->codec_mode = MODE1; + move16(); + } + else + { + st->codec_mode = get_codec_mode( total_brate ); + + IF( st->codec_mode == -1 ) + { + SWITCH( total_brate ) + { + case 0: + st->codec_mode = st->last_codec_mode; + move16(); + BREAK; + case 2400: + st->codec_mode = st->last_codec_mode; + move16(); + BREAK; + case 2800: + st->codec_mode = MODE1; + move16(); + break; + default: /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bitrates */ + st->codec_mode = st->last_codec_mode; + move16(); + st->bfi = 1; + move16(); + break; + } + } + } + + IF( st->ini_frame == 0 ) + { + if ( st->codec_mode == -1 ) + { + st->codec_mode = MODE1; + move16(); + } + st->last_codec_mode = st->codec_mode; move16(); } + /* set SID/CNG type */ + IF( total_brate == SID_2k40 ) + { + IF( bit0 == 0 ) + { + st->cng_type = LP_CNG; + move16(); + + /* force MODE1 when selecting LP_CNG */ + st->codec_mode = MODE1; + move16(); + } + ELSE IF( bit0 == 1 ) + { + st->cng_type = FD_CNG; + move16(); + + test(); + if ( st->last_codec_mode == MODE2 && st->last_total_brate == ACELP_13k20 ) + { + st->codec_mode = MODE1; + move16(); + } + } + } + return; } +/*-------------------------------------------------------------------* + * dec_prm_core() + * + * + *-------------------------------------------------------------------*/ + static void dec_prm_core( Decoder_State *st ) { Word16 n, frame_size_index, num_bits; @@ -459,8 +4028,11 @@ static void dec_prm_core( Decoder_State *st ) move16(); } } + + return; } + /*-----------------------------------------------------------------* * decision_matrix_core_dec() * @@ -599,6 +4171,7 @@ static void decision_matrix_core_dec( return; } + /*-------------------------------------------------------------------* * mdct_switching_dec() * @@ -671,172 +4244,517 @@ void mdct_switching_dec_fx( } ELSE IF( EQ_16( st->codec_mode, MODE2 ) && EQ_16( st->mdct_sw_enable, MODE2 ) ) { - /* Read ahead core mode signaling */ - Word16 next_bit_pos_save; - Word16 core_save; - Word16 bwidth_save; + /* Read ahead core mode signaling */ + Word16 next_bit_pos_save; + Word16 core_save; + Word16 bwidth_save; + + next_bit_pos_save = st->next_bit_pos; + move16(); + core_save = st->core; + move16(); + bwidth_save = st->bwidth; + move16(); + + dec_prm_core( st ); /* sets st->core */ + + IF( EQ_16( st->core, HQ_CORE ) ) + { + /* Trigger HQ_CORE */ + st->codec_mode = MODE1; + move16(); + st->mdct_sw = MODE2; + move16(); + } + ELSE + { + /* Rewind bitstream */ + st->next_bit_pos = next_bit_pos_save; + move16(); + if ( st->bfi != 0 ) + { + st->core = core_save; + move16(); + } + /* always reset bwidth, to not interfere with BER logic */ + st->bwidth = bwidth_save; + move16(); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * reset_elements() + * + * Simulate packet losses by reading FEC pattern from external file + *-------------------------------------------------------------------*/ + +Decoder_State **reset_elements( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, n; + Decoder_State **sts = NULL; /* to avoid compilation warning */ + + FOR( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + + sts[0]->bfi = 0; + sts[0]->BER_detect = 0; + sts[0]->mdct_sw_enable = 0; + sts[0]->mdct_sw = 0; + + move16(); + move16(); + move16(); + move16(); + + reset_indices_dec( sts[0] ); + } + + FOR( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = 0; + sts[n]->BER_detect = 0; + sts[n]->mdct_sw_enable = 0; + sts[n]->mdct_sw = 0; + + move16(); + move16(); + move16(); + move16(); + + reset_indices_dec( sts[n] ); + } + } + + return sts; /* return last decoder state */ +} + + +/*-------------------------------------------------------------------* + * ivas_set_bitstream_pointers() + * + * Set bitstream pointers for every SCE/CPE Core-Decoder + *-------------------------------------------------------------------*/ + +void ivas_set_bitstream_pointers( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 k, num_bits; + Decoder_State **sts; + + num_bits = 0; + + /* set bitstream pointers for SCEs */ + for ( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (Word16) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); + } + + /* set bitstream pointers for CPEs */ + for ( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + sts[0]->bit_stream = st_ivas->bit_stream + num_bits; + num_bits += (Word16) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); + } + + return; +} + +#ifdef DEBUGGING + +/*-------------------------------------------------------------------* + * file_read_FECpattern() + * + * Simulate packet losses by reading FEC pattern from external file + *-------------------------------------------------------------------*/ + +static ivas_error file_read_FECpattern( + Word16 *bfi ) +{ + ivas_error error; + + error = IVAS_ERR_OK; + *bfi = 0; + + /* FEC pattern file provided */ + if ( FEC_pattern != NULL ) + { + Word16 tmp = 0; + if ( fread( &tmp, sizeof( Word16 ), 1, FEC_pattern ) != 1 ) + { + if ( feof( FEC_pattern ) != 0 ) + { +#ifdef WRAP_AS_EIDXOR + fseek( FEC_pattern, 0L, SEEK_SET ); + fread( &tmp, sizeof( Word16 ), 1, FEC_pattern ); +#else + tmp = 0; + fseek( FEC_pattern, 0L, SEEK_SET ); +#endif + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error reading the FEC pattern file !" ); + } + } + + if ( tmp == 2609 || tmp == 1 || tmp == (UWord16) 0x6B20 /* == G192_SYNC_BAD_FRAME */ ) + { + *bfi = 1; + } + else + { + *bfi = 0; + } + } + + return error; +} + +#endif + +/*-------------------------------------------------------------------* + * read_indices() + * + * Detect SID, NO_DATA, BFI, etc. and set bitstream pointers + * Set ivas_total_brate + * Note: each bit is represented in bitsream buffer as a uint16_t of value 0 or 1 + *-------------------------------------------------------------------*/ + +/*! r: 1 = reading OK, 0 = problem */ +ivas_error read_indices_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + UWord16 bit_stream[], /* i : bitstream buffer */ + UWord16 num_bits, /* i : number of bits in bitstream */ + Word16 *prev_ft_speech, + Word16 *CNG, + Word16 bfi /* i : bad frame indicator */ +) +{ + Word16 k; + Decoder_State **sts; + Word32 total_brate = 0; + move32(); + Word16 curr_ft_good_sp, curr_ft_bad_sp; + Word16 g192_sid_first, sid_upd_bad, sid_update; + Word16 speech_bad, speech_lost; + Word16 n; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + st_ivas->BER_detect = 0; + move16(); + st_ivas->num_bits = num_bits; + move16(); + sts = reset_elements( st_ivas ); + +#ifdef DEBUGGING + file_read_FECpattern( &st_ivas->bfi ); + st_ivas->bfi |= bfi; + + if ( bfi == FRAMEMODE_MISSING ) + { + for ( k = 0; k < num_bits; k++ ) + { + bit_stream[k] = 0; + } + } +#else + st_ivas->bfi = bfi; + move16(); +#endif + + /* convert the frame length to total bitrate */ + total_brate = imult3216( num_bits, FRAMES_PER_SEC ); + move32(); + + /* verify that a valid num bits value is present */ + /* only AMRWB, EVS or IVAS bitrates or 0 (NO DATA) are allowed */ + IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + k = 0; + move16(); + + test(); + WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( total_brate, ivas_brate_tbl[k] ) ) + { + k = add( k, 1 ); + } + + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && ( LT_16( k, SIZE_IVAS_BRATE_TBL ) || LE_32( total_brate, SID_2k40 ) ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + move16(); + } + ELSE IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) && LE_32( total_brate, SID_2k40 ) ) + { + st_ivas->element_mode_init = IVAS_SCE; + move16(); + } + ELSE IF( EQ_16( k, SIZE_IVAS_BRATE_TBL ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) detected! Exiting ! \n", total_brate ); + } + ELSE + { + st_ivas->element_mode_init = -1; + move16(); + } + } + ELSE /* AMRWB or EVS */ + { + st_ivas->element_mode_init = EVS_MONO; + move16(); + + IF( rate2EVSmode( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) detected! Exiting ! \n", total_brate ); + } + } - next_bit_pos_save = st->next_bit_pos; - move16(); - core_save = st->core; + /* G.RX DTX handler*/ + /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA */ + /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ + curr_ft_good_sp = 0; + move16(); + curr_ft_bad_sp = 0; + move16(); + + IF( is_DTXrate( total_brate ) == 0 ) + { + IF( st_ivas->bfi == 0 ) + { + curr_ft_good_sp = 1; move16(); - bwidth_save = st->bwidth; + } + ELSE + { + curr_ft_bad_sp = 1; move16(); - - dec_prm_core( st ); /* sets st->core */ - - IF( EQ_16( st->core, HQ_CORE ) ) - { - /* Trigger HQ_CORE */ - st->codec_mode = MODE1; - move16(); - st->mdct_sw = MODE2; - move16(); - } - ELSE - { - /* Rewind bitstream */ - st->next_bit_pos = next_bit_pos_save; - move16(); - if ( st->bfi != 0 ) - { - st->core = core_save; - move16(); - } - /* always reset bwidth, to not interfere with BER logic */ - st->bwidth = bwidth_save; - move16(); - } } } - return; -} - + sid_update = 0; + move16(); + sid_upd_bad = 0; + move16(); + IF( EQ_16( is_SIDrate( total_brate ), 1 ) ) + { + IF( st_ivas->bfi == 0 ) + { + sid_update = 1; + move16(); + } + ELSE + { + sid_upd_bad = 1; /* this frame type may happen in ETSI/3GPP CS cases, a corrupt SID frames */ + move16(); + } + } -/*-------------------------------------------------------------------* - * BRATE2IDX_fx() - * - * Convert Bitrate to Index Value - *-------------------------------------------------------------------*/ + /* all zero indices/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ + /* all zero indices/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ + test(); + IF( EQ_32( total_brate, SID_1k75 ) && EQ_16( sid_update, 1 ) ) + { + /* valid sid_update received, check for very risky but formally valid content */ + Word16 sum = 0; + move16(); + FOR( k = 0; k < num_bits; ++k ) + { + sum = add( sum, extract_l( EQ_32( bit_stream[k], 1 ) ) ); /* check of 35 zeroes */ + } + if ( sum == 0 ) + { /* all zeros */ + sid_upd_bad = 1; /* initial signal as corrupt (BER likely) */ + move16(); + } + } -Word16 BRATE2IDX_fx( Word32 brate ) -{ + /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, + it declares every bad synch marked frame initially as a lost_speech frame, + and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. + While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. + Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . + */ + IF( sid_upd_bad ) + { + sid_upd_bad = 0; + move16(); + total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ + move32(); + } - Word32 L_temp; - Word32 L_idx; -#define START 9 - extern const Word16 bit_rates_div50[]; + g192_sid_first = 0; + move16(); - /* This is a Fast Bit Rate Value to Index Value Binary Search */ - L_temp = L_msu0( brate, bit_rates_div50[START], 50 ); - L_temp = L_min( 6, L_max( -6, L_temp ) ); - L_idx = L_add( L_temp, START ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - L_temp = L_min( 3, L_max( -3, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - L_temp = L_min( 1, L_max( -2, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_div50[L_idx], 50 ); - if ( L_temp != 0 ) - L_idx = L_add( L_idx, 1 ); - return (Word16) L_idx; -} + test(); + test(); + test(); + test(); + if ( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) && EQ_16( sts[0]->core, AMR_WB_CORE ) && *prev_ft_speech && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ + /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: + the very first SID_FIRST detection is based on a past EVS active frame + and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, + due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding + */ + move16(); + } + speech_bad = 0; + move16(); -/*-------------------------------------------------------------------* - * BRATE2IDX16k_fx() - * - * Convert Bitrate to Index Value - *-------------------------------------------------------------------*/ + test(); + if ( st_ivas->bfi != 0 && ( is_DTXrate( total_brate ) == 0 ) ) + { + speech_bad = 1; /* initial ft assumption, CNG_state decides what to do */ + move16(); + } -Word16 BRATE2IDX16k_fx( Word32 brate ) -{ - Word32 L_temp, L_idx; -#define START_16K 5 - extern const Word16 bit_rates_16k_div50[]; + speech_lost = 0; + move16(); - if ( EQ_32( brate, ACELP_16k40 ) ) + test(); + if ( total_brate == FRAME_NO_DATA && st_ivas->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ { - brate = ACELP_14k80; + speech_lost = 1; /* initial ft assumption, CNG_state decides what to do */ move16(); } - /* This is a Fast Bit Rate Value to Index Value Binary Search */ - L_temp = L_msu0( brate, bit_rates_16k_div50[START_16K], 50 ); - L_temp = L_min( 3, L_max( -3, L_temp ) ); - L_idx = L_add( L_temp, START_16K ); - L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); - L_temp = L_min( 2, L_max( -2, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); - L_temp = L_msu0( brate, bit_rates_16k_div50[L_idx], 50 ); - L_temp = L_min( 1, L_max( -1, L_temp ) ); - L_idx = L_add( L_temp, L_idx ); + /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame + as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ + IF( *CNG != 0 ) + { + /* We were in CNG synthesis */ + if ( curr_ft_good_sp != 0 ) + { + /* only a good speech frame makes you leave CNG synthesis */ + *CNG = 0; + move16(); + } + } + ELSE + { + /* We were in SPEECH synthesis */ + /* only a received/detected SID frame can make the decoder enter into CNG synthsis */ + test(); + test(); + if ( g192_sid_first || sid_update || sid_upd_bad ) + { + *CNG = 1; + move16(); + } + } - return (Word16) L_idx; -} + /* set bfi, total_brate pair for proper decoding */ + /* handle the G.192 _simulated_ untransmitted NO_DATA frame, setting for decoder SPEECH synthesis */ + test(); + test(); + if ( *CNG == 0 && total_brate == FRAME_NO_DATA && st_ivas->bfi == 0 ) + { + st_ivas->bfi = 1; /* SPEECH PLC code will now become active as in a real system */ + /* total_brate= 0 */ + move16(); + } -/*-------------------------------------------------------------------* - * BIT_ALLOC_IDX_fx() - *-------------------------------------------------------------------*/ + /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ + test(); + test(); + test(); + test(); + IF( ( + NE_16( bfi, FRAMEMODE_FUTURE ) && + ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ + ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ + { + st_ivas->bfi = 0; /* bfi=0 needed to activate CNG code */ + move16(); + total_brate = FRAME_NO_DATA; + move32(); + } -Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ) -{ - Word32 L_temp; - Word16 temp; - if ( ctype == INACTIVE ) /* no sub(ctype, INACTIVE) because it is '0' */ - ctype = GENERIC; + /* update for next frame's G.192 file format's odd SID_FIRST detection (primarily for AMRWBIO) */ + test(); + *prev_ft_speech = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); move16(); - L_temp = L_mac0( -1l * 256, 1 * 256, ctype ); - - temp = BRATE2IDX_fx( brate ); - L_temp = L_mac0( L_temp, 4 * 256, temp ); - IF( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); - /* So either 'temp' x 4 when 'tc < 0', 'temp' x 10 otherwise */ - - L_temp = L_mac0( L_temp, 1 * 256, s_max( 0, tc ) ); - L_temp = L_mac0( L_temp, s_max( 0, sfrm ), 1 ); - if ( sfrm < 0 ) - L_temp = L_shr( L_temp, 2 ); - L_temp = L_shr( L_temp, 6 ); + /* st->total brate= total_brate; updated in a good frame below */ - return L_temp; -} + FOR( k = 0; k < st_ivas->nCPE; k++ ) + { + sts = st_ivas->hCPE[k]->hCoreCoder; + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->bfi = st_ivas->bfi; + move16(); + } + } -/*-------------------------------------------------------------------* - * BIT_ALLOC_IDX_16KHZ_fx() - *-------------------------------------------------------------------*/ + FOR( k = 0; k < st_ivas->nSCE; k++ ) + { + sts = st_ivas->hSCE[k]->hCoreCoder; + sts[0]->bfi = st_ivas->bfi; + move16(); + } -Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ) -{ - Word32 L_temp; - Word16 temp; - /* 'ctype' = - TRANSITION => 2 - GENERIC => 1 - ALL Other => 0 - */ - L_temp = L_and( shr( 0x0240l, shl( ctype, 1 ) ), 3 ); + IF( st_ivas->bfi == 0 ) + { + /* select Mode 1 or Mode 2 */ + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) /* EVS mono */ + { + decoder_selectCodec( sts[0], total_brate, bit_stream[0] ); + st_ivas->hDecoderConfig->Opt_AMR_WB = sts[0]->Opt_AMR_WB; + move16(); + } + ELSE /* IVAS */ + { + st_ivas->codec_mode = MODE1; + move16(); + st_ivas->hDecoderConfig->Opt_AMR_WB = 0; + move16(); + } + } - temp = BRATE2IDX16k_fx( brate ); - L_temp = L_mac0( L_temp, 3, temp ); - IF( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); - /* So either 'temp' x 3 when 'tc < 0', 'temp' x 7 otherwise */ + /* GOOD frame */ + test(); + if ( st_ivas->bfi == 0 || EQ_16( st_ivas->bfi, FRAMEMODE_FUTURE ) ) + { + /* GOOD frame - convert ITU-T G.192 words to short values */ + st_ivas->hDecoderConfig->ivas_total_brate = total_brate; + move32(); + } - L_temp = L_mac0( L_temp, 1, s_max( 0, tc ) ); + st_ivas->bit_stream = bit_stream; - IF( sfrm >= 0 ) + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) { - /* Mult by 5 */ - L_temp = L_add( L_temp, L_shl( L_temp, 2 ) ); - L_temp = L_mac0( L_temp, shr( sfrm, 6 ), 1 ); + ivas_set_bitstream_pointers( st_ivas ); } - return L_temp; + return error; } @@ -875,6 +4793,7 @@ static void berCheck( return; } + /*-------------------------------------------------------------------* * getPartialCopyInfo() * @@ -940,8 +4859,11 @@ void getPartialCopyInfo( get_next_indice_tmp_fx( st, nBits ); } + + return; } + /*-------------------------------------------------------------------* * get_rfFlag() * @@ -950,7 +4872,7 @@ void getPartialCopyInfo( void get_rfFlag( Decoder_State *st, /* i: decoder state structure */ - Word16 *rf_flag, /* o : check for the RF flag */ + Word16 *rf_flag, /* o : check for the RF flag */ Word16 *nBits, Word16 *ind ) { @@ -983,7 +4905,7 @@ void get_rfFlag( move16(); /* retrieve the signalling indice */ - ind_tmp = (Word16) acelp_sig_tbl[add( start_idx, get_indice( st, 0, nBits_tmp ) )]; + ind_tmp = (Word16) acelp_sig_tbl[add( start_idx, get_indice_fx( st, 0, nBits_tmp ) )]; move16(); /* convert signalling indice into RF flag. */ @@ -1002,8 +4924,11 @@ void get_rfFlag( move16(); } } + + return; } + /*-------------------------------------------------------------------* * get_rfFrameType() * @@ -1035,7 +4960,7 @@ void get_rfFrameType( } /* the last three bits in a packet is the RF frame type */ - *rf_frame_type = get_indice( st, sub( num_bits, 3 ), 3 ); + *rf_frame_type = get_indice_fx( st, sub( num_bits, 3 ), 3 ); move16(); } ELSE @@ -1043,8 +4968,11 @@ void get_rfFrameType( *rf_frame_type = 0; move16(); } + + return; } + /*-------------------------------------------------------------------* * get_rf_fec_offset() * @@ -1075,7 +5003,7 @@ void get_rf_fec_offset( } /* the two bits before the rf frame type contain the fec offset */ - tmp = get_indice( st, sub( num_bits, 5 ), 2 ); + tmp = get_indice_fx( st, sub( num_bits, 5 ), 2 ); IF( tmp == 0 ) { @@ -1093,8 +5021,11 @@ void get_rf_fec_offset( *rf_fec_offset = 0; move16(); } + + return; } + /*-------------------------------------------------------------------* * get_rfTargetBits() * @@ -1106,9 +5037,7 @@ void get_rfTargetBits( Word16 *rf_target_bits /* o : Number of RF target bits */ ) { - /* Number of RF bits for different RF coder types */ - SWITCH( rf_frame_type ) { case RF_NO_DATA: @@ -1148,6 +5077,8 @@ void get_rfTargetBits( move16(); BREAK; } + + return; } @@ -1168,7 +5099,6 @@ void get_NextCoderType_fx( Word8 bit_stream[ACELP_13k20 / 50]; UWord16 tmp; - FOR( k = 0; k < ACELP_13k20 / 50; k++ ) { bit_stream[k] = (UWord8) s_and( shr( bitsteam[k / 8], sub( 7, s_and( k, 7 ) ) ), 0x1 ); @@ -1194,16 +5124,21 @@ void get_NextCoderType_fx( tmp = lshl( tmp, 1 ); tmp = add( tmp, bit_stream[k] ); } + /* retrieve the signalling indice */ *next_coder_type = s_and( extract_l( acelp_sig_tbl[start_idx + tmp] ), 0x7 ); move16(); + + return; } + /*-------------------------------------------------------------------* * get_indice_preview() * * Indices preview to parse for the presence of partial copy *-------------------------------------------------------------------*/ + static UWord16 get_indice_preview( UWord8 *bitstream, Word16 bitstreamSize, @@ -1231,14 +5166,17 @@ static UWord16 get_indice_preview( value = shl( value, 1 ); value = add( value, bitstreamShort[pos + i] ); } + return value; } + /*-------------------------------------------------------------------* * evs_dec_previewFrame() * * Signalling index preview *-------------------------------------------------------------------*/ + void evs_dec_previewFrame( UWord8 *bitstream, Word16 bitstreamSize, @@ -1295,8 +5233,11 @@ void evs_dec_previewFrame( move16(); } } + + return; } + void dtx_read_padding_bits_fx( DEC_CORE_HANDLE st, const Word16 num_bits ) diff --git a/lib_com/ivas_arith_fx.c b/lib_com/ivas_arith_fx.c index 311bccff8e206cbdb862bba20cd4f6e89d62ecc2..c708976dac8552562abb21fd47637ec18a9eb61f 100644 --- a/lib_com/ivas_arith_fx.c +++ b/lib_com/ivas_arith_fx.c @@ -191,7 +191,7 @@ void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, const Word16 extra_bits_read ) { - get_next_indice_tmp( st, negate( sub( cbitsnew - 2, extra_bits_read ) ) ); + get_next_indice_tmp_fx( st, negate( sub( cbitsnew - 2, extra_bits_read ) ) ); return; } diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index e9f09230b41239b6cc855b62b46d1c02eed2c070..e982007664b02402a275872746b4da08d01c50b5 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1248,11 +1248,6 @@ UWord16 get_next_indice_fx( Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); -Word16 rate2EVSmode( - const Word32 brate, /* i : bitrate */ - Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ -); - /* o : value of the indice */ UWord16 get_next_indice_1_fx( Decoder_State *st_fx /* i/o: decoder state structure */ @@ -1274,11 +1269,23 @@ void reset_indices_enc_fx( const Word16 max_num_indices /* i : max number of indices */ ); -Word16 BRATE2IDX_fx( Word32 brate ); -Word16 BRATE2IDX16k_fx( Word32 brate ); +Word16 BRATE2IDX_fx( + const Word32 brate ); + +Word16 BRATE2IDX16k_fx( + Word32 brate ); -Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ); -Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ); +Word32 BIT_ALLOC_IDX_fx( + const Word32 brate, + Word16 ctype, + const Word16 sfrm, + const Word16 tc ); + +Word32 BIT_ALLOC_IDX_16KHZ_fx( + const Word32 brate, + const Word16 ctype, + const Word16 sfrm, + const Word16 tc ); void getPartialCopyInfo( Decoder_State *st, /* i : decoder state structure */ @@ -10427,6 +10434,7 @@ Word32 sum2_32_fx( const Word32 *vec, /* i : input vector */ const Word16 lvec, /* i : length of input vector */ Word16 *e ); + void ProcessStereoIGF_fx( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ @@ -10444,6 +10452,7 @@ void ProcessStereoIGF_fx( const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ); + /*igf_enc.c*/ void IGFEncApplyStereo_fx( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ @@ -10467,6 +10476,7 @@ void IGFSaveSpectrumForITF_ivas_fx( const Word16 igfGridIdx, /* i : IGF grid index */ const Word32 *pITFSpectrum, /* i : MDCT spectrum */ Word16 exp_pITFSpectrum ); + Word16 IGFEncWriteBitstream_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -10474,6 +10484,7 @@ Word16 IGFEncWriteBitstream_ivas_fx( const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 isIndepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ ); + /*igf_scf_enc.c*/ Word16 IGFSCFEncoderEncode_ivas_fx( IGFSCFENC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ @@ -10483,6 +10494,7 @@ Word16 IGFSCFEncoderEncode_ivas_fx( const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 indepFlag /* i : if 1 frame is independent, 0 = frame is coded with data from previous frame */ ); + /*ari_enc.c*/ Word16 ari_encode_14bits_ext_ivas_fx( Word16 *ptr, /* Q0 */ @@ -10491,6 +10503,7 @@ Word16 ari_encode_14bits_ext_ivas_fx( Word32 symbol, /* Q0 */ UWord16 const *cum_freq /* Q0 */ ); + Word16 ari_encode_14bits_sign_ivas_fx( Word16 *ptr, /* Q0 */ Word16 bp, /* Q0 */ @@ -10498,22 +10511,18 @@ Word16 ari_encode_14bits_sign_ivas_fx( Tastat *s, Word16 sign /* Q0 */ ); + Word16 ari_done_encoding_14bits_ivas_fx( Word16 *ptr, /* Q0 */ Word16 bp, /* Q0 */ Tastat *s ); -void pack_bit( - const Word16 bit, /* i: bit to be packed */ - UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ - UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ -); + void IGFEncConcatenateBitstream( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const Word16 bsBits, /* i : number of IGF bits written to list of indices */ BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ ); - void hq_generic_hf_encoding_fx( const Word32 *coefs_fx, /* i : MDCT coefficients of weighted original */ Word16 *hq_generic_fenv_fx, /* i/o: energy of SWB envelope */ @@ -10521,6 +10530,7 @@ void hq_generic_hf_encoding_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ Word16 *hq_generic_exc_clas, /* o : bwe excitation class */ Word16 length ); + Word16 ari_decode_14bits_pow_ivas( Word16 *ptr, Word16 bp, @@ -10988,18 +10998,7 @@ UWord16 delete_indice( ); /*! r: value of the indice */ -UWord16 get_next_indice( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -void get_next_indice_tmp( - Decoder_State *st, /* o : decoder state structure */ - Word16 nb_bits /* i : number of bits that were used to quantize the indice */ -); - -/*! r: value of the indice */ -UWord16 get_indice( +UWord16 get_indice_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 pos, /* i : absolute position in the bitstream */ Word16 nb_bits /* i : number of bits that were used to quantize the indice */ @@ -11009,12 +11008,11 @@ void reset_indices_dec( Decoder_State *st /* i/o: decoder state structure */ ); -Word16 rate2EVSmode_float( +Word16 rate2EVSmode( const Word32 brate, /* i : bitrate */ Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ); - /*! r: 1 = OK, 0 = something wrong */ ivas_error read_indices_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -11025,7 +11023,6 @@ ivas_error read_indices_fx( Word16 bfi /* i : bad frame indicator */ ); - void ivas_set_bitstream_pointers( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index 2bd38153a3c533568ec9b21792b3d21df478853b..595e750f49e710ae9d93a00654cc8aed40850b8d 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -864,7 +864,7 @@ Word16 FEC_pos_dec_fx( bit_pos_pitch_index = add( bit_pos_pitch_index, 1 ); } /* retrieve the pitch index */ - pitch_index = (Word16) get_indice( st_fx, bit_pos_pitch_index, nBits ); + pitch_index = (Word16) get_indice_fx( st_fx, bit_pos_pitch_index, nBits ); /* decode pitch period */ T0_min = PIT_MIN; diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 96ae82ddee71c1e6a9a0115bce5ce2e84dea8334..d5a3cf71a2f35b0b650407150d408758869ea412 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -463,7 +463,7 @@ ivas_error amr_wb_dec_fx( * Extracts VAD information from the bitstream in AMR-WB IO mode *------------------------------------------------------------*/ - vad_flag = (Word16) get_next_indice( st_fx, 1 ); + vad_flag = (Word16) get_next_indice_fx( st_fx, 1 ); move16(); st_fx->coder_type = GENERIC; diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index eea558914c2af6701f3cca58975eaa6ed3a5a4d7..3ff22158846d47df64e98b4e00fcaf84eb034bd9 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -61,7 +61,7 @@ static void decode_frame_type_fx( Decoder_State *st ) /* SID frame */ ELSE IF( EQ_32( st->total_brate, SID_2k40 ) ) { - st->cng_type = get_next_indice( st, 1 ); + st->cng_type = get_next_indice_fx( st, 1 ); move16(); if ( NE_16( st->cng_type, FD_CNG ) ) { @@ -72,10 +72,10 @@ static void decode_frame_type_fx( Decoder_State *st ) move16(); frame_size_index = 1; move16(); - st->bwidth = get_next_indice( st, 2 ); + st->bwidth = get_next_indice_fx( st, 2 ); move16(); - frame_len_indicator = get_next_indice( st, 1 ); + frame_len_indicator = get_next_indice_fx( st, 1 ); IF( EQ_16( st->bwidth, NB ) ) { if ( frame_len_indicator ) @@ -146,7 +146,7 @@ static void decode_frame_type_fx( Decoder_State *st ) { /* Get bandwidth mode */ - st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); + st->bwidth = get_next_indice_fx( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); move16(); st->bwidth = add( st->bwidth, FrameSizeConfig[frame_size_index].bandwidth_min ); @@ -180,7 +180,7 @@ static void decode_frame_type_fx( Decoder_State *st ) IF( FrameSizeConfig[frame_size_index].reserved_bits && st->rf_flag == 0 ) { Word16 dummyBit; - dummyBit = (Word8) get_next_indice( st, 1 ); + dummyBit = (Word8) get_next_indice_fx( st, 1 ); move16(); if ( dummyBit != 0 ) { diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index 500fe34bab921a2c385caf751d34616d63e0045f..c5b08a784c0f3fa6cd8fd63f925dbc23dc60c16e 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -127,7 +127,7 @@ void decod_amr_wb_fx( IF( EQ_32( st_fx->core_brate, ACELP_23k85 ) ) { - hf_gain_fx[i_subfr / 64] = (Word16) get_next_indice( st_fx, 4 ); + hf_gain_fx[i_subfr / 64] = (Word16) get_next_indice_fx( st_fx, 4 ); move16(); } diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index c8dac0a0bc934199a60e6bf05c50e91235d4e3fc..4bbe3c5bc06e392d746c60b807bdf084474cebed 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -105,7 +105,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) { - *hqswb_clas = get_next_indice( st_fx, 2 ); /* Q0 */ + *hqswb_clas = get_next_indice_fx( st_fx, 2 ); /* Q0 */ move16(); bits = 2; move16(); @@ -119,7 +119,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits } ELSE { - *hqswb_clas = get_next_indice( st_fx, 1 ); /* Q0 */ + *hqswb_clas = get_next_indice_fx( st_fx, 1 ); /* Q0 */ move16(); bits = 1; move16(); diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 0161cbac0e1ad5b6f95c233ca22f1ba665229c56..3e76603326f099a1a1485188f8253a172f196385 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -103,7 +103,7 @@ void hq_core_dec_fx( test(); IF( !( core_switching_flag ) && GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) { - hHQ_core->HqVoicing = get_next_indice( st_fx, 1 ); /* Q0 */ + hHQ_core->HqVoicing = get_next_indice_fx( st_fx, 1 ); /* Q0 */ move16(); num_bits = sub( num_bits, 1 ); /* Q0 */ } diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c index 6423015bc4f8afe008e206801dc367770e8d32d8..27b352cd34e29cf546dd68ac15ff087d2f1a8311 100644 --- a/lib_dec/hq_hr_dec_fx.c +++ b/lib_dec/hq_hr_dec_fx.c @@ -477,7 +477,7 @@ void hq_hr_dec_fx( test(); IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) ) { - nf_idx = get_next_indice( st_fx, 2 ); /* Q0 */ + nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */ } /*------------------------------------------------------------------* diff --git a/lib_dec/range_dec_fx.c b/lib_dec/range_dec_fx.c index 7f62e0dd351583588e04b0e65efa6bcbefa3354c..e63435f5b5a96163243d3ca186d01c25f123c0f6 100644 --- a/lib_dec/range_dec_fx.c +++ b/lib_dec/range_dec_fx.c @@ -147,16 +147,16 @@ Word32 rc_dec_bits_fx( /* i : Decoded value */ { hPVQ->rc_offset = sub( hPVQ->rc_offset, sub( bits, 16 ) ); move16(); - value = UL_lshl( UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, sub( bits, 16 ) ) ), 16 ); + value = UL_lshl( UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, sub( bits, 16 ) ) ), 16 ); hPVQ->rc_offset = sub( hPVQ->rc_offset, 16 ); move16(); - value = UL_or( value, UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, 16 ) ) ); + value = UL_or( value, UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, 16 ) ) ); } ELSE { hPVQ->rc_offset = sub( hPVQ->rc_offset, bits ); move16(); - value = UL_deposit_l( get_indice( st_fx, hPVQ->rc_offset, bits ) ); + value = UL_deposit_l( get_indice_fx( st_fx, hPVQ->rc_offset, bits ) ); } return value; diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 0a01dfe6667897772df2872ff2d6089504db72c5..ee4f439961553f7ca4603a9fc67e862fdd89aef8 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -2360,11 +2360,6 @@ void IGFEncSetMode_ivas_fx( return; } -/*-------------------------------------------------------------------* - * pack_bit_ivas() - * - * insert a bit into packed octet - *-------------------------------------------------------------------*/ /*-------------------------------------------------------------------* * IGFEncConcatenateBitstream() diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index e0562467a93c60abef056c29d59cf5a67a193c8c..c57f5ffb014c41b53f7a2caeff06cac9fcd422e3 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1534,7 +1534,7 @@ void IGFEncSetMode_fx( * insert a bit into packed octet *-------------------------------------------------------------------*/ -static void pack_bit_ivas_fx( +static void pack_bit_fx( const Word16 bit, /* i : bit to be packed */ UWord8 **pt, /* i/o: pointer to octet array into which bit will be placed */ UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ @@ -1607,7 +1607,7 @@ void IGFEncConcatenateBitstream_ivas_fx( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* write bit by bit */ FOR( k = 0; k < ind_list[i].nb_bits; k++ ) { - pack_bit_ivas_fx( extract_l( L_and( ind_list[i].value, imask ) ), &pFrame, &omask ); + pack_bit_fx( extract_l( L_and( ind_list[i].value, imask ) ), &pFrame, &omask ); imask = L_shr( imask, 1 ); } nb_bits_written = add( nb_bits_written, ind_list[i].nb_bits ); diff --git a/lib_util/mime_io.c b/lib_util/mime_io.c index 2976e1895feea86a4a9d03cdca6571ee8ebd3d5a..03ff3bbb705300ec3f07856f8b683470378d746f 100644 --- a/lib_util/mime_io.c +++ b/lib_util/mime_io.c @@ -201,8 +201,8 @@ MIME_ERROR MIME_WriteFrame( { int16_t mode; int16_t cmi; - mode = rate2EVSmode_float( numBits * FRAMES_PER_SEC, &isAmrWb ); - cmi = rate2EVSmode_float( totalBrate, &isAmrWb ); + mode = rate2EVSmode( numBits * FRAMES_PER_SEC, &isAmrWb ); + cmi = rate2EVSmode( totalBrate, &isAmrWb ); ToC = (uint8_t) ( isAmrWb << 5 | isAmrWb << 4 | mode ); writeByte( hMIME->file, ToC );