diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj
index 75831970efdfb8fc2a9230f03be6eba7eb990195..86e56d42a2875863ddbf9a3b044d5940969eba8e 100644
--- a/Workspace_msvc/lib_enc.vcxproj
+++ b/Workspace_msvc/lib_enc.vcxproj
@@ -239,60 +239,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -324,18 +273,13 @@
-
-
-
-
-
@@ -373,18 +317,8 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters
index 0c3220178924f65ff87dfee9b4c2a57195bfd1d9..406c01b86a7768305a30f39c8249ac6303890d65 100644
--- a/Workspace_msvc/lib_enc.vcxproj.filters
+++ b/Workspace_msvc/lib_enc.vcxproj.filters
@@ -8,75 +8,39 @@
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
@@ -92,54 +56,33 @@
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
encoder_evs_c
-
- encoder_evs_c
-
encoder_evs_c
@@ -347,135 +290,72 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -494,9 +374,6 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -506,27 +383,15 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -536,45 +401,24 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -590,39 +434,21 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -632,27 +458,15 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -668,21 +482,12 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
@@ -719,9 +524,6 @@
encoder_all_c
-
- encoder_all_c
-
encoder_all_c
diff --git a/lib_enc/ari_enc.c b/lib_enc/ari_enc.c
deleted file mode 100644
index da4d1486b8ab2c36bed04809489df3765d72cc14..0000000000000000000000000000000000000000
--- a/lib_enc/ari_enc.c
+++ /dev/null
@@ -1,316 +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.h"
-#include "prot_fx.h"
-#include "stat_com.h"
-#include "basop_util.h"
-#include "wmc_auto.h"
-#include "prot_fx_enc.h"
-
-
-/*---------------------------------------------------------------
- * ari_copy_states()
- *
- * Copy state
- *-------------------------------------------------------------*/
-
-void ari_copy_states(
- Tastat *source,
- Tastat *dest )
-{
- dest->low = source->low;
- dest->high = source->high;
- dest->bits_to_follow = source->bits_to_follow;
-
- return;
-}
-
-/*---------------------------------------------------------------
- Ari encoder 14 bits routines
- -------------------------------------------------------------*/
-
-/*---------------------------------------------------------------
- * ari_start_encoding_14bits()
- *
- * Start ArCo encoding
- *-------------------------------------------------------------*/
-
-void ari_start_encoding_14bits(
- Tastat *s )
-{
- /* : addressing is made with walking pointer s */
- s->low = 0;
- s->high = ari_q4new;
- s->bits_to_follow = 0;
- move32();
- move32();
- move32();
-
- return;
-}
-void ari_start_encoding_14bits_ivas_fx(
- Tastat *s )
-{
- /* : addressing is made with walking pointer s */
- s->low = 0;
- s->high = ari_q4new;
- s->bits_to_follow = 0;
- move32();
- move32();
- move32();
-
- return;
-}
-
-/*---------------------------------------------------------------
- * ari_done_encoding_14bits_ivas_fx()
- *
- * Finish ArCo encoding
- *-------------------------------------------------------------*/
-
-Word16 ari_done_encoding_14bits_ivas_fx(
- Word16 *ptr, /* Q0 */
- Word16 bp, /* Q0 */
- Tastat *s )
-{
- Word16 bit;
-
- bit = 0;
- move16();
- IF( GE_32( s->low, ari_q1new ) )
- {
- bit = s_xor( bit, 1 );
- }
- return ari_put_bit_plus_follow( ptr, bp, add( extract_l( s->bits_to_follow ), 1 ), bit );
-}
-
-
-/*---------------------------------------------------------------
- * ari_encode_14bits_ext_ivas_fx()
- *
- * encode function for extended proba tables: less branches needed for coding
- *
- *-------------------------------------------------------------*/
-Word16 ari_encode_14bits_ext_ivas_fx(
- Word16 *ptr, /* Q0 */
- Word16 bp, /* Q0 */
- Tastat *s,
- Word32 symbol, /* Q0 */
- UWord16 const *cum_freq /* Q0 */
-)
-{
- Word32 low;
- Word32 high;
- Word32 range;
- Word16 bits_to_follow;
- Word16 i;
- UWord16 temp;
- Word32 L_temp1, L_temp2;
-
- high = L_add( s->high, 0 );
- low = L_add( s->low, 0 );
- range = L_add( L_sub( high, low ), 1 ); /* Q0 */
-
- L_temp1 = L_shl( range, 15 - stat_bitsnew /*both are constants*/ );
- Mpy_32_16_ss( L_temp1, cum_freq[symbol + 1], &L_temp2, &temp );
- IF( symbol != 0 ) /* when symbol is 0, range remains unchanged */
- {
- Mpy_32_16_ss( L_temp1, cum_freq[symbol], &range, &temp );
- }
- high = L_sub( L_add( low, range ), 1 ); /* Q0 */
- low = L_add( low, L_temp2 ); /* Q0 */
-
- assert( s->bits_to_follow <= MAX_16 );
- bits_to_follow = extract_l( s->bits_to_follow ); /* Q0 */
-
- FOR( i = 0; i < 0x7FFF; i++ )
- {
- IF( LT_32( high, ari_q2new ) )
- {
- bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 0 ); /* Q0 */
- bits_to_follow = 0;
- move16();
- }
- ELSE IF( GE_32( low, ari_q2new ) )
- {
- bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 1 ); /* Q0 */
- bits_to_follow = 0;
- move16();
- low = L_sub( low, ari_q2new );
- high = L_sub( high, ari_q2new ); /* Subtract offset to top. */
- }
- ELSE
- {
- test();
- IF( GE_32( low, ari_q1new ) && LT_32( high, ari_q3new ) )
- {
- /* Output an opposite bit */
- /* later if in middle half. */
- bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */
- low = L_sub( low, ari_q1new ); /* Subtract offset to middle*/
- high = L_sub( high, ari_q1new );
- }
- ELSE
- {
- BREAK; /* Otherwise exit loop. */
- }
- }
- low = L_add( low, low ); /* Q0 */
- high = L_add( L_add( high, high ), 1 ); /* Scale up code range. Q0*/
- }
-
- s->low = low; /* Q0 */
- move32();
- s->high = high; /* Q0 */
- move32();
- s->bits_to_follow = bits_to_follow; /* Q0 */
- move32();
-
- return bp;
-}
-
-
-/*------------------------------------------------------------------------
- * Function: ari_encode_14bits_high_low_fx()
- *
- *-------------------------------------------------------------------------*/
-
-static Word16 ari_encode_14bits_high_low_fx(
- Word16 *ptr, /* Q0 */
- Word16 bp, /* Q0 */
- Word16 bits, /* Q0 */
- Tastat *s,
- Word32 high, /* Q0 */
- Word32 low /* Q0 */
-)
-{
- Word16 bits_to_follow, tmp;
-
- bits_to_follow = extract_l( s->bits_to_follow ); /* Q0 */
- move16();
-
- /* while there are more than 16 bits left */
- tmp = sub( 16, bits ); /* Q0 */
- WHILE( add( add( bp, bits_to_follow ), tmp ) < 0 )
- {
- IF( LE_32( high, ari_q2new ) )
- {
- bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 0 ); /* Q0 */
- bits_to_follow = 0;
- move16();
- }
- ELSE IF( GE_32( low, ari_q2new ) )
- {
- bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 1 ); /* Q0 */
- bits_to_follow = 0;
- move16();
- low = L_sub( low, ari_q2new ); /* Q0 */
- high = L_sub( high, ari_q2new ); /* Subtract offset to top. Q0*/
- }
- ELSE
- {
- test();
- IF( GE_32( low, ari_q1new ) && LE_32( high, ari_q3new ) )
- {
- /* Output an opposite bit */
- /* later if in middle half. */
- bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */
- low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/
- high = L_sub( high, ari_q1new ); /* Q0 */
- }
- ELSE
- {
- BREAK; /* Otherwise exit loop. */
- }
- }
-
- low = L_add( low, low );
- high = L_add( high, high ); /* Scale up code range. */
- }
-
- s->low = low; /* Q0 */
- move32();
- s->high = L_sub( high, 1 ); /* Q0 */
- move32();
- s->bits_to_follow = bits_to_follow; /* Q0 */
- move16();
-
- return bp;
-}
-
-/*------------------------------------------------------------------------
- * Function: ari_encode_14bits_sign_ivas_fx()
- *
- * Encode a sign with equal probabilities.
- *-------------------------------------------------------------------------*/
-Word16 ari_encode_14bits_sign_ivas_fx(
- Word16 *ptr, /* Q0 */
- Word16 bp, /* Q0 */
- Word32 bits, /* Q0 */
- Tastat *s,
- Word16 sign /* Q0 */
-)
-{
- Word32 low, high, range;
- Word32 L_tmp;
-
- high = L_add( s->high, 1 );
- low = L_add( s->low, 0 );
- range = L_sub( high, low ); /* Q0 */
-
- L_tmp = L_shr( range, 1 );
- if ( sign != 0 )
- {
- high = L_add( low, L_tmp ); /* Q0 */
- }
- if ( sign == 0 )
- {
- low = L_add( low, L_tmp ); /* Q0 */
- }
-
- return ari_encode_14bits_high_low_fx( ptr, bp, extract_l( bits ), s, high, low );
-}
-
-/*------------------------------------------------------------------------
- * Function: ari_done_cbr_encoding_14bits()
- *
- * Finish up encoding in CBR mode.
- *-------------------------------------------------------------------------*/
diff --git a/lib_enc/ari_enc_fx.c b/lib_enc/ari_enc_fx.c
index 0ef053edd75ef58434abdc6fab944cb0851964de..29ddd838c69cfb2be54ccfd8d304168190e848bf 100644
--- a/lib_enc/ari_enc_fx.c
+++ b/lib_enc/ari_enc_fx.c
@@ -364,3 +364,226 @@ Word16 ari_done_cbr_encoding_14bits_fx(
return bp;
}
+
+void ari_start_encoding_14bits_ivas_fx(
+ Tastat *s )
+{
+ /* : addressing is made with walking pointer s */
+ s->low = 0;
+ s->high = ari_q4new;
+ s->bits_to_follow = 0;
+ move32();
+ move32();
+ move32();
+
+ return;
+}
+
+/*---------------------------------------------------------------
+ * ari_done_encoding_14bits_ivas_fx()
+ *
+ * Finish ArCo encoding
+ *-------------------------------------------------------------*/
+
+Word16 ari_done_encoding_14bits_ivas_fx(
+ Word16 *ptr, /* Q0 */
+ Word16 bp, /* Q0 */
+ Tastat *s )
+{
+ Word16 bit;
+
+ bit = 0;
+ move16();
+ IF( GE_32( s->low, ari_q1new ) )
+ {
+ bit = s_xor( bit, 1 );
+ }
+ return ari_put_bit_plus_follow( ptr, bp, add( extract_l( s->bits_to_follow ), 1 ), bit );
+}
+
+
+/*---------------------------------------------------------------
+ * ari_encode_14bits_ext_ivas_fx()
+ *
+ * encode function for extended proba tables: less branches needed for coding
+ *
+ *-------------------------------------------------------------*/
+Word16 ari_encode_14bits_ext_ivas_fx(
+ Word16 *ptr, /* Q0 */
+ Word16 bp, /* Q0 */
+ Tastat *s,
+ Word32 symbol, /* Q0 */
+ UWord16 const *cum_freq /* Q0 */
+)
+{
+ Word32 low;
+ Word32 high;
+ Word32 range;
+ Word16 bits_to_follow;
+ Word16 i;
+ UWord16 temp;
+ Word32 L_temp1, L_temp2;
+
+ high = L_add( s->high, 0 );
+ low = L_add( s->low, 0 );
+ range = L_add( L_sub( high, low ), 1 ); /* Q0 */
+
+ L_temp1 = L_shl( range, 15 - stat_bitsnew /*both are constants*/ );
+ Mpy_32_16_ss( L_temp1, cum_freq[symbol + 1], &L_temp2, &temp );
+ IF( symbol != 0 ) /* when symbol is 0, range remains unchanged */
+ {
+ Mpy_32_16_ss( L_temp1, cum_freq[symbol], &range, &temp );
+ }
+ high = L_sub( L_add( low, range ), 1 ); /* Q0 */
+ low = L_add( low, L_temp2 ); /* Q0 */
+
+ assert( s->bits_to_follow <= MAX_16 );
+ bits_to_follow = extract_l( s->bits_to_follow ); /* Q0 */
+
+ FOR( i = 0; i < 0x7FFF; i++ )
+ {
+ IF( LT_32( high, ari_q2new ) )
+ {
+ bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 0 ); /* Q0 */
+ bits_to_follow = 0;
+ move16();
+ }
+ ELSE IF( GE_32( low, ari_q2new ) )
+ {
+ bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 1 ); /* Q0 */
+ bits_to_follow = 0;
+ move16();
+ low = L_sub( low, ari_q2new );
+ high = L_sub( high, ari_q2new ); /* Subtract offset to top. */
+ }
+ ELSE
+ {
+ test();
+ IF( GE_32( low, ari_q1new ) && LT_32( high, ari_q3new ) )
+ {
+ /* Output an opposite bit */
+ /* later if in middle half. */
+ bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */
+ low = L_sub( low, ari_q1new ); /* Subtract offset to middle*/
+ high = L_sub( high, ari_q1new );
+ }
+ ELSE
+ {
+ BREAK; /* Otherwise exit loop. */
+ }
+ }
+ low = L_add( low, low ); /* Q0 */
+ high = L_add( L_add( high, high ), 1 ); /* Scale up code range. Q0*/
+ }
+
+ s->low = low; /* Q0 */
+ move32();
+ s->high = high; /* Q0 */
+ move32();
+ s->bits_to_follow = bits_to_follow; /* Q0 */
+ move32();
+
+ return bp;
+}
+
+
+/*------------------------------------------------------------------------
+ * Function: ari_encode_14bits_high_low_fx()
+ *
+ *-------------------------------------------------------------------------*/
+
+static Word16 ari_encode_14bits_high_low_ivas_fx(
+ Word16 *ptr, /* Q0 */
+ Word16 bp, /* Q0 */
+ Word16 bits, /* Q0 */
+ Tastat *s,
+ Word32 high, /* Q0 */
+ Word32 low /* Q0 */
+)
+{
+ Word16 bits_to_follow, tmp;
+
+ bits_to_follow = extract_l( s->bits_to_follow ); /* Q0 */
+ move16();
+
+ /* while there are more than 16 bits left */
+ tmp = sub( 16, bits ); /* Q0 */
+ WHILE( add( add( bp, bits_to_follow ), tmp ) < 0 )
+ {
+ IF( LE_32( high, ari_q2new ) )
+ {
+ bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 0 ); /* Q0 */
+ bits_to_follow = 0;
+ move16();
+ }
+ ELSE IF( GE_32( low, ari_q2new ) )
+ {
+ bp = ari_put_bit_plus_follow( ptr, bp, bits_to_follow, 1 ); /* Q0 */
+ bits_to_follow = 0;
+ move16();
+ low = L_sub( low, ari_q2new ); /* Q0 */
+ high = L_sub( high, ari_q2new ); /* Subtract offset to top. Q0*/
+ }
+ ELSE
+ {
+ test();
+ IF( GE_32( low, ari_q1new ) && LE_32( high, ari_q3new ) )
+ {
+ /* Output an opposite bit */
+ /* later if in middle half. */
+ bits_to_follow = add( bits_to_follow, 1 ); /* Q0 */
+ low = L_sub( low, ari_q1new ); /* Subtract offset to middle Q0*/
+ high = L_sub( high, ari_q1new ); /* Q0 */
+ }
+ ELSE
+ {
+ BREAK; /* Otherwise exit loop. */
+ }
+ }
+
+ low = L_add( low, low );
+ high = L_add( high, high ); /* Scale up code range. */
+ }
+
+ s->low = low; /* Q0 */
+ move32();
+ s->high = L_sub( high, 1 ); /* Q0 */
+ move32();
+ s->bits_to_follow = bits_to_follow; /* Q0 */
+ move16();
+
+ return bp;
+}
+
+/*------------------------------------------------------------------------
+ * Function: ari_encode_14bits_sign_ivas_fx()
+ *
+ * Encode a sign with equal probabilities.
+ *-------------------------------------------------------------------------*/
+Word16 ari_encode_14bits_sign_ivas_fx(
+ Word16 *ptr, /* Q0 */
+ Word16 bp, /* Q0 */
+ Word32 bits, /* Q0 */
+ Tastat *s,
+ Word16 sign /* Q0 */
+)
+{
+ Word32 low, high, range;
+ Word32 L_tmp;
+
+ high = L_add( s->high, 1 );
+ low = L_add( s->low, 0 );
+ range = L_sub( high, low ); /* Q0 */
+
+ L_tmp = L_shr( range, 1 );
+ if ( sign != 0 )
+ {
+ high = L_add( low, L_tmp ); /* Q0 */
+ }
+ if ( sign == 0 )
+ {
+ low = L_add( low, L_tmp ); /* Q0 */
+ }
+
+ return ari_encode_14bits_high_low_ivas_fx( ptr, bp, extract_l( bits ), s, high, low );
+}
diff --git a/lib_enc/ari_hm_enc.c b/lib_enc/ari_hm_enc.c
deleted file mode 100644
index c6e11a3f0db760424be54b7fd697d375b5b070d4..0000000000000000000000000000000000000000
--- a/lib_enc/ari_hm_enc.c
+++ /dev/null
@@ -1,53 +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
-#include "cnst.h"
-#include "rom_enc.h"
-#include "stl.h"
-#include "basop_util.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * EncodeIndex()
- *
- *
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/arith_coder_enc.c b/lib_enc/arith_coder_enc.c
deleted file mode 100644
index 5625b6cf4f0b75eadea8ae2cf8bac61a4b75db4c..0000000000000000000000000000000000000000
--- a/lib_enc/arith_coder_enc.c
+++ /dev/null
@@ -1,51 +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
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "basop_util.h"
-#include "basop_proto_func.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-
-/*-------------------------------------------------------------------*
- * Local constants
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/avq_cod.c b/lib_enc/avq_cod.c
deleted file mode 100644
index 9228e2f5d74225dead52c212c28881aa61812ea6..0000000000000000000000000000000000000000
--- a/lib_enc/avq_cod.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/bass_psfilter_enc.c b/lib_enc/bass_psfilter_enc.c
deleted file mode 100644
index 9228e2f5d74225dead52c212c28881aa61812ea6..0000000000000000000000000000000000000000
--- a/lib_enc/bass_psfilter_enc.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c
deleted file mode 100644
index d86351ae8053e5deb265beef6dceb16d1cc13e22..0000000000000000000000000000000000000000
--- a/lib_enc/bw_detect.c
+++ /dev/null
@@ -1,64 +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
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * Local constants
- *-------------------------------------------------------------------*/
-
-#define BWD_MIN_BRATE_WIDER_BW_MDCT IVAS_48k
-#define BWD_MIN_BRATE_WIDER_BW_ISM IVAS_32k
-#define BWD_MAX_BRATE_WIDER_BW_MDCT IVAS_80k
-#define BWD_MAX_BRATE_WIDER_BW_ISM IVAS_64k
-
-#define ALPHA_BWD 0.75f
-#define BWD_LT_THRESH 0.6f
-
-#define BWD_COUNT_MAX 100
-#define BWD_COUNT_WIDER_BW 10
-#define BWD_COUNT_WIDER_BW_MDCT 0
-
-#define CLDFB_ENER_OFFSET 1.6f
diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c
deleted file mode 100644
index 192a71f92588c5dd802efa7755d73918a0321b2c..0000000000000000000000000000000000000000
--- a/lib_enc/cng_enc.c
+++ /dev/null
@@ -1,429 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-#include "prot_fx_enc.h"
-#include "prot_fx.h"
-#include "ivas_rom_com_fx.h"
-
-/*---------------------------------------------------------------------*
- * Local function prototypes
- *---------------------------------------------------------------------*/
-
-static Word16 shb_DTX_ivas_fx( Encoder_State *st, const Word16 *shb_speech_fx, const Word16 *syn_12k8_16k_fx );
-
-static void shb_CNG_encod_ivas_fx( Encoder_State *st, const Word16 update );
-
-
-void swb_CNG_enc_ivas_fx(
- Encoder_State *st, /* i/o: State structure */
- const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */
- const Word16 *syn_12k8_16k_fx /* i : ACELP core synthesis at 12.8kHz or 16kHz Q0 */
-)
-{
- Word16 shb_SID_updt;
-
- test();
- IF( EQ_32( st->core_brate, SID_2k40 ) || st->core_brate == FRAME_NO_DATA )
- {
- IF( st->cng_type == LP_CNG )
- {
- test();
- IF( GE_32( st->input_Fs, L_FRAME32k * FRAMES_PER_SEC ) )
- {
- /* decide if SHB SID encoding or not */
- shb_SID_updt = shb_DTX_ivas_fx( st, shb_speech_fx, syn_12k8_16k_fx );
-
- /* SHB CNG encoding */
- shb_CNG_encod_ivas_fx( st, shb_SID_updt );
- }
- ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_32( st->core_brate, SID_2k40 ) )
- {
- /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */
- delete_indice( st->hBstr, IND_CNG_ENV1 );
- push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
- push_indice( st->hBstr, IND_UNUSED, 0, 4 );
- push_indice( st->hBstr, IND_SID_BW, 1, 1 );
- }
- }
- st->hTdCngEnc->last_vad = 0;
- move16();
- }
- ELSE
- {
- st->hTdCngEnc->last_vad = 1;
- move16();
- }
-
- return;
-}
-
-
-/*---------------------------------------------------------------------*
- * shb_CNG_encod()
- *
- * SID parameters encoding for SHB signal
- *---------------------------------------------------------------------*/
-
-static void shb_CNG_encod_ivas_fx(
- Encoder_State *st, /* i/o: State structure */
- const Word16 update /* i : SID update flag */
-)
-{
- Word16 idx_ener = 0;
- move16();
- BSTR_ENC_HANDLE hBstr = st->hBstr;
-
- Word16 ener_mid_dec_thr_fx;
-
- IF( EQ_16( update, 1 ) )
- {
- IF( st->element_mode == EVS_MONO )
- {
- /* 6.0 in Q8 -> 1510 */
- /* 0.9 in Q15 29491 */
- /* ( 1 / log10(2.0) ) * 0.1 in Q15 ->10886 */
- idx_ener = shr( mult( add( mult( st->hTdCngEnc->mov_shb_cng_ener_fx, 10886 ), 1510 ), 29491 ), 8 ); /* Q0 */
- }
- ELSE
- {
- /*idx_ener = (int16_t)(0.7f * (0.1f * st->hTdCngEnc->mov_shb_cng_ener / (float)log10(2.0f) + 6.0f) + 0.5f);*/
- // PMT("shb_CNG_encod_fx quantization in missing")
- /* 6.0 in Q8 -> 1510 */
- /* 0.7 in Q15 22938 */
- /* ( 1 / log10(2.0) ) * 0.1 in Q15 -> 10886 */
- idx_ener = shr( mult( add( mult( st->hTdCngEnc->mov_shb_cng_ener_fx, 10886 ), 1510 ), 22938 ), 8 ); /* Q0 */
- }
-
-
- if ( LT_16( st->bwidth, SWB ) )
- {
- idx_ener = 0;
- move16();
- }
-
- IF( GT_16( idx_ener, 15 ) )
- {
- idx_ener = 15;
- move16();
- }
- ELSE IF( idx_ener < 0 )
- {
- idx_ener = 0;
- move16();
- }
-
- /* prevent toggling of idx_ener by adding small dead-zone interval around decision thresholds */
- IF( st->element_mode != EVS_MONO )
- {
- IF( EQ_16( abs_s( sub( idx_ener, st->hTdCngEnc->last_idx_ener ) ), 1 ) )
- {
-
- Word16 tmp, tmp1, tmp2, scale, exp1, exp2, ener_mid_dec_thr_e;
- tmp = BASOP_Util_Divide1616_Scale( st->hTdCngEnc->last_idx_ener, 22938, &scale ); // 0.7 in Q15 ->exp 0
- scale = add( scale, ( 15 - 0 ) );
- tmp = sub( tmp, shl( 6, sub( Q15, scale ) ) );
- tmp1 = BASOP_Util_Divide1616_Scale( tmp, 3277, &exp1 );
- exp1 = add( exp1, ( scale - 0 ) );
-
- ener_mid_dec_thr_fx = shr( mult( tmp1, 9864 ), 1 ); // exp = exp
-
- tmp = BASOP_Util_Divide1616_Scale( idx_ener, 22938, &scale ); // 0.7 in Q15 ->exp 0
- scale = add( scale, ( 15 - 0 ) );
- tmp = sub( tmp, shl( 6, sub( Q15, scale ) ) );
- tmp1 = BASOP_Util_Divide1616_Scale( tmp, 3277, &exp2 );
- exp2 = add( exp2, ( scale - 0 ) );
-
- tmp2 = shr( mult( tmp1, 9864 ), 1 ); // exp = exp
-
- ener_mid_dec_thr_e = BASOP_Util_Add_MantExp( tmp2, exp2, ener_mid_dec_thr_fx, exp1, &ener_mid_dec_thr_fx );
-
-
- scale = BASOP_Util_Add_MantExp( st->hTdCngEnc->mov_shb_cng_ener_fx, 7, negate( ener_mid_dec_thr_fx ), ener_mid_dec_thr_e, &tmp );
- tmp1 = BASOP_Util_Divide1616_Scale( tmp, ener_mid_dec_thr_fx, &exp1 );
- exp1 = add( exp1, sub( scale, ener_mid_dec_thr_e ) );
- IF( LT_16( abs_s( tmp1 ), shr( 328, sub( 15, exp1 ) ) ) )
- {
- idx_ener = st->hTdCngEnc->last_idx_ener;
- move16();
- }
- }
- }
-
- st->hTdCngEnc->last_idx_ener = idx_ener;
- move16();
-
- push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 );
- push_indice( hBstr, IND_SID_BW, 1, 1 );
- delete_indice( hBstr, IND_CNG_ENV1 );
- IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
- {
- push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
- }
- ELSE
- {
- push_indice( hBstr, IND_UNUSED, 0, 2 );
- }
- st->hTdCngEnc->ho_sid_bw = L_shl( L_and( st->hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 );
- st->hTdCngEnc->ho_sid_bw = L_or( st->hTdCngEnc->ho_sid_bw, 0x1L );
- move32();
- move32();
- }
- ELSE IF( EQ_32( st->core_brate, SID_2k40 ) )
- {
- st->hTdCngEnc->ho_sid_bw = L_shl( L_and( st->hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 );
- move32();
- push_indice( hBstr, IND_SID_BW, 0, 1 );
- }
-
- return;
-}
-
-/*---------------------------------------------------------------------*
- * shb_DTX()
- *
- * Decide if encoding SHB SID or not
- *---------------------------------------------------------------------*/
-
-static Word16 shb_DTX_ivas_fx(
- Encoder_State *st, /* i/o: State structure */
- const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */
- const Word16 *syn_12k8_16k_fx /* i : ACELP core synthesis at 12.8kHz or 16kHz Q0 */
-)
-{
- Word16 i;
- Word16 update;
-
- Word16 allow_cn_step = 0;
- move16();
- Word16 shb_old_speech_fx[( ACELP_LOOK_12k8 + L_SUBFR + L_FRAME ) * 5 / 4];
- Word16 *shb_new_speech_fx;
- Word32 wb_ener_fx;
- Word32 shb_ener_fx;
- Word16 log_wb_ener_fx;
- Word16 log_shb_ener_fx;
- Word16 tmp;
- Word16 exp;
- Word16 fra;
- Word16 att_fx; /*Q8*/
-
- TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc;
- TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD;
-
-
-#ifdef BASOP_NOGLOB_DECLARE_LOCAL
- Flag Overflow = 0;
- move16();
-#endif
-
- shb_new_speech_fx = shb_old_speech_fx + ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4;
- Copy( hBWE_TD->old_speech_shb_fx, shb_old_speech_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); // old_speech_shb_fx -> Q0
- Copy( shb_speech_fx, shb_new_speech_fx, L_FRAME16k ); // Q0
- Copy( shb_old_speech_fx + L_FRAME16k, hBWE_TD->old_speech_shb_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); // Q0
-
- shb_ener_fx = L_deposit_l( 0 );
- FOR( i = 0; i < L_FRAME16k; i++ )
- {
- shb_ener_fx = L_mac_sat( shb_ener_fx, shb_old_speech_fx[i], shb_old_speech_fx[i] ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac
- }
-
- shb_ener_fx = L_add( Mpy_32_16_1( shb_ener_fx, 102 ), 1 ); /* ( 1 / L_FRAME16K ) -> 102 in Q15, shb_ener_fx in Q1 */
-
- wb_ener_fx = L_deposit_l( 0 );
- FOR( i = 0; i < st->L_frame; i++ )
- {
- wb_ener_fx = L_mac_o( wb_ener_fx, syn_12k8_16k_fx[i], syn_12k8_16k_fx[i], &Overflow ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac
- }
-
- wb_ener_fx = L_add( Mpy_32_16_1( wb_ener_fx, 128 ), 1 ); /* 128 in Q15, wb_ener_fx in Q1 */
-
- exp = norm_l( wb_ener_fx );
- fra = Log2_norm_lc( L_shl( wb_ener_fx, exp ) );
- exp = sub( 30 - 1, exp );
- wb_ener_fx = Mpy_32_16( exp, fra, LG10 );
-
- log_wb_ener_fx = round_fx_o( L_shl_o( wb_ener_fx, 10, &Overflow ), &Overflow ); /* log_wb_ener_fx in Q8 */
- exp = norm_l( shb_ener_fx );
- fra = Log2_norm_lc( L_shl( shb_ener_fx, exp ) );
- exp = sub( 30 - 1, exp );
- shb_ener_fx = Mpy_32_16( exp, fra, LG10 );
-
-
- test();
- IF( EQ_16( st->element_mode, IVAS_SCE ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) )
- {
- Word32 att_fx32 = 0;
- move32();
- Word16 index;
-
- apply_scale_ivas_fx( &att_fx32, st->hFdCngEnc->hFdCngCom->CngBandwidth, st->hFdCngEnc->hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO, &index ); // Q23;
-
- att_fx = extract_l( L_shr( att_fx32, 15 ) ); // Q8
- }
- ELSE
- {
- att_fx = -1664; // Q8
- move16();
- }
-
-
- log_shb_ener_fx = sub_o( round_fx_o( L_shl_o( shb_ener_fx, 10, &Overflow ), &Overflow ), att_fx, &Overflow ); /* log_shb_ener_fx in Q8 */
-
- IF( st->hDtxEnc->first_CNG == 0 )
- {
-
-
- hTdCngEnc->mov_wb_cng_ener_fx = log_wb_ener_fx; // Q8
- hTdCngEnc->mov_shb_cng_ener_fx = log_shb_ener_fx; // Q8
- hTdCngEnc->last_wb_cng_ener_fx = log_wb_ener_fx; // Q8
- hTdCngEnc->last_shb_cng_ener_fx = log_shb_ener_fx; // Q8
- move16();
- move16();
- move16();
- move16();
- }
- IF( GT_16( abs_s( sub( log_wb_ener_fx, hTdCngEnc->mov_wb_cng_ener_fx ) ), 3072 /*12 in Q8*/ ) )
- {
- allow_cn_step = 1;
- move16();
- }
-
- /* Also allow step if shb energy has dropped 12 dB */
- test();
- test();
- IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && GT_16( sub( hTdCngEnc->mov_shb_cng_ener_fx, log_shb_ener_fx ), 3072 /*12 in Q8*/ ) )
- {
- allow_cn_step = 1;
- move16();
- }
-
- IF( EQ_16( allow_cn_step, 1 ) )
- {
- hTdCngEnc->mov_wb_cng_ener_fx = log_wb_ener_fx;
- hTdCngEnc->mov_shb_cng_ener_fx = log_shb_ener_fx;
- move16();
- move16();
- }
- ELSE
- {
- tmp = sub( log_wb_ener_fx, hTdCngEnc->mov_wb_cng_ener_fx ); /* Q8 */
- tmp = mult( tmp, 29491 /* .9f in Q15*/ ); /* Q8 */
- hTdCngEnc->mov_wb_cng_ener_fx = add( hTdCngEnc->mov_wb_cng_ener_fx, tmp ); /* Q8 */
- move16();
-
- tmp = sub( log_shb_ener_fx, hTdCngEnc->mov_shb_cng_ener_fx );
- tmp = mult( tmp, 8192 /* .25f in Q15*/ ); /* Q8 */
- hTdCngEnc->mov_shb_cng_ener_fx = add( hTdCngEnc->mov_shb_cng_ener_fx, tmp ); /* Q8 */
- move16();
- }
-
- hTdCngEnc->shb_NO_DATA_cnt = add( hTdCngEnc->shb_NO_DATA_cnt, 1 );
- update = 0;
-
- move16();
- move16();
-
- IF( EQ_32( st->core_brate, SID_2k40 ) )
- {
- test();
- test();
- test();
- IF( st->hDtxEnc->first_CNG == 0 )
- {
- update = 1;
- move16();
- }
- ELSE IF( hTdCngEnc->shb_cng_ini_cnt > 0 )
- {
- hTdCngEnc->shb_cng_ini_cnt = sub( hTdCngEnc->shb_cng_ini_cnt, 1 );
- update = 1;
- move16();
- move16();
- }
- ELSE IF( EQ_16( hTdCngEnc->last_vad, 1 ) )
- {
- update = 1;
- move16();
- }
- ELSE IF( GE_16( hTdCngEnc->shb_NO_DATA_cnt, 100 ) )
- {
- update = 1;
- move16();
- }
- ELSE IF( GT_16( abs_s( sub( sub( hTdCngEnc->mov_wb_cng_ener_fx, hTdCngEnc->mov_shb_cng_ener_fx ), sub( hTdCngEnc->last_wb_cng_ener_fx, hTdCngEnc->last_shb_cng_ener_fx ) ) ), 768 ) )
- {
- update = 1;
- move16();
- }
- ELSE IF( ( GE_16( st->bwidth, SWB ) && LT_16( hTdCngEnc->last_SID_bwidth, SWB ) ) || ( LT_16( st->bwidth, SWB ) && GE_16( hTdCngEnc->last_SID_bwidth, SWB ) ) )
- {
- update = 1;
- move16();
- }
-
- hTdCngEnc->last_SID_bwidth = st->bwidth;
- move16();
- }
-
- /* LF-boost not yet implemented in decoder which means that the specific wb_sid information is not used */
- test();
- test();
- if ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && EQ_32( st->core_brate, SID_2k40 ) )
- {
- update = 1;
- move16();
- }
-
- IF( EQ_16( update, 1 ) )
- {
- hTdCngEnc->last_wb_cng_ener_fx = hTdCngEnc->mov_wb_cng_ener_fx;
- hTdCngEnc->last_shb_cng_ener_fx = hTdCngEnc->mov_shb_cng_ener_fx;
- hTdCngEnc->shb_NO_DATA_cnt = 0;
- move16();
- move16();
- move16();
- }
-
- return ( update );
-}
diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c
index 4cfc193ecc5785ac74d5b4e0bc75405f86d11176..7188bcbad9835be3b1545b6f980a9d8ae55ea68b 100644
--- a/lib_enc/cng_enc_fx.c
+++ b/lib_enc/cng_enc_fx.c
@@ -27,6 +27,8 @@
*---------------------------------------------------------------------*/
static void shb_CNG_encod_fx( Encoder_State *st_fx, const Word16 update_fx );
static Word16 shb_DTX_fx( Encoder_State *st_fx, const Word16 *shb_speech_fx, const Word16 *syn_12k8_16k );
+static Word16 shb_DTX_ivas_fx( Encoder_State *st, const Word16 *shb_speech_fx, const Word16 *syn_12k8_16k_fx );
+static void shb_CNG_encod_ivas_fx( Encoder_State *st, const Word16 update );
/*---------------------------------------------------------------------*
* CNG_enc()
*
@@ -2839,3 +2841,375 @@ void calculate_hangover_attenuation_gain_ivas_fx(
return;
}
+
+void swb_CNG_enc_ivas_fx(
+ Encoder_State *st, /* i/o: State structure */
+ const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */
+ const Word16 *syn_12k8_16k_fx /* i : ACELP core synthesis at 12.8kHz or 16kHz Q0 */
+)
+{
+ Word16 shb_SID_updt;
+
+ test();
+ IF( EQ_32( st->core_brate, SID_2k40 ) || st->core_brate == FRAME_NO_DATA )
+ {
+ IF( st->cng_type == LP_CNG )
+ {
+ test();
+ IF( GE_32( st->input_Fs, L_FRAME32k * FRAMES_PER_SEC ) )
+ {
+ /* decide if SHB SID encoding or not */
+ shb_SID_updt = shb_DTX_ivas_fx( st, shb_speech_fx, syn_12k8_16k_fx );
+
+ /* SHB CNG encoding */
+ shb_CNG_encod_ivas_fx( st, shb_SID_updt );
+ }
+ ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_32( st->core_brate, SID_2k40 ) )
+ {
+ /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */
+ delete_indice( st->hBstr, IND_CNG_ENV1 );
+ push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
+ push_indice( st->hBstr, IND_UNUSED, 0, 4 );
+ push_indice( st->hBstr, IND_SID_BW, 1, 1 );
+ }
+ }
+ st->hTdCngEnc->last_vad = 0;
+ move16();
+ }
+ ELSE
+ {
+ st->hTdCngEnc->last_vad = 1;
+ move16();
+ }
+
+ return;
+}
+
+
+/*---------------------------------------------------------------------*
+ * shb_CNG_encod()
+ *
+ * SID parameters encoding for SHB signal
+ *---------------------------------------------------------------------*/
+
+static void shb_CNG_encod_ivas_fx(
+ Encoder_State *st, /* i/o: State structure */
+ const Word16 update /* i : SID update flag */
+)
+{
+ Word16 idx_ener = 0;
+ move16();
+ BSTR_ENC_HANDLE hBstr = st->hBstr;
+
+ Word16 ener_mid_dec_thr_fx;
+
+ IF( EQ_16( update, 1 ) )
+ {
+ IF( st->element_mode == EVS_MONO )
+ {
+ /* 6.0 in Q8 -> 1510 */
+ /* 0.9 in Q15 29491 */
+ /* ( 1 / log10(2.0) ) * 0.1 in Q15 ->10886 */
+ idx_ener = shr( mult( add( mult( st->hTdCngEnc->mov_shb_cng_ener_fx, 10886 ), 1510 ), 29491 ), 8 ); /* Q0 */
+ }
+ ELSE
+ {
+ /*idx_ener = (int16_t)(0.7f * (0.1f * st->hTdCngEnc->mov_shb_cng_ener / (float)log10(2.0f) + 6.0f) + 0.5f);*/
+ // PMT("shb_CNG_encod_fx quantization in missing")
+ /* 6.0 in Q8 -> 1510 */
+ /* 0.7 in Q15 22938 */
+ /* ( 1 / log10(2.0) ) * 0.1 in Q15 -> 10886 */
+ idx_ener = shr( mult( add( mult( st->hTdCngEnc->mov_shb_cng_ener_fx, 10886 ), 1510 ), 22938 ), 8 ); /* Q0 */
+ }
+
+
+ if ( LT_16( st->bwidth, SWB ) )
+ {
+ idx_ener = 0;
+ move16();
+ }
+
+ IF( GT_16( idx_ener, 15 ) )
+ {
+ idx_ener = 15;
+ move16();
+ }
+ ELSE IF( idx_ener < 0 )
+ {
+ idx_ener = 0;
+ move16();
+ }
+
+ /* prevent toggling of idx_ener by adding small dead-zone interval around decision thresholds */
+ IF( st->element_mode != EVS_MONO )
+ {
+ IF( EQ_16( abs_s( sub( idx_ener, st->hTdCngEnc->last_idx_ener ) ), 1 ) )
+ {
+
+ Word16 tmp, tmp1, tmp2, scale, exp1, exp2, ener_mid_dec_thr_e;
+ tmp = BASOP_Util_Divide1616_Scale( st->hTdCngEnc->last_idx_ener, 22938, &scale ); // 0.7 in Q15 ->exp 0
+ scale = add( scale, ( 15 - 0 ) );
+ tmp = sub( tmp, shl( 6, sub( Q15, scale ) ) );
+ tmp1 = BASOP_Util_Divide1616_Scale( tmp, 3277, &exp1 );
+ exp1 = add( exp1, ( scale - 0 ) );
+
+ ener_mid_dec_thr_fx = shr( mult( tmp1, 9864 ), 1 ); // exp = exp
+
+ tmp = BASOP_Util_Divide1616_Scale( idx_ener, 22938, &scale ); // 0.7 in Q15 ->exp 0
+ scale = add( scale, ( 15 - 0 ) );
+ tmp = sub( tmp, shl( 6, sub( Q15, scale ) ) );
+ tmp1 = BASOP_Util_Divide1616_Scale( tmp, 3277, &exp2 );
+ exp2 = add( exp2, ( scale - 0 ) );
+
+ tmp2 = shr( mult( tmp1, 9864 ), 1 ); // exp = exp
+
+ ener_mid_dec_thr_e = BASOP_Util_Add_MantExp( tmp2, exp2, ener_mid_dec_thr_fx, exp1, &ener_mid_dec_thr_fx );
+
+
+ scale = BASOP_Util_Add_MantExp( st->hTdCngEnc->mov_shb_cng_ener_fx, 7, negate( ener_mid_dec_thr_fx ), ener_mid_dec_thr_e, &tmp );
+ tmp1 = BASOP_Util_Divide1616_Scale( tmp, ener_mid_dec_thr_fx, &exp1 );
+ exp1 = add( exp1, sub( scale, ener_mid_dec_thr_e ) );
+ IF( LT_16( abs_s( tmp1 ), shr( 328, sub( 15, exp1 ) ) ) )
+ {
+ idx_ener = st->hTdCngEnc->last_idx_ener;
+ move16();
+ }
+ }
+ }
+
+ st->hTdCngEnc->last_idx_ener = idx_ener;
+ move16();
+
+ push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 );
+ push_indice( hBstr, IND_SID_BW, 1, 1 );
+ delete_indice( hBstr, IND_CNG_ENV1 );
+ IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
+ {
+ push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
+ }
+ ELSE
+ {
+ push_indice( hBstr, IND_UNUSED, 0, 2 );
+ }
+ st->hTdCngEnc->ho_sid_bw = L_shl( L_and( st->hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 );
+ st->hTdCngEnc->ho_sid_bw = L_or( st->hTdCngEnc->ho_sid_bw, 0x1L );
+ move32();
+ move32();
+ }
+ ELSE IF( EQ_32( st->core_brate, SID_2k40 ) )
+ {
+ st->hTdCngEnc->ho_sid_bw = L_shl( L_and( st->hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 );
+ move32();
+ push_indice( hBstr, IND_SID_BW, 0, 1 );
+ }
+
+ return;
+}
+
+/*---------------------------------------------------------------------*
+ * shb_DTX()
+ *
+ * Decide if encoding SHB SID or not
+ *---------------------------------------------------------------------*/
+
+static Word16 shb_DTX_ivas_fx(
+ Encoder_State *st, /* i/o: State structure */
+ const Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz Q0 */
+ const Word16 *syn_12k8_16k_fx /* i : ACELP core synthesis at 12.8kHz or 16kHz Q0 */
+)
+{
+ Word16 i;
+ Word16 update;
+
+ Word16 allow_cn_step = 0;
+ move16();
+ Word16 shb_old_speech_fx[( ACELP_LOOK_12k8 + L_SUBFR + L_FRAME ) * 5 / 4];
+ Word16 *shb_new_speech_fx;
+ Word32 wb_ener_fx;
+ Word32 shb_ener_fx;
+ Word16 log_wb_ener_fx;
+ Word16 log_shb_ener_fx;
+ Word16 tmp;
+ Word16 exp;
+ Word16 fra;
+ Word16 att_fx; /*Q8*/
+
+ TD_CNG_ENC_HANDLE hTdCngEnc = st->hTdCngEnc;
+ TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD;
+
+
+#ifdef BASOP_NOGLOB_DECLARE_LOCAL
+ Flag Overflow = 0;
+ move16();
+#endif
+
+ shb_new_speech_fx = shb_old_speech_fx + ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4;
+ Copy( hBWE_TD->old_speech_shb_fx, shb_old_speech_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); // old_speech_shb_fx -> Q0
+ Copy( shb_speech_fx, shb_new_speech_fx, L_FRAME16k ); // Q0
+ Copy( shb_old_speech_fx + L_FRAME16k, hBWE_TD->old_speech_shb_fx, ( ACELP_LOOK_12k8 + L_SUBFR ) * 5 / 4 ); // Q0
+
+ shb_ener_fx = L_deposit_l( 0 );
+ FOR( i = 0; i < L_FRAME16k; i++ )
+ {
+ shb_ener_fx = L_mac_sat( shb_ener_fx, shb_old_speech_fx[i], shb_old_speech_fx[i] ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac
+ }
+
+ shb_ener_fx = L_add( Mpy_32_16_1( shb_ener_fx, 102 ), 1 ); /* ( 1 / L_FRAME16K ) -> 102 in Q15, shb_ener_fx in Q1 */
+
+ wb_ener_fx = L_deposit_l( 0 );
+ FOR( i = 0; i < st->L_frame; i++ )
+ {
+ wb_ener_fx = L_mac_o( wb_ener_fx, syn_12k8_16k_fx[i], syn_12k8_16k_fx[i], &Overflow ); // ( Q0 + Q0 + Q1 ) --> Q1 due to left shift in L_mac
+ }
+
+ wb_ener_fx = L_add( Mpy_32_16_1( wb_ener_fx, 128 ), 1 ); /* 128 in Q15, wb_ener_fx in Q1 */
+
+ exp = norm_l( wb_ener_fx );
+ fra = Log2_norm_lc( L_shl( wb_ener_fx, exp ) );
+ exp = sub( 30 - 1, exp );
+ wb_ener_fx = Mpy_32_16( exp, fra, LG10 );
+
+ log_wb_ener_fx = round_fx_o( L_shl_o( wb_ener_fx, 10, &Overflow ), &Overflow ); /* log_wb_ener_fx in Q8 */
+ exp = norm_l( shb_ener_fx );
+ fra = Log2_norm_lc( L_shl( shb_ener_fx, exp ) );
+ exp = sub( 30 - 1, exp );
+ shb_ener_fx = Mpy_32_16( exp, fra, LG10 );
+
+
+ test();
+ IF( EQ_16( st->element_mode, IVAS_SCE ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) )
+ {
+ Word32 att_fx32 = 0;
+ move32();
+ Word16 index;
+
+ apply_scale_ivas_fx( &att_fx32, st->hFdCngEnc->hFdCngCom->CngBandwidth, st->hFdCngEnc->hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO, &index ); // Q23;
+
+ att_fx = extract_l( L_shr( att_fx32, 15 ) ); // Q8
+ }
+ ELSE
+ {
+ att_fx = -1664; // Q8
+ move16();
+ }
+
+
+ log_shb_ener_fx = sub_o( round_fx_o( L_shl_o( shb_ener_fx, 10, &Overflow ), &Overflow ), att_fx, &Overflow ); /* log_shb_ener_fx in Q8 */
+
+ IF( st->hDtxEnc->first_CNG == 0 )
+ {
+
+
+ hTdCngEnc->mov_wb_cng_ener_fx = log_wb_ener_fx; // Q8
+ hTdCngEnc->mov_shb_cng_ener_fx = log_shb_ener_fx; // Q8
+ hTdCngEnc->last_wb_cng_ener_fx = log_wb_ener_fx; // Q8
+ hTdCngEnc->last_shb_cng_ener_fx = log_shb_ener_fx; // Q8
+ move16();
+ move16();
+ move16();
+ move16();
+ }
+ IF( GT_16( abs_s( sub( log_wb_ener_fx, hTdCngEnc->mov_wb_cng_ener_fx ) ), 3072 /*12 in Q8*/ ) )
+ {
+ allow_cn_step = 1;
+ move16();
+ }
+
+ /* Also allow step if shb energy has dropped 12 dB */
+ test();
+ test();
+ IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && GT_16( sub( hTdCngEnc->mov_shb_cng_ener_fx, log_shb_ener_fx ), 3072 /*12 in Q8*/ ) )
+ {
+ allow_cn_step = 1;
+ move16();
+ }
+
+ IF( EQ_16( allow_cn_step, 1 ) )
+ {
+ hTdCngEnc->mov_wb_cng_ener_fx = log_wb_ener_fx;
+ hTdCngEnc->mov_shb_cng_ener_fx = log_shb_ener_fx;
+ move16();
+ move16();
+ }
+ ELSE
+ {
+ tmp = sub( log_wb_ener_fx, hTdCngEnc->mov_wb_cng_ener_fx ); /* Q8 */
+ tmp = mult( tmp, 29491 /* .9f in Q15*/ ); /* Q8 */
+ hTdCngEnc->mov_wb_cng_ener_fx = add( hTdCngEnc->mov_wb_cng_ener_fx, tmp ); /* Q8 */
+ move16();
+
+ tmp = sub( log_shb_ener_fx, hTdCngEnc->mov_shb_cng_ener_fx );
+ tmp = mult( tmp, 8192 /* .25f in Q15*/ ); /* Q8 */
+ hTdCngEnc->mov_shb_cng_ener_fx = add( hTdCngEnc->mov_shb_cng_ener_fx, tmp ); /* Q8 */
+ move16();
+ }
+
+ hTdCngEnc->shb_NO_DATA_cnt = add( hTdCngEnc->shb_NO_DATA_cnt, 1 );
+ update = 0;
+
+ move16();
+ move16();
+
+ IF( EQ_32( st->core_brate, SID_2k40 ) )
+ {
+ test();
+ test();
+ test();
+ IF( st->hDtxEnc->first_CNG == 0 )
+ {
+ update = 1;
+ move16();
+ }
+ ELSE IF( hTdCngEnc->shb_cng_ini_cnt > 0 )
+ {
+ hTdCngEnc->shb_cng_ini_cnt = sub( hTdCngEnc->shb_cng_ini_cnt, 1 );
+ update = 1;
+ move16();
+ move16();
+ }
+ ELSE IF( EQ_16( hTdCngEnc->last_vad, 1 ) )
+ {
+ update = 1;
+ move16();
+ }
+ ELSE IF( GE_16( hTdCngEnc->shb_NO_DATA_cnt, 100 ) )
+ {
+ update = 1;
+ move16();
+ }
+ ELSE IF( GT_16( abs_s( sub( sub( hTdCngEnc->mov_wb_cng_ener_fx, hTdCngEnc->mov_shb_cng_ener_fx ), sub( hTdCngEnc->last_wb_cng_ener_fx, hTdCngEnc->last_shb_cng_ener_fx ) ) ), 768 ) )
+ {
+ update = 1;
+ move16();
+ }
+ ELSE IF( ( GE_16( st->bwidth, SWB ) && LT_16( hTdCngEnc->last_SID_bwidth, SWB ) ) || ( LT_16( st->bwidth, SWB ) && GE_16( hTdCngEnc->last_SID_bwidth, SWB ) ) )
+ {
+ update = 1;
+ move16();
+ }
+
+ hTdCngEnc->last_SID_bwidth = st->bwidth;
+ move16();
+ }
+
+ /* LF-boost not yet implemented in decoder which means that the specific wb_sid information is not used */
+ test();
+ test();
+ if ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && EQ_32( st->core_brate, SID_2k40 ) )
+ {
+ update = 1;
+ move16();
+ }
+
+ IF( EQ_16( update, 1 ) )
+ {
+ hTdCngEnc->last_wb_cng_ener_fx = hTdCngEnc->mov_wb_cng_ener_fx;
+ hTdCngEnc->last_shb_cng_ener_fx = hTdCngEnc->mov_shb_cng_ener_fx;
+ hTdCngEnc->shb_NO_DATA_cnt = 0;
+ move16();
+ move16();
+ move16();
+ }
+
+ return ( update );
+}
diff --git a/lib_enc/cod2t32.c b/lib_enc/cod2t32.c
deleted file mode 100644
index 167c70dbfb92ffa66483e8fa575c5d73c71c6b0a..0000000000000000000000000000000000000000
--- a/lib_enc/cod2t32.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/cod4t64.c b/lib_enc/cod4t64.c
deleted file mode 100644
index 9be976783240248ee1507bfbb571520cf1680bbf..0000000000000000000000000000000000000000
--- a/lib_enc/cod4t64.c
+++ /dev/null
@@ -1,48 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_enc.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-/*---------------------------------------------------------------------*
- * Local function prototypes
- *---------------------------------------------------------------------*/
diff --git a/lib_enc/cod_ace.c b/lib_enc/cod_ace.c
deleted file mode 100644
index 46d7a42d1a3fb4c72e12459513eb9fc9d3207c5d..0000000000000000000000000000000000000000
--- a/lib_enc/cod_ace.c
+++ /dev/null
@@ -1,42 +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 "prot.h"
-#include
-#include "options.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/cod_tcx.c b/lib_enc/cod_tcx.c
deleted file mode 100644
index 88e028c86fa04d0555b66be0234c707a7c643107..0000000000000000000000000000000000000000
--- a/lib_enc/cod_tcx.c
+++ /dev/null
@@ -1,869 +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
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-#include "ivas_prot.h"
-#include "ivas_rom_com.h"
-#include "ivas_rom_com_fx.h"
-#include "prot_fx_enc.h"
-#include "prot_fx.h"
-#include "ivas_prot_fx.h"
-
-
-/*-------------------------------------------------------------------*
- * TNSAnalysisStereo()
- *
- *
- *-------------------------------------------------------------------*/
-
-#define SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ( 1311 )
-#define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q7 ( 384 )
-#define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ( 25165824 )
-void TNSAnalysisStereo_fx(
- Encoder_State **sts, /* i : encoder state handle */
- Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* o : MDST spectrum Qx*/
- const Word16 bWhitenedDomain, /* i : whitened domain flag Q0*/
- Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm Q0*/
- Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : number of tns bits in the frame Q0*/
- Word16 param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters Q0*/
- const Word16 mct_on /* i : flag mct block (1) or stereo (0) Q0*/
-)
-{
- Word16 ch, k, L_spec, L_frame, nSubframes, iFilter;
- Word32 *spectrum_fx;
- Encoder_State *st = NULL;
- TCX_ENC_HANDLE hTcxEnc = NULL;
- Word16 individual_decision[NB_DIV];
- Word32 maxPredictionGain_fx = 0, meanPredictionGain_fx;
- move32();
- Word16 maxPredictionGain_e = Q31, meanPredictionGain_e;
- move16();
- Word16 sum_e = 0;
- move16();
- individual_decision[0] = 0;
- move16();
- individual_decision[1] = 0;
- move16();
- L_spec = -1;
- move16();
- L_frame = -1;
- move16();
-
- /* TNS filter analysis, loop over channels */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- st = sts[ch];
- IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
- {
- continue;
- }
-
- hTcxEnc = st->hTcxEnc;
-
- IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- }
- move16();
-
- FOR( k = 0; k < nSubframes; k++ )
- {
- /* reset tns on whitened domain flag */
- IF( !bWhitenedDomain )
- {
- hTcxEnc->bTnsOnWhithenedSpectra[k] = 0;
- move16();
- hTcxEnc->fUseTns[k] = 0;
- move16();
- }
- test();
- test();
- IF( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- spectrum_fx = hTcxEnc->spectrum_fx[k];
-
- L_frame = hTcxEnc->L_frameTCX;
- move16();
- st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )];
- L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0];
- move16();
- /*-----------------------------------------------------------*
- * Temporal Noise Shaping analysis *
- *-----------------------------------------------------------*/
-
- IF( EQ_16( hTcxEnc->transform_type[k], TCX_5 ) )
- {
- /* rearrange LF sub-window lines prior to TNS analysis & filtering */
- tcx5TnsGrouping_fx( shr( L_frame, 2 ), shr( L_spec, 1 ), spectrum_fx );
- }
-
- /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */
-
- ResetTnsData( &hTcxEnc->tnsData[k] );
- IF( st->hTcxCfg->pCurrentTnsConfig->maxOrder <= 0 )
- {
- BREAK;
- }
-
- CalculateTnsFilt_fx( st->hTcxCfg->pCurrentTnsConfig, spectrum_fx, hTcxEnc->spectrum_e[k], &hTcxEnc->tnsData[k] );
- }
- }
- }
-
- IF( !mct_on )
- {
- /* TNS decision */
- /* if framing differs between channels, keep the filter decision per channel */
- test();
- test();
- IF( ( NE_16( sts[0]->hTcxEnc->transform_type[0], sts[1]->hTcxEnc->transform_type[0] ) &&
- NE_16( sts[0]->hTcxEnc->transform_type[1], sts[1]->hTcxEnc->transform_type[1] ) ) ||
- NE_16( sts[0]->hTcxCfg->fIsTNSAllowed, sts[1]->hTcxCfg->fIsTNSAllowed ) )
- {
- individual_decision[0] = individual_decision[1] = 1;
- move16();
- move16();
- }
- ELSE IF( bWhitenedDomain )
- {
- IF( EQ_16( sts[0]->hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- }
- move16();
- FOR( k = 0; k < nSubframes; k++ )
- {
- IF( NE_16( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k], sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- individual_decision[k] = 1;
- move16();
- }
- }
- }
-
- /* framing equal, check for similar filters, if very similar (also indicator for and M signal),
- * use at least the same decision, maybe use the same filter
- */
- {
- Word8 isTCX10;
-
- IF( EQ_16( sts[0]->hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- isTCX10 = 0;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- isTCX10 = 1;
- }
- move16();
- move16();
- FOR( k = 0; k < nSubframes; k++ )
- {
- test();
- test();
- test();
- IF( sts[0]->hTcxCfg->fIsTNSAllowed && NE_16( individual_decision[k], 1 ) && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- Word32 maxPredGain_fx = -ONE_IN_Q31;
- move32();
- Word16 maxPredGain_e = 0;
- move16();
- sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )];
- sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )];
-
- FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- STnsFilter *pFilter[2];
- struct TnsParameters const *pTnsParameters[2];
- pFilter[0] = sts[0]->hTcxEnc->tnsData[k].filter + iFilter;
- pTnsParameters[0] = sts[0]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
- pFilter[1] = sts[1]->hTcxEnc->tnsData[k].filter + iFilter;
- pTnsParameters[1] = sts[1]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
-
- /* if prediction gain and avgSqrCoef are both close we are pretty sure the filters are quite similar, use the avg of
- * both filters for the decision
- */
-
- meanPredictionGain_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pFilter[0]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[0]->predictionGain_e, Mpy_32_16_1( pFilter[1]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[1]->predictionGain_e, &meanPredictionGain_e ); // meanPredictionGain_e
- Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, meanPredictionGain_fx, meanPredictionGain_e );
- IF( flag < 0 )
- {
- maxPredictionGain_fx = meanPredictionGain_fx;
- maxPredictionGain_e = meanPredictionGain_e;
- move32();
- move16();
- }
- flag = BASOP_Util_Cmp_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- Word16 flag_1 = BASOP_Util_Cmp_Mant32Exp( pFilter[1]->predictionGain32, pFilter[1]->predictionGain_e, L_deposit_h( pTnsParameters[1]->minPredictionGain ), PRED_GAIN_E );
- if ( flag_1 < 0 )
- {
- flag_1 = 0;
- move16();
- }
- test();
- test();
- test();
- IF( flag && LT_32( sts[0]->element_brate, IVAS_80k ) &&
- flag_1 && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
- {
- pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */
- move32();
- move32();
- pFilter[0]->predictionGain_e = pFilter[1]->predictionGain_e = meanPredictionGain_e; /* more TNS filter sync at 48kbps */
- move16();
- move16();
- pFilter[0]->predictionGain = pFilter[1]->predictionGain = shl_sat( extract_h( meanPredictionGain_fx ), sub( meanPredictionGain_e, PRED_GAIN_E ) ); /* Q7 */
- move16();
- move16();
- }
- flag = BASOP_Util_Cmp_Mant32Exp( Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ), meanPredictionGain_e, L_abs( BASOP_Util_Add_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_negate( pFilter[1]->predictionGain32 ), pFilter[1]->predictionGain_e, &sum_e ) ), sum_e );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- test();
- IF( flag &&
- ( EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) )
- {
-
- Word16 maxAvgSqrCoef_fx = s_max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); // Q15
- Word16 meanLtpGain_fx = add( shr( sts[0]->hTcxEnc->tcxltp_gain, 1 ), shr( sts[1]->hTcxEnc->tcxltp_gain, 1 ) );
- // maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx );
- flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, meanPredictionGain_fx, meanPredictionGain_e );
- IF( flag < 0 )
- {
- maxPredGain_fx = meanPredictionGain_fx;
- maxPredGain_e = meanPredictionGain_e;
- move32();
- move16();
- }
- flag = BASOP_Util_Cmp_Mant32Exp( meanPredictionGain_fx, meanPredictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- test();
- test();
- IF( flag || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
- {
- test();
- test();
- test();
- IF( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 || sts[1]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || LT_16( meanLtpGain_fx, 19660 /* 0.6 in Q15*/ ) )
- {
-
- sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
- this may result in crash later. Changing the filter type here so the order is taken here in further section */
- IF( pFilter[0]->order != 0 )
- {
- pFilter[0]->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- IF( pFilter[1]->order != 0 )
- {
- pFilter[1]->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- }
- ELSE
- {
- Word16 maxEnergyChange_fx;
- maxEnergyChange_fx = mac_r( L_mult( GetTCXMaxenergyChange_ivas_fx( sts[0]->hTranDet, isTCX10, NSUBBLOCKS, 3 ), 16384 ), GetTCXMaxenergyChange_ivas_fx( sts[1]->hTranDet, isTCX10, NSUBBLOCKS, 3 ), 16384 );
-
- IF( GE_16( maxEnergyChange_fx, shl( pTnsParameters[0]->minEnergyChange, Q3 - Q7 ) ) )
- {
- sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
- this may result in crash later. Changing the filter type here so the order is taken here in further section */
- IF( pFilter[0]->order != 0 )
- {
- pFilter[0]->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- IF( pFilter[1]->order != 0 )
- {
- pFilter[1]->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- }
- ELSE
- {
- pFilter[0]->filterType = TNS_FILTER_OFF;
- move16();
- pFilter[1]->filterType = TNS_FILTER_OFF;
- move16();
- }
- }
- }
- ELSE IF( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 && sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */
- {
- pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
- pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
- move16();
- move16();
- sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- }
- ELSE IF( NE_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) /* sanity check */
- {
- assert( 0 );
- }
- ELSE
- {
- pFilter[0]->filterType = TNS_FILTER_OFF;
- move16();
- pFilter[1]->filterType = TNS_FILTER_OFF;
- move16();
- }
-
- test();
- test();
- IF( EQ_16( pFilter[0]->filterType, TNS_FILTER_ON ) && EQ_16( pFilter[1]->filterType, TNS_FILTER_ON ) && LT_32( sts[0]->element_brate, IVAS_80k ) )
- {
- Word16 tmpIntValue = 0;
- move16();
- Word16 tmpCoeff[TNS_MAX_FILTER_ORDER];
- Word16 i, maxOrder = s_max( pFilter[0]->order, pFilter[1]->order );
-
- set16_fx( tmpCoeff, 0, TNS_MAX_FILTER_ORDER );
- FOR( i = 0; i < maxOrder; i++ )
- {
- tmpIntValue = s_max( tmpIntValue, abs_s( sub( pFilter[0]->coefIndex[i], pFilter[1]->coefIndex[i] ) ) );
- }
-
- IF( EQ_16( tmpIntValue, 1 ) ) /* the TNS coefficients are sufficiently similar to equalize the two filters */
- {
- FOR( i = maxOrder - 1; i >= 0; i-- )
- {
- IF( LT_16( abs_s( pFilter[0]->coefIndex[i] ), abs_s( pFilter[1]->coefIndex[i] ) ) )
- {
- tmpCoeff[i] = pFilter[0]->coefIndex[i];
- }
- ELSE
- {
- tmpCoeff[i] = pFilter[1]->coefIndex[i];
- }
- move16();
- IF( ( tmpIntValue > 0 ) && ( tmpCoeff[i] == 0 ) )
- {
- maxOrder = sub( maxOrder, 1 );
- }
- ELSE
- {
- tmpIntValue = 0;
- move16();
- }
- }
- /* make sure that maxOrder is non zero and not all coefficients are zero (could happen in rare cases) */
- IF( maxOrder > 0 )
- {
- FOR( i = TNS_MAX_FILTER_ORDER - 1; i >= 0; i-- )
- {
- pFilter[0]->coefIndex[i] = pFilter[1]->coefIndex[i] = tmpCoeff[i];
- move16();
- move16();
- }
-
- pFilter[0]->order = pFilter[1]->order = maxOrder;
- move16();
- move16();
- }
- }
- }
- }
- ELSE
- {
- individual_decision[k] = 1;
- move16();
- }
- }
-
- IF( individual_decision[k] == 0 )
- {
- IF( ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 ) )
- {
- sts[0]->hTcxEnc->fUseTns[k] = 1;
- }
- ELSE
- {
- sts[0]->hTcxEnc->fUseTns[k] = 0;
- }
- move16();
-
- IF( ( sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) )
- {
- sts[1]->hTcxEnc->fUseTns[k] = 1;
- }
- ELSE
- {
- sts[1]->hTcxEnc->fUseTns[k] = 0;
- }
- move16();
- }
- ELSE
- {
- sts[0]->hTcxEnc->tnsData[k].nFilters = 0;
- move16();
- sts[1]->hTcxEnc->tnsData[k].nFilters = 0;
- move16();
- sts[0]->hTcxEnc->fUseTns[k] = 0;
- move16();
- sts[1]->hTcxEnc->fUseTns[k] = 0;
- move16();
- FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- sts[0]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
- move16();
- sts[1]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
- move16();
- }
- }
- Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- test();
- test();
- test();
- IF( !bWhitenedDomain && individual_decision[k] == 0 && flag && NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
- {
- sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
- move16();
- sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
- move16();
- sts[0]->hTcxEnc->tnsData[k].nFilters = 0;
- move16();
- sts[1]->hTcxEnc->tnsData[k].nFilters = 0;
- move16();
- sts[0]->hTcxEnc->fUseTns[k] = 0;
- move16();
- sts[1]->hTcxEnc->fUseTns[k] = 0;
- move16();
- FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- ClearTnsFilterCoefficients( sts[0]->hTcxEnc->tnsData[k].filter + iFilter );
- ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter );
- }
- }
- // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
- flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
- IF( flag < 0 )
- {
- maxPredictionGain_fx = maxPredGain_fx;
- maxPredictionGain_e = maxPredGain_e;
- move32();
- move16();
- }
- }
- }
- }
- }
-
- /* individual decision for each channel */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- IF( EQ_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
- {
- CONTINUE;
- }
-
- Word8 isTCX10;
-
- IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- isTCX10 = 0;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- isTCX10 = 1;
- }
- move16();
- move16();
-
- FOR( k = 0; k < nSubframes; k++ )
- {
- test();
- test();
- test();
- test();
- IF( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) &&
- ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- Word32 maxPredGain_fx = -ONE_IN_Q31; // Q31
- move32();
- Word16 maxPredGain_e = 0;
- move16();
- sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )];
-
- FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- STnsFilter *pFilter;
- struct TnsParameters const *pTnsParameters;
- pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter;
- pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
-
- // maxPredGain_fx = L_max( maxPredGain_fx, pFilter->predictionGain32 );
- Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, pFilter->predictionGain32, pFilter->predictionGain_e );
- IF( flag < 0 )
- {
- maxPredGain_fx = pFilter->predictionGain32;
- move32();
- maxPredGain_e = pFilter->predictionGain_e;
- move16();
- }
- flag = BASOP_Util_Cmp_Mant32Exp( pFilter->predictionGain32, pFilter->predictionGain_e, L_deposit_h( pTnsParameters->minPredictionGain ), PRED_GAIN_E );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- test();
- IF( flag || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
- {
- test();
- test();
- IF( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || LT_16( sts[ch]->hTcxEnc->tcxltp_gain, 19660 /*.6f in Q15*/ ) )
- {
- sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
- this may result in crash later. Changing the filter type here so the order is taken here in further section */
- IF( pFilter->order != 0 )
- {
- pFilter->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- }
- ELSE
- {
- Word16 maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( sts[ch]->hTranDet, isTCX10, NSUBBLOCKS, 3 );
-
- IF( GE_16( maxEnergyChange_fx, shl( pTnsParameters->minEnergyChange, Q3 - Q7 ) ) )
- {
- sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
- this may result in crash later. Changing the filter type here so the order is taken here in further section */
- IF( pFilter->order != 0 )
- {
- pFilter->filterType = TNS_FILTER_ON;
- move16();
- }
- ELSE
- {
- pFilter->filterType = TNS_FILTER_ON_ZERO;
- move16();
- }
- }
- ELSE
- {
- pFilter->filterType = TNS_FILTER_OFF;
- move16();
- }
- }
- }
- ELSE IF( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */
- {
- pFilter->filterType = TNS_FILTER_ON_ZERO;
- move16();
- sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
- move16();
- }
- ELSE
- {
- pFilter->filterType = TNS_FILTER_OFF;
- move16();
- }
- }
-
- IF( ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) )
- {
- sts[ch]->hTcxEnc->fUseTns[k] = 1;
- }
- ELSE
- {
- sts[ch]->hTcxEnc->fUseTns[k] = 0;
- }
- move16();
- Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
- if ( flag < 0 )
- {
- flag = 0;
- move16();
- }
- test();
- test();
- IF( !bWhitenedDomain && flag && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
- {
- sts[ch]->hTcxEnc->fUseTns[k] = 0;
- move16();
- sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
- move16();
- sts[ch]->hTcxEnc->tnsData[k].nFilters = 0;
- move16();
- FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter );
- sts[ch]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
- move16();
- }
- }
- // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
- flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
- IF( flag < 0 )
- {
- maxPredictionGain_fx = maxPredGain_fx;
- maxPredictionGain_e = maxPredGain_e;
- move32();
- move16();
- }
- }
- }
- }
-
-
- /* we have the decision, set filter data accordingly */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
- {
- CONTINUE;
- }
-
- IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- }
- move16();
- FOR( k = 0; k < nSubframes; k++ )
- {
- test();
- test();
- IF( sts[ch]->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )];
-
- FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- STnsFilter *pFilter;
- pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter;
- SWITCH( pFilter->filterType )
- {
- case TNS_FILTER_OFF:
- ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter );
- BREAK;
- case TNS_FILTER_ON_ZERO:
- /* Since TNS filter of order 0 is not allowed we have to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */
- ClearTnsFilterCoefficients( pFilter );
- pFilter->order = 1;
- move16();
- BREAK;
- }
- }
- }
- }
- }
-
- /* Apply filters, loop over channels */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- st = sts[ch];
- IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
- {
- CONTINUE;
- }
-
- IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) )
- {
- nSubframes = 1;
- }
- ELSE
- {
- nSubframes = NB_DIV;
- }
- move16();
-
- FOR( k = 0; k < nSubframes; k++ )
- {
- test();
- test();
- test();
- test();
- test();
- IF( bWhitenedDomain && ( ch > 0 ) && /* test for identical TNS filter data in both channels */
- sts[0]->hTcxCfg->fIsTNSAllowed && sts[0]->hTcxEnc->fUseTns[k] &&
- sts[1]->hTcxCfg->fIsTNSAllowed && sts[1]->hTcxEnc->fUseTns[k] )
- {
- Word16 equalFilterData = 0;
- move16();
- test();
- test();
- if ( EQ_16( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters, sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters ) &&
- EQ_16( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k], sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) &&
- EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
- {
- equalFilterData = 1;
- move16();
- }
-
- IF( equalFilterData )
- {
- FOR( iFilter = st->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
- {
- const Word16 *pDataCh0 = (const Word16 *) &sts[0]->hTcxEnc->tnsData[k].filter[iFilter];
- const Word16 *pDataCh1 = (const Word16 *) &sts[1]->hTcxEnc->tnsData[k].filter[iFilter];
- Word16 i = 2 + TNS_MAX_FILTER_ORDER; /* excl. informative float data. Portable? */
-
- move16();
- test();
- WHILE( ( i >= 0 ) && EQ_16( pDataCh0[i], pDataCh1[i] ) )
- {
- test();
- i = sub( i, 1 );
- }
- IF( i >= 0 )
- {
- equalFilterData = 0;
- move16();
- BREAK;
- }
- }
- IF( equalFilterData )
- {
- st->hTcxEnc->tnsData[k].nFilters = i_mult( st->hTcxEnc->tnsData[k].nFilters, -1 ); /* signals common TNS */
- move16();
- }
- }
- }
- test();
- test();
- IF( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || st->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
- {
- L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0];
- move16();
- spectrum_fx = st->hTcxEnc->spectrum_fx[k];
- /* If TNS should be used then get the residual after applying it inplace in the spectrum */
- IF( st->hTcxEnc->fUseTns[k] )
- {
- st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[st->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )];
-
- ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], spectrum_fx, 1 );
- }
-
- IF( EQ_16( st->hTcxEnc->transform_type[k], TCX_5 ) )
- {
- tcx5TnsUngrouping_fx( shr( L_frame, 2 ), shr( L_spec, 1 ), st->hTcxEnc->spectrum_fx[k], ENC );
- }
-
- st->hTcxEnc->tnsData[k].tnsOnWhitenedSpectra = st->hTcxEnc->bTnsOnWhithenedSpectra[k];
- move16();
- EncodeTnsData_ivas_fx( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], param_core[ch] + k * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, tnsSize[ch] + k, tnsBits[ch] + k );
- }
-
- IF( EQ_16( st->hTcxEnc->transform_type[k], TCX_5 ) )
- {
- tcx5SpectrumInterleaving_fx( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum_fx[k] );
- tcx5SpectrumInterleaving_fx( st->hTcxCfg->tcx5SizeFB, mdst_spectrum_fx[ch][k] );
- }
- }
- }
- return;
-}
diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c
index b2fe04ce13f5fcb65f8a7abd6a47bba15f06a1c1..93c1dc58d87fc2583ddb233af88aa4bafce81aaf 100644
--- a/lib_enc/cod_tcx_fx.c
+++ b/lib_enc/cod_tcx_fx.c
@@ -26,6 +26,9 @@
#include "debug.h"
#endif
+#define SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ( 1311 )
+#define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q7 ( 384 )
+#define TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ( 25165824 )
/* Up to the Autocorrelation it is the same code as in GetMDCT, with the difference in the parameters in the call to tcx_windowing_analysis */
void HBAutocorrelation_fx(
@@ -5363,3 +5366,814 @@ void InternalTCXDecoder_fx(
return;
}
+
+
+void TNSAnalysisStereo_fx(
+ Encoder_State **sts, /* i : encoder state handle */
+ Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* o : MDST spectrum Qx*/
+ const Word16 bWhitenedDomain, /* i : whitened domain flag Q0*/
+ Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm Q0*/
+ Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* i : number of tns bits in the frame Q0*/
+ Word16 param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters Q0*/
+ const Word16 mct_on /* i : flag mct block (1) or stereo (0) Q0*/
+)
+{
+ Word16 ch, k, L_spec, L_frame, nSubframes, iFilter;
+ Word32 *spectrum_fx;
+ Encoder_State *st = NULL;
+ TCX_ENC_HANDLE hTcxEnc = NULL;
+ Word16 individual_decision[NB_DIV];
+ Word32 maxPredictionGain_fx = 0, meanPredictionGain_fx;
+ move32();
+ Word16 maxPredictionGain_e = Q31, meanPredictionGain_e;
+ move16();
+ Word16 sum_e = 0;
+ move16();
+ individual_decision[0] = 0;
+ move16();
+ individual_decision[1] = 0;
+ move16();
+ L_spec = -1;
+ move16();
+ L_frame = -1;
+ move16();
+
+ /* TNS filter analysis, loop over channels */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ st = sts[ch];
+ IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
+ {
+ continue;
+ }
+
+ hTcxEnc = st->hTcxEnc;
+
+ IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ }
+ move16();
+
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ /* reset tns on whitened domain flag */
+ IF( !bWhitenedDomain )
+ {
+ hTcxEnc->bTnsOnWhithenedSpectra[k] = 0;
+ move16();
+ hTcxEnc->fUseTns[k] = 0;
+ move16();
+ }
+ test();
+ test();
+ IF( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ spectrum_fx = hTcxEnc->spectrum_fx[k];
+
+ L_frame = hTcxEnc->L_frameTCX;
+ move16();
+ st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )];
+ L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0];
+ move16();
+ /*-----------------------------------------------------------*
+ * Temporal Noise Shaping analysis *
+ *-----------------------------------------------------------*/
+
+ IF( EQ_16( hTcxEnc->transform_type[k], TCX_5 ) )
+ {
+ /* rearrange LF sub-window lines prior to TNS analysis & filtering */
+ tcx5TnsGrouping_fx( shr( L_frame, 2 ), shr( L_spec, 1 ), spectrum_fx );
+ }
+
+ /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */
+
+ ResetTnsData( &hTcxEnc->tnsData[k] );
+ IF( st->hTcxCfg->pCurrentTnsConfig->maxOrder <= 0 )
+ {
+ BREAK;
+ }
+
+ CalculateTnsFilt_fx( st->hTcxCfg->pCurrentTnsConfig, spectrum_fx, hTcxEnc->spectrum_e[k], &hTcxEnc->tnsData[k] );
+ }
+ }
+ }
+
+ IF( !mct_on )
+ {
+ /* TNS decision */
+ /* if framing differs between channels, keep the filter decision per channel */
+ test();
+ test();
+ IF( ( NE_16( sts[0]->hTcxEnc->transform_type[0], sts[1]->hTcxEnc->transform_type[0] ) &&
+ NE_16( sts[0]->hTcxEnc->transform_type[1], sts[1]->hTcxEnc->transform_type[1] ) ) ||
+ NE_16( sts[0]->hTcxCfg->fIsTNSAllowed, sts[1]->hTcxCfg->fIsTNSAllowed ) )
+ {
+ individual_decision[0] = individual_decision[1] = 1;
+ move16();
+ move16();
+ }
+ ELSE IF( bWhitenedDomain )
+ {
+ IF( EQ_16( sts[0]->hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ }
+ move16();
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ IF( NE_16( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k], sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ individual_decision[k] = 1;
+ move16();
+ }
+ }
+ }
+
+ /* framing equal, check for similar filters, if very similar (also indicator for and M signal),
+ * use at least the same decision, maybe use the same filter
+ */
+ {
+ Word8 isTCX10;
+
+ IF( EQ_16( sts[0]->hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ isTCX10 = 0;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ isTCX10 = 1;
+ }
+ move16();
+ move16();
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ test();
+ test();
+ test();
+ IF( sts[0]->hTcxCfg->fIsTNSAllowed && NE_16( individual_decision[k], 1 ) && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ Word32 maxPredGain_fx = -ONE_IN_Q31;
+ move32();
+ Word16 maxPredGain_e = 0;
+ move16();
+ sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )];
+ sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )];
+
+ FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ STnsFilter *pFilter[2];
+ struct TnsParameters const *pTnsParameters[2];
+ pFilter[0] = sts[0]->hTcxEnc->tnsData[k].filter + iFilter;
+ pTnsParameters[0] = sts[0]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
+ pFilter[1] = sts[1]->hTcxEnc->tnsData[k].filter + iFilter;
+ pTnsParameters[1] = sts[1]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
+
+ /* if prediction gain and avgSqrCoef are both close we are pretty sure the filters are quite similar, use the avg of
+ * both filters for the decision
+ */
+
+ meanPredictionGain_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pFilter[0]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[0]->predictionGain_e, Mpy_32_16_1( pFilter[1]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[1]->predictionGain_e, &meanPredictionGain_e ); // meanPredictionGain_e
+ Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, meanPredictionGain_fx, meanPredictionGain_e );
+ IF( flag < 0 )
+ {
+ maxPredictionGain_fx = meanPredictionGain_fx;
+ maxPredictionGain_e = meanPredictionGain_e;
+ move32();
+ move16();
+ }
+ flag = BASOP_Util_Cmp_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ Word16 flag_1 = BASOP_Util_Cmp_Mant32Exp( pFilter[1]->predictionGain32, pFilter[1]->predictionGain_e, L_deposit_h( pTnsParameters[1]->minPredictionGain ), PRED_GAIN_E );
+ if ( flag_1 < 0 )
+ {
+ flag_1 = 0;
+ move16();
+ }
+ test();
+ test();
+ test();
+ IF( flag && LT_32( sts[0]->element_brate, IVAS_80k ) &&
+ flag_1 && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
+ {
+ pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */
+ move32();
+ move32();
+ pFilter[0]->predictionGain_e = pFilter[1]->predictionGain_e = meanPredictionGain_e; /* more TNS filter sync at 48kbps */
+ move16();
+ move16();
+ pFilter[0]->predictionGain = pFilter[1]->predictionGain = shl_sat( extract_h( meanPredictionGain_fx ), sub( meanPredictionGain_e, PRED_GAIN_E ) ); /* Q7 */
+ move16();
+ move16();
+ }
+ flag = BASOP_Util_Cmp_Mant32Exp( Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ), meanPredictionGain_e, L_abs( BASOP_Util_Add_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_negate( pFilter[1]->predictionGain32 ), pFilter[1]->predictionGain_e, &sum_e ) ), sum_e );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ test();
+ IF( flag &&
+ ( EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) )
+ {
+
+ Word16 maxAvgSqrCoef_fx = s_max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); // Q15
+ Word16 meanLtpGain_fx = add( shr( sts[0]->hTcxEnc->tcxltp_gain, 1 ), shr( sts[1]->hTcxEnc->tcxltp_gain, 1 ) );
+ // maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx );
+ flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, meanPredictionGain_fx, meanPredictionGain_e );
+ IF( flag < 0 )
+ {
+ maxPredGain_fx = meanPredictionGain_fx;
+ maxPredGain_e = meanPredictionGain_e;
+ move32();
+ move16();
+ }
+ flag = BASOP_Util_Cmp_Mant32Exp( meanPredictionGain_fx, meanPredictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ test();
+ test();
+ IF( flag || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
+ {
+ test();
+ test();
+ test();
+ IF( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 || sts[1]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || LT_16( meanLtpGain_fx, 19660 /* 0.6 in Q15*/ ) )
+ {
+
+ sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
+ this may result in crash later. Changing the filter type here so the order is taken here in further section */
+ IF( pFilter[0]->order != 0 )
+ {
+ pFilter[0]->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ IF( pFilter[1]->order != 0 )
+ {
+ pFilter[1]->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ }
+ ELSE
+ {
+ Word16 maxEnergyChange_fx;
+ maxEnergyChange_fx = mac_r( L_mult( GetTCXMaxenergyChange_ivas_fx( sts[0]->hTranDet, isTCX10, NSUBBLOCKS, 3 ), 16384 ), GetTCXMaxenergyChange_ivas_fx( sts[1]->hTranDet, isTCX10, NSUBBLOCKS, 3 ), 16384 );
+
+ IF( GE_16( maxEnergyChange_fx, shl( pTnsParameters[0]->minEnergyChange, Q3 - Q7 ) ) )
+ {
+ sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
+ this may result in crash later. Changing the filter type here so the order is taken here in further section */
+ IF( pFilter[0]->order != 0 )
+ {
+ pFilter[0]->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ IF( pFilter[1]->order != 0 )
+ {
+ pFilter[1]->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ }
+ ELSE
+ {
+ pFilter[0]->filterType = TNS_FILTER_OFF;
+ move16();
+ pFilter[1]->filterType = TNS_FILTER_OFF;
+ move16();
+ }
+ }
+ }
+ ELSE IF( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 && sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */
+ {
+ pFilter[0]->filterType = TNS_FILTER_ON_ZERO;
+ pFilter[1]->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ move16();
+ sts[0]->hTcxEnc->tnsData[k].nFilters = add( sts[0]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ sts[1]->hTcxEnc->tnsData[k].nFilters = add( sts[1]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ }
+ ELSE IF( NE_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) /* sanity check */
+ {
+ assert( 0 );
+ }
+ ELSE
+ {
+ pFilter[0]->filterType = TNS_FILTER_OFF;
+ move16();
+ pFilter[1]->filterType = TNS_FILTER_OFF;
+ move16();
+ }
+
+ test();
+ test();
+ IF( EQ_16( pFilter[0]->filterType, TNS_FILTER_ON ) && EQ_16( pFilter[1]->filterType, TNS_FILTER_ON ) && LT_32( sts[0]->element_brate, IVAS_80k ) )
+ {
+ Word16 tmpIntValue = 0;
+ move16();
+ Word16 tmpCoeff[TNS_MAX_FILTER_ORDER];
+ Word16 i, maxOrder = s_max( pFilter[0]->order, pFilter[1]->order );
+
+ set16_fx( tmpCoeff, 0, TNS_MAX_FILTER_ORDER );
+ FOR( i = 0; i < maxOrder; i++ )
+ {
+ tmpIntValue = s_max( tmpIntValue, abs_s( sub( pFilter[0]->coefIndex[i], pFilter[1]->coefIndex[i] ) ) );
+ }
+
+ IF( EQ_16( tmpIntValue, 1 ) ) /* the TNS coefficients are sufficiently similar to equalize the two filters */
+ {
+ FOR( i = maxOrder - 1; i >= 0; i-- )
+ {
+ IF( LT_16( abs_s( pFilter[0]->coefIndex[i] ), abs_s( pFilter[1]->coefIndex[i] ) ) )
+ {
+ tmpCoeff[i] = pFilter[0]->coefIndex[i];
+ }
+ ELSE
+ {
+ tmpCoeff[i] = pFilter[1]->coefIndex[i];
+ }
+ move16();
+ IF( ( tmpIntValue > 0 ) && ( tmpCoeff[i] == 0 ) )
+ {
+ maxOrder = sub( maxOrder, 1 );
+ }
+ ELSE
+ {
+ tmpIntValue = 0;
+ move16();
+ }
+ }
+ /* make sure that maxOrder is non zero and not all coefficients are zero (could happen in rare cases) */
+ IF( maxOrder > 0 )
+ {
+ FOR( i = TNS_MAX_FILTER_ORDER - 1; i >= 0; i-- )
+ {
+ pFilter[0]->coefIndex[i] = pFilter[1]->coefIndex[i] = tmpCoeff[i];
+ move16();
+ move16();
+ }
+
+ pFilter[0]->order = pFilter[1]->order = maxOrder;
+ move16();
+ move16();
+ }
+ }
+ }
+ }
+ ELSE
+ {
+ individual_decision[k] = 1;
+ move16();
+ }
+ }
+
+ IF( individual_decision[k] == 0 )
+ {
+ IF( ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 ) )
+ {
+ sts[0]->hTcxEnc->fUseTns[k] = 1;
+ }
+ ELSE
+ {
+ sts[0]->hTcxEnc->fUseTns[k] = 0;
+ }
+ move16();
+
+ IF( ( sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) )
+ {
+ sts[1]->hTcxEnc->fUseTns[k] = 1;
+ }
+ ELSE
+ {
+ sts[1]->hTcxEnc->fUseTns[k] = 0;
+ }
+ move16();
+ }
+ ELSE
+ {
+ sts[0]->hTcxEnc->tnsData[k].nFilters = 0;
+ move16();
+ sts[1]->hTcxEnc->tnsData[k].nFilters = 0;
+ move16();
+ sts[0]->hTcxEnc->fUseTns[k] = 0;
+ move16();
+ sts[1]->hTcxEnc->fUseTns[k] = 0;
+ move16();
+ FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ sts[0]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
+ move16();
+ sts[1]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
+ move16();
+ }
+ }
+ Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ test();
+ test();
+ test();
+ IF( !bWhitenedDomain && individual_decision[k] == 0 && flag && NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
+ {
+ sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
+ move16();
+ sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
+ move16();
+ sts[0]->hTcxEnc->tnsData[k].nFilters = 0;
+ move16();
+ sts[1]->hTcxEnc->tnsData[k].nFilters = 0;
+ move16();
+ sts[0]->hTcxEnc->fUseTns[k] = 0;
+ move16();
+ sts[1]->hTcxEnc->fUseTns[k] = 0;
+ move16();
+ FOR( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ ClearTnsFilterCoefficients( sts[0]->hTcxEnc->tnsData[k].filter + iFilter );
+ ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter );
+ }
+ }
+ // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
+ flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
+ IF( flag < 0 )
+ {
+ maxPredictionGain_fx = maxPredGain_fx;
+ maxPredictionGain_e = maxPredGain_e;
+ move32();
+ move16();
+ }
+ }
+ }
+ }
+ }
+
+ /* individual decision for each channel */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ IF( EQ_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
+ {
+ CONTINUE;
+ }
+
+ Word8 isTCX10;
+
+ IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ isTCX10 = 0;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ isTCX10 = 1;
+ }
+ move16();
+ move16();
+
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ test();
+ test();
+ test();
+ test();
+ IF( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) &&
+ ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ Word32 maxPredGain_fx = -ONE_IN_Q31; // Q31
+ move32();
+ Word16 maxPredGain_e = 0;
+ move16();
+ sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )];
+
+ FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ STnsFilter *pFilter;
+ struct TnsParameters const *pTnsParameters;
+ pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter;
+ pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;
+
+ // maxPredGain_fx = L_max( maxPredGain_fx, pFilter->predictionGain32 );
+ Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, pFilter->predictionGain32, pFilter->predictionGain_e );
+ IF( flag < 0 )
+ {
+ maxPredGain_fx = pFilter->predictionGain32;
+ move32();
+ maxPredGain_e = pFilter->predictionGain_e;
+ move16();
+ }
+ flag = BASOP_Util_Cmp_Mant32Exp( pFilter->predictionGain32, pFilter->predictionGain_e, L_deposit_h( pTnsParameters->minPredictionGain ), PRED_GAIN_E );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ test();
+ IF( flag || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
+ {
+ test();
+ test();
+ IF( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || LT_16( sts[ch]->hTcxEnc->tcxltp_gain, 19660 /*.6f in Q15*/ ) )
+ {
+ sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
+ this may result in crash later. Changing the filter type here so the order is taken here in further section */
+ IF( pFilter->order != 0 )
+ {
+ pFilter->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ }
+ ELSE
+ {
+ Word16 maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( sts[ch]->hTranDet, isTCX10, NSUBBLOCKS, 3 );
+
+ IF( GE_16( maxEnergyChange_fx, shl( pTnsParameters->minEnergyChange, Q3 - Q7 ) ) )
+ {
+ sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ /* When order parameter is evaluated as 0 and change in precision causes the flow to reach here,
+ this may result in crash later. Changing the filter type here so the order is taken here in further section */
+ IF( pFilter->order != 0 )
+ {
+ pFilter->filterType = TNS_FILTER_ON;
+ move16();
+ }
+ ELSE
+ {
+ pFilter->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ }
+ }
+ ELSE
+ {
+ pFilter->filterType = TNS_FILTER_OFF;
+ move16();
+ }
+ }
+ }
+ ELSE IF( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */
+ {
+ pFilter->filterType = TNS_FILTER_ON_ZERO;
+ move16();
+ sts[ch]->hTcxEnc->tnsData[k].nFilters = add( sts[ch]->hTcxEnc->tnsData[k].nFilters, 1 );
+ move16();
+ }
+ ELSE
+ {
+ pFilter->filterType = TNS_FILTER_OFF;
+ move16();
+ }
+ }
+
+ IF( ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) )
+ {
+ sts[ch]->hTcxEnc->fUseTns[k] = 1;
+ }
+ ELSE
+ {
+ sts[ch]->hTcxEnc->fUseTns[k] = 0;
+ }
+ move16();
+ Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
+ if ( flag < 0 )
+ {
+ flag = 0;
+ move16();
+ }
+ test();
+ test();
+ IF( !bWhitenedDomain && flag && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
+ {
+ sts[ch]->hTcxEnc->fUseTns[k] = 0;
+ move16();
+ sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
+ move16();
+ sts[ch]->hTcxEnc->tnsData[k].nFilters = 0;
+ move16();
+ FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter );
+ sts[ch]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF;
+ move16();
+ }
+ }
+ // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
+ flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
+ IF( flag < 0 )
+ {
+ maxPredictionGain_fx = maxPredGain_fx;
+ maxPredictionGain_e = maxPredGain_e;
+ move32();
+ move16();
+ }
+ }
+ }
+ }
+
+
+ /* we have the decision, set filter data accordingly */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
+ {
+ CONTINUE;
+ }
+
+ IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ }
+ move16();
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ test();
+ test();
+ IF( sts[ch]->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )];
+
+ FOR( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ STnsFilter *pFilter;
+ pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter;
+ SWITCH( pFilter->filterType )
+ {
+ case TNS_FILTER_OFF:
+ ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter );
+ BREAK;
+ case TNS_FILTER_ON_ZERO:
+ /* Since TNS filter of order 0 is not allowed we have to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */
+ ClearTnsFilterCoefficients( pFilter );
+ pFilter->order = 1;
+ move16();
+ BREAK;
+ }
+ }
+ }
+ }
+ }
+
+ /* Apply filters, loop over channels */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ st = sts[ch];
+ IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) )
+ {
+ CONTINUE;
+ }
+
+ IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) )
+ {
+ nSubframes = 1;
+ }
+ ELSE
+ {
+ nSubframes = NB_DIV;
+ }
+ move16();
+
+ FOR( k = 0; k < nSubframes; k++ )
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( bWhitenedDomain && ( ch > 0 ) && /* test for identical TNS filter data in both channels */
+ sts[0]->hTcxCfg->fIsTNSAllowed && sts[0]->hTcxEnc->fUseTns[k] &&
+ sts[1]->hTcxCfg->fIsTNSAllowed && sts[1]->hTcxEnc->fUseTns[k] )
+ {
+ Word16 equalFilterData = 0;
+ move16();
+ test();
+ test();
+ if ( EQ_16( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters, sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters ) &&
+ EQ_16( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k], sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) &&
+ EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
+ {
+ equalFilterData = 1;
+ move16();
+ }
+
+ IF( equalFilterData )
+ {
+ FOR( iFilter = st->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- )
+ {
+ const Word16 *pDataCh0 = (const Word16 *) &sts[0]->hTcxEnc->tnsData[k].filter[iFilter];
+ const Word16 *pDataCh1 = (const Word16 *) &sts[1]->hTcxEnc->tnsData[k].filter[iFilter];
+ Word16 i = 2 + TNS_MAX_FILTER_ORDER; /* excl. informative float data. Portable? */
+
+ move16();
+ test();
+ WHILE( ( i >= 0 ) && EQ_16( pDataCh0[i], pDataCh1[i] ) )
+ {
+ test();
+ i = sub( i, 1 );
+ }
+ IF( i >= 0 )
+ {
+ equalFilterData = 0;
+ move16();
+ BREAK;
+ }
+ }
+ IF( equalFilterData )
+ {
+ st->hTcxEnc->tnsData[k].nFilters = i_mult( st->hTcxEnc->tnsData[k].nFilters, -1 ); /* signals common TNS */
+ move16();
+ }
+ }
+ }
+ test();
+ test();
+ IF( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || st->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
+ {
+ L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0];
+ move16();
+ spectrum_fx = st->hTcxEnc->spectrum_fx[k];
+ /* If TNS should be used then get the residual after applying it inplace in the spectrum */
+ IF( st->hTcxEnc->fUseTns[k] )
+ {
+ st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[st->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )];
+
+ ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], spectrum_fx, 1 );
+ }
+
+ IF( EQ_16( st->hTcxEnc->transform_type[k], TCX_5 ) )
+ {
+ tcx5TnsUngrouping_fx( shr( L_frame, 2 ), shr( L_spec, 1 ), st->hTcxEnc->spectrum_fx[k], ENC );
+ }
+
+ st->hTcxEnc->tnsData[k].tnsOnWhitenedSpectra = st->hTcxEnc->bTnsOnWhithenedSpectra[k];
+ move16();
+ EncodeTnsData_ivas_fx( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], param_core[ch] + k * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, tnsSize[ch] + k, tnsBits[ch] + k );
+ }
+
+ IF( EQ_16( st->hTcxEnc->transform_type[k], TCX_5 ) )
+ {
+ tcx5SpectrumInterleaving_fx( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum_fx[k] );
+ tcx5SpectrumInterleaving_fx( st->hTcxCfg->tcx5SizeFB, mdst_spectrum_fx[ch][k] );
+ }
+ }
+ }
+ return;
+}
diff --git a/lib_enc/cod_uv.c b/lib_enc/cod_uv.c
deleted file mode 100644
index 9e7ce955844554794434881de1f04317bb321cd3..0000000000000000000000000000000000000000
--- a/lib_enc/cod_uv.c
+++ /dev/null
@@ -1,40 +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 "options.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/comvad_decision.c b/lib_enc/comvad_decision.c
deleted file mode 100644
index efb9c1d789381c50f813704f56c5b207b055d790..0000000000000000000000000000000000000000
--- a/lib_enc/comvad_decision.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include "prot.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/cor_shif.c b/lib_enc/cor_shif.c
deleted file mode 100644
index 0e2004abf2b74fc291df1fafb1f856b731c8e611..0000000000000000000000000000000000000000
--- a/lib_enc/cor_shif.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/core_enc_2div.c b/lib_enc/core_enc_2div.c
deleted file mode 100644
index c899b52ff72d3d5658f135f34e7730d22f0987de..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_2div.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c
deleted file mode 100644
index b0a1c880eec8cc1dd81c9ce0619c9712f124db62..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_init.c
+++ /dev/null
@@ -1,1055 +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 "options.h"
-#include "options_warnings.h"
-#include "cnst.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-
-#include "prot_fx.h"
-
-/*-----------------------------------------------------------------------*
- * Local function prototypes
- *-----------------------------------------------------------------------*/
-static void init_tcx_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word32 total_brate, const Word32 last_total_brate, const Word16 MCT_flag );
-static void init_core_sig_ana_ivas_fx( Encoder_State *st );
-static void init_modes_ivas_fx( Encoder_State *st, const Word32 last_total_brate );
-static void init_sig_buffers_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word16 L_subfr, const int32_t last_total_brate );
-static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 shift, const int32_t last_total_brate );
-/*-----------------------------------------------------------------------*
- * init_coder_ace_plus()
- *
- * Initialization of state variables
- *-----------------------------------------------------------------------*/
-void init_coder_ace_plus_ivas_fx(
- Encoder_State *st, /* i : Encoder state */
- const Word32 last_total_brate, /* i : last total bitrate */
-#ifdef FIX_920_IGF_INIT_ERROR
- const Word32 igf_brate, /* i : IGF configuration bitrate */
-#endif
- const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */
-)
-{
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
- Word16 L_frame_old; /*keep old frame size for switching */
- Word16 L_subfr;
-
- /* Bitrate */
- st->tcxonly = getTcxonly_ivas_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
- move16();
-
- /* Core Sampling Rate */
- st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format );
- st->fscale = sr2fscale_fx( st->sr_core );
- move32();
- move16();
-
- /* Narrowband? */
- IF( EQ_16( st->bwidth, NB ) )
- {
- st->narrowBand = 1;
- move16();
- }
- ELSE
- {
- st->narrowBand = 0;
- move16();
- }
-
- /* Core Framing */
- L_frame_old = st->last_L_frame;
- move16();
- st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
- move16();
- st->L_frame_past = -1;
- move16();
-
- IF( hTcxEnc != NULL )
- {
- hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
- move16();
-
- IF( st->ini_frame == 0 )
- {
- set16_fx( hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
- hTcxEnc->acelp_zir = hTcxEnc->Txnq + L_FRAME / 2;
- hTcxEnc->q_Txnq = Q15;
- move16();
- hTcxEnc->tcx_target_bits_fac = ONE_IN_Q14;
- move16();
- }
- }
-
- test();
- test();
- test();
- test();
- test();
- IF( ( st->element_mode == EVS_MONO && EQ_32( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->element_mode > EVS_MONO && EQ_32( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, MAX_ACELP_BRATE ) ) )
- {
- st->nb_subfr = NB_SUBFR16k;
- move16();
- }
- ELSE
- {
- st->nb_subfr = NB_SUBFR;
- move16();
- }
- L_subfr = idiv1616( st->L_frame, st->nb_subfr );
-
- /* Core Lookahead */
- st->encoderLookahead_enc = NS2SA_FX2( st->sr_core, ACELP_LOOK_NS );
- st->encoderLookahead_FB = NS2SA_FX2( st->input_Fs, ACELP_LOOK_NS );
- move16();
- move16();
-
- IF( st->ini_frame == 0 )
- {
- st->acelpFramesCount = 0;
- move16();
- st->prevTempFlatness_fx = 128 /*1.0f Q7*/;
- move16();
- }
-
- /* Initialize TBE */
- IF( st->hBWE_TD != NULL )
- {
- st->hBWE_TD->prev_coder_type = GENERIC;
- move16();
- set16_fx( st->hBWE_TD->prev_lsf_diff_fx, 16384, LPC_SHB_ORDER - 2 );
- st->hBWE_TD->prev_tilt_para_fx = 0;
- move16();
- set16_fx( st->hBWE_TD->cur_sub_Aq_fx, 0, M + 1 );
- }
-
- st->currEnergyHF_fx = 0;
- move32();
- st->currEnergyHF_e_fx = 0;
- move16();
- test();
- /* Initialize LPC analysis/quantization */
- IF( LE_32( st->sr_core, INT_FS_16k ) && st->tcxonly == 0 )
- {
- st->lpcQuantization = 1;
- move16();
- }
- ELSE
- {
- st->lpcQuantization = 0;
- move16();
- }
-
- st->next_force_safety_net = 0;
- move16();
- test();
- test();
- IF( ( NE_16( st->last_L_frame, st->L_frame ) ) || ( EQ_16( st->last_core, AMR_WB_CORE ) ) || ( EQ_16( st->last_core, HQ_CORE ) ) )
- {
- set16_fx( st->mem_MA_fx, 0, M );
- Copy( GEWB_Ave_fx, st->mem_AR_fx, M );
- }
-
- /* Initialize IGF */
- if ( st->hIGFEnc != NULL )
- {
- st->hIGFEnc->infoStopFrequency = -1;
- move16();
- }
-
- test();
- IF( st->igf && st->hIGFEnc != NULL )
- {
-#ifdef FIX_920_IGF_INIT_ERROR
- IGFEncSetMode_ivas_fx( st->hIGFEnc, igf_brate, st->bwidth, st->element_mode, st->rf_mode );
-#else
- IGFEncSetMode_ivas_fx( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode );
-#endif
- }
- ELSE IF( st->hIGFEnc != NULL )
- {
- st->hIGFEnc->infoTotalBitsWritten = 0;
- move16();
- st->hIGFEnc->infoTotalBitsPerFrameWritten = 0;
- move16();
- }
-
- /* Initialize Core Signal Analysis Module */
- init_core_sig_ana_ivas_fx( st );
-
-
- /* Initialize TCX */
- IF( hTcxEnc != NULL )
- {
- init_tcx_ivas_fx( st, L_frame_old, st->total_brate, last_total_brate, MCT_flag );
- }
-
- /* Initialize Signal Buffers */
- init_sig_buffers_ivas_fx( st, L_frame_old, L_subfr, last_total_brate );
-
- /* Initialize ACELP */
-
- init_acelp_ivas_fx( st, L_frame_old, 0, last_total_brate );
-
- if ( st->ini_frame == 0 )
- {
- st->tec_tfa = 0;
- move16();
- }
-
- IF( st->hTECEnc != NULL )
- {
- resetTecEnc_Fx( st->hTECEnc, st->tec_tfa );
- }
-
- test();
- test();
- test();
- IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
- {
- st->tec_tfa = 1;
- move16();
- }
- ELSE
- {
- st->tec_tfa = 0;
- move16();
- }
-
- st->tec_flag = 0;
- move16();
- st->tfa_flag = 0;
- move16();
-
- test();
- test();
- test();
- IF( ( EQ_32( st->total_brate, ACELP_9k60 ) || EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
- {
- st->glr = 1;
- move16();
- }
- ELSE
- {
- st->glr = 0;
- move16();
- }
-
- st->glr_reset = 0;
- move16();
-
- /* Initialize ACELP/TCX Modes */
- init_modes_ivas_fx( st, last_total_brate );
-
- /* Adaptive BPF */
- set32_fx( st->mem_bpf_fx1, 0, 2 * L_FILT16k );
- set32_fx( st->mem_error_bpf_fx, 0, 2 * L_FILT16k );
-
- IF( st->ini_frame == 0 )
- {
- st->Q_max_enc[0] = 15;
- move16();
- st->Q_max_enc[1] = 15;
- move16();
- }
-
- IF( GE_32( st->total_brate, HQ_48k ) )
- {
- st->enablePlcWaveadjust = 1;
- move16();
- }
- ELSE
- {
- st->enablePlcWaveadjust = 0;
- move16();
- }
-
- IF( st->hPlcExt )
- {
- init_PLC_enc_fx( st->hPlcExt, st->sr_core );
- }
-
- st->glr_idx[0] = 0;
- move16();
- st->glr_idx[1] = 0;
- move16();
- st->mean_gc[0] = 0;
- move16();
- st->mean_gc[1] = 0;
- move16();
- st->prev_lsf4_mean = 0;
- move16();
- st->last_stab_fac = 0;
- move16();
-
- return;
-}
-
-/*-----------------------------------------------------------------------*
- * init_tcx()
- *
- * Initialization of TCX
- *-----------------------------------------------------------------------*/
-
-
-static void init_tcx_ivas_fx(
- Encoder_State *st,
- const Word16 L_frame_old,
- const Word32 total_brate,
- const Word32 last_total_brate,
- const Word16 MCT_flag )
-{
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
-
- /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */
- hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx;
- hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX;
- st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0;
- move16();
- move16();
-
- init_tcx_cfg_ivas_fx( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX,
- st->fscale, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf,
- st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag );
-
- /* Init TCX target bits correction factor */
- hTcxEnc->tcx_target_bits_fac = 0x4000; /*1.0f in 1Q14*/
- move16();
- hTcxEnc->measuredBwRatio = 0x4000; /*1.0f in 1Q14*/
- move16();
- hTcxEnc->noiseTiltFactor = 9216; /*0.5625f in 1Q14*/
- move16();
- hTcxEnc->noiseLevelMemory_cnt = 0;
- move16();
-
- set16_fx( hTcxEnc->ltpGainMemory_fx, 0, N_LTP_GAIN_MEMS );
- set8_fx( hTcxEnc->memQuantZeros, 0, L_FRAME_PLUS );
-
- /* TCX-LTP */
- hTcxEnc->tcxltp = getTcxLtp( st->sr_core );
- move16();
-
- test();
- test();
- test();
- test();
- IF( st->ini_frame == 0 )
- {
- hTcxEnc->tcxltp_pitch_int_past = st->L_frame;
- hTcxEnc->tcxltp_pitch_fr_past = 0;
- hTcxEnc->tcxltp_gain_past = 0;
- hTcxEnc->tcxltp_norm_corr_past = 0;
- hTcxEnc->tcxltp_norm_corr_mem = 0;
- hTcxEnc->kernel_switch_corr_past = 0;
- hTcxEnc->kernel_symmetry_past = 0; /* MDCT_IV & 1 */
- hTcxEnc->enc_ste_pre_corr_past = 0;
- hTcxEnc->tfm_mem_fx = 1610612736; /* 0.75 in Q31 */
- hTcxEnc->tcxltp_on_mem = 0;
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- }
- ELSE IF( NE_16( st->L_frame, L_frame_old ) && !( ( GE_32( total_brate, ACELP_16k40 ) && LE_32( total_brate, ACELP_24k40 ) ) &&
- ( EQ_32( total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
- {
- Word16 pitres, pitres_old;
- Word16 pit, pit_old;
-
- pitres_old = 4;
- move16();
- if ( EQ_16( 160, shr( L_frame_old, sub( 7, norm_s( L_frame_old ) ) ) ) ) /*if ( L_frame_old%160==0 )*/
- {
- pitres_old = 6;
- move16();
- }
-
- /*pit_old = (float)st->tcxltp_pitch_int_past + (float)st->tcxltp_pitch_fr_past/(float)pitres_old;*/
- pit_old = add( hTcxEnc->tcxltp_pitch_int_past, mult_r( hTcxEnc->tcxltp_pitch_fr_past, div_s( 1, pitres_old ) ) );
-
- pitres = 4;
- move16();
- if ( EQ_16( 160, shr( st->L_frame, sub( 7, norm_s( st->L_frame ) ) ) ) ) /*if ( st->L_frame%160==0 )*/
- {
- pitres = 6;
- move16();
- }
-
- /*pit = pit_old * (float)st->L_frame/(float)L_frame_old;*/
- pit = shl_sat( mult_r( pit_old, div_s( st->L_frame, shl( L_frame_old, 2 ) ) ), 2 );
- /* Note : the saturation here that can happens when FS == 32kHz*/
- /* assert(pit <= st->L_frame);*/
-
- hTcxEnc->tcxltp_pitch_int_past = pit;
- move16();
- hTcxEnc->tcxltp_pitch_fr_past = i_mult2( sub( pit, hTcxEnc->tcxltp_pitch_int_past ), pitres );
- move16();
- }
-
- hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode );
- move16();
-
- return;
-}
-
-/*-----------------------------------------------------------------------*
- * init_sig_buffers()
- *
- * Initialization of signal buffers
- *-----------------------------------------------------------------------*/
-/*copy of evs function since it was static */
-static void init_sig_buffers_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word16 L_subfr, const int32_t last_total_brate )
-{
-
- LPD_state_HANDLE hLPDmem = st->hLPDmem;
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
-
- /* Encoder Past Samples at encoder-sampling-rate */
- st->encoderPastSamples_enc = shr( imult1616( st->L_frame, 9 ), 4 );
- move16();
-
- /* Initialize Signal Buffers and Pointers at encoder-sampling-rate */
- IF( st->ini_frame == 0 )
- {
- set16_fx( st->buf_speech_enc, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
- st->exp_buf_speech_enc = 0;
- move16();
- set16_fx( st->buf_speech_enc_pe, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
- st->exp_buf_speech_enc_pe = 0;
- move16();
- if ( hTcxEnc != NULL )
- {
- set16_fx( hTcxEnc->buf_speech_ltp, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
- hTcxEnc->exp_buf_speech_ltp = 0;
- move16();
- }
- set16_fx( st->buf_wspeech_enc, 0, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); /* increased by 320 to avoid memory overlap in ivas_find_wsp_fx() and also to accomodate for the wspeech_enc */
- st->exp_buf_wspeech_enc = 0;
- move16();
- }
- ELSE
- {
- test();
- test();
- test();
- test();
- test();
- IF( NE_16( st->L_frame, L_frame_old ) && !( ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && ( EQ_32( st->total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
- {
- lerp( st->buf_speech_enc, st->buf_speech_enc, st->L_frame, L_frame_old );
- test();
- IF( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) /* condition should be checked again */
- {
- Copy( st->buf_speech_enc, hTcxEnc->buf_speech_ltp, st->L_frame );
- Scale_sig( hTcxEnc->buf_speech_ltp, st->L_frame, sub( st->exp_buf_speech_enc, s_max( st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(15-max(st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp))
- Scale_sig( hTcxEnc->buf_speech_ltp + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( hTcxEnc->exp_buf_speech_ltp, s_max( st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(15-max(st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp))
- hTcxEnc->exp_buf_speech_ltp = s_max( hTcxEnc->exp_buf_speech_ltp, st->exp_buf_speech_enc );
- move16();
- }
-
- // Copy_Scale_sig( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
- Copy( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM );
- st->exp_buf_wspeech_enc = st->exp_old_wsp;
- move16();
-
- /*Resamp buffers needed only for ACELP*/
- test();
- test();
- IF( EQ_16( st->L_frame, L_FRAME ) && !st->tcxonly )
- {
- // Copy_Scale_sig( st->old_inp_12k8_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
- Copy( st->old_inp_12k8_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM );
- /* SCaling to common exponent*/
- Scale_sig( st->buf_speech_enc_pe + sub( st->L_frame, L_INP_MEM ), L_INP_MEM, sub( st->exp_old_inp_12k8, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
- Scale_sig( st->buf_speech_enc_pe, sub( st->L_frame, L_INP_MEM ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
- Scale_sig( st->buf_speech_enc_pe + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
- st->exp_buf_speech_enc_pe = s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe );
- move16();
- }
- ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) && !st->tcxonly )
- {
- lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM );
- Copy( st->old_inp_16k_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM );
- /* SCaling to common exponent*/
- Scale_sig( st->buf_speech_enc_pe + sub( st->L_frame, L_INP_MEM ), L_INP_MEM, sub( st->exp_old_inp_16k, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
- Scale_sig( st->buf_speech_enc_pe, sub( st->L_frame, L_INP_MEM ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
- Scale_sig( st->buf_speech_enc_pe + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
- st->exp_buf_speech_enc_pe = s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe );
- move16();
- }
-
- st->mem_preemph_enc = st->buf_speech_enc[st->encoderPastSamples_enc + st->encoderLookahead_enc - 1];
- move16();
- st->exp_mem_preemph_enc = st->exp_buf_speech_enc;
- move16();
- st->mem_wsp_enc = shr( st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1], sub( Q16, st->exp_buf_wspeech_enc ) ); // Q-1
- move16();
- }
- /*coming from TCXonly modes*/
- ELSE IF( !st->tcxonly && GE_32( last_total_brate, ACELP_32k ) )
- {
-
- Copy( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM );
- // Copy_Scale_sig( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
- st->exp_buf_wspeech_enc = st->exp_old_wsp;
- move16(); /*Resamp buffers needed only for ACELP*/
- IF( EQ_16( st->L_frame, L_FRAME16k ) )
- {
- lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM );
- }
- hLPDmem->mem_w0 = 0;
- move16();
- st->mem_wsp_enc = shr( st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1], sub( Q16, st->exp_buf_wspeech_enc ) ); // Q-1
- move16();
- }
- }
-
- st->new_speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc + st->encoderLookahead_enc;
- st->new_speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc + st->encoderLookahead_enc;
- if ( hTcxEnc != NULL )
- {
- hTcxEnc->new_speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc + st->encoderLookahead_enc;
- }
-
- IF( st->hTcxEnc != NULL )
- {
- st->hTcxEnc->new_speech_TCX = st->input_buff_fx + Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 );
- st->hTcxEnc->speech_TCX = st->hTcxEnc->new_speech_TCX - st->encoderLookahead_FB;
- }
- st->speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc;
- st->speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc;
-
- if ( hTcxEnc != NULL )
- {
- hTcxEnc->speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc;
- }
-
- IF( st->element_mode > EVS_MONO )
- {
- st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_SUBFR;
- }
- ELSE
- {
- st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_subfr;
- }
-
- test();
- test();
- IF( st->ini_frame == 0 || NE_16( st->L_frame, L_frame_old ) || EQ_16( st->last_codec_mode, MODE1 ) )
- {
- set16_fx( st->buf_synth, 0, OLD_SYNTH_SIZE_ENC + L_FRAME32k );
- }
-
- st->synth = st->buf_synth + st->L_frame + L_subfr;
-
-
- return;
-}
-
-/*-----------------------------------------------------------------------*
- * init_core_sig_ana()
- *
- *
- *-----------------------------------------------------------------------*/
-static void init_core_sig_ana_ivas_fx( Encoder_State *st )
-{
-
- /* Pre-emphasis factor and memory */
-
- st->preemph_fac = PREEMPH_FAC_SWB; /*SWB*/
- move16();
- IF( LT_16( st->fscale, ( 16000 * FSCALE_DENOM ) / 12800 ) )
- {
- st->preemph_fac = PREEMPH_FAC; /*WB*/
- move16();
- }
- ELSE IF( LT_16( st->fscale, ( 24000 * FSCALE_DENOM ) / 12800 ) )
- {
- st->preemph_fac = PREEMPH_FAC_16k; /*WB*/
- move16();
- }
-
- st->gamma = GAMMA1;
- move16();
- st->inv_gamma = GAMMA1_INV;
- move16();
- IF( EQ_32( st->sr_core, 16000 ) )
- {
- st->gamma = GAMMA16k;
- move16();
- st->inv_gamma = GAMMA16k_INV;
- move16();
- }
-
-
- st->min_band = 1;
- move16();
- st->max_band = 16;
- move16();
-
- IF( st->narrowBand == 0 )
- {
- st->min_band = 0;
- move16();
- st->max_band = 19;
- move16();
- }
-
-
- return;
-}
-/*-----------------------------------------------------------------------*
- * init_acelp()
- *
- *
- *-----------------------------------------------------------------------*/
-static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 shift, const int32_t last_total_brate )
-{
- Word16 mem_syn_r_size_old;
- Word16 mem_syn_r_size_new;
- LPD_state_HANDLE hLPDmem = st->hLPDmem;
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
-
- /* Init pitch lag */
- IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- /* TCX LTP ana always runs @12.8kHz */
- st->pit_res_max = initPitchLagParameters( 12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max );
- move16();
- }
- ELSE
- {
- st->pit_res_max = initPitchLagParameters( st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max );
- move16();
- }
-
- /* Init LPDmem */
- IF( st->ini_frame == 0 )
- {
- IF( hLPDmem != NULL )
- {
- set16_fx( hLPDmem->syn, 0, 1 + M );
- set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM );
- }
-
- IF( st->hTcxEnc != NULL )
- {
- set16_fx( st->hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
- st->hTcxEnc->q_Txnq = Q15;
- move16();
- st->hTcxEnc->acelp_zir = st->hTcxEnc->Txnq + shr( st->L_frame, 1 );
- }
- }
- ELSE /*Rate switching*/
- {
- IF( st->last_core == ACELP_CORE )
- {
- lerp( hTcxEnc->Txnq, hTcxEnc->Txnq, shr( st->L_frame, 1 ), shr( L_frame_old, 1 ) );
- }
- ELSE
- {
- lerp( hTcxEnc->Txnq, hTcxEnc->Txnq, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_length_old );
- }
- hTcxEnc->acelp_zir = hTcxEnc->Txnq + shr( st->L_frame, 1 );
-
- /* Rate switching */
- IF( EQ_16( st->last_codec_mode, MODE1 ) && st->element_mode == EVS_MONO )
- {
- IF( hLPDmem != NULL )
- {
- Copy( hLPDmem->mem_syn1_fx, hLPDmem->mem_syn2, M );
- set16_fx( hLPDmem->syn, 0, M );
- hLPDmem->q_lpd_syn = Q15;
- move16();
- }
- IF( st->hTcxEnc != NULL )
- {
- set16_fx( hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
- st->hTcxEnc->q_Txnq = Q15;
- move16();
- }
- }
-
- /*AMR-WBIO->MODE2*/
- IF( EQ_16( st->last_core, AMR_WB_CORE ) )
- {
- st->next_force_safety_net = 1;
- move16();
- st->last_core = ACELP_CORE;
- move16();
- }
- /*HQ-CORE->MODE2*/
- test();
- IF( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->last_core, HQ_CORE ) )
- {
- /*Reset of ACELP memories*/
- st->next_force_safety_net = 1;
- move16();
- st->rate_switching_reset = 1;
- move16();
- IF( hLPDmem != NULL )
- {
- hLPDmem->tilt_code = TILT_CODE;
- move16();
- set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
- set16_fx( hLPDmem->syn, 0, 1 + M );
- hLPDmem->q_lpd_syn = Q15;
- move16();
- hLPDmem->q_lpd_old_exc = Q15;
- move16();
- hLPDmem->mem_w0 = 0;
- move16();
- set16_fx( hLPDmem->mem_syn, 0, M );
- set16_fx( hLPDmem->mem_syn2, 0, M );
- hLPDmem->q_mem_syn = Q15;
- move16();
- }
-
- /* unquantized LPC*/
- test();
- test();
- test();
- IF( !( ( GE_32( st->total_brate, ACELP_16k40 ) && LE_32( st->total_brate, ACELP_24k40 ) ) && ( EQ_32( st->total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
- {
- Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); /*lsp old @12.8kHz*/
- IF( EQ_16( st->L_frame, L_FRAME16k ) )
- {
- lsp_convert_poly_fx( st->lspold_enc_fx, st->L_frame, 0 );
- }
- }
- Copy( st->lspold_enc_fx, st->lsp_old_fx, M ); /*used unquantized values for mid-LSF Q*/
- IF( st->tcxonly == 0 )
- {
- lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
- }
- ELSE
- {
- E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
- }
- st->last_core = TCX_20_CORE;
- move16();
-
- st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/
- st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW;
- move16();
- move16();
- /*ALDO overlap windowed past: also used in MODE1 but for other MDCT-FB*/
- set16_fx( hTcxEnc->old_out_fx, 0, st->L_frame );
- }
- ELSE
- {
- test();
- test();
- test();
- test();
- IF( ( NE_16( st->L_frame, L_frame_old ) ) && ( LE_16( st->L_frame, L_FRAME16k ) ) && ( LE_16( L_frame_old, L_FRAME16k ) ) )
- {
- /* convert quantized LSP vector */
- st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 );
- move16();
- IF( st->tcxonly == 0 )
- {
- lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
- }
- ELSE
- {
- E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
- }
- IF( EQ_16( st->L_frame, L_FRAME16k ) )
- {
- Copy( st->lsp_old_fx, st->lspold_enc_fx, M );
- }
- ELSE
- {
- Copy( st->lsp_old1_fx, st->lspold_enc_fx, M );
- }
-
-
- /*Mem of deemphasis stay unchanged : hLPDmem->syn*/
- IF( hLPDmem != NULL )
- {
- synth_mem_updt2( st->L_frame, st->last_L_frame, hLPDmem->old_exc, hLPDmem->mem_syn_r, hLPDmem->mem_syn2, hLPDmem->mem_syn, ENC );
- Word16 tmp, A[M + 1], Ap[M + 1], tmp_buf[M + 1];
- /* Update wsyn */
- /* lsp2a_stab( st->lsp_old, A, M ); */
- E_LPC_f_lsp_a_conversion( st->lsp_old_fx, A, M );
- weight_a_fx( A, Ap, GAMMA1, M );
- tmp = 0;
- move16();
- tmp_buf[0] = 0;
- move16();
- Copy( hLPDmem->mem_syn2, tmp_buf + 1, M );
- deemph_fx( tmp_buf + 1, st->preemph_fac, M, &tmp );
- Residu3_fx( Ap, tmp_buf + M, &tmp, 1, 1 );
- hLPDmem->mem_w0 = sub_sat( shr_sat( st->wspeech_enc[-1], shift ), tmp );
- move16();
- }
- }
- ELSE IF( ( NE_16( st->L_frame, L_frame_old ) ) )
- {
- /*Partial reset of ACELP memories*/
- st->next_force_safety_net = 1;
- move16();
- st->rate_switching_reset = 1;
- move16();
-
- /*reset partly some memories*/
- IF( hLPDmem != NULL )
- {
- hLPDmem->tilt_code = TILT_CODE;
- move16();
- set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
- move16();
- hLPDmem->q_lpd_old_exc = Q15;
- move16();
- /*Resamp others memories*/
- /*Size of LPC syn memory*/
- /* 1.25/20.0 = 1.0/16.0 -> shift 4 to the right. */
- mem_syn_r_size_old = shr( L_frame_old, 4 );
- mem_syn_r_size_new = shr( st->L_frame, 4 );
-
- lerp( hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old );
- Copy( hLPDmem->mem_syn_r + L_SYN_MEM - M, hLPDmem->mem_syn, M );
- Copy( hLPDmem->mem_syn, hLPDmem->mem_syn2, M );
-
- /*Untouched memories : hLPDmem->syn & hLPDmem->mem_w0*/
- hLPDmem->mem_w0 = 0;
- move16();
- }
- /* unquantized LPC*/
- Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); /*lsp old @12.8kHz*/
- IF( EQ_16( st->L_frame, L_FRAME16k ) )
- {
- lsp_convert_poly_fx( st->lspold_enc_fx, st->L_frame, 0 );
- }
- Copy( st->lspold_enc_fx, st->lsp_old_fx, M ); /*used unquantized values for mid-LSF Q*/
- IF( st->tcxonly == 0 )
- {
- lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
- }
- ELSE
- {
- E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
- }
- }
- ELSE IF( !st->tcxonly && EQ_16( st->L_frame, L_FRAME16k ) && GT_32( st->last_total_brate, ACELP_32k ) )
- {
- lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
- }
- }
- }
-
- test();
- test();
- if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && st->ini_frame != 0 )
- {
- st->rate_switching_reset = 1;
- move16();
- }
-
- /* Post-processing */
- /*EVS specific*/
- /* hLPDmem->dm_fx.prev_gain_code = L_deposit_l( 0 );
- set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
- hLPDmem->dm_fx.prev_state = 0;*/
- /*------------*/
-
- if ( hLPDmem != NULL )
- {
- hLPDmem->dm_fx.prev_state = 0;
- move16(); /* This corresponds to st_fx->dispMem in FLP */
- hLPDmem->dm_fx.prev_gain_code = 0;
- move32();
-
- FOR( Word16 i = 2; i < 8; i++ )
- {
- hLPDmem->dm_fx.prev_gain_pit[i - 2] = 0;
- move16();
- }
- hLPDmem->gc_threshold = 0;
- move16();
- }
-
- /* Pulse Search configuration */
- st->acelp_autocorr = 1;
- move16();
-
- /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/
- test();
- test();
- if ( ( LE_32( st->total_brate, ACELP_9k60 ) || EQ_16( st->rf_mode, 1 ) ) && ( EQ_32( st->sr_core, 12800 ) ) )
- {
- st->acelp_autocorr = 0;
- move16();
- }
-
-
- /*BPF parameters for adjusting gain in function of background noise*/
- IF( EQ_16( st->codec_mode, MODE2 ) )
- {
- st->mem_bpf_fx.lp_error_ener = L_deposit_l( 0 );
- move32();
- st->pst_lp_ener_fx = 0;
- move16();
- IF( EQ_16( st->last_codec_mode, MODE1 ) )
- {
- st->mem_bpf_fx.lp_error = 0;
- move32();
- st->pst_mem_deemp_err_fx = 0;
- move16();
- }
- }
-
- return;
-}
-/*-----------------------------------------------------------------------*
- * init_modes()
- *
- *
- *-----------------------------------------------------------------------*/
-
-static void init_modes_ivas_fx(
- Encoder_State *st,
- const Word32 last_total_brate )
-{
- Word8 n;
- Word32 tmp32;
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
-
- /* Restrict ACE/TCX20/TCX10 mode */
- move16();
- st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, st->Opt_AMR_WB );
- move16();
- st->acelpEnabled = 0;
- move16();
- st->tcx20Enabled = 0;
- move16();
- st->tcx10Enabled = 0;
-
- if ( EQ_16( s_and( st->restrictedMode, 1 ), 1 ) )
- {
- st->acelpEnabled = 1;
- move16();
- }
- if ( EQ_16( s_and( st->restrictedMode, 2 ), 2 ) )
- {
- st->tcx20Enabled = 1;
- move16();
- }
- if ( EQ_16( s_and( st->restrictedMode, 4 ), 4 ) )
- {
- st->tcx10Enabled = 1;
- move16();
- }
-
- /* TCX mode (TCX20 TCX10_10 or NO_TCX) */
- if ( st->hTcxEnc != NULL )
- {
- hTcxEnc->tcxMode = NO_TCX;
- move16();
- }
-
- /* Bits Budget */
- /*st->bits_frame_nominal = (int)( (float)st->L_frame * (float)FSCALE_DENOM * (float)st->bitrate / ( (float)st->fscale * 12800.0f ) );*/
- /*st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f );*/
- /*328 = 0.010009765625 in 0Q15*/
- /* st->bits_frame_nominal = extract_h(L_add(L_mult(div_l(L_mult(shl(st->L_frame,2),st->bitrate),st->fscale),328),16056)); */
-
- /* st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f ); */
- tmp32 = L_shl( st->total_brate, 1 ); /* (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate */
- st->bits_frame_nominal = extract_l( L_shr( Mpy_32_16_1( tmp32, 20972 ), 6 ) ); /* 20972 = 0.01 * 64 * 32768 */
- move16();
-
- IF( st->Opt_AMR_WB )
- {
- st->bits_frame = st->bits_frame_nominal;
- move16();
- st->bits_frame_core = st->bits_frame_nominal;
- move16();
- st->frame_size_index = 0;
- move16();
- }
- ELSE
- {
- FOR( n = 0; n < FRAME_SIZE_NB; n++ )
- {
- IF( LT_32( n, FRAME_SIZE_NB - 1 ) )
- {
- test();
- IF( LE_32( FrameSizeConfig[n].frame_bits, st->bits_frame_nominal ) && GT_32( FrameSizeConfig[n + 1].frame_bits, st->bits_frame_nominal ) )
- {
- st->frame_size_index = n;
- move16();
- st->bits_frame = st->bits_frame_nominal;
- move16();
- st->bits_frame_core = sub( sub( sub( st->bits_frame_nominal, FrameSizeConfig[n].transmission_bits ), FrameSizeConfig[n].bandwidth_bits ), FrameSizeConfig[n].reserved_bits );
- move16();
- BREAK;
- }
- }
- ELSE
- {
- IF( LE_32( FrameSizeConfig[n].frame_bits, st->bits_frame_nominal ) )
- {
- st->frame_size_index = n;
- move16();
- st->bits_frame = st->bits_frame_nominal;
- move16();
- st->bits_frame_core = sub( sub( sub( st->bits_frame_nominal, FrameSizeConfig[n].transmission_bits ), FrameSizeConfig[n].bandwidth_bits ), FrameSizeConfig[n].reserved_bits );
- move16();
- BREAK;
- }
- }
- }
- }
-
- /* Reconfigure core */
- core_coder_reconfig_ivas_fx( st, last_total_brate );
-
-
- return;
-}
diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c
index 1f5b0df1eafb5c39c40903007588f03a852c8a84..4151725af295bb853a52ad006061c6eed3fb8a23 100644
--- a/lib_enc/core_enc_init_fx.c
+++ b/lib_enc/core_enc_init_fx.c
@@ -28,6 +28,11 @@ static void init_core_sig_ana_fx( Encoder_State *st );
static void init_acelp_fx( Encoder_State *st, Word16 L_frame_old, const Word16 shift );
static void init_modes_fx( Encoder_State *st, const Word32 Last_total_brate );
static void init_sig_buffers_fx( Encoder_State *st, const Word16 L_frame_old, const Word16 L_subfr );
+static void init_tcx_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word32 total_brate, const Word32 last_total_brate, const Word16 MCT_flag );
+static void init_core_sig_ana_ivas_fx( Encoder_State *st );
+static void init_modes_ivas_fx( Encoder_State *st, const Word32 last_total_brate );
+static void init_sig_buffers_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word16 L_subfr, const int32_t last_total_brate );
+static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 shift, const int32_t last_total_brate );
/*-----------------------------------------------------------------------*
* init_coder_ace_plus_fx()
@@ -930,5 +935,1004 @@ static void init_modes_fx(
core_coder_reconfig_fx( st, last_total_brate );
+ return;
+}
+
+/*-----------------------------------------------------------------------*
+ * init_coder_ace_plus()
+ *
+ * Initialization of state variables
+ *-----------------------------------------------------------------------*/
+void init_coder_ace_plus_ivas_fx(
+ Encoder_State *st, /* i : Encoder state */
+ const Word32 last_total_brate, /* i : last total bitrate */
+#ifdef FIX_920_IGF_INIT_ERROR
+ const Word32 igf_brate, /* i : IGF configuration bitrate */
+#endif
+ const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) */
+)
+{
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+ Word16 L_frame_old; /*keep old frame size for switching */
+ Word16 L_subfr;
+
+ /* Bitrate */
+ st->tcxonly = getTcxonly_ivas_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
+ move16();
+
+ /* Core Sampling Rate */
+ st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format );
+ st->fscale = sr2fscale_fx( st->sr_core );
+ move32();
+ move16();
+
+ /* Narrowband? */
+ IF( EQ_16( st->bwidth, NB ) )
+ {
+ st->narrowBand = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->narrowBand = 0;
+ move16();
+ }
+
+ /* Core Framing */
+ L_frame_old = st->last_L_frame;
+ move16();
+ st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
+ move16();
+ st->L_frame_past = -1;
+ move16();
+
+ IF( hTcxEnc != NULL )
+ {
+ hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
+ move16();
+
+ IF( st->ini_frame == 0 )
+ {
+ set16_fx( hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
+ hTcxEnc->acelp_zir = hTcxEnc->Txnq + L_FRAME / 2;
+ hTcxEnc->q_Txnq = Q15;
+ move16();
+ hTcxEnc->tcx_target_bits_fac = ONE_IN_Q14;
+ move16();
+ }
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( st->element_mode == EVS_MONO && EQ_32( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->element_mode > EVS_MONO && EQ_32( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, MAX_ACELP_BRATE ) ) )
+ {
+ st->nb_subfr = NB_SUBFR16k;
+ move16();
+ }
+ ELSE
+ {
+ st->nb_subfr = NB_SUBFR;
+ move16();
+ }
+ L_subfr = idiv1616( st->L_frame, st->nb_subfr );
+
+ /* Core Lookahead */
+ st->encoderLookahead_enc = NS2SA_FX2( st->sr_core, ACELP_LOOK_NS );
+ st->encoderLookahead_FB = NS2SA_FX2( st->input_Fs, ACELP_LOOK_NS );
+ move16();
+ move16();
+
+ IF( st->ini_frame == 0 )
+ {
+ st->acelpFramesCount = 0;
+ move16();
+ st->prevTempFlatness_fx = 128 /*1.0f Q7*/;
+ move16();
+ }
+
+ /* Initialize TBE */
+ IF( st->hBWE_TD != NULL )
+ {
+ st->hBWE_TD->prev_coder_type = GENERIC;
+ move16();
+ set16_fx( st->hBWE_TD->prev_lsf_diff_fx, 16384, LPC_SHB_ORDER - 2 );
+ st->hBWE_TD->prev_tilt_para_fx = 0;
+ move16();
+ set16_fx( st->hBWE_TD->cur_sub_Aq_fx, 0, M + 1 );
+ }
+
+ st->currEnergyHF_fx = 0;
+ move32();
+ st->currEnergyHF_e_fx = 0;
+ move16();
+ test();
+ /* Initialize LPC analysis/quantization */
+ IF( LE_32( st->sr_core, INT_FS_16k ) && st->tcxonly == 0 )
+ {
+ st->lpcQuantization = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->lpcQuantization = 0;
+ move16();
+ }
+
+ st->next_force_safety_net = 0;
+ move16();
+ test();
+ test();
+ IF( ( NE_16( st->last_L_frame, st->L_frame ) ) || ( EQ_16( st->last_core, AMR_WB_CORE ) ) || ( EQ_16( st->last_core, HQ_CORE ) ) )
+ {
+ set16_fx( st->mem_MA_fx, 0, M );
+ Copy( GEWB_Ave_fx, st->mem_AR_fx, M );
+ }
+
+ /* Initialize IGF */
+ if ( st->hIGFEnc != NULL )
+ {
+ st->hIGFEnc->infoStopFrequency = -1;
+ move16();
+ }
+
+ test();
+ IF( st->igf && st->hIGFEnc != NULL )
+ {
+#ifdef FIX_920_IGF_INIT_ERROR
+ IGFEncSetMode_ivas_fx( st->hIGFEnc, igf_brate, st->bwidth, st->element_mode, st->rf_mode );
+#else
+ IGFEncSetMode_ivas_fx( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode );
+#endif
+ }
+ ELSE IF( st->hIGFEnc != NULL )
+ {
+ st->hIGFEnc->infoTotalBitsWritten = 0;
+ move16();
+ st->hIGFEnc->infoTotalBitsPerFrameWritten = 0;
+ move16();
+ }
+
+ /* Initialize Core Signal Analysis Module */
+ init_core_sig_ana_ivas_fx( st );
+
+
+ /* Initialize TCX */
+ IF( hTcxEnc != NULL )
+ {
+ init_tcx_ivas_fx( st, L_frame_old, st->total_brate, last_total_brate, MCT_flag );
+ }
+
+ /* Initialize Signal Buffers */
+ init_sig_buffers_ivas_fx( st, L_frame_old, L_subfr, last_total_brate );
+
+ /* Initialize ACELP */
+
+ init_acelp_ivas_fx( st, L_frame_old, 0, last_total_brate );
+
+ if ( st->ini_frame == 0 )
+ {
+ st->tec_tfa = 0;
+ move16();
+ }
+
+ IF( st->hTECEnc != NULL )
+ {
+ resetTecEnc_Fx( st->hTECEnc, st->tec_tfa );
+ }
+
+ test();
+ test();
+ test();
+ IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
+ {
+ st->tec_tfa = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->tec_tfa = 0;
+ move16();
+ }
+
+ st->tec_flag = 0;
+ move16();
+ st->tfa_flag = 0;
+ move16();
+
+ test();
+ test();
+ test();
+ IF( ( EQ_32( st->total_brate, ACELP_9k60 ) || EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
+ {
+ st->glr = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->glr = 0;
+ move16();
+ }
+
+ st->glr_reset = 0;
+ move16();
+
+ /* Initialize ACELP/TCX Modes */
+ init_modes_ivas_fx( st, last_total_brate );
+
+ /* Adaptive BPF */
+ set32_fx( st->mem_bpf_fx1, 0, 2 * L_FILT16k );
+ set32_fx( st->mem_error_bpf_fx, 0, 2 * L_FILT16k );
+
+ IF( st->ini_frame == 0 )
+ {
+ st->Q_max_enc[0] = 15;
+ move16();
+ st->Q_max_enc[1] = 15;
+ move16();
+ }
+
+ IF( GE_32( st->total_brate, HQ_48k ) )
+ {
+ st->enablePlcWaveadjust = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->enablePlcWaveadjust = 0;
+ move16();
+ }
+
+ IF( st->hPlcExt )
+ {
+ init_PLC_enc_fx( st->hPlcExt, st->sr_core );
+ }
+
+ st->glr_idx[0] = 0;
+ move16();
+ st->glr_idx[1] = 0;
+ move16();
+ st->mean_gc[0] = 0;
+ move16();
+ st->mean_gc[1] = 0;
+ move16();
+ st->prev_lsf4_mean = 0;
+ move16();
+ st->last_stab_fac = 0;
+ move16();
+
+ return;
+}
+
+/*-----------------------------------------------------------------------*
+ * init_tcx()
+ *
+ * Initialization of TCX
+ *-----------------------------------------------------------------------*/
+
+
+static void init_tcx_ivas_fx(
+ Encoder_State *st,
+ const Word16 L_frame_old,
+ const Word32 total_brate,
+ const Word32 last_total_brate,
+ const Word16 MCT_flag )
+{
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+
+ /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */
+ hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx;
+ hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX;
+ st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0;
+ move16();
+ move16();
+
+ init_tcx_cfg_ivas_fx( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX,
+ st->fscale, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf,
+ st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag );
+
+ /* Init TCX target bits correction factor */
+ hTcxEnc->tcx_target_bits_fac = 0x4000; /*1.0f in 1Q14*/
+ move16();
+ hTcxEnc->measuredBwRatio = 0x4000; /*1.0f in 1Q14*/
+ move16();
+ hTcxEnc->noiseTiltFactor = 9216; /*0.5625f in 1Q14*/
+ move16();
+ hTcxEnc->noiseLevelMemory_cnt = 0;
+ move16();
+
+ set16_fx( hTcxEnc->ltpGainMemory_fx, 0, N_LTP_GAIN_MEMS );
+ set8_fx( hTcxEnc->memQuantZeros, 0, L_FRAME_PLUS );
+
+ /* TCX-LTP */
+ hTcxEnc->tcxltp = getTcxLtp( st->sr_core );
+ move16();
+
+ test();
+ test();
+ test();
+ test();
+ IF( st->ini_frame == 0 )
+ {
+ hTcxEnc->tcxltp_pitch_int_past = st->L_frame;
+ hTcxEnc->tcxltp_pitch_fr_past = 0;
+ hTcxEnc->tcxltp_gain_past = 0;
+ hTcxEnc->tcxltp_norm_corr_past = 0;
+ hTcxEnc->tcxltp_norm_corr_mem = 0;
+ hTcxEnc->kernel_switch_corr_past = 0;
+ hTcxEnc->kernel_symmetry_past = 0; /* MDCT_IV & 1 */
+ hTcxEnc->enc_ste_pre_corr_past = 0;
+ hTcxEnc->tfm_mem_fx = 1610612736; /* 0.75 in Q31 */
+ hTcxEnc->tcxltp_on_mem = 0;
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ }
+ ELSE IF( NE_16( st->L_frame, L_frame_old ) && !( ( GE_32( total_brate, ACELP_16k40 ) && LE_32( total_brate, ACELP_24k40 ) ) &&
+ ( EQ_32( total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
+ {
+ Word16 pitres, pitres_old;
+ Word16 pit, pit_old;
+
+ pitres_old = 4;
+ move16();
+ if ( EQ_16( 160, shr( L_frame_old, sub( 7, norm_s( L_frame_old ) ) ) ) ) /*if ( L_frame_old%160==0 )*/
+ {
+ pitres_old = 6;
+ move16();
+ }
+
+ /*pit_old = (float)st->tcxltp_pitch_int_past + (float)st->tcxltp_pitch_fr_past/(float)pitres_old;*/
+ pit_old = add( hTcxEnc->tcxltp_pitch_int_past, mult_r( hTcxEnc->tcxltp_pitch_fr_past, div_s( 1, pitres_old ) ) );
+
+ pitres = 4;
+ move16();
+ if ( EQ_16( 160, shr( st->L_frame, sub( 7, norm_s( st->L_frame ) ) ) ) ) /*if ( st->L_frame%160==0 )*/
+ {
+ pitres = 6;
+ move16();
+ }
+
+ /*pit = pit_old * (float)st->L_frame/(float)L_frame_old;*/
+ pit = shl_sat( mult_r( pit_old, div_s( st->L_frame, shl( L_frame_old, 2 ) ) ), 2 );
+ /* Note : the saturation here that can happens when FS == 32kHz*/
+ /* assert(pit <= st->L_frame);*/
+
+ hTcxEnc->tcxltp_pitch_int_past = pit;
+ move16();
+ hTcxEnc->tcxltp_pitch_fr_past = i_mult2( sub( pit, hTcxEnc->tcxltp_pitch_int_past ), pitres );
+ move16();
+ }
+
+ hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode );
+ move16();
+
+ return;
+}
+
+/*-----------------------------------------------------------------------*
+ * init_sig_buffers()
+ *
+ * Initialization of signal buffers
+ *-----------------------------------------------------------------------*/
+/*copy of evs function since it was static */
+static void init_sig_buffers_ivas_fx( Encoder_State *st, const Word16 L_frame_old, const Word16 L_subfr, const int32_t last_total_brate )
+{
+
+ LPD_state_HANDLE hLPDmem = st->hLPDmem;
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+
+ /* Encoder Past Samples at encoder-sampling-rate */
+ st->encoderPastSamples_enc = shr( imult1616( st->L_frame, 9 ), 4 );
+ move16();
+
+ /* Initialize Signal Buffers and Pointers at encoder-sampling-rate */
+ IF( st->ini_frame == 0 )
+ {
+ set16_fx( st->buf_speech_enc, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
+ st->exp_buf_speech_enc = 0;
+ move16();
+ set16_fx( st->buf_speech_enc_pe, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
+ st->exp_buf_speech_enc_pe = 0;
+ move16();
+ if ( hTcxEnc != NULL )
+ {
+ set16_fx( hTcxEnc->buf_speech_ltp, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
+ hTcxEnc->exp_buf_speech_ltp = 0;
+ move16();
+ }
+ set16_fx( st->buf_wspeech_enc, 0, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); /* increased by 320 to avoid memory overlap in ivas_find_wsp_fx() and also to accomodate for the wspeech_enc */
+ st->exp_buf_wspeech_enc = 0;
+ move16();
+ }
+ ELSE
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( NE_16( st->L_frame, L_frame_old ) && !( ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && ( EQ_32( st->total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
+ {
+ lerp( st->buf_speech_enc, st->buf_speech_enc, st->L_frame, L_frame_old );
+ test();
+ IF( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) /* condition should be checked again */
+ {
+ Copy( st->buf_speech_enc, hTcxEnc->buf_speech_ltp, st->L_frame );
+ Scale_sig( hTcxEnc->buf_speech_ltp, st->L_frame, sub( st->exp_buf_speech_enc, s_max( st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(15-max(st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp))
+ Scale_sig( hTcxEnc->buf_speech_ltp + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( hTcxEnc->exp_buf_speech_ltp, s_max( st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(15-max(st->exp_buf_speech_enc, hTcxEnc->exp_buf_speech_ltp))
+ hTcxEnc->exp_buf_speech_ltp = s_max( hTcxEnc->exp_buf_speech_ltp, st->exp_buf_speech_enc );
+ move16();
+ }
+
+ // Copy_Scale_sig( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
+ Copy( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM );
+ st->exp_buf_wspeech_enc = st->exp_old_wsp;
+ move16();
+
+ /*Resamp buffers needed only for ACELP*/
+ test();
+ test();
+ IF( EQ_16( st->L_frame, L_FRAME ) && !st->tcxonly )
+ {
+ // Copy_Scale_sig( st->old_inp_12k8_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
+ Copy( st->old_inp_12k8_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM );
+ /* SCaling to common exponent*/
+ Scale_sig( st->buf_speech_enc_pe + sub( st->L_frame, L_INP_MEM ), L_INP_MEM, sub( st->exp_old_inp_12k8, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
+ Scale_sig( st->buf_speech_enc_pe, sub( st->L_frame, L_INP_MEM ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
+ Scale_sig( st->buf_speech_enc_pe + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ) ) ); // Q(15-max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe ))
+ st->exp_buf_speech_enc_pe = s_max( st->exp_old_inp_12k8, st->exp_buf_speech_enc_pe );
+ move16();
+ }
+ ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) && !st->tcxonly )
+ {
+ lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM );
+ Copy( st->old_inp_16k_fx, st->buf_speech_enc_pe + st->L_frame - L_INP_MEM, L_INP_MEM );
+ /* SCaling to common exponent*/
+ Scale_sig( st->buf_speech_enc_pe + sub( st->L_frame, L_INP_MEM ), L_INP_MEM, sub( st->exp_old_inp_16k, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
+ Scale_sig( st->buf_speech_enc_pe, sub( st->L_frame, L_INP_MEM ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
+ Scale_sig( st->buf_speech_enc_pe + st->L_frame, sub( L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, st->L_frame ), sub( st->exp_buf_speech_enc_pe, s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe ) ) );
+ st->exp_buf_speech_enc_pe = s_max( st->exp_old_inp_16k, st->exp_buf_speech_enc_pe );
+ move16();
+ }
+
+ st->mem_preemph_enc = st->buf_speech_enc[st->encoderPastSamples_enc + st->encoderLookahead_enc - 1];
+ move16();
+ st->exp_mem_preemph_enc = st->exp_buf_speech_enc;
+ move16();
+ st->mem_wsp_enc = shr( st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1], sub( Q16, st->exp_buf_wspeech_enc ) ); // Q-1
+ move16();
+ }
+ /*coming from TCXonly modes*/
+ ELSE IF( !st->tcxonly && GE_32( last_total_brate, ACELP_32k ) )
+ {
+
+ Copy( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM );
+ // Copy_Scale_sig( st->old_wsp_fx, st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, L_WSP_MEM, sub( st->prev_Q_new, st->prev_Q_old ) );
+ st->exp_buf_wspeech_enc = st->exp_old_wsp;
+ move16(); /*Resamp buffers needed only for ACELP*/
+ IF( EQ_16( st->L_frame, L_FRAME16k ) )
+ {
+ lerp( st->buf_wspeech_enc + st->L_frame + L_SUBFR - L_WSP_MEM, st->buf_wspeech_enc + st->L_frame + L_SUBFR - 310, 310, L_WSP_MEM );
+ }
+ hLPDmem->mem_w0 = 0;
+ move16();
+ st->mem_wsp_enc = shr( st->buf_wspeech_enc[st->L_frame + L_SUBFR - 1], sub( Q16, st->exp_buf_wspeech_enc ) ); // Q-1
+ move16();
+ }
+ }
+
+ st->new_speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc + st->encoderLookahead_enc;
+ st->new_speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc + st->encoderLookahead_enc;
+ if ( hTcxEnc != NULL )
+ {
+ hTcxEnc->new_speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc + st->encoderLookahead_enc;
+ }
+
+ IF( st->hTcxEnc != NULL )
+ {
+ st->hTcxEnc->new_speech_TCX = st->input_buff_fx + Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 );
+ st->hTcxEnc->speech_TCX = st->hTcxEnc->new_speech_TCX - st->encoderLookahead_FB;
+ }
+ st->speech_enc = st->buf_speech_enc + st->encoderPastSamples_enc;
+ st->speech_enc_pe = st->buf_speech_enc_pe + st->encoderPastSamples_enc;
+
+ if ( hTcxEnc != NULL )
+ {
+ hTcxEnc->speech_ltp = hTcxEnc->buf_speech_ltp + st->encoderPastSamples_enc;
+ }
+
+ IF( st->element_mode > EVS_MONO )
+ {
+ st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_SUBFR;
+ }
+ ELSE
+ {
+ st->wspeech_enc = st->buf_wspeech_enc + st->L_frame + L_subfr;
+ }
+
+ test();
+ test();
+ IF( st->ini_frame == 0 || NE_16( st->L_frame, L_frame_old ) || EQ_16( st->last_codec_mode, MODE1 ) )
+ {
+ set16_fx( st->buf_synth, 0, OLD_SYNTH_SIZE_ENC + L_FRAME32k );
+ }
+
+ st->synth = st->buf_synth + st->L_frame + L_subfr;
+
+
+ return;
+}
+
+/*-----------------------------------------------------------------------*
+ * init_core_sig_ana()
+ *
+ *
+ *-----------------------------------------------------------------------*/
+static void init_core_sig_ana_ivas_fx( Encoder_State *st )
+{
+
+ /* Pre-emphasis factor and memory */
+
+ st->preemph_fac = PREEMPH_FAC_SWB; /*SWB*/
+ move16();
+ IF( LT_16( st->fscale, ( 16000 * FSCALE_DENOM ) / 12800 ) )
+ {
+ st->preemph_fac = PREEMPH_FAC; /*WB*/
+ move16();
+ }
+ ELSE IF( LT_16( st->fscale, ( 24000 * FSCALE_DENOM ) / 12800 ) )
+ {
+ st->preemph_fac = PREEMPH_FAC_16k; /*WB*/
+ move16();
+ }
+
+ st->gamma = GAMMA1;
+ move16();
+ st->inv_gamma = GAMMA1_INV;
+ move16();
+ IF( EQ_32( st->sr_core, 16000 ) )
+ {
+ st->gamma = GAMMA16k;
+ move16();
+ st->inv_gamma = GAMMA16k_INV;
+ move16();
+ }
+
+
+ st->min_band = 1;
+ move16();
+ st->max_band = 16;
+ move16();
+
+ IF( st->narrowBand == 0 )
+ {
+ st->min_band = 0;
+ move16();
+ st->max_band = 19;
+ move16();
+ }
+
+
+ return;
+}
+/*-----------------------------------------------------------------------*
+ * init_acelp()
+ *
+ *
+ *-----------------------------------------------------------------------*/
+static void init_acelp_ivas_fx( Encoder_State *st, Word16 L_frame_old, Word16 shift, const int32_t last_total_brate )
+{
+ Word16 mem_syn_r_size_old;
+ Word16 mem_syn_r_size_new;
+ LPD_state_HANDLE hLPDmem = st->hLPDmem;
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+
+ /* Init pitch lag */
+ IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ /* TCX LTP ana always runs @12.8kHz */
+ st->pit_res_max = initPitchLagParameters( 12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max );
+ move16();
+ }
+ ELSE
+ {
+ st->pit_res_max = initPitchLagParameters( st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max );
+ move16();
+ }
+
+ /* Init LPDmem */
+ IF( st->ini_frame == 0 )
+ {
+ IF( hLPDmem != NULL )
+ {
+ set16_fx( hLPDmem->syn, 0, 1 + M );
+ set16_fx( hLPDmem->mem_syn_r, 0, L_SYN_MEM );
+ }
+
+ IF( st->hTcxEnc != NULL )
+ {
+ set16_fx( st->hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
+ st->hTcxEnc->q_Txnq = Q15;
+ move16();
+ st->hTcxEnc->acelp_zir = st->hTcxEnc->Txnq + shr( st->L_frame, 1 );
+ }
+ }
+ ELSE /*Rate switching*/
+ {
+ IF( st->last_core == ACELP_CORE )
+ {
+ lerp( hTcxEnc->Txnq, hTcxEnc->Txnq, shr( st->L_frame, 1 ), shr( L_frame_old, 1 ) );
+ }
+ ELSE
+ {
+ lerp( hTcxEnc->Txnq, hTcxEnc->Txnq, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_length_old );
+ }
+ hTcxEnc->acelp_zir = hTcxEnc->Txnq + shr( st->L_frame, 1 );
+
+ /* Rate switching */
+ IF( EQ_16( st->last_codec_mode, MODE1 ) && st->element_mode == EVS_MONO )
+ {
+ IF( hLPDmem != NULL )
+ {
+ Copy( hLPDmem->mem_syn1_fx, hLPDmem->mem_syn2, M );
+ set16_fx( hLPDmem->syn, 0, M );
+ hLPDmem->q_lpd_syn = Q15;
+ move16();
+ }
+ IF( st->hTcxEnc != NULL )
+ {
+ set16_fx( hTcxEnc->Txnq, 0, L_FRAME32k / 2 + 64 );
+ st->hTcxEnc->q_Txnq = Q15;
+ move16();
+ }
+ }
+
+ /*AMR-WBIO->MODE2*/
+ IF( EQ_16( st->last_core, AMR_WB_CORE ) )
+ {
+ st->next_force_safety_net = 1;
+ move16();
+ st->last_core = ACELP_CORE;
+ move16();
+ }
+ /*HQ-CORE->MODE2*/
+ test();
+ IF( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->last_core, HQ_CORE ) )
+ {
+ /*Reset of ACELP memories*/
+ st->next_force_safety_net = 1;
+ move16();
+ st->rate_switching_reset = 1;
+ move16();
+ IF( hLPDmem != NULL )
+ {
+ hLPDmem->tilt_code = TILT_CODE;
+ move16();
+ set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
+ set16_fx( hLPDmem->syn, 0, 1 + M );
+ hLPDmem->q_lpd_syn = Q15;
+ move16();
+ hLPDmem->q_lpd_old_exc = Q15;
+ move16();
+ hLPDmem->mem_w0 = 0;
+ move16();
+ set16_fx( hLPDmem->mem_syn, 0, M );
+ set16_fx( hLPDmem->mem_syn2, 0, M );
+ hLPDmem->q_mem_syn = Q15;
+ move16();
+ }
+
+ /* unquantized LPC*/
+ test();
+ test();
+ test();
+ IF( !( ( GE_32( st->total_brate, ACELP_16k40 ) && LE_32( st->total_brate, ACELP_24k40 ) ) && ( EQ_32( st->total_brate, last_total_brate ) ) && ( EQ_16( st->last_bwidth, st->bwidth ) ) ) )
+ {
+ Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); /*lsp old @12.8kHz*/
+ IF( EQ_16( st->L_frame, L_FRAME16k ) )
+ {
+ lsp_convert_poly_fx( st->lspold_enc_fx, st->L_frame, 0 );
+ }
+ }
+ Copy( st->lspold_enc_fx, st->lsp_old_fx, M ); /*used unquantized values for mid-LSF Q*/
+ IF( st->tcxonly == 0 )
+ {
+ lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
+ }
+ ELSE
+ {
+ E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
+ }
+ st->last_core = TCX_20_CORE;
+ move16();
+
+ st->hTcxCfg->last_aldo = 1; /*It was previously ALDO*/
+ st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW;
+ move16();
+ move16();
+ /*ALDO overlap windowed past: also used in MODE1 but for other MDCT-FB*/
+ set16_fx( hTcxEnc->old_out_fx, 0, st->L_frame );
+ }
+ ELSE
+ {
+ test();
+ test();
+ test();
+ test();
+ IF( ( NE_16( st->L_frame, L_frame_old ) ) && ( LE_16( st->L_frame, L_FRAME16k ) ) && ( LE_16( L_frame_old, L_FRAME16k ) ) )
+ {
+ /* convert quantized LSP vector */
+ st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 );
+ move16();
+ IF( st->tcxonly == 0 )
+ {
+ lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
+ }
+ ELSE
+ {
+ E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
+ }
+ IF( EQ_16( st->L_frame, L_FRAME16k ) )
+ {
+ Copy( st->lsp_old_fx, st->lspold_enc_fx, M );
+ }
+ ELSE
+ {
+ Copy( st->lsp_old1_fx, st->lspold_enc_fx, M );
+ }
+
+
+ /*Mem of deemphasis stay unchanged : hLPDmem->syn*/
+ IF( hLPDmem != NULL )
+ {
+ synth_mem_updt2( st->L_frame, st->last_L_frame, hLPDmem->old_exc, hLPDmem->mem_syn_r, hLPDmem->mem_syn2, hLPDmem->mem_syn, ENC );
+ Word16 tmp, A[M + 1], Ap[M + 1], tmp_buf[M + 1];
+ /* Update wsyn */
+ /* lsp2a_stab( st->lsp_old, A, M ); */
+ E_LPC_f_lsp_a_conversion( st->lsp_old_fx, A, M );
+ weight_a_fx( A, Ap, GAMMA1, M );
+ tmp = 0;
+ move16();
+ tmp_buf[0] = 0;
+ move16();
+ Copy( hLPDmem->mem_syn2, tmp_buf + 1, M );
+ deemph_fx( tmp_buf + 1, st->preemph_fac, M, &tmp );
+ Residu3_fx( Ap, tmp_buf + M, &tmp, 1, 1 );
+ hLPDmem->mem_w0 = sub_sat( shr_sat( st->wspeech_enc[-1], shift ), tmp );
+ move16();
+ }
+ }
+ ELSE IF( ( NE_16( st->L_frame, L_frame_old ) ) )
+ {
+ /*Partial reset of ACELP memories*/
+ st->next_force_safety_net = 1;
+ move16();
+ st->rate_switching_reset = 1;
+ move16();
+
+ /*reset partly some memories*/
+ IF( hLPDmem != NULL )
+ {
+ hLPDmem->tilt_code = TILT_CODE;
+ move16();
+ set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
+ move16();
+ hLPDmem->q_lpd_old_exc = Q15;
+ move16();
+ /*Resamp others memories*/
+ /*Size of LPC syn memory*/
+ /* 1.25/20.0 = 1.0/16.0 -> shift 4 to the right. */
+ mem_syn_r_size_old = shr( L_frame_old, 4 );
+ mem_syn_r_size_new = shr( st->L_frame, 4 );
+
+ lerp( hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_old, hLPDmem->mem_syn_r + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old );
+ Copy( hLPDmem->mem_syn_r + L_SYN_MEM - M, hLPDmem->mem_syn, M );
+ Copy( hLPDmem->mem_syn, hLPDmem->mem_syn2, M );
+
+ /*Untouched memories : hLPDmem->syn & hLPDmem->mem_w0*/
+ hLPDmem->mem_w0 = 0;
+ move16();
+ }
+ /* unquantized LPC*/
+ Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); /*lsp old @12.8kHz*/
+ IF( EQ_16( st->L_frame, L_FRAME16k ) )
+ {
+ lsp_convert_poly_fx( st->lspold_enc_fx, st->L_frame, 0 );
+ }
+ Copy( st->lspold_enc_fx, st->lsp_old_fx, M ); /*used unquantized values for mid-LSF Q*/
+ IF( st->tcxonly == 0 )
+ {
+ lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
+ }
+ ELSE
+ {
+ E_LPC_lsp_lsf_conversion( st->lsp_old_fx, st->lsf_old_fx, M );
+ }
+ }
+ ELSE IF( !st->tcxonly && EQ_16( st->L_frame, L_FRAME16k ) && GT_32( st->last_total_brate, ACELP_32k ) )
+ {
+ lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core );
+ }
+ }
+ }
+
+ test();
+ test();
+ if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && st->ini_frame != 0 )
+ {
+ st->rate_switching_reset = 1;
+ move16();
+ }
+
+ /* Post-processing */
+ /*EVS specific*/
+ /* hLPDmem->dm_fx.prev_gain_code = L_deposit_l( 0 );
+ set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
+ hLPDmem->dm_fx.prev_state = 0;*/
+ /*------------*/
+
+ if ( hLPDmem != NULL )
+ {
+ hLPDmem->dm_fx.prev_state = 0;
+ move16(); /* This corresponds to st_fx->dispMem in FLP */
+ hLPDmem->dm_fx.prev_gain_code = 0;
+ move32();
+
+ FOR( Word16 i = 2; i < 8; i++ )
+ {
+ hLPDmem->dm_fx.prev_gain_pit[i - 2] = 0;
+ move16();
+ }
+ hLPDmem->gc_threshold = 0;
+ move16();
+ }
+
+ /* Pulse Search configuration */
+ st->acelp_autocorr = 1;
+ move16();
+
+ /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/
+ test();
+ test();
+ if ( ( LE_32( st->total_brate, ACELP_9k60 ) || EQ_16( st->rf_mode, 1 ) ) && ( EQ_32( st->sr_core, 12800 ) ) )
+ {
+ st->acelp_autocorr = 0;
+ move16();
+ }
+
+
+ /*BPF parameters for adjusting gain in function of background noise*/
+ IF( EQ_16( st->codec_mode, MODE2 ) )
+ {
+ st->mem_bpf_fx.lp_error_ener = L_deposit_l( 0 );
+ move32();
+ st->pst_lp_ener_fx = 0;
+ move16();
+ IF( EQ_16( st->last_codec_mode, MODE1 ) )
+ {
+ st->mem_bpf_fx.lp_error = 0;
+ move32();
+ st->pst_mem_deemp_err_fx = 0;
+ move16();
+ }
+ }
+
+ return;
+}
+/*-----------------------------------------------------------------------*
+ * init_modes()
+ *
+ *
+ *-----------------------------------------------------------------------*/
+
+static void init_modes_ivas_fx(
+ Encoder_State *st,
+ const Word32 last_total_brate )
+{
+ Word8 n;
+ Word32 tmp32;
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+
+ /* Restrict ACE/TCX20/TCX10 mode */
+ move16();
+ st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, st->Opt_AMR_WB );
+ move16();
+ st->acelpEnabled = 0;
+ move16();
+ st->tcx20Enabled = 0;
+ move16();
+ st->tcx10Enabled = 0;
+
+ if ( EQ_16( s_and( st->restrictedMode, 1 ), 1 ) )
+ {
+ st->acelpEnabled = 1;
+ move16();
+ }
+ if ( EQ_16( s_and( st->restrictedMode, 2 ), 2 ) )
+ {
+ st->tcx20Enabled = 1;
+ move16();
+ }
+ if ( EQ_16( s_and( st->restrictedMode, 4 ), 4 ) )
+ {
+ st->tcx10Enabled = 1;
+ move16();
+ }
+
+ /* TCX mode (TCX20 TCX10_10 or NO_TCX) */
+ if ( st->hTcxEnc != NULL )
+ {
+ hTcxEnc->tcxMode = NO_TCX;
+ move16();
+ }
+
+ /* Bits Budget */
+ /*st->bits_frame_nominal = (int)( (float)st->L_frame * (float)FSCALE_DENOM * (float)st->bitrate / ( (float)st->fscale * 12800.0f ) );*/
+ /*st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f );*/
+ /*328 = 0.010009765625 in 0Q15*/
+ /* st->bits_frame_nominal = extract_h(L_add(L_mult(div_l(L_mult(shl(st->L_frame,2),st->bitrate),st->fscale),328),16056)); */
+
+ /* st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f ); */
+ tmp32 = L_shl( st->total_brate, 1 ); /* (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate */
+ st->bits_frame_nominal = extract_l( L_shr( Mpy_32_16_1( tmp32, 20972 ), 6 ) ); /* 20972 = 0.01 * 64 * 32768 */
+ move16();
+
+ IF( st->Opt_AMR_WB )
+ {
+ st->bits_frame = st->bits_frame_nominal;
+ move16();
+ st->bits_frame_core = st->bits_frame_nominal;
+ move16();
+ st->frame_size_index = 0;
+ move16();
+ }
+ ELSE
+ {
+ FOR( n = 0; n < FRAME_SIZE_NB; n++ )
+ {
+ IF( LT_32( n, FRAME_SIZE_NB - 1 ) )
+ {
+ test();
+ IF( LE_32( FrameSizeConfig[n].frame_bits, st->bits_frame_nominal ) && GT_32( FrameSizeConfig[n + 1].frame_bits, st->bits_frame_nominal ) )
+ {
+ st->frame_size_index = n;
+ move16();
+ st->bits_frame = st->bits_frame_nominal;
+ move16();
+ st->bits_frame_core = sub( sub( sub( st->bits_frame_nominal, FrameSizeConfig[n].transmission_bits ), FrameSizeConfig[n].bandwidth_bits ), FrameSizeConfig[n].reserved_bits );
+ move16();
+ BREAK;
+ }
+ }
+ ELSE
+ {
+ IF( LE_32( FrameSizeConfig[n].frame_bits, st->bits_frame_nominal ) )
+ {
+ st->frame_size_index = n;
+ move16();
+ st->bits_frame = st->bits_frame_nominal;
+ move16();
+ st->bits_frame_core = sub( sub( sub( st->bits_frame_nominal, FrameSizeConfig[n].transmission_bits ), FrameSizeConfig[n].bandwidth_bits ), FrameSizeConfig[n].reserved_bits );
+ move16();
+ BREAK;
+ }
+ }
+ }
+ }
+
+ /* Reconfigure core */
+ core_coder_reconfig_ivas_fx( st, last_total_brate );
+
+
return;
}
diff --git a/lib_enc/core_enc_ol.c b/lib_enc/core_enc_ol.c
deleted file mode 100644
index c282f76495f73769d1f47f562ef810313573154f..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_ol.c
+++ /dev/null
@@ -1,46 +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
-#include "prot.h"
-#include "rom_com.h"
-#include "basop_proto_func.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
diff --git a/lib_enc/core_enc_reconf.c b/lib_enc/core_enc_reconf.c
deleted file mode 100644
index 2bffd1728894a7f0899c79889d5f0b99bc024d1c..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_reconf.c
+++ /dev/null
@@ -1,346 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-
-/*-----------------------------------------------------------------*
- * Funtion core_coder_reconfig *
- * ~~~~~~~~~~~~~~~~~~~ *
- * - reconfig core coder when switching to another frame type *
- *-----------------------------------------------------------------*/
-
-void core_coder_reconfig_ivas_fx(
- Encoder_State *st,
- const int32_t last_total_brate )
-{
- Word16 i, bwidth, index;
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
- /*Configuration of ACELP*/
- BITS_ALLOC_init_config_acelp( st->total_brate, st->narrowBand, st->nb_subfr, &( st->acelp_cfg ) );
-
- /*Configuration of partial copy*/
- IF( st->Opt_RF_ON )
- {
- st->hRF->acelp_cfg_rf.mode_index = 1;
- st->hRF->acelp_cfg_rf.midLpc = 0;
- st->hRF->acelp_cfg_rf.midLpc_enable = 0;
- st->hRF->acelp_cfg_rf.pre_emphasis = 0;
- st->hRF->acelp_cfg_rf.formant_enh = 1;
- st->hRF->acelp_cfg_rf.formant_tilt = 1;
- st->hRF->acelp_cfg_rf.voice_tilt = 1;
- st->hRF->acelp_cfg_rf.formant_enh_num = FORMANT_SHARPENING_G1;
- st->hRF->acelp_cfg_rf.formant_enh_den = FORMANT_SHARPENING_G2;
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- }
-
- IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- st->nb_bits_header_tcx = 2; /* signal class */
- move16();
- }
- ELSE IF( st->tcxonly )
- {
- st->nb_bits_header_tcx = 1 + 1; /*TCX20/TCX10 + last_core*/
- st->nb_bits_header_tcx = add( st->nb_bits_header_tcx, 2 ); /* Siganl class*/
- move16();
- move16();
- }
- ELSE
- {
- st->nb_bits_header_ace = 1 + 2 + 1; /*TCX/ACELP+coder_type + last_core*/
- st->nb_bits_header_tcx = st->nb_bits_header_ace;
- move16();
- move16();
-
- IF( st->hTcxCfg != NULL )
- {
- IF( st->hTcxCfg->lfacNext <= 0 )
- {
- st->nb_bits_header_ace = sub( st->nb_bits_header_ace, 1 ); /*No last_core*/
- move16();
- }
- }
- }
-
-
- /*Switch off TCX or ACELP?*/
- IF( EQ_32( st->sr_core, INT_FS_12k8 ) )
- {
- st->acelpEnabled = extract_l( EQ_16( ( s_and( st->restrictedMode, 1 ) ), 1 ) );
- st->tcx20Enabled = extract_l( EQ_16( ( s_and( st->restrictedMode, 2 ) ), 2 ) );
- move16();
- move16();
- }
- st->prevEnergyHF_fx = st->currEnergyHF_fx = 1073725440l /*65535.0f Q14*/; /* prevent block switch */
- st->currEnergyHF_e_fx = 17;
- move32();
- move16();
-
- /*Sanity check : don't need to be instrumented*/
- IF( st->tcxonly == 0 )
- {
- assert( st->acelpEnabled || st->tcx20Enabled || st->frame_size_index == 0 );
- }
- ELSE
- {
- assert( st->tcx10Enabled || st->tcx20Enabled || st->frame_size_index == 0 );
- }
-
- /* TCX-LTP */
- IF( st->hTcxEnc != NULL )
- {
- hTcxEnc->tcxltp = getTcxLtp( st->sr_core );
- move16();
- }
-
- /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/
-
- st->acelp_autocorr = 1;
- move16();
-
- test();
- if ( ( LE_32( st->total_brate, ACELP_9k60 ) ) && ( EQ_32( st->sr_core, INT_FS_12k8 ) ) )
- {
- st->acelp_autocorr = 0;
- move16();
- }
-
- /*Get bandwidth mode*/
- IF( st->narrowBand )
- {
- move16();
- bwidth = NB;
- }
- ELSE IF( LE_32( st->sr_core, INT_FS_16k ) )
- {
- move16();
- bwidth = WB;
- }
- ELSE
- {
- move16();
- bwidth = SWB;
- }
-
- /*Scale TCX for non-active frames to adjust loudness with ACELP*/
- IF( st->hTcxCfg != NULL )
- {
- st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/;
- move16();
-
- test();
- IF( LT_16( bwidth, 2 ) && ( st->tcxonly == 0 ) )
- {
- /*const Word16 scaleTableSize = sizeof(scaleTcxTable) / sizeof(scaleTcxTable[0]);*/
-
- FOR( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ )
- {
-
- test();
- test();
- IF( EQ_16( bwidth, scaleTcxTable[i].bwmode ) &&
- GE_32( st->total_brate, scaleTcxTable[i].bitrateFrom ) &&
- LT_32( st->total_brate, scaleTcxTable[i].bitrateTo ) )
- {
- if ( st->rf_mode )
- {
- i = sub( i, 1 );
- }
- move16();
- st->hTcxCfg->na_scale = scaleTcxTable[i].scale;
- BREAK;
- }
- }
- }
- }
- st->enableTcxLpc = 0;
- move16();
- IF( GT_16( st->element_mode, IVAS_SCE ) )
- {
- test();
- test();
- st->enableTcxLpc = ( EQ_16( st->lpcQuantization, 1 ) && ( LE_32( st->total_brate, LOWRATE_TCXLPC_MAX_BR_CPE ) || st->rf_mode ) );
- move16();
- }
- ELSE
- {
- test();
- test();
- if ( EQ_16( st->lpcQuantization, 1 ) && ( LE_32( st->total_brate, LOWRATE_TCXLPC_MAX_BR ) || st->rf_mode != 0 ) )
- {
- st->enableTcxLpc = 1;
- move16();
- }
- }
- test();
- IF( st->ini_frame == 0 || EQ_16( st->last_codec_mode, MODE1 ) )
- {
- st->envWeighted = 0;
- move16();
- }
-
- test();
- test();
- test();
- IF( EQ_16( st->bwidth, SWB ) &&
- ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
- {
- IF( st->tec_tfa == 0 )
- {
- FOR( i = 0; i < MAX_TEC_SMOOTHING_DEG; i++ )
- {
- st->hTECEnc->loBuffer[i] = 0;
- move16();
- }
- }
- st->tec_tfa = 1;
- move16();
- }
- ELSE
- {
- st->tec_tfa = 0;
- move16();
- }
-
- st->enablePlcWaveadjust = 0;
- move16();
- if ( GE_32( st->total_brate, HQ_48k ) )
- {
- st->enablePlcWaveadjust = 1;
- move16();
- }
-
-
- move16();
- st->glr = 0;
- test();
- test();
- test();
- if ( ( EQ_32( st->total_brate, ACELP_9k60 ) || EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && ( st->element_mode == EVS_MONO ) )
- {
- move16();
- st->glr = 1;
- }
-
- IF( st->glr )
- {
- move16();
- st->nb_bits_header_ace = add( st->nb_bits_header_ace, G_LPC_RECOVERY_BITS );
- }
- IF( hTcxEnc != NULL )
- {
- test();
- IF( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, WB ) )
- {
- IF( st->rf_mode == 0 )
- {
- index = s_min( N_TCX_STARTLINE_NOISE_WB - 1, s_max( 3, st->frame_size_index ) );
- }
- ELSE
- {
- index = s_min( N_TCX_STARTLINE_NOISE_WB - 1, s_max( 3, st->frame_size_index - 1 ) );
- }
- hTcxEnc->nmStartLine = startLineWB[index];
- move16();
- }
- ELSE /* (st->bwidth == SWB || st->bwidth == FB) */
- {
- IF( st->rf_mode == 0 )
- {
- index = s_min( N_TCX_STARTLINE_NOISE_SWB - 1, sub( s_max( 3, st->frame_size_index ), 3 ) );
- }
- ELSE
- {
- index = s_min( N_TCX_STARTLINE_NOISE_SWB - 1, sub( s_max( 3, st->frame_size_index - 1 ), 3 ) );
- }
- test();
- test();
- if ( GE_32( st->total_brate, IVAS_96k ) && LE_32( st->total_brate, IVAS_192k ) && GT_16( st->element_mode, IVAS_SCE ) )
- {
- index = sub( index, 1 );
- }
- hTcxEnc->nmStartLine = startLineSWB[index];
- move16();
- test();
- test();
- IF( EQ_32( st->total_brate, IVAS_48k ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LT_16( add( hTcxEnc->nmStartLine, shl( hTcxEnc->nmStartLine, 2 ) ), shl( st->L_frame, 2 ) ) )
- {
- hTcxEnc->nmStartLine = shr( add( hTcxEnc->nmStartLine, shl( hTcxEnc->nmStartLine, 2 ) ), 2 ); /* low-rate stereo is more efficient than dual-mono due to stereo processing */
- move16();
- }
- }
- }
-
- IF( hTcxEnc != NULL )
- {
- test();
- test();
- test();
- test();
- test();
- IF( ( LT_32( st->total_brate, ACELP_24k40 ) ) && ( ( GT_32( st->total_brate, last_total_brate ) ) || ( EQ_16( st->last_codec_mode, MODE1 ) ) ) )
- {
- /* low-freq memQuantZeros_fx must be reset partially if bitrate increased */
- FOR( i = 0; i < hTcxEnc->nmStartLine; i++ )
- {
- hTcxEnc->memQuantZeros[i] = 0;
- move16();
- }
- }
- ELSE IF( ( GE_32( st->total_brate, ACELP_24k40 ) ) && ( LE_32( st->total_brate, ACELP_32k ) ) && ( GE_32( last_total_brate, ACELP_13k20 ) ) && ( LT_32( last_total_brate, ACELP_24k40 ) ) )
- {
- FOR( i = 0; i < st->L_frame; i++ ) /* memQuantZeros_fx won't be updated */
- {
- hTcxEnc->memQuantZeros[i] = 0;
- move16();
- }
- }
- }
-}
diff --git a/lib_enc/core_enc_reconf_fx.c b/lib_enc/core_enc_reconf_fx.c
index 3140422be5d88531fba60b90693049aa84388a8b..3637dd53f58bcd95fa3d9a360595cfaa155b480b 100644
--- a/lib_enc/core_enc_reconf_fx.c
+++ b/lib_enc/core_enc_reconf_fx.c
@@ -334,3 +334,307 @@ void core_coder_reconfig_fx(
}
}
}
+
+
+/*-----------------------------------------------------------------*
+ * Funtion core_coder_reconfig *
+ * ~~~~~~~~~~~~~~~~~~~ *
+ * - reconfig core coder when switching to another frame type *
+ *-----------------------------------------------------------------*/
+
+void core_coder_reconfig_ivas_fx(
+ Encoder_State *st,
+ const int32_t last_total_brate )
+{
+ Word16 i, bwidth, index;
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+ /*Configuration of ACELP*/
+ BITS_ALLOC_init_config_acelp( st->total_brate, st->narrowBand, st->nb_subfr, &( st->acelp_cfg ) );
+
+ /*Configuration of partial copy*/
+ IF( st->Opt_RF_ON )
+ {
+ st->hRF->acelp_cfg_rf.mode_index = 1;
+ st->hRF->acelp_cfg_rf.midLpc = 0;
+ st->hRF->acelp_cfg_rf.midLpc_enable = 0;
+ st->hRF->acelp_cfg_rf.pre_emphasis = 0;
+ st->hRF->acelp_cfg_rf.formant_enh = 1;
+ st->hRF->acelp_cfg_rf.formant_tilt = 1;
+ st->hRF->acelp_cfg_rf.voice_tilt = 1;
+ st->hRF->acelp_cfg_rf.formant_enh_num = FORMANT_SHARPENING_G1;
+ st->hRF->acelp_cfg_rf.formant_enh_den = FORMANT_SHARPENING_G2;
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ }
+
+ IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ st->nb_bits_header_tcx = 2; /* signal class */
+ move16();
+ }
+ ELSE IF( st->tcxonly )
+ {
+ st->nb_bits_header_tcx = 1 + 1; /*TCX20/TCX10 + last_core*/
+ st->nb_bits_header_tcx = add( st->nb_bits_header_tcx, 2 ); /* Siganl class*/
+ move16();
+ move16();
+ }
+ ELSE
+ {
+ st->nb_bits_header_ace = 1 + 2 + 1; /*TCX/ACELP+coder_type + last_core*/
+ st->nb_bits_header_tcx = st->nb_bits_header_ace;
+ move16();
+ move16();
+
+ IF( st->hTcxCfg != NULL )
+ {
+ IF( st->hTcxCfg->lfacNext <= 0 )
+ {
+ st->nb_bits_header_ace = sub( st->nb_bits_header_ace, 1 ); /*No last_core*/
+ move16();
+ }
+ }
+ }
+
+
+ /*Switch off TCX or ACELP?*/
+ IF( EQ_32( st->sr_core, INT_FS_12k8 ) )
+ {
+ st->acelpEnabled = extract_l( EQ_16( ( s_and( st->restrictedMode, 1 ) ), 1 ) );
+ st->tcx20Enabled = extract_l( EQ_16( ( s_and( st->restrictedMode, 2 ) ), 2 ) );
+ move16();
+ move16();
+ }
+ st->prevEnergyHF_fx = st->currEnergyHF_fx = 1073725440l /*65535.0f Q14*/; /* prevent block switch */
+ st->currEnergyHF_e_fx = 17;
+ move32();
+ move16();
+
+ /*Sanity check : don't need to be instrumented*/
+ IF( st->tcxonly == 0 )
+ {
+ assert( st->acelpEnabled || st->tcx20Enabled || st->frame_size_index == 0 );
+ }
+ ELSE
+ {
+ assert( st->tcx10Enabled || st->tcx20Enabled || st->frame_size_index == 0 );
+ }
+
+ /* TCX-LTP */
+ IF( st->hTcxEnc != NULL )
+ {
+ hTcxEnc->tcxltp = getTcxLtp( st->sr_core );
+ move16();
+ }
+
+ /*Use for 12.8 kHz sampling rate and low bitrates, the conventional pulse search->better SNR*/
+
+ st->acelp_autocorr = 1;
+ move16();
+
+ test();
+ if ( ( LE_32( st->total_brate, ACELP_9k60 ) ) && ( EQ_32( st->sr_core, INT_FS_12k8 ) ) )
+ {
+ st->acelp_autocorr = 0;
+ move16();
+ }
+
+ /*Get bandwidth mode*/
+ IF( st->narrowBand )
+ {
+ move16();
+ bwidth = NB;
+ }
+ ELSE IF( LE_32( st->sr_core, INT_FS_16k ) )
+ {
+ move16();
+ bwidth = WB;
+ }
+ ELSE
+ {
+ move16();
+ bwidth = SWB;
+ }
+
+ /*Scale TCX for non-active frames to adjust loudness with ACELP*/
+ IF( st->hTcxCfg != NULL )
+ {
+ st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/;
+ move16();
+
+ test();
+ IF( LT_16( bwidth, 2 ) && ( st->tcxonly == 0 ) )
+ {
+ /*const Word16 scaleTableSize = sizeof(scaleTcxTable) / sizeof(scaleTcxTable[0]);*/
+
+ FOR( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ )
+ {
+
+ test();
+ test();
+ IF( EQ_16( bwidth, scaleTcxTable[i].bwmode ) &&
+ GE_32( st->total_brate, scaleTcxTable[i].bitrateFrom ) &&
+ LT_32( st->total_brate, scaleTcxTable[i].bitrateTo ) )
+ {
+ if ( st->rf_mode )
+ {
+ i = sub( i, 1 );
+ }
+ move16();
+ st->hTcxCfg->na_scale = scaleTcxTable[i].scale;
+ BREAK;
+ }
+ }
+ }
+ }
+ st->enableTcxLpc = 0;
+ move16();
+ IF( GT_16( st->element_mode, IVAS_SCE ) )
+ {
+ test();
+ test();
+ st->enableTcxLpc = ( EQ_16( st->lpcQuantization, 1 ) && ( LE_32( st->total_brate, LOWRATE_TCXLPC_MAX_BR_CPE ) || st->rf_mode ) );
+ move16();
+ }
+ ELSE
+ {
+ test();
+ test();
+ if ( EQ_16( st->lpcQuantization, 1 ) && ( LE_32( st->total_brate, LOWRATE_TCXLPC_MAX_BR ) || st->rf_mode != 0 ) )
+ {
+ st->enableTcxLpc = 1;
+ move16();
+ }
+ }
+ test();
+ IF( st->ini_frame == 0 || EQ_16( st->last_codec_mode, MODE1 ) )
+ {
+ st->envWeighted = 0;
+ move16();
+ }
+
+ test();
+ test();
+ test();
+ IF( EQ_16( st->bwidth, SWB ) &&
+ ( EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && st->element_mode == EVS_MONO )
+ {
+ IF( st->tec_tfa == 0 )
+ {
+ FOR( i = 0; i < MAX_TEC_SMOOTHING_DEG; i++ )
+ {
+ st->hTECEnc->loBuffer[i] = 0;
+ move16();
+ }
+ }
+ st->tec_tfa = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->tec_tfa = 0;
+ move16();
+ }
+
+ st->enablePlcWaveadjust = 0;
+ move16();
+ if ( GE_32( st->total_brate, HQ_48k ) )
+ {
+ st->enablePlcWaveadjust = 1;
+ move16();
+ }
+
+
+ move16();
+ st->glr = 0;
+ test();
+ test();
+ test();
+ if ( ( EQ_32( st->total_brate, ACELP_9k60 ) || EQ_32( st->total_brate, ACELP_16k40 ) || EQ_32( st->total_brate, ACELP_24k40 ) ) && ( st->element_mode == EVS_MONO ) )
+ {
+ move16();
+ st->glr = 1;
+ }
+
+ IF( st->glr )
+ {
+ move16();
+ st->nb_bits_header_ace = add( st->nb_bits_header_ace, G_LPC_RECOVERY_BITS );
+ }
+ IF( hTcxEnc != NULL )
+ {
+ test();
+ IF( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, WB ) )
+ {
+ IF( st->rf_mode == 0 )
+ {
+ index = s_min( N_TCX_STARTLINE_NOISE_WB - 1, s_max( 3, st->frame_size_index ) );
+ }
+ ELSE
+ {
+ index = s_min( N_TCX_STARTLINE_NOISE_WB - 1, s_max( 3, st->frame_size_index - 1 ) );
+ }
+ hTcxEnc->nmStartLine = startLineWB[index];
+ move16();
+ }
+ ELSE /* (st->bwidth == SWB || st->bwidth == FB) */
+ {
+ IF( st->rf_mode == 0 )
+ {
+ index = s_min( N_TCX_STARTLINE_NOISE_SWB - 1, sub( s_max( 3, st->frame_size_index ), 3 ) );
+ }
+ ELSE
+ {
+ index = s_min( N_TCX_STARTLINE_NOISE_SWB - 1, sub( s_max( 3, st->frame_size_index - 1 ), 3 ) );
+ }
+ test();
+ test();
+ if ( GE_32( st->total_brate, IVAS_96k ) && LE_32( st->total_brate, IVAS_192k ) && GT_16( st->element_mode, IVAS_SCE ) )
+ {
+ index = sub( index, 1 );
+ }
+ hTcxEnc->nmStartLine = startLineSWB[index];
+ move16();
+ test();
+ test();
+ IF( EQ_32( st->total_brate, IVAS_48k ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LT_16( add( hTcxEnc->nmStartLine, shl( hTcxEnc->nmStartLine, 2 ) ), shl( st->L_frame, 2 ) ) )
+ {
+ hTcxEnc->nmStartLine = shr( add( hTcxEnc->nmStartLine, shl( hTcxEnc->nmStartLine, 2 ) ), 2 ); /* low-rate stereo is more efficient than dual-mono due to stereo processing */
+ move16();
+ }
+ }
+ }
+
+ IF( hTcxEnc != NULL )
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( LT_32( st->total_brate, ACELP_24k40 ) ) && ( ( GT_32( st->total_brate, last_total_brate ) ) || ( EQ_16( st->last_codec_mode, MODE1 ) ) ) )
+ {
+ /* low-freq memQuantZeros_fx must be reset partially if bitrate increased */
+ FOR( i = 0; i < hTcxEnc->nmStartLine; i++ )
+ {
+ hTcxEnc->memQuantZeros[i] = 0;
+ move16();
+ }
+ }
+ ELSE IF( ( GE_32( st->total_brate, ACELP_24k40 ) ) && ( LE_32( st->total_brate, ACELP_32k ) ) && ( GE_32( last_total_brate, ACELP_13k20 ) ) && ( LT_32( last_total_brate, ACELP_24k40 ) ) )
+ {
+ FOR( i = 0; i < st->L_frame; i++ ) /* memQuantZeros_fx won't be updated */
+ {
+ hTcxEnc->memQuantZeros[i] = 0;
+ move16();
+ }
+ }
+ }
+}
diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c
deleted file mode 100644
index f2375fb506cb7b0aa0ec05a5bbfedc99f0796991..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_switch.c
+++ /dev/null
@@ -1,302 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-
-
-/*-------------------------------------------------------------------*
- * core_coder_mode_switch()
- *
- *
- *-------------------------------------------------------------------*/
-void core_coder_mode_switch_ivas_fx(
- Encoder_State *st, /* i/o: encoder state structure */
- const Word32 last_total_brate, /* i : last bitrate */
- const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/
-)
-{
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
- Word16 i, fscale, switchWB;
- Word32 sr_core;
- Word16 bSwitchFromAmrwbIO;
- Word16 tcxonly_tmp, exp_res;
-
- switchWB = 0;
- move16();
- bSwitchFromAmrwbIO = 0;
- move16();
- exp_res = 0;
- move16();
-
-
- if ( EQ_16( st->last_core, AMR_WB_CORE ) )
- {
- bSwitchFromAmrwbIO = 1;
- move16();
- }
-
- /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/
- sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format );
-
- fscale = sr2fscale_fx( sr_core );
- if ( EQ_16( st->last_codec_mode, MODE1 ) )
- {
- switchWB = 1; /*force init when coming from MODE1*/
- move16();
- }
-
- tcxonly_tmp = getTcxonly_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
-
- if ( NE_32( tcxonly_tmp, st->tcxonly ) )
- {
- switchWB = 1; /*force init when coming from MODE1*/
- move16();
- }
-
- test();
- test();
- IF( EQ_32( fscale, st->fscale ) && !bSwitchFromAmrwbIO && !switchWB )
- {
- st->sr_core = sr_core;
- move16();
- Word16 tmp = BASOP_Util_Divide3232_Scale( sr_core, FRAMES_PER_SEC, &exp_res );
- st->L_frame = shr( tmp, sub( 15, exp_res ) ); // Q0
- move16();
-
- st->tcxonly = getTcxonly_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
- move16();
-
- Word16 exp_tmp1 = 0;
- move16();
- Word16 tmp1 = BASOP_Util_Divide1616_Scale( ONE_IN_Q9, 128, &exp_tmp1 );
-
- Word16 exp_tmp2 = 0;
- move16();
- Word16 tmp2 = BASOP_Util_Divide3232_Scale( st->total_brate, 100, &exp_tmp2 );
-
- Word16 exp_tmp3 = 0;
- move16();
- Word16 tmp3 = BASOP_Util_Divide3232_Scale( st->L_frame, st->fscale, &exp_tmp3 );
-
- Word32 tmp4 = L_mult0( tmp1, tmp2 ); // exp_tmp1 + exp_tmp2
- Word32 tmp5 = L_shl( Mpy_32_16_1( tmp4, tmp3 ), 1 ); // exp_tmp1 + exp_tmp2 + exp_tmp3
- st->bits_frame_nominal = extract_l( L_shr( tmp5, sub( 31, ( add( add( exp_tmp1, exp_tmp2 ), exp_tmp3 ) ) ) ) );
- move16();
- st->igf = getIgfPresent_fx( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
- move16();
- /* switch IGF configuration */
- IF( st->igf )
- {
- IGFEncSetMode_fx( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode );
- }
- st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( st->bwidth );
- move16();
-
- st->hTcxCfg->bandwidth = getTcxBandwidth( st->bwidth );
- move16();
- if ( st->tcxonly )
- {
- st->hTcxCfg->tcxRateLoopOpt = 2;
- move16();
- }
- else
- {
- st->hTcxCfg->tcxRateLoopOpt = 0;
- move16();
- }
- if ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- st->hTcxCfg->tcxRateLoopOpt = 3;
- move16();
- }
- st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->total_brate, st->rf_mode );
- st->hTcxCfg->resq = getResq( st->total_brate );
- hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode );
- test();
- if ( st->hTcxCfg->resq && !st->tcxonly )
- {
- st->hTcxCfg->tcxRateLoopOpt = 1;
- move16();
- }
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode );
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
- move16();
-
- IF( st->hTcxCfg->fIsTNSAllowed )
- {
- InitTnsConfigs_ivas_fx( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->total_brate, st->element_mode, MCT_flag );
-
- SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT );
- }
-
- IF( EQ_16( st->bwidth, NB ) )
- {
- st->narrowBand = 1;
- st->min_band = 1;
- st->max_band = 16;
- }
- ELSE
- {
- st->narrowBand = 0;
- st->min_band = 0;
- st->max_band = 19;
- }
-
- move16();
- move16();
- move16();
-
- FOR( i = 0; i < FRAME_SIZE_NB; i++ )
- {
- IF( EQ_32( FrameSizeConfig[i].frame_bits, st->bits_frame_nominal ) )
- {
- st->frame_size_index = i;
- st->bits_frame = FrameSizeConfig[i].frame_bits;
- st->bits_frame_core = FrameSizeConfig[i].frame_net_bits;
- move16();
- move16();
- move16();
- BREAK;
- }
- }
-
- st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, 0 );
- move16();
- core_coder_reconfig_ivas_fx( st, last_total_brate );
- }
- ELSE
- {
- st->igf = getIgfPresent_fx( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
- move16();
- IF( hTcxEnc != NULL )
- {
- hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
- move16();
- }
- st->currEnergyHF_fx = 0;
- move32();
- st->currEnergyHF_e_fx = 0;
- move16();
- Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM );
- Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift );
- st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift );
- move16();
- shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM );
- Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift );
- st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift );
- move16();
-#ifdef FIX_920_IGF_INIT_ERROR
- init_coder_ace_plus_ivas_fx( st, last_total_brate, st->total_brate, MCT_flag );
-#else
- init_coder_ace_plus_ivas_fx( st, last_total_brate, MCT_flag );
-#endif
- if ( st->hLPDmem != NULL )
- {
- st->hLPDmem->q_lpd_old_exc = st->prev_Q_new;
- move16();
- }
- }
-
- test();
- IF( st->igf && st->hBWE_TD != NULL )
- {
- /* reset TBE */
- test();
- test();
- test();
- test();
- test();
- IF( ( EQ_16( st->bwidth, WB ) && NE_16( st->last_extl, WB_TBE ) ) ||
- ( EQ_16( st->bwidth, SWB ) && NE_16( st->last_extl, SWB_TBE ) ) ||
- ( EQ_16( st->bwidth, FB ) && NE_16( st->last_extl, FB_TBE ) ) )
- {
- TBEreset_enc_fx( st, st->bwidth );
- }
- ELSE
- {
- set16_fx( st->hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD );
- set16_fx( st->hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER );
- set16_fx( st->hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
- st->hBWE_TD->gain_prec_swb_fx = ONE_IN_Q14;
- move16();
- }
- }
- test();
- IF( st->envWeighted && !st->enableTcxLpc )
- {
- /* Unweight the envelope */
- st->inv_gamma = BASOP_Util_Divide1616_Scale( MAX16B, st->gamma, &exp_res );
- move16();
- st->inv_gamma = shr( st->inv_gamma, sub( Q1, exp_res ) ); /* Q14 */
- move16();
- E_LPC_lsp_unweight( st->lsp_old_fx, st->lsp_old_fx, st->lsf_old_fx, st->inv_gamma, M );
- st->envWeighted = 0;
- move16();
- }
-
- IF( GE_32( st->total_brate, HQ_48k ) )
- {
- st->enablePlcWaveadjust = 1;
- move16();
- }
- ELSE
- {
- st->enablePlcWaveadjust = 0;
- move16();
- }
-
- test();
- test();
- if ( ( GT_32( last_total_brate, HQ_32k ) || EQ_16( st->last_codec_mode, MODE1 ) ) && ( st->element_mode == EVS_MONO ) )
- {
- st->glr_reset = 1;
- move16();
- }
-
- return;
-}
diff --git a/lib_enc/core_enc_switch_fx.c b/lib_enc/core_enc_switch_fx.c
index 1096cfb492cb75edc8ad6ba65069ae4690ec5ef6..82bb5fca9ee3d12fe100c7f11863652145e523bd 100644
--- a/lib_enc/core_enc_switch_fx.c
+++ b/lib_enc/core_enc_switch_fx.c
@@ -223,3 +223,262 @@ void core_coder_mode_switch_fx(
st->glr_reset = 1;
}
}
+
+
+/*-------------------------------------------------------------------*
+ * core_coder_mode_switch()
+ *
+ *
+ *-------------------------------------------------------------------*/
+void core_coder_mode_switch_ivas_fx(
+ Encoder_State *st, /* i/o: encoder state structure */
+ const Word32 last_total_brate, /* i : last bitrate */
+ const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/
+)
+{
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+ Word16 i, fscale, switchWB;
+ Word32 sr_core;
+ Word16 bSwitchFromAmrwbIO;
+ Word16 tcxonly_tmp, exp_res;
+
+ switchWB = 0;
+ move16();
+ bSwitchFromAmrwbIO = 0;
+ move16();
+ exp_res = 0;
+ move16();
+
+
+ if ( EQ_16( st->last_core, AMR_WB_CORE ) )
+ {
+ bSwitchFromAmrwbIO = 1;
+ move16();
+ }
+
+ /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/
+ sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format );
+
+ fscale = sr2fscale_fx( sr_core );
+ if ( EQ_16( st->last_codec_mode, MODE1 ) )
+ {
+ switchWB = 1; /*force init when coming from MODE1*/
+ move16();
+ }
+
+ tcxonly_tmp = getTcxonly_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
+
+ if ( NE_32( tcxonly_tmp, st->tcxonly ) )
+ {
+ switchWB = 1; /*force init when coming from MODE1*/
+ move16();
+ }
+
+ test();
+ test();
+ IF( EQ_32( fscale, st->fscale ) && !bSwitchFromAmrwbIO && !switchWB )
+ {
+ st->sr_core = sr_core;
+ move16();
+ Word16 tmp = BASOP_Util_Divide3232_Scale( sr_core, FRAMES_PER_SEC, &exp_res );
+ st->L_frame = shr( tmp, sub( 15, exp_res ) ); // Q0
+ move16();
+
+ st->tcxonly = getTcxonly_fx( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format );
+ move16();
+
+ Word16 exp_tmp1 = 0;
+ move16();
+ Word16 tmp1 = BASOP_Util_Divide1616_Scale( ONE_IN_Q9, 128, &exp_tmp1 );
+
+ Word16 exp_tmp2 = 0;
+ move16();
+ Word16 tmp2 = BASOP_Util_Divide3232_Scale( st->total_brate, 100, &exp_tmp2 );
+
+ Word16 exp_tmp3 = 0;
+ move16();
+ Word16 tmp3 = BASOP_Util_Divide3232_Scale( st->L_frame, st->fscale, &exp_tmp3 );
+
+ Word32 tmp4 = L_mult0( tmp1, tmp2 ); // exp_tmp1 + exp_tmp2
+ Word32 tmp5 = L_shl( Mpy_32_16_1( tmp4, tmp3 ), 1 ); // exp_tmp1 + exp_tmp2 + exp_tmp3
+ st->bits_frame_nominal = extract_l( L_shr( tmp5, sub( 31, ( add( add( exp_tmp1, exp_tmp2 ), exp_tmp3 ) ) ) ) );
+ move16();
+ st->igf = getIgfPresent_fx( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
+ move16();
+ /* switch IGF configuration */
+ IF( st->igf )
+ {
+ IGFEncSetMode_fx( st->hIGFEnc, st->total_brate, st->bwidth, st->element_mode, st->rf_mode );
+ }
+ st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( st->bwidth );
+ move16();
+
+ st->hTcxCfg->bandwidth = getTcxBandwidth( st->bwidth );
+ move16();
+ if ( st->tcxonly )
+ {
+ st->hTcxCfg->tcxRateLoopOpt = 2;
+ move16();
+ }
+ else
+ {
+ st->hTcxCfg->tcxRateLoopOpt = 0;
+ move16();
+ }
+ if ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ st->hTcxCfg->tcxRateLoopOpt = 3;
+ move16();
+ }
+ st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->total_brate, st->rf_mode );
+ st->hTcxCfg->resq = getResq( st->total_brate );
+ hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode );
+ test();
+ if ( st->hTcxCfg->resq && !st->tcxonly )
+ {
+ st->hTcxCfg->tcxRateLoopOpt = 1;
+ move16();
+ }
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode );
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+ move16();
+
+ IF( st->hTcxCfg->fIsTNSAllowed )
+ {
+ InitTnsConfigs_ivas_fx( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->total_brate, st->element_mode, MCT_flag );
+
+ SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT );
+ }
+
+ IF( EQ_16( st->bwidth, NB ) )
+ {
+ st->narrowBand = 1;
+ st->min_band = 1;
+ st->max_band = 16;
+ }
+ ELSE
+ {
+ st->narrowBand = 0;
+ st->min_band = 0;
+ st->max_band = 19;
+ }
+
+ move16();
+ move16();
+ move16();
+
+ FOR( i = 0; i < FRAME_SIZE_NB; i++ )
+ {
+ IF( EQ_32( FrameSizeConfig[i].frame_bits, st->bits_frame_nominal ) )
+ {
+ st->frame_size_index = i;
+ st->bits_frame = FrameSizeConfig[i].frame_bits;
+ st->bits_frame_core = FrameSizeConfig[i].frame_net_bits;
+ move16();
+ move16();
+ move16();
+ BREAK;
+ }
+ }
+
+ st->restrictedMode = getRestrictedMode( st->element_mode, st->total_brate, 0 );
+ move16();
+ core_coder_reconfig_ivas_fx( st, last_total_brate );
+ }
+ ELSE
+ {
+ st->igf = getIgfPresent_fx( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
+ move16();
+ IF( hTcxEnc != NULL )
+ {
+ hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
+ move16();
+ }
+ st->currEnergyHF_fx = 0;
+ move32();
+ st->currEnergyHF_e_fx = 0;
+ move16();
+ Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM );
+ Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift );
+ st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift );
+ move16();
+ shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM );
+ Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift );
+ st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift );
+ move16();
+#ifdef FIX_920_IGF_INIT_ERROR
+ init_coder_ace_plus_ivas_fx( st, last_total_brate, st->total_brate, MCT_flag );
+#else
+ init_coder_ace_plus_ivas_fx( st, last_total_brate, MCT_flag );
+#endif
+ if ( st->hLPDmem != NULL )
+ {
+ st->hLPDmem->q_lpd_old_exc = st->prev_Q_new;
+ move16();
+ }
+ }
+
+ test();
+ IF( st->igf && st->hBWE_TD != NULL )
+ {
+ /* reset TBE */
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( EQ_16( st->bwidth, WB ) && NE_16( st->last_extl, WB_TBE ) ) ||
+ ( EQ_16( st->bwidth, SWB ) && NE_16( st->last_extl, SWB_TBE ) ) ||
+ ( EQ_16( st->bwidth, FB ) && NE_16( st->last_extl, FB_TBE ) ) )
+ {
+ TBEreset_enc_fx( st, st->bwidth );
+ }
+ ELSE
+ {
+ set16_fx( st->hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER );
+ set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD );
+ set16_fx( st->hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER );
+ set16_fx( st->hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
+ st->hBWE_TD->gain_prec_swb_fx = ONE_IN_Q14;
+ move16();
+ }
+ }
+ test();
+ IF( st->envWeighted && !st->enableTcxLpc )
+ {
+ /* Unweight the envelope */
+ st->inv_gamma = BASOP_Util_Divide1616_Scale( MAX16B, st->gamma, &exp_res );
+ move16();
+ st->inv_gamma = shr( st->inv_gamma, sub( Q1, exp_res ) ); /* Q14 */
+ move16();
+ E_LPC_lsp_unweight( st->lsp_old_fx, st->lsp_old_fx, st->lsf_old_fx, st->inv_gamma, M );
+ st->envWeighted = 0;
+ move16();
+ }
+
+ IF( GE_32( st->total_brate, HQ_48k ) )
+ {
+ st->enablePlcWaveadjust = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->enablePlcWaveadjust = 0;
+ move16();
+ }
+
+ test();
+ test();
+ if ( ( GT_32( last_total_brate, HQ_32k ) || EQ_16( st->last_codec_mode, MODE1 ) ) && ( st->element_mode == EVS_MONO ) )
+ {
+ st->glr_reset = 1;
+ move16();
+ }
+
+ return;
+}
diff --git a/lib_enc/core_enc_updt.c b/lib_enc/core_enc_updt.c
deleted file mode 100644
index 4533af002e1ec4f813811a081998aba6335782e3..0000000000000000000000000000000000000000
--- a/lib_enc/core_enc_updt.c
+++ /dev/null
@@ -1,117 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "cnst.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-
-/*-------------------------------------------------------------------*
- * core_encode_update()
- *
- * Common updates of buffers
- *-------------------------------------------------------------------*/
-
-void core_encode_update_ivas_fx(
- Encoder_State *st /* i/o: Encoder state structure */
-)
-{
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
- Word16 n;
-
- /* Update Input Signal Buffers */
- n = add( st->encoderPastSamples_enc, st->encoderLookahead_enc );
-
- Copy( st->buf_speech_enc_pe + st->L_frame, st->buf_speech_enc_pe, n );
- Copy( st->buf_speech_enc + st->L_frame, st->buf_speech_enc, n );
-
- IF( !st->tcxonly )
- {
- n = add( st->L_frame, shr( st->L_frame, 2 ) );
- Copy( st->buf_wspeech_enc + st->L_frame, st->buf_wspeech_enc, n );
- }
-
- IF( hTcxEnc != NULL )
- {
- test();
- test();
- test();
- IF( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) || EQ_32( st->core_brate, SID_2k40 ) || ( st->core_brate == FRAME_NO_DATA ) )
- {
- Word16 max_e = s_max( st->hTcxEnc->exp_buf_speech_ltp, st->exp_buf_speech_enc );
- Scale_sig( hTcxEnc->buf_speech_ltp, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, negate( sub( max_e, st->hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(31-max_e)
- Copy_Scale_sig( st->buf_speech_enc + st->L_frame, hTcxEnc->buf_speech_ltp + st->L_frame, st->L_frame, negate( sub( max_e, st->exp_buf_speech_enc ) ) ); // Q(31-max_e)
- st->hTcxEnc->exp_buf_speech_ltp = max_e;
- move16();
- }
- }
-
- n = add( st->encoderPastSamples_enc, st->encoderLookahead_enc );
- Copy( st->buf_synth + st->L_frame, st->buf_synth, add( st->L_frame, L_SUBFR ) );
- IF( hTcxEnc != NULL )
- {
- Copy( hTcxEnc->buf_speech_ltp + st->L_frame, hTcxEnc->buf_speech_ltp, n );
-
- IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- st->hTcxEnc->kernel_switch_corr_past = 0;
- st->hTcxEnc->kernel_type[0] = MDCT_IV;
- st->hTcxEnc->kernel_symmetry_past = 0;
- st->hTcxEnc->enc_ste_pre_corr_past = 0;
-
- move16();
- move16();
- move16();
- move16();
- }
- }
-
- test();
- test();
- test();
- test();
- test();
- IF( ( st->Opt_DTX_ON && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) || ( st->tcxonly && ( EQ_16( st->codec_mode, MODE2 ) || ( st->element_mode > EVS_MONO ) ) ) )
- {
- /* reset LP memories */
- set16_fx( st->mem_MA_fx, 0, M );
- Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); // 2.56 scaling
- }
- return;
-}
diff --git a/lib_enc/core_enc_updt_fx.c b/lib_enc/core_enc_updt_fx.c
index 125f0cd524c024eacb7ba95c1e8df1394853be01..305c2a92fe5f74d7c02317667cb6aa3c234f1401 100644
--- a/lib_enc/core_enc_updt_fx.c
+++ b/lib_enc/core_enc_updt_fx.c
@@ -211,3 +211,77 @@ void core_encode_update_cng_fx(
return;
}
+
+/*-------------------------------------------------------------------*
+ * core_encode_update()
+ *
+ * Common updates of buffers
+ *-------------------------------------------------------------------*/
+
+void core_encode_update_ivas_fx(
+ Encoder_State *st /* i/o: Encoder state structure */
+)
+{
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+ Word16 n;
+
+ /* Update Input Signal Buffers */
+ n = add( st->encoderPastSamples_enc, st->encoderLookahead_enc );
+
+ Copy( st->buf_speech_enc_pe + st->L_frame, st->buf_speech_enc_pe, n );
+ Copy( st->buf_speech_enc + st->L_frame, st->buf_speech_enc, n );
+
+ IF( !st->tcxonly )
+ {
+ n = add( st->L_frame, shr( st->L_frame, 2 ) );
+ Copy( st->buf_wspeech_enc + st->L_frame, st->buf_wspeech_enc, n );
+ }
+
+ IF( hTcxEnc != NULL )
+ {
+ test();
+ test();
+ test();
+ IF( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) || EQ_32( st->core_brate, SID_2k40 ) || ( st->core_brate == FRAME_NO_DATA ) )
+ {
+ Word16 max_e = s_max( st->hTcxEnc->exp_buf_speech_ltp, st->exp_buf_speech_enc );
+ Scale_sig( hTcxEnc->buf_speech_ltp, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, negate( sub( max_e, st->hTcxEnc->exp_buf_speech_ltp ) ) ); // Q(31-max_e)
+ Copy_Scale_sig( st->buf_speech_enc + st->L_frame, hTcxEnc->buf_speech_ltp + st->L_frame, st->L_frame, negate( sub( max_e, st->exp_buf_speech_enc ) ) ); // Q(31-max_e)
+ st->hTcxEnc->exp_buf_speech_ltp = max_e;
+ move16();
+ }
+ }
+
+ n = add( st->encoderPastSamples_enc, st->encoderLookahead_enc );
+ Copy( st->buf_synth + st->L_frame, st->buf_synth, add( st->L_frame, L_SUBFR ) );
+ IF( hTcxEnc != NULL )
+ {
+ Copy( hTcxEnc->buf_speech_ltp + st->L_frame, hTcxEnc->buf_speech_ltp, n );
+
+ IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ st->hTcxEnc->kernel_switch_corr_past = 0;
+ st->hTcxEnc->kernel_type[0] = MDCT_IV;
+ st->hTcxEnc->kernel_symmetry_past = 0;
+ st->hTcxEnc->enc_ste_pre_corr_past = 0;
+
+ move16();
+ move16();
+ move16();
+ move16();
+ }
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( st->Opt_DTX_ON && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) || ( st->tcxonly && ( EQ_16( st->codec_mode, MODE2 ) || ( st->element_mode > EVS_MONO ) ) ) )
+ {
+ /* reset LP memories */
+ set16_fx( st->mem_MA_fx, 0, M );
+ Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); // 2.56 scaling
+ }
+ return;
+}
diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c
deleted file mode 100644
index 08789dbded001c3254c5ae38a0ae1dc0261d1f13..0000000000000000000000000000000000000000
--- a/lib_enc/core_switching_enc.c
+++ /dev/null
@@ -1,603 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-#include "ivas_prot_fx.h"
-
-void core_switching_pre_enc_ivas_fx(
- Encoder_State *st_fx, /* i/o: encoder state structure */
- const Word16 *old_inp_12k8, /* i : old input signal @12.8kHz q_old_inp_12k8 */
- const Word16 q_old_inp_12k8, /* i : Q old input signal @12.8kHz */
- const Word16 *old_inp_16k, /* i : old input signal @16kHz q_old_inp_16k */
- const Word16 q_old_inp_16k, /* i : Q old input signal @16kHz */
- const Word16 active_cnt, /* i : active frame counter */
- const Word16 last_element_mode /* i : last_element_mode */
-)
-{
- Word16 Sample_Delay_HP, Sample_Delay_LP;
- Word16 tmp16;
- Word16 tmp;
- SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
- LPD_state_HANDLE hLPDmem = st_fx->hLPDmem;
- HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
- TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD;
- TCX_ENC_HANDLE hTcxEnc = st_fx->hTcxEnc;
- FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD;
-
- /* Mode switching */
- test();
- test();
- test();
- IF( EQ_16( st_fx->last_codec_mode, MODE2 ) || ( ( ( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) && ( st_fx->element_mode > EVS_MONO ) ) ) )
- {
- IF( hLPDmem != NULL )
- {
- st_fx->mem_deemph_fx = hLPDmem->syn[M];
- move16();
- Copy( hLPDmem->mem_syn2, hLPDmem->mem_syn1_fx, M );
- }
-
- if ( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) )
- {
- st_fx->igf = 0;
- move16();
- }
-
- IF( hBWE_TD != NULL )
- {
- IF( st_fx->last_core != ACELP_CORE )
- {
- /* reset BWE memories */
- set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
- hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 );
- move32();
- }
-
- set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) );
- }
- test();
- IF( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) )
- {
- if ( st_fx->element_mode == EVS_MONO )
- {
- st_fx->last_core = HQ_CORE;
- move16();
- }
- IF( hHQ_core != NULL )
- {
- set32_fx( hHQ_core->last_ni_gain_fx, 0, BANDS_MAX );
- set16_fx( hHQ_core->last_env_fx, 0, BANDS_MAX );
- hHQ_core->last_max_pos_pulse = 0;
- move16();
-
- hHQ_core->mode_count = 0;
- move16();
- hHQ_core->mode_count1 = 0;
- move16();
-
- set16_fx( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
- hHQ_core->prev_frm_hfe2 = 0;
- move16();
- hHQ_core->prev_stab_hfe2 = 0;
- move16();
- }
- test();
- /*ALDO overlap windowed past: also used in MODE2 but for other MDCT-LB*/
- IF( ( st_fx->element_mode == EVS_MONO ) && hTcxEnc != NULL )
- {
- set16_fx( hTcxEnc->old_out_fx, 0, L_FRAME32k );
- }
- }
-
- test();
- IF( ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) && ( EQ_16( st_fx->last_L_frame, L_FRAME ) ) )
- {
- Copy( st_fx->lsp_old_fx, st_fx->lsp_old16k_fx, M );
-
- st_fx->rate_switching_reset_16kHz = lsp_convert_poly_fx( st_fx->lsp_old16k_fx, st_fx->L_frame, 0 );
- move16();
- }
-
- st_fx->use_acelp_preq = 0;
- move16();
- }
-
- test();
- test();
- test();
- if ( EQ_16( st_fx->last_core, -1 ) && ( EQ_16( st_fx->core, HQ_CORE ) || EQ_16( st_fx->core, TCX_20_CORE ) || EQ_16( st_fx->core, TCX_10_CORE ) ) )
- {
- /* very first frame is HQ_CORE */
- st_fx->last_core = HQ_CORE;
- move16();
- }
-
- test();
- test();
- IF( EQ_16( st_fx->core, HQ_CORE ) && ( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) /* HQ init */
- {
- set32_fx( hHQ_core->last_ni_gain_fx, 0, BANDS_MAX );
- set16_fx( hHQ_core->last_env_fx, 0, BANDS_MAX );
- hHQ_core->last_max_pos_pulse = 0;
- move16();
-
- hHQ_core->mode_count = 0;
- move16();
- hHQ_core->mode_count1 = 0;
- move16();
-
- set16_fx( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
- hHQ_core->prev_frm_hfe2 = 0;
- move16();
- hHQ_core->prev_stab_hfe2 = 0;
- move16();
-
- IF( hTcxEnc != NULL )
- {
- set16_fx( hTcxEnc->old_out_fx, 0, L_FRAME32k );
- }
- }
-
- /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores
- within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */
- test();
- test();
- IF( ( st_fx->core == ACELP_CORE ) && ( ( st_fx->last_core != ACELP_CORE ) || EQ_16( st_fx->last_codec_mode, MODE2 ) ) )
- {
- IF( hSC_VBR != NULL )
- {
- hSC_VBR->last_last_ppp_mode = 0;
- move16();
- hSC_VBR->last_ppp_mode = 0;
- move16();
- hSC_VBR->last_nelp_mode = 0;
- move16();
- }
- }
-
- test();
- test();
- test();
- IF( ( st_fx->core == ACELP_CORE ) && ( ( st_fx->last_core != ACELP_CORE ) || EQ_16( st_fx->last_codec_mode, MODE2 ) || LE_32( st_fx->last_total_brate, PPP_NELP_2k80 ) ) )
- {
- st_fx->act_count = 3;
- move16();
- st_fx->uv_count = 0;
- move16();
- }
-
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) ||
- ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) )
- {
- IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
- {
- Copy( TRWB2_Ave_fx, st_fx->lsf_old_fx, M ); /* init of LSP */
- lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_16k );
- }
- ELSE
- {
- Copy( TRWB_Ave_fx, st_fx->lsf_old_fx, M ); /* init of LSP */
- lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_FX );
- }
-
- st_fx->mem_deemph_fx = 0;
- move16();
- /* Reset ACELP parameters */
- IF( hLPDmem != NULL )
- {
- move16();
- hLPDmem->syn[M] = 0;
- move16();
- set16_fx( hLPDmem->mem_syn2, 0, M );
- set16_fx( hLPDmem->mem_syn, 0, M );
- set16_fx( hLPDmem->mem_syn1_fx, 0, M );
- hLPDmem->q_mem_syn = Q15;
- move16();
- hLPDmem->mem_w0 = 0;
- move16();
- hLPDmem->tilt_code = 0;
- move16();
- hLPDmem->gc_threshold = 0;
- move32();
- /* set16_fx( st_fx->dispMem, 0, 8 ); */
- set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
- hLPDmem->dm_fx.prev_state = 0;
- move16();
- hLPDmem->dm_fx.prev_gain_code = L_deposit_l( 0 );
- }
- st_fx->Nb_ACELP_frames = 0;
- move16();
-
- set16_fx( st_fx->mem_MA_fx, 0, M );
- Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M );
- init_gp_clip_fx( st_fx->clip_var_fx );
- st_fx->last_coder_type = GENERIC;
- move16();
-
- tmp16 = add( NB_SUBFR, 1 );
-
- if ( EQ_16( st_fx->L_frame, L_FRAME ) )
- {
- tmp16 = NB_SUBFR;
- move16();
- }
-
- Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 );
- set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 );
-
- /* Reset old ACELP buffers */
- test();
- IF( ( st_fx->element_mode == EVS_MONO ) && hLPDmem != NULL )
- {
- set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
- }
- IF( hBWE_TD != NULL )
- {
- set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
-
- /* reset BWE memories */
- hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
- move32();
- }
- IF( hBWE_FD != NULL )
- {
- set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) );
- }
- }
- test();
- test();
- test();
- IF( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && ( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) )
- {
- /* Reset the ACELP core in case of TCX->ACELP core switching */
- st_fx->Nb_ACELP_frames = 0;
- move16();
-
- IF( hLPDmem != NULL )
- {
- hLPDmem->mem_w0 = 0;
- move16();
- hLPDmem->tilt_code = 0;
- move16();
- hLPDmem->gc_threshold = 0;
- move32();
- init_gp_clip_fx( st_fx->clip_var_fx );
- set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
- hLPDmem->dm_fx.prev_state = 0;
- move16();
- hLPDmem->dm_fx.prev_gain_code = 0;
- move32();
- }
-
- st_fx->last_coder_type = GENERIC;
- move16();
-
- tmp16 = shr( st_fx->L_frame, 6 );
- Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 );
- set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 );
-
- /* Reset old TD BWE buffers */
- IF( hBWE_TD != NULL )
- {
- set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
- hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
- move32();
- }
-
- /* reset BWE memories */
- IF( hBWE_FD != NULL )
- {
- set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO : this might not be needed */
- }
- }
- test();
- test();
- test();
- IF( GE_32( st_fx->input_Fs, 16000 ) && NE_16( st_fx->last_extl, WB_BWE ) && EQ_16( st_fx->extl, WB_BWE ) && hBWE_FD != NULL )
- {
- test();
- IF( NE_16( st_fx->last_extl, SWB_BWE ) && NE_16( st_fx->last_extl, FB_BWE ) )
- {
- hBWE_FD->prev_mode = NORMAL;
- move16();
- hBWE_FD->modeCount = 0;
- move16();
- }
-
- hBWE_FD->prev_L_swb_norm1 = 8;
- move16();
- }
-
- test();
- test();
- test();
- test();
- test();
- IF( ( GE_32( st_fx->input_Fs, 32000 ) && NE_16( st_fx->last_extl, SWB_BWE ) && EQ_16( st_fx->extl, SWB_BWE ) ) ||
- ( GE_32( st_fx->input_Fs, 48000 ) && NE_16( st_fx->last_extl, FB_BWE ) && EQ_16( st_fx->extl, FB_BWE ) ) )
- {
- /* we are switching to SWB BWE - reset SWB BWE buffers */
-
- IF( EQ_16( st_fx->L_frame, L_FRAME ) )
- {
- Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS );
- Sample_Delay_LP = NS2SA( 12800, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS );
- IF( ( st_fx->element_mode > EVS_MONO ) )
- {
- IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) )
- {
- Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS );
- }
- Sample_Delay_HP = sub( Sample_Delay_HP, NS2SA( 16000, DELAY_FIR_RESAMPL_NS ) );
- }
- IF( GT_16( q_old_inp_12k8, hBWE_FD->prev_Q_input_lp ) )
- {
- Copy_Scale_sig( old_inp_12k8 + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP, sub( hBWE_FD->prev_Q_input_lp, q_old_inp_12k8 ) ); // prev_Q_input_lp
- }
- ELSE
- {
- Scale_sig( hBWE_FD->old_input_lp_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ), sub( q_old_inp_12k8, hBWE_FD->prev_Q_input_lp ) ); // q_old_inp_12k8
- hBWE_FD->prev_Q_input_lp = q_old_inp_12k8;
- move16();
- Copy( old_inp_12k8 + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP );
- }
- }
- ELSE
- {
- Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS );
- Sample_Delay_LP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS );
- IF( GT_16( st_fx->element_mode, EVS_MONO ) )
- {
- IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) )
- {
- Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS );
- }
- Sample_Delay_HP = sub( Sample_Delay_HP, NS2SA( 16000, DELAY_FIR_RESAMPL_NS ) );
- }
- IF( GT_16( q_old_inp_16k, hBWE_FD->prev_Q_input_lp ) )
- {
- Copy_Scale_sig( old_inp_16k + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP, sub( hBWE_FD->prev_Q_input_lp, q_old_inp_16k ) ); // prev_Q_input_lp
- }
- ELSE
- {
- Scale_sig( hBWE_FD->old_input_lp_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ), sub( q_old_inp_16k, hBWE_FD->prev_Q_input_lp ) ); // q_old_inp_16k
- hBWE_FD->prev_Q_input_lp = q_old_inp_16k;
- move16();
- Copy( old_inp_16k + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP );
- }
- }
-
- tmp = sub( L_LOOK_16k + L_SUBFR16k, Sample_Delay_HP );
- Copy( &hBWE_TD->old_speech_shb_fx[tmp], hBWE_FD->new_input_hp_fx, Sample_Delay_HP );
-#ifdef FIX_ISSUE_1230
- hBWE_FD->Q_new_input_hp = 0;
- move16();
-#endif
-
- IF( NE_16( st_fx->last_extl, WB_BWE ) )
- {
- hBWE_FD->prev_mode = NORMAL;
- move16();
- hBWE_FD->modeCount = 0;
- move16();
- }
- hBWE_FD->EnergyLF_fx = 0;
- hBWE_FD->EnergyLF_exp = 0;
- move32();
- move16();
- hBWE_FD->prev_L_swb_norm1 = 8;
- move16(); /*8.0 in Q0 */
- st_fx->EnergyLT_fx_exp = 30;
- move16(); /* Set to a High Exponent so it is 1^-30 */
- }
- /*---------------------------------------------------------------------*
- * band-width switching from WB -> SWB/FB
- *---------------------------------------------------------------------*/
- IF( st_fx->element_mode > EVS_MONO )
- {
- IF( st_fx->bwidth_sw_cnt == 0 )
- {
- test();
- IF( GE_16( st_fx->bwidth, SWB ) && EQ_16( st_fx->last_bwidth, WB ) )
- {
- st_fx->bwidth_sw_cnt = add( st_fx->bwidth_sw_cnt, 1 );
- move16();
- }
- }
- ELSE
- {
- st_fx->bwidth_sw_cnt = add( st_fx->bwidth_sw_cnt, 1 );
- move16();
- IF( EQ_16( st_fx->bwidth_sw_cnt, BWS_TRAN_PERIOD ) )
- {
- st_fx->bwidth_sw_cnt = 0;
- move16();
- }
- }
- }
-
- return;
-}
-
-/*---------------------------------------------------------------------*
- * core_switching_post_enc()
- *
- * Postprocessing for ACELP/HQ core switching
- *---------------------------------------------------------------------*/
-
-void core_switching_post_enc_ivas_fx(
- Encoder_State *st, /* i/o: encoder state structure */
- Word16 *old_inp_12k8_fx, /* i : old input signal @12.8kHz Q_new-1 */
- Word16 *old_inp_16k_fx, /* i : old input signal @16kHz Q_new-1 */
- Word16 A_fx[], /* i : unquant. LP filter coefs. Q12 */
- Word16 Q_new )
-{
- IF( EQ_16( st->core, HQ_CORE ) )
- {
- st->use_acelp_preq = 0;
- move16();
- test();
- test();
- IF( ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) && st->element_mode == EVS_MONO ) /* core switching ==> ACELP subframe encoding */
- {
- /* Memory scaling to keep everything in common q */
- Scale_sig( st->hLPDmem->mem_syn, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- Scale_sig( st->hLPDmem->mem_syn1_fx, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- Scale_sig( st->hLPDmem->mem_syn2, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- Scale_sig( st->hLPDmem->mem_syn3, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- Scale_sig( st->hLPDmem->mem_syn_r, L_SYN_MEM, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- st->hLPDmem->mem_w0 = shl( st->hLPDmem->mem_w0, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
- move16();
- st->hLPDmem->q_mem_syn = sub( Q_new, 1 );
- move16();
-
- acelp_core_switch_enc_ivas_fx( st, old_inp_12k8_fx + L_INP_MEM - NS2SA( INT_FS_12k8, ACELP_LOOK_NS ), old_inp_16k_fx + L_INP_MEM - NS2SA( INT_FS_16k, ACELP_LOOK_NS ), A_fx, 0, sub( Q_new, 1 ) );
- }
-
- st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
- move32();
- st->hBWE_FD->mem_deemph_old_syn_fx = 0;
- move16();
- st->hBWE_FD->q_mem_deemph_old_syn = 0;
- move16();
- }
- ELSE
- {
- IF( st->hBWE_TD == NULL )
- {
- return;
- }
-
- test();
- /* reset SWB TBE buffers */
- IF( EQ_16( st->extl, WB_TBE ) && NE_16( st->last_extl, WB_TBE ) )
- {
- wb_tbe_extras_reset_fx( st->hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, st->hBWE_TD->mem_genSHBexc_filt_down_wb3_fx );
-
- IF( NE_16( st->last_extl, WB_BWE ) )
- {
- set16_fx( st->hBWE_TD->decim_state1_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
- set16_fx( st->hBWE_TD->decim_state2_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
- }
-
- set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 );
- set16_fx( st->hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD );
- set32_fx( st->hBWE_TD->mem_csfilt_fx, 0, 2 );
- }
-
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
-
- IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) &&
- ( EQ_16( st->last_core, HQ_CORE ) || NE_16( st->L_frame, st->last_L_frame ) || ( NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) && NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) ) )
- {
- set16_fx( st->hBWE_TD->state_ana_filt_shb_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
-
- InitSWBencBufferStates_fx( st->hBWE_TD, NULL );
- swb_tbe_reset_fx( st->hBWE_TD->mem_csfilt_fx, st->hBWE_TD->mem_genSHBexc_filt_down_shb_fx, st->hBWE_TD->state_lpc_syn_fx, st->hBWE_TD->syn_overlap_fx, st->hBWE_TD->state_syn_shbexc_fx, &( st->hBWE_TD->tbe_demph_fx ), &( st->hBWE_TD->tbe_premph_fx ), st->hBWE_TD->mem_stp_swb_fx, &( st->hBWE_TD->gain_prec_swb_fx ) );
-
- set16_fx( st->hBWE_TD->dec_2_over_3_mem_fx, 0, L_FILT_2OVER3 );
- set16_fx( st->hBWE_TD->dec_2_over_3_mem_lp_fx, 0, L_FILT_2OVER3_LP );
- }
- ELSE IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && ( ( EQ_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_32( st->last_total_brate, st->total_brate ) ) || ( NE_16( st->last_bwidth, st->bwidth ) ) || ( NE_16( st->last_codec_mode, MODE1 ) ) || ( NE_16( st->rf_mode_last, st->rf_mode ) ) ) )
- {
- set16_fx( st->hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD );
- set16_fx( st->hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER );
- set16_fx( st->hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
- st->hBWE_TD->gain_prec_swb_fx = ONE_IN_Q14;
- move16();
- }
- ELSE IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) )
- {
- TBEreset_enc_fx( st, st->bwidth );
- }
-
- test();
- test();
- test();
- test();
- /* Interp_3_2 CNG buffers reset */
- IF( EQ_16( st->extl, FB_TBE ) && ( ( NE_16( st->last_extl, FB_TBE ) && NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) || NE_16( st->L_frame, st->last_L_frame ) ) )
- {
- set16_fx( st->hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- st->hBWE_TD->fb_tbe_demph_fx = 0;
- move16();
- fb_tbe_reset_enc_fx( st->hBWE_TD->elliptic_bpf_2_48k_mem_fx, &st->hBWE_TD->prev_fb_energy_fx, st->hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, &st->hBWE_TD->prev_fb_energy_fx_Q );
- }
- /* Fade towards init value for non HQ_CORE */
- IF( st->hHQ_core != NULL )
- {
- st->hHQ_core->crest_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, st->hHQ_core->crest_lp_fx ), Mpy_32_32( L_sub( ONE_IN_Q31, HQ_CREST_FAC_SM_FX ), L_shr( HQ_CREST_THRESHOLD_FX, sub( Q28, st->hHQ_core->crest_lp_q ) ) ) ); /*crest_lp_q*/
- move32();
- st->hHQ_core->crest_mod_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, st->hHQ_core->crest_mod_lp_fx ), Mpy_32_32( L_sub( ONE_IN_Q31, HQ_CREST_FAC_SM_FX ), L_shr( HQ_CREST_MOD_THRESHOLD_FX, sub( Q29, st->hHQ_core->crest_mod_lp_q ) ) ) ); /*crest_mod_lp_q*/
- move32();
- }
- }
-
- return;
-}
diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c
index da1139d1538ceb398c608a16b85e39c2a474d110..6fa341a7b2a75341fe73d5e52b8b15f447bf218d 100644
--- a/lib_enc/core_switching_enc_fx.c
+++ b/lib_enc/core_switching_enc_fx.c
@@ -8,8 +8,9 @@
#include "rom_com_fx.h" /* Static table prototypes */
#include "rom_com.h" /* Static table prototypes */
//#include "prot_fx.h" /* Function prototypes */
-#include "prot_fx.h" /* Function prototypes */
-#include "prot_fx_enc.h" /* Function prototypes */
+#include "prot_fx.h" /* Function prototypes */
+#include "ivas_prot_fx.h" /* Function prototypes */
+#include "prot_fx_enc.h" /* Function prototypes */
/*---------------------------------------------------------------------*
@@ -672,3 +673,559 @@ void core_switching_hq_prepare_enc_fx(
}
return;
}
+
+void core_switching_pre_enc_ivas_fx(
+ Encoder_State *st_fx, /* i/o: encoder state structure */
+ const Word16 *old_inp_12k8, /* i : old input signal @12.8kHz q_old_inp_12k8 */
+ const Word16 q_old_inp_12k8, /* i : Q old input signal @12.8kHz */
+ const Word16 *old_inp_16k, /* i : old input signal @16kHz q_old_inp_16k */
+ const Word16 q_old_inp_16k, /* i : Q old input signal @16kHz */
+ const Word16 active_cnt, /* i : active frame counter */
+ const Word16 last_element_mode /* i : last_element_mode */
+)
+{
+ Word16 Sample_Delay_HP, Sample_Delay_LP;
+ Word16 tmp16;
+ Word16 tmp;
+ SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
+ LPD_state_HANDLE hLPDmem = st_fx->hLPDmem;
+ HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
+ TD_BWE_ENC_HANDLE hBWE_TD = st_fx->hBWE_TD;
+ TCX_ENC_HANDLE hTcxEnc = st_fx->hTcxEnc;
+ FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD;
+
+ /* Mode switching */
+ test();
+ test();
+ test();
+ IF( EQ_16( st_fx->last_codec_mode, MODE2 ) || ( ( ( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) && ( st_fx->element_mode > EVS_MONO ) ) ) )
+ {
+ IF( hLPDmem != NULL )
+ {
+ st_fx->mem_deemph_fx = hLPDmem->syn[M];
+ move16();
+ Copy( hLPDmem->mem_syn2, hLPDmem->mem_syn1_fx, M );
+ }
+
+ if ( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) )
+ {
+ st_fx->igf = 0;
+ move16();
+ }
+
+ IF( hBWE_TD != NULL )
+ {
+ IF( st_fx->last_core != ACELP_CORE )
+ {
+ /* reset BWE memories */
+ set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
+ hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 );
+ move32();
+ }
+
+ set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) );
+ }
+ test();
+ IF( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) )
+ {
+ if ( st_fx->element_mode == EVS_MONO )
+ {
+ st_fx->last_core = HQ_CORE;
+ move16();
+ }
+ IF( hHQ_core != NULL )
+ {
+ set32_fx( hHQ_core->last_ni_gain_fx, 0, BANDS_MAX );
+ set16_fx( hHQ_core->last_env_fx, 0, BANDS_MAX );
+ hHQ_core->last_max_pos_pulse = 0;
+ move16();
+
+ hHQ_core->mode_count = 0;
+ move16();
+ hHQ_core->mode_count1 = 0;
+ move16();
+
+ set16_fx( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
+ hHQ_core->prev_frm_hfe2 = 0;
+ move16();
+ hHQ_core->prev_stab_hfe2 = 0;
+ move16();
+ }
+ test();
+ /*ALDO overlap windowed past: also used in MODE2 but for other MDCT-LB*/
+ IF( ( st_fx->element_mode == EVS_MONO ) && hTcxEnc != NULL )
+ {
+ set16_fx( hTcxEnc->old_out_fx, 0, L_FRAME32k );
+ }
+ }
+
+ test();
+ IF( ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) && ( EQ_16( st_fx->last_L_frame, L_FRAME ) ) )
+ {
+ Copy( st_fx->lsp_old_fx, st_fx->lsp_old16k_fx, M );
+
+ st_fx->rate_switching_reset_16kHz = lsp_convert_poly_fx( st_fx->lsp_old16k_fx, st_fx->L_frame, 0 );
+ move16();
+ }
+
+ st_fx->use_acelp_preq = 0;
+ move16();
+ }
+
+ test();
+ test();
+ test();
+ if ( EQ_16( st_fx->last_core, -1 ) && ( EQ_16( st_fx->core, HQ_CORE ) || EQ_16( st_fx->core, TCX_20_CORE ) || EQ_16( st_fx->core, TCX_10_CORE ) ) )
+ {
+ /* very first frame is HQ_CORE */
+ st_fx->last_core = HQ_CORE;
+ move16();
+ }
+
+ test();
+ test();
+ IF( EQ_16( st_fx->core, HQ_CORE ) && ( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) /* HQ init */
+ {
+ set32_fx( hHQ_core->last_ni_gain_fx, 0, BANDS_MAX );
+ set16_fx( hHQ_core->last_env_fx, 0, BANDS_MAX );
+ hHQ_core->last_max_pos_pulse = 0;
+ move16();
+
+ hHQ_core->mode_count = 0;
+ move16();
+ hHQ_core->mode_count1 = 0;
+ move16();
+
+ set16_fx( hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
+ hHQ_core->prev_frm_hfe2 = 0;
+ move16();
+ hHQ_core->prev_stab_hfe2 = 0;
+ move16();
+
+ IF( hTcxEnc != NULL )
+ {
+ set16_fx( hTcxEnc->old_out_fx, 0, L_FRAME32k );
+ }
+ }
+
+ /* Here we only handle cases where last_ppp and last_nelp not updated when coming from CodecB or other cores
+ within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */
+ test();
+ test();
+ IF( ( st_fx->core == ACELP_CORE ) && ( ( st_fx->last_core != ACELP_CORE ) || EQ_16( st_fx->last_codec_mode, MODE2 ) ) )
+ {
+ IF( hSC_VBR != NULL )
+ {
+ hSC_VBR->last_last_ppp_mode = 0;
+ move16();
+ hSC_VBR->last_ppp_mode = 0;
+ move16();
+ hSC_VBR->last_nelp_mode = 0;
+ move16();
+ }
+ }
+
+ test();
+ test();
+ test();
+ IF( ( st_fx->core == ACELP_CORE ) && ( ( st_fx->last_core != ACELP_CORE ) || EQ_16( st_fx->last_codec_mode, MODE2 ) || LE_32( st_fx->last_total_brate, PPP_NELP_2k80 ) ) )
+ {
+ st_fx->act_count = 3;
+ move16();
+ st_fx->uv_count = 0;
+ move16();
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && EQ_16( st_fx->last_core, HQ_CORE ) ) ||
+ ( ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( active_cnt, 1 ) ) )
+ {
+ IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
+ {
+ Copy( TRWB2_Ave_fx, st_fx->lsf_old_fx, M ); /* init of LSP */
+ lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_16k );
+ }
+ ELSE
+ {
+ Copy( TRWB_Ave_fx, st_fx->lsf_old_fx, M ); /* init of LSP */
+ lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, INT_FS_FX );
+ }
+
+ st_fx->mem_deemph_fx = 0;
+ move16();
+ /* Reset ACELP parameters */
+ IF( hLPDmem != NULL )
+ {
+ move16();
+ hLPDmem->syn[M] = 0;
+ move16();
+ set16_fx( hLPDmem->mem_syn2, 0, M );
+ set16_fx( hLPDmem->mem_syn, 0, M );
+ set16_fx( hLPDmem->mem_syn1_fx, 0, M );
+ hLPDmem->q_mem_syn = Q15;
+ move16();
+ hLPDmem->mem_w0 = 0;
+ move16();
+ hLPDmem->tilt_code = 0;
+ move16();
+ hLPDmem->gc_threshold = 0;
+ move32();
+ /* set16_fx( st_fx->dispMem, 0, 8 ); */
+ set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
+ hLPDmem->dm_fx.prev_state = 0;
+ move16();
+ hLPDmem->dm_fx.prev_gain_code = L_deposit_l( 0 );
+ }
+ st_fx->Nb_ACELP_frames = 0;
+ move16();
+
+ set16_fx( st_fx->mem_MA_fx, 0, M );
+ Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M );
+ init_gp_clip_fx( st_fx->clip_var_fx );
+ st_fx->last_coder_type = GENERIC;
+ move16();
+
+ tmp16 = add( NB_SUBFR, 1 );
+
+ if ( EQ_16( st_fx->L_frame, L_FRAME ) )
+ {
+ tmp16 = NB_SUBFR;
+ move16();
+ }
+
+ Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 );
+ set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 );
+
+ /* Reset old ACELP buffers */
+ test();
+ IF( ( st_fx->element_mode == EVS_MONO ) && hLPDmem != NULL )
+ {
+ set16_fx( hLPDmem->old_exc, 0, L_EXC_MEM );
+ }
+ IF( hBWE_TD != NULL )
+ {
+ set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
+
+ /* reset BWE memories */
+ hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
+ move32();
+ }
+ IF( hBWE_FD != NULL )
+ {
+ set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) );
+ }
+ }
+ test();
+ test();
+ test();
+ IF( ( ( st_fx->core == ACELP_CORE ) || EQ_16( st_fx->core, AMR_WB_CORE ) ) && ( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) )
+ {
+ /* Reset the ACELP core in case of TCX->ACELP core switching */
+ st_fx->Nb_ACELP_frames = 0;
+ move16();
+
+ IF( hLPDmem != NULL )
+ {
+ hLPDmem->mem_w0 = 0;
+ move16();
+ hLPDmem->tilt_code = 0;
+ move16();
+ hLPDmem->gc_threshold = 0;
+ move32();
+ init_gp_clip_fx( st_fx->clip_var_fx );
+ set16_fx( hLPDmem->dm_fx.prev_gain_pit, 0, 6 );
+ hLPDmem->dm_fx.prev_state = 0;
+ move16();
+ hLPDmem->dm_fx.prev_gain_code = 0;
+ move32();
+ }
+
+ st_fx->last_coder_type = GENERIC;
+ move16();
+
+ tmp16 = shr( st_fx->L_frame, 6 );
+ Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 );
+ set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 );
+
+ /* Reset old TD BWE buffers */
+ IF( hBWE_TD != NULL )
+ {
+ set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
+ hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
+ move32();
+ }
+
+ /* reset BWE memories */
+ IF( hBWE_FD != NULL )
+ {
+ set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO : this might not be needed */
+ }
+ }
+ test();
+ test();
+ test();
+ IF( GE_32( st_fx->input_Fs, 16000 ) && NE_16( st_fx->last_extl, WB_BWE ) && EQ_16( st_fx->extl, WB_BWE ) && hBWE_FD != NULL )
+ {
+ test();
+ IF( NE_16( st_fx->last_extl, SWB_BWE ) && NE_16( st_fx->last_extl, FB_BWE ) )
+ {
+ hBWE_FD->prev_mode = NORMAL;
+ move16();
+ hBWE_FD->modeCount = 0;
+ move16();
+ }
+
+ hBWE_FD->prev_L_swb_norm1 = 8;
+ move16();
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( GE_32( st_fx->input_Fs, 32000 ) && NE_16( st_fx->last_extl, SWB_BWE ) && EQ_16( st_fx->extl, SWB_BWE ) ) ||
+ ( GE_32( st_fx->input_Fs, 48000 ) && NE_16( st_fx->last_extl, FB_BWE ) && EQ_16( st_fx->extl, FB_BWE ) ) )
+ {
+ /* we are switching to SWB BWE - reset SWB BWE buffers */
+
+ IF( EQ_16( st_fx->L_frame, L_FRAME ) )
+ {
+ Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS );
+ Sample_Delay_LP = NS2SA( 12800, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS );
+ IF( ( st_fx->element_mode > EVS_MONO ) )
+ {
+ IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) )
+ {
+ Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS );
+ }
+ Sample_Delay_HP = sub( Sample_Delay_HP, NS2SA( 16000, DELAY_FIR_RESAMPL_NS ) );
+ }
+ IF( GT_16( q_old_inp_12k8, hBWE_FD->prev_Q_input_lp ) )
+ {
+ Copy_Scale_sig( old_inp_12k8 + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP, sub( hBWE_FD->prev_Q_input_lp, q_old_inp_12k8 ) ); // prev_Q_input_lp
+ }
+ ELSE
+ {
+ Scale_sig( hBWE_FD->old_input_lp_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ), sub( q_old_inp_12k8, hBWE_FD->prev_Q_input_lp ) ); // q_old_inp_12k8
+ hBWE_FD->prev_Q_input_lp = q_old_inp_12k8;
+ move16();
+ Copy( old_inp_12k8 + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP );
+ }
+ }
+ ELSE
+ {
+ Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS );
+ Sample_Delay_LP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS );
+ IF( GT_16( st_fx->element_mode, EVS_MONO ) )
+ {
+ IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) )
+ {
+ Sample_Delay_HP = NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS - L_MEM_RECALC_TBE_NS );
+ }
+ Sample_Delay_HP = sub( Sample_Delay_HP, NS2SA( 16000, DELAY_FIR_RESAMPL_NS ) );
+ }
+ IF( GT_16( q_old_inp_16k, hBWE_FD->prev_Q_input_lp ) )
+ {
+ Copy_Scale_sig( old_inp_16k + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP, sub( hBWE_FD->prev_Q_input_lp, q_old_inp_16k ) ); // prev_Q_input_lp
+ }
+ ELSE
+ {
+ Scale_sig( hBWE_FD->old_input_lp_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ), sub( q_old_inp_16k, hBWE_FD->prev_Q_input_lp ) ); // q_old_inp_16k
+ hBWE_FD->prev_Q_input_lp = q_old_inp_16k;
+ move16();
+ Copy( old_inp_16k + sub( L_INP_MEM + L_FRAME, Sample_Delay_LP ), hBWE_FD->old_input_lp_fx, Sample_Delay_LP );
+ }
+ }
+
+ tmp = sub( L_LOOK_16k + L_SUBFR16k, Sample_Delay_HP );
+ Copy( &hBWE_TD->old_speech_shb_fx[tmp], hBWE_FD->new_input_hp_fx, Sample_Delay_HP );
+#ifdef FIX_ISSUE_1230
+ hBWE_FD->Q_new_input_hp = 0;
+ move16();
+#endif
+
+ IF( NE_16( st_fx->last_extl, WB_BWE ) )
+ {
+ hBWE_FD->prev_mode = NORMAL;
+ move16();
+ hBWE_FD->modeCount = 0;
+ move16();
+ }
+ hBWE_FD->EnergyLF_fx = 0;
+ hBWE_FD->EnergyLF_exp = 0;
+ move32();
+ move16();
+ hBWE_FD->prev_L_swb_norm1 = 8;
+ move16(); /*8.0 in Q0 */
+ st_fx->EnergyLT_fx_exp = 30;
+ move16(); /* Set to a High Exponent so it is 1^-30 */
+ }
+ /*---------------------------------------------------------------------*
+ * band-width switching from WB -> SWB/FB
+ *---------------------------------------------------------------------*/
+ IF( st_fx->element_mode > EVS_MONO )
+ {
+ IF( st_fx->bwidth_sw_cnt == 0 )
+ {
+ test();
+ IF( GE_16( st_fx->bwidth, SWB ) && EQ_16( st_fx->last_bwidth, WB ) )
+ {
+ st_fx->bwidth_sw_cnt = add( st_fx->bwidth_sw_cnt, 1 );
+ move16();
+ }
+ }
+ ELSE
+ {
+ st_fx->bwidth_sw_cnt = add( st_fx->bwidth_sw_cnt, 1 );
+ move16();
+ IF( EQ_16( st_fx->bwidth_sw_cnt, BWS_TRAN_PERIOD ) )
+ {
+ st_fx->bwidth_sw_cnt = 0;
+ move16();
+ }
+ }
+ }
+
+ return;
+}
+
+/*---------------------------------------------------------------------*
+ * core_switching_post_enc()
+ *
+ * Postprocessing for ACELP/HQ core switching
+ *---------------------------------------------------------------------*/
+
+void core_switching_post_enc_ivas_fx(
+ Encoder_State *st, /* i/o: encoder state structure */
+ Word16 *old_inp_12k8_fx, /* i : old input signal @12.8kHz Q_new-1 */
+ Word16 *old_inp_16k_fx, /* i : old input signal @16kHz Q_new-1 */
+ Word16 A_fx[], /* i : unquant. LP filter coefs. Q12 */
+ Word16 Q_new )
+{
+ IF( EQ_16( st->core, HQ_CORE ) )
+ {
+ st->use_acelp_preq = 0;
+ move16();
+ test();
+ test();
+ IF( ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) && st->element_mode == EVS_MONO ) /* core switching ==> ACELP subframe encoding */
+ {
+ /* Memory scaling to keep everything in common q */
+ Scale_sig( st->hLPDmem->mem_syn, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ Scale_sig( st->hLPDmem->mem_syn1_fx, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ Scale_sig( st->hLPDmem->mem_syn2, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ Scale_sig( st->hLPDmem->mem_syn3, M, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ Scale_sig( st->hLPDmem->mem_syn_r, L_SYN_MEM, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ st->hLPDmem->mem_w0 = shl( st->hLPDmem->mem_w0, sub( sub( Q_new, 1 ), st->hLPDmem->q_mem_syn ) ); /* Q_new-1 */
+ move16();
+ st->hLPDmem->q_mem_syn = sub( Q_new, 1 );
+ move16();
+
+ acelp_core_switch_enc_ivas_fx( st, old_inp_12k8_fx + L_INP_MEM - NS2SA( INT_FS_12k8, ACELP_LOOK_NS ), old_inp_16k_fx + L_INP_MEM - NS2SA( INT_FS_16k, ACELP_LOOK_NS ), A_fx, 0, sub( Q_new, 1 ) );
+ }
+
+ st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
+ move32();
+ st->hBWE_FD->mem_deemph_old_syn_fx = 0;
+ move16();
+ st->hBWE_FD->q_mem_deemph_old_syn = 0;
+ move16();
+ }
+ ELSE
+ {
+ IF( st->hBWE_TD == NULL )
+ {
+ return;
+ }
+
+ test();
+ /* reset SWB TBE buffers */
+ IF( EQ_16( st->extl, WB_TBE ) && NE_16( st->last_extl, WB_TBE ) )
+ {
+ wb_tbe_extras_reset_fx( st->hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, st->hBWE_TD->mem_genSHBexc_filt_down_wb3_fx );
+
+ IF( NE_16( st->last_extl, WB_BWE ) )
+ {
+ set16_fx( st->hBWE_TD->decim_state1_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
+ set16_fx( st->hBWE_TD->decim_state2_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
+ }
+
+ set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 );
+ set16_fx( st->hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD );
+ set32_fx( st->hBWE_TD->mem_csfilt_fx, 0, 2 );
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+
+ IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) &&
+ ( EQ_16( st->last_core, HQ_CORE ) || NE_16( st->L_frame, st->last_L_frame ) || ( NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) && NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) ) )
+ {
+ set16_fx( st->hBWE_TD->state_ana_filt_shb_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
+
+ InitSWBencBufferStates_fx( st->hBWE_TD, NULL );
+ swb_tbe_reset_fx( st->hBWE_TD->mem_csfilt_fx, st->hBWE_TD->mem_genSHBexc_filt_down_shb_fx, st->hBWE_TD->state_lpc_syn_fx, st->hBWE_TD->syn_overlap_fx, st->hBWE_TD->state_syn_shbexc_fx, &( st->hBWE_TD->tbe_demph_fx ), &( st->hBWE_TD->tbe_premph_fx ), st->hBWE_TD->mem_stp_swb_fx, &( st->hBWE_TD->gain_prec_swb_fx ) );
+
+ set16_fx( st->hBWE_TD->dec_2_over_3_mem_fx, 0, L_FILT_2OVER3 );
+ set16_fx( st->hBWE_TD->dec_2_over_3_mem_lp_fx, 0, L_FILT_2OVER3_LP );
+ }
+ ELSE IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && ( ( EQ_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_32( st->last_total_brate, st->total_brate ) ) || ( NE_16( st->last_bwidth, st->bwidth ) ) || ( NE_16( st->last_codec_mode, MODE1 ) ) || ( NE_16( st->rf_mode_last, st->rf_mode ) ) ) )
+ {
+ set16_fx( st->hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER );
+ set16_fx( st->hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD );
+ set16_fx( st->hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER );
+ set16_fx( st->hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
+ st->hBWE_TD->gain_prec_swb_fx = ONE_IN_Q14;
+ move16();
+ }
+ ELSE IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) )
+ {
+ TBEreset_enc_fx( st, st->bwidth );
+ }
+
+ test();
+ test();
+ test();
+ test();
+ /* Interp_3_2 CNG buffers reset */
+ IF( EQ_16( st->extl, FB_TBE ) && ( ( NE_16( st->last_extl, FB_TBE ) && NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) || NE_16( st->L_frame, st->last_L_frame ) ) )
+ {
+ set16_fx( st->hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
+ st->hBWE_TD->fb_tbe_demph_fx = 0;
+ move16();
+ fb_tbe_reset_enc_fx( st->hBWE_TD->elliptic_bpf_2_48k_mem_fx, &st->hBWE_TD->prev_fb_energy_fx, st->hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, &st->hBWE_TD->prev_fb_energy_fx_Q );
+ }
+ /* Fade towards init value for non HQ_CORE */
+ IF( st->hHQ_core != NULL )
+ {
+ st->hHQ_core->crest_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, st->hHQ_core->crest_lp_fx ), Mpy_32_32( L_sub( ONE_IN_Q31, HQ_CREST_FAC_SM_FX ), L_shr( HQ_CREST_THRESHOLD_FX, sub( Q28, st->hHQ_core->crest_lp_q ) ) ) ); /*crest_lp_q*/
+ move32();
+ st->hHQ_core->crest_mod_lp_fx = L_add( Mpy_32_32( HQ_CREST_FAC_SM_FX, st->hHQ_core->crest_mod_lp_fx ), Mpy_32_32( L_sub( ONE_IN_Q31, HQ_CREST_FAC_SM_FX ), L_shr( HQ_CREST_MOD_THRESHOLD_FX, sub( Q29, st->hHQ_core->crest_mod_lp_q ) ) ) ); /*crest_mod_lp_q*/
+ move32();
+ }
+ }
+
+ return;
+}
diff --git a/lib_enc/corr_xh.c b/lib_enc/corr_xh.c
deleted file mode 100644
index 9fd3cb8a2110dd67de347543d80c98cc92ab9c43..0000000000000000000000000000000000000000
--- a/lib_enc/corr_xh.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include "prot.h"
-#include "cnst.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/decision_matrix_enc.c b/lib_enc/decision_matrix_enc.c
deleted file mode 100644
index 5e0c266ca74776a96e206ea77826e8a721633d1d..0000000000000000000000000000000000000000
--- a/lib_enc/decision_matrix_enc.c
+++ /dev/null
@@ -1,45 +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 "prot.h"
-#include "prot_fx_enc.h"
-#include "stat_enc.h"
-#include "stat_dec.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/detect_transient.c b/lib_enc/detect_transient.c
deleted file mode 100644
index c2bbde08041bfeed5a556826eb2e257a72870485..0000000000000000000000000000000000000000
--- a/lib_enc/detect_transient.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include "prot.h"
-#include "cnst.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/diffcod.c b/lib_enc/diffcod.c
deleted file mode 100644
index 9f6bb42839bf471e7549869bde2f5ca8aaea65b9..0000000000000000000000000000000000000000
--- a/lib_enc/diffcod.c
+++ /dev/null
@@ -1,149 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-/*--------------------------------------------------------------------------*/
-/* Function diffcod() */
-/* */
-/* Differential coding for indices of quantized norms */
-/*--------------------------------------------------------------------------*/
-
-void diffcod(
- const int16_t N, /* i : number of sub-vectors */
- int16_t *y, /* i/o: indices of quantized norms */
- int16_t *difidx /* o : differential code */
-)
-{
- int16_t i, k, r;
-
- for ( i = N - 1; i > 0; i-- )
- {
- r = i - 1;
- k = y[i] - y[r];
- if ( k < ( -15 ) )
- {
- y[r] = y[i] + 15;
- }
- }
-
- for ( i = 1; i < N; i++ )
- {
- r = i - 1;
- k = y[i] - y[r];
- if ( k > 16 )
- {
- k = 16;
- y[i] = y[r] + 16;
- }
- difidx[r] = k + 15;
- }
-
- return;
-}
-
-
-/*--------------------------------------------------------------------------
- * diffcod_lrmdct()
- *
- * Differential coding for indices of quantized norms
- *--------------------------------------------------------------------------*/
-
-void diffcod_lrmdct(
- const int16_t N, /* i : number of sub-vectors */
- const int16_t be_ref, /* i : band energy reference */
- int16_t *y, /* i/o: indices of quantized norms */
- int16_t *difidx, /* o : differential code */
- const int16_t is_transient /* i : transient flag */
-)
-{
- int16_t i, m, r;
- int16_t k;
- int16_t thr_l, thr_h;
-
- if ( is_transient )
- {
- thr_l = -15;
- thr_h = 16;
- }
- else
- {
- thr_l = -32;
- thr_h = 31;
- }
-
- difidx[0] = y[0] - be_ref;
- if ( difidx[0] > thr_h )
- {
- difidx[0] = thr_h;
- y[0] = be_ref + thr_h;
- }
-
- if ( difidx[0] < thr_l )
- {
- difidx[0] = thr_l;
- y[0] = be_ref + thr_l;
- }
-
- m = N - 1;
- for ( i = m; i > 0; i-- )
- {
- r = i - 1;
- k = y[i] - y[r];
- if ( k < thr_l )
- {
- y[r] = y[i] - thr_l;
- }
- }
-
- for ( i = 1; i < N; i++ )
- {
- r = i - 1;
- k = y[i] - y[r];
- if ( k > thr_h )
- {
- k = thr_h;
- y[i] = y[r] + thr_h;
- }
- difidx[i] = k;
- }
-
- return;
-}
diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c
deleted file mode 100644
index 726508b0c292e420b5277b184e8860556dd047ad..0000000000000000000000000000000000000000
--- a/lib_enc/dtx.c
+++ /dev/null
@@ -1,45 +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
-#include "cnst.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_acelp.c b/lib_enc/enc_acelp.c
deleted file mode 100644
index bf5688ef1a77cfe2bebe279516cd43cc88c16ff6..0000000000000000000000000000000000000000
--- a/lib_enc/enc_acelp.c
+++ /dev/null
@@ -1,91 +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
-#include "prot.h"
-#include "rom_com.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
-
-
-/*
- * acelp_2pulse_search
- *
- * Parameters:
- * nb_pos_ix I: nb of pos for pulse 1 (1..8)
- * track_x I: track of pulse 1
- * track_y I: track of pulse 2
- * ps I/O: correlation of all fixed pulses
- * alp I/O: energy of all fixed pulses
- * ix O: position of pulse 1
- * iy O: position of pulse 2
- * dn I: corr. between target and h[]
- * dn2 I: vector of selected positions
- * cor_x I: corr. of pulse 1 with fixed pulses
- * cor_y I: corr. of pulse 2 with fixed pulses
- * rrixiy I: corr. of pulse 1 with pulse 2
- *
- * Function:
- * Find the best positions of 2 pulses in a subframe
- *
- * Returns:
- * void
- */
-
-
-/*
- * E_ACELP_1pulse_search
- *
- * Parameters:
- * track_x I: track of pulse 1
- * track_y I: track of pulse 2
- * ps I/O: correlation of all fixed pulses
- * alp I/O: energy of all fixed pulses
- * ix O: position of pulse 1
- * dn I: corr. between target and h[]
- * cor_x I: corr. of pulse 1 with fixed pulses
- * cor_y I: corr. of pulse 2 with fixed pulses
- *
- * Function:
- * Find the best positions of 1 pulse in a subframe
- *
- * Returns:
- * void
- */
diff --git a/lib_enc/enc_acelp_tcx_main.c b/lib_enc/enc_acelp_tcx_main.c
deleted file mode 100644
index d029c2fa8ff7ca387884c05ac7f0cdc99d30c61d..0000000000000000000000000000000000000000
--- a/lib_enc/enc_acelp_tcx_main.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_acelpx.c b/lib_enc/enc_acelpx.c
deleted file mode 100644
index f6e2b03799e472a70aafb03c4871a40ca99ad910..0000000000000000000000000000000000000000
--- a/lib_enc/enc_acelpx.c
+++ /dev/null
@@ -1,42 +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 "prot.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_amr_wb.c b/lib_enc/enc_amr_wb.c
deleted file mode 100644
index c899b52ff72d3d5658f135f34e7730d22f0987de..0000000000000000000000000000000000000000
--- a/lib_enc/enc_amr_wb.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_gain.c b/lib_enc/enc_gain.c
deleted file mode 100644
index 491d5d2f37f03f1729ca24b8b36a4bf2cf4009bc..0000000000000000000000000000000000000000
--- a/lib_enc/enc_gain.c
+++ /dev/null
@@ -1,43 +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 "prot.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_gen_voic.c b/lib_enc/enc_gen_voic.c
deleted file mode 100644
index c899b52ff72d3d5658f135f34e7730d22f0987de..0000000000000000000000000000000000000000
--- a/lib_enc/enc_gen_voic.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/enc_prm.c b/lib_enc/enc_prm.c
deleted file mode 100644
index 554521732b68510afd58032de4e51612f5c33c7d..0000000000000000000000000000000000000000
--- a/lib_enc/enc_prm.c
+++ /dev/null
@@ -1,231 +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 "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-
-/*-------------------------------------------------------------------*
- * writeTCXMode_fx()
- *
- * write TCX mode
- *--------------------------------------------------------------------*/
-
-void writeTCXMode_fx(
- Encoder_State *st, /* i/o: encoder state structure */
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/
- Word16 *nbits_start /* o : nbits start Q0*/
-)
-{
- UWord16 index;
- Word16 idx, start_idx;
- Word16 nBits;
-
- IF( st->tcxonly )
- {
- push_next_indice( hBstr, (UWord16) EQ_16( st->core, TCX_10_CORE ), 1 );
-
- test();
- IF( EQ_16( st->clas, UNVOICED_CLAS ) )
- {
- index = 0;
- move16();
- }
- ELSE IF( EQ_16( st->clas, VOICED_TRANSITION ) || EQ_16( st->clas, UNVOICED_TRANSITION ) )
- {
- index = 1;
- move16();
- }
- ELSE IF( EQ_16( st->clas, VOICED_CLAS ) )
- {
- index = 2;
- move16();
- }
- ELSE
- {
- index = 3;
- move16();
- }
-
- push_next_indice( hBstr, index, 2 );
-
- test();
- IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && !MCT_flag )
- {
- push_next_indice( hBstr, st->vad_flag, 1 );
- }
- }
- ELSE
- {
- IF( EQ_16( st->core, ACELP_CORE ) )
- {
- /* write the RF signaling information */
- IF( EQ_16( st->rf_mode, 1 ) )
- {
- /* find the section in the ACELP signaling table corresponding to bitrate */
- idx = 0;
- move16();
- WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) ) /* total bitrate is kept at 13.2kbps */
- {
- idx = add( idx, 1 );
- }
-
- /* retrieve the number of bits for signaling */
- idx = add( idx, 1 ); /* Q0 */
- nBits = extract_l( acelp_sig_tbl[idx] ); /* Q0 */
-
- /* retrieve the signaling index */
- idx = add( idx, 1 );
- start_idx = idx;
- move16();
- WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) )
- {
- idx = add( idx, 1 );
- }
- push_next_indice( hBstr, sub( idx, start_idx ), nBits );
- push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/
- *nbits_start = 3;
- move16();
- }
- ELSE
- {
- push_next_indice( hBstr, st->coder_type, 3 );
- }
- }
- ELSE
- {
- IF( EQ_16( st->mdct_sw, MODE1 ) )
- {
- /* 2 bits instead of 3 as TCX is already signaled */
- push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 );
- }
- ELSE
- {
- IF( EQ_16( st->mdct_sw_enable, MODE2 ) )
- {
- push_next_indice( hBstr, 1, 1 ); /* TCX */
- push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */
- push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 );
- }
- ELSE
- {
- /*write the RF signaling information*/
- IF( EQ_16( st->rf_mode, 1 ) )
- {
- /* find the section in the ACELP signaling table corresponding to bitrate */
- idx = 0;
- move16();
- WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) )
- {
- idx = add( idx, 1 );
- }
-
- /* retrieve the number of bits for signaling */
- idx = add( idx, 1 );
- nBits = extract_l( acelp_sig_tbl[idx] );
-
- test();
- test();
- IF( EQ_16( st->hTcxCfg->coder_type, VOICED ) || EQ_16( st->hTcxCfg->coder_type, GENERIC ) || EQ_16( st->hTcxCfg->coder_type, TRANSITION ) )
- {
- st->sharpFlag = 1;
- move16();
- }
- ELSE
- {
- st->sharpFlag = 0;
- move16();
- }
-
- /* retrieve the signaling index */
- idx = add( idx, 1 );
- start_idx = idx;
- move16();
- WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->hTcxCfg->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) )
- {
- idx = add( idx, 1 );
- }
- push_next_indice( hBstr, sub( idx, start_idx ), nBits );
- push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/
- *nbits_start = 3;
- move16();
- }
- ELSE
- {
- push_next_indice( hBstr, add( ACELP_MODE_MAX, st->hTcxCfg->coder_type ), 3 );
- }
- }
- }
- }
- }
-
- return;
-}
-
-
-/*-------------------------------------------------------------------*
- * writeTCXWindowing_fx()
- *
- * write TCX transform type
- *-------------------------------------------------------------------*/
-
-void writeTCXWindowing_fx(
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- const Word16 overlap_mode /* i : overlap mode Q0*/
-)
-{
-
- IF( EQ_16( overlap_mode, MIN_OVERLAP ) )
- {
- push_next_indice( hBstr, 2, 2 );
- }
- ELSE IF( EQ_16( overlap_mode, HALF_OVERLAP ) )
- {
- push_next_indice( hBstr, 3, 2 );
- }
- ELSE
- {
- push_next_indice( hBstr, 0, 1 );
- }
-
- return;
-}
diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c
index d394fa2d3acbf5703f33934fcbf011e214f0b7a7..da2ea58633af67855ca699a13a7b2d650d700024 100644
--- a/lib_enc/enc_prm_fx.c
+++ b/lib_enc/enc_prm_fx.c
@@ -11,7 +11,7 @@
#include "rom_com_fx.h"
#include "rom_com.h"
#include "stl.h"
-//#include "prot_fx.h"
+#include "prot.h"
#include "prot_fx.h" /* Function prototypes */
#include "prot_fx_enc.h" /* Function prototypes */
@@ -1512,3 +1512,190 @@ void writeTCXparam_fx(
return;
}
+
+/*-------------------------------------------------------------------*
+ * writeTCXMode_fx()
+ *
+ * write TCX mode
+ *--------------------------------------------------------------------*/
+
+void writeTCXMode_fx(
+ Encoder_State *st, /* i/o: encoder state structure */
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/
+ Word16 *nbits_start /* o : nbits start Q0*/
+)
+{
+ UWord16 index;
+ Word16 idx, start_idx;
+ Word16 nBits;
+
+ IF( st->tcxonly )
+ {
+ push_next_indice( hBstr, (UWord16) EQ_16( st->core, TCX_10_CORE ), 1 );
+
+ test();
+ IF( EQ_16( st->clas, UNVOICED_CLAS ) )
+ {
+ index = 0;
+ move16();
+ }
+ ELSE IF( EQ_16( st->clas, VOICED_TRANSITION ) || EQ_16( st->clas, UNVOICED_TRANSITION ) )
+ {
+ index = 1;
+ move16();
+ }
+ ELSE IF( EQ_16( st->clas, VOICED_CLAS ) )
+ {
+ index = 2;
+ move16();
+ }
+ ELSE
+ {
+ index = 3;
+ move16();
+ }
+
+ push_next_indice( hBstr, index, 2 );
+
+ test();
+ IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && !MCT_flag )
+ {
+ push_next_indice( hBstr, st->vad_flag, 1 );
+ }
+ }
+ ELSE
+ {
+ IF( EQ_16( st->core, ACELP_CORE ) )
+ {
+ /* write the RF signaling information */
+ IF( EQ_16( st->rf_mode, 1 ) )
+ {
+ /* find the section in the ACELP signaling table corresponding to bitrate */
+ idx = 0;
+ move16();
+ WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) ) /* total bitrate is kept at 13.2kbps */
+ {
+ idx = add( idx, 1 );
+ }
+
+ /* retrieve the number of bits for signaling */
+ idx = add( idx, 1 ); /* Q0 */
+ nBits = extract_l( acelp_sig_tbl[idx] ); /* Q0 */
+
+ /* retrieve the signaling index */
+ idx = add( idx, 1 );
+ start_idx = idx;
+ move16();
+ WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) )
+ {
+ idx = add( idx, 1 );
+ }
+ push_next_indice( hBstr, sub( idx, start_idx ), nBits );
+ push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/
+ *nbits_start = 3;
+ move16();
+ }
+ ELSE
+ {
+ push_next_indice( hBstr, st->coder_type, 3 );
+ }
+ }
+ ELSE
+ {
+ IF( EQ_16( st->mdct_sw, MODE1 ) )
+ {
+ /* 2 bits instead of 3 as TCX is already signaled */
+ push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 );
+ }
+ ELSE
+ {
+ IF( EQ_16( st->mdct_sw_enable, MODE2 ) )
+ {
+ push_next_indice( hBstr, 1, 1 ); /* TCX */
+ push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */
+ push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 );
+ }
+ ELSE
+ {
+ /*write the RF signaling information*/
+ IF( EQ_16( st->rf_mode, 1 ) )
+ {
+ /* find the section in the ACELP signaling table corresponding to bitrate */
+ idx = 0;
+ move16();
+ WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) )
+ {
+ idx = add( idx, 1 );
+ }
+
+ /* retrieve the number of bits for signaling */
+ idx = add( idx, 1 );
+ nBits = extract_l( acelp_sig_tbl[idx] );
+
+ test();
+ test();
+ IF( EQ_16( st->hTcxCfg->coder_type, VOICED ) || EQ_16( st->hTcxCfg->coder_type, GENERIC ) || EQ_16( st->hTcxCfg->coder_type, TRANSITION ) )
+ {
+ st->sharpFlag = 1;
+ move16();
+ }
+ ELSE
+ {
+ st->sharpFlag = 0;
+ move16();
+ }
+
+ /* retrieve the signaling index */
+ idx = add( idx, 1 );
+ start_idx = idx;
+ move16();
+ WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->hTcxCfg->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) )
+ {
+ idx = add( idx, 1 );
+ }
+ push_next_indice( hBstr, sub( idx, start_idx ), nBits );
+ push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/
+ *nbits_start = 3;
+ move16();
+ }
+ ELSE
+ {
+ push_next_indice( hBstr, add( ACELP_MODE_MAX, st->hTcxCfg->coder_type ), 3 );
+ }
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * writeTCXWindowing_fx()
+ *
+ * write TCX transform type
+ *-------------------------------------------------------------------*/
+
+void writeTCXWindowing_fx(
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ const Word16 overlap_mode /* i : overlap mode Q0*/
+)
+{
+
+ IF( EQ_16( overlap_mode, MIN_OVERLAP ) )
+ {
+ push_next_indice( hBstr, 2, 2 );
+ }
+ ELSE IF( EQ_16( overlap_mode, HALF_OVERLAP ) )
+ {
+ push_next_indice( hBstr, 3, 2 );
+ }
+ ELSE
+ {
+ push_next_indice( hBstr, 0, 1 );
+ }
+
+ return;
+}
diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c
deleted file mode 100644
index 3b1b81730b109a3a01bbdd1b2a774f2f7df37720..0000000000000000000000000000000000000000
--- a/lib_enc/fd_cng_enc.c
+++ /dev/null
@@ -1,1172 +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
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-#include "ivas_prot.h"
-#include "ivas_prot_fx.h"
-#include "stat_enc.h"
-#include "wmc_auto.h"
-
-#include "prot_fx.h"
-
-/*-------------------------------------------------------------------*
- * initFdCngEnc()
- *
- * Initialize FD_CNG
- *-------------------------------------------------------------------*/
-
-/*-------------------------------------------------------------------*
- * deleteFdCngEnc()
- *
- * Delete the instance of type FD_CNG
- *-------------------------------------------------------------------*/
-
-/*-------------------------------------------------------------------*
- * resetFdCngEnc()
- *
- * Reset the instance of type FD_CNG
- *-------------------------------------------------------------------*/
-/*-------------------------------------------------------------------*
- * perform_noise_estimation_enc()
- *
- * Perform noise estimation
- *-------------------------------------------------------------------*/
-void perform_noise_estimation_enc_ivas_fx(
- Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/
- Word16 band_energies_exp,
- Word32 *enerBuffer, /* enerBuffer_exp */
- Word16 enerBuffer_exp,
- HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: CNG structure containing all buffers and variables */
- const Word32 input_Fs, /* i : input sampling rate Q0*/
- CPE_ENC_HANDLE hCPE /* i : CPE encoder structure */
-)
-{
- Word16 i, j, s, s1, s2;
- Word16 numBands;
- Word16 numCoreBands = hFdCngEnc->hFdCngCom->numCoreBands; /* Q0 */
- move16();
- Word16 regularStopBand = hFdCngEnc->hFdCngCom->regularStopBand; /* Q0 */
- move16();
- Word16 numSlots = hFdCngEnc->hFdCngCom->numSlots; /* Q0 */
- move16();
- assert( numSlots == 16 );
-
- Word32 numSlots_inv_fx = 1073741824; // Q34 of .0625
- move32();
- Word32 *periodog = hFdCngEnc->hFdCngCom->periodog; /* exp(peridog_exp) */
- Word32 *ptr_per_fx = periodog;
- Word64 periodog_64;
- Word16 periodog_exp[PERIODOGLEN];
- Word16 npart = hFdCngEnc->hFdCngCom->npart; /* Q0 */
- move16();
- Word16 nFFTpart = hFdCngEnc->hFdCngCom->nFFTpart; /* Q0 */
- move16();
- Word16 nCLDFBpart = hFdCngEnc->hFdCngCom->nCLDFBpart; /* Q0 */
- move16();
-
- Word16 *psize = hFdCngEnc->hFdCngCom->psize; // 6Q9
- Word32 *msPeriodog_fx = hFdCngEnc->msPeriodog_fx;
- Word32 *msNoiseEst_fx = hFdCngEnc->msNoiseEst_fx; /* exp(msNoiseEst_fx_exp) */
-
- Word16 *msLogPeriodog_fx = hFdCngEnc->msLogPeriodog_fx;
- Word16 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_fx;
-
- Word32 scaleEB_fx = 0;
- move32();
- Word32 tmp;
-
- test();
- IF( hCPE != NULL && hCPE->hStereoDft != NULL )
- {
- // band_res_dft = ( (float) input_Fs ) / hCPE->hStereoDft->NFFT;
- // chan_width_f = 24000.f / CLDFB_NO_CHANNELS_MAX;
- // chan_width_bins = chan_width_f / band_res_dft;
-
- ///* Scaling of Energy buffer to get energy per sample, same scaling as for band_energies, 3 is to compensate for the 1/3 scaling in calculate_energy_buffer */
- // scaleEB = 3 * 4.0f / ( hCPE->hStereoDft->NFFT * hCPE->hStereoDft->NFFT );
-
- ///* Scale with number of bins in one band */
- // scaleEB = scaleEB / chan_width_bins;
-
- SWITCH( input_Fs )
- {
- case 8000:
- scaleEB_fx = 251648; // Q35
- move32();
- BREAK;
- case 16000:
- scaleEB_fx = 62912; // Q35
- move32();
- BREAK;
- case 32000:
- scaleEB_fx = 15728; // Q35
- move32();
- BREAK;
- case 48000:
- scaleEB_fx = 6991; // Q35
- move32();
- BREAK;
- default:
- assert( 0 && "invalid sample rate" );
- }
- }
- ELSE
- {
- scaleEB_fx = Mpy_32_32( numSlots_inv_fx, L_deposit_l( hFdCngEnc->hFdCngCom->scalingFactor ) ); // Q34 + Q30 - Q31 = Q33
- scaleEB_fx = L_shl( scaleEB_fx, 2 ); // Q35
- }
-
- /* preemphasis compensation and grouping of per bin energies into msPeriodog */
- FOR( i = 0; i < nFFTpart; i++ )
- {
- tmp = L_add( L_shr( band_energies[i], 1 ), L_shr( band_energies[i + NB_BANDS], 1 ) );
- msPeriodog_fx[i] = Mpy_32_16_1( tmp, preemphCompensation_fx[i] );
- move32();
- }
-
- /* exponent for fft part of msPeriodog */
- hFdCngEnc->msPeriodog_fx_exp_fft = add( band_energies_exp, PREEMPH_COMPENSATION_EXP );
- move16();
-
- Word16 max_exp = -31;
- move16();
- i = 0;
- move16();
- /* Adjust to the desired time resolution by averaging the periodograms over the time slots */
- FOR( j = numCoreBands; j < regularStopBand; j++ )
- {
- periodog_64 = W_mult_32_32( enerBuffer[j], scaleEB_fx );
- Word16 scale = W_norm( periodog_64 );
- *ptr_per_fx = W_extract_h( W_shl( periodog_64, scale ) );
- move32();
- periodog_exp[i] = sub( Q31, add( add( sub( Q31, enerBuffer_exp ), 35 - 31 ), scale ) );
- move16();
- max_exp = s_max( max_exp, periodog_exp[i] );
-
- ptr_per_fx++;
- i++;
- }
- /* exponent for cldfb part of msPeriodog */
- // hFdCngEnc->hFdCngCom->exp_cldfb_periodog = add( sub( enerBuffer_exp, 4 ), CLDFBscalingFactor_EXP );
- // move16();
-
- numBands = sub( regularStopBand, numCoreBands ); /* Q0 */
- FOR( i = 0; i < numBands; i++ )
- {
-
- periodog[i] = L_shr( periodog[i], sub( max_exp, periodog_exp[i] ) );
-
- move16();
- }
- hFdCngEnc->hFdCngCom->exp_cldfb_periodog = max_exp;
- move16();
- IF( numBands > 0 )
- {
- ///* Adjust CLDFB filterbank to the desired frequency resolution by averaging over spectral partitions for SID transmission */
- bandcombinepow(
- periodog,
- hFdCngEnc->hFdCngCom->exp_cldfb_periodog,
- numBands,
- hFdCngEnc->hFdCngCom->CLDFBpart,
- nCLDFBpart,
- hFdCngEnc->hFdCngCom->CLDFBpsize_inv,
- &msPeriodog_fx[nFFTpart],
- &hFdCngEnc->msPeriodog_fx_exp_cldfb );
-
- ///* find common exponent for fft part and cldfb part of msperiodog */
- s1 = getScaleFactor32( msPeriodog_fx, nFFTpart );
- s2 = getScaleFactor32( &msPeriodog_fx[nFFTpart], nCLDFBpart );
-
- s = s_max( sub( hFdCngEnc->msPeriodog_fx_exp_fft, s1 ), sub( hFdCngEnc->msPeriodog_fx_exp_cldfb, s2 ) );
- s1 = sub( s, hFdCngEnc->msPeriodog_fx_exp_fft );
- s2 = sub( s, hFdCngEnc->msPeriodog_fx_exp_cldfb );
-
- hFdCngEnc->msPeriodog_fx_exp_fft = s;
- move16();
- hFdCngEnc->msPeriodog_fx_exp_cldfb = s;
- move16();
-
- FOR( i = 0; i < nFFTpart; i++ )
- {
- msPeriodog_fx[i] = L_shr( msPeriodog_fx[i], s1 ); /* hFdCngEnc->msPeriodog_fx_exp_fft */
- move32();
- }
-
- FOR( i = 0; i < nCLDFBpart; i++ )
- {
- msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s_min( 31, s2 ) ); /* hFdCngEnc->msPeriodog_fx_exp_fft */
- move32();
- }
- }
- /* exponent for entire msPeriodog vector */
- hFdCngEnc->msPeriodog_fx_exp = hFdCngEnc->msPeriodog_fx_exp_fft;
- move16();
-
- /* Compress MS inputs */
- // compress_range_flt( msPeriodog, msLogPeriodog, npart );
- compress_range( msPeriodog_fx, hFdCngEnc->msPeriodog_fx_exp, msLogPeriodog_fx, npart );
-
-
- /* Call the minimum statistics routine for noise estimation */
-
- minimum_statistics_fx( npart, nFFTpart, psize, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx,
- hFdCngEnc->msPsdSecondMoment_fx, hFdCngEnc->msMinBuf_fx, hFdCngEnc->msBminWin_fx, hFdCngEnc->msBminSubWin_fx, hFdCngEnc->msCurrentMin_fx, hFdCngEnc->msCurrentMinOut_fx, hFdCngEnc->msCurrentMinSubWindow_fx, hFdCngEnc->msLocalMinFlag, hFdCngEnc->msNewMinFlag, hFdCngEnc->msPeriodogBuf_fx, &( hFdCngEnc->msPeriodogBufPtr ), hFdCngEnc->hFdCngCom,
- ENC, ( hCPE == NULL ) ? 0 : hCPE->element_mode );
-
- /* Expand MS outputs */
- expand_range( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart );
-
- return;
-}
-
-
-/*-------------------------------------------------------------------*
- * FdCng_encodeSID()
- *
- * Generate a bitstream out of the partition levels
- *-------------------------------------------------------------------*/
-void FdCng_encodeSID_ivas_fx(
- Encoder_State *st /* i/o: encoder state structure */
-)
-{
- Word16 N;
- HANDLE_FD_CNG_ENC hFdCngEnc = st->hFdCngEnc;
- HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
- BSTR_ENC_HANDLE hBstr = st->hBstr;
-
- Word32 *invTrfMatrix_fx, *E_fx;
- Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
- Word32 v_fx[32], gain_fx, e_fx, temp;
- Word16 w_fx[32], indices[32], exp[32];
- Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC];
- Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN];
- Word16 v_e, gain_q_offset, preemph_fac;
- Word16 i, index;
-
- gain_q_offset = GAIN_Q_OFFSET_IVAS_FX_Q0;
- move16();
-
- if ( st->element_mode == EVS_MONO )
- {
- gain_q_offset = GAIN_Q_OFFSET_EVS_FX_Q0;
- move16();
- }
-
- preemph_fac = st->preemph_fac; // Q15
- move16();
-
- /* Init */
- N = hFdCngEnc->npartDec;
- move16();
-
- E_fx = hFdCngEnc->msNoiseEst_fx;
-
- invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
-
- set_zero_fx( v_fx, FDCNG_VQ_MAX_LEN );
-
- /* Convert to LOG */
- e_fx = 0;
- move32();
- FOR( i = 0; i < N; i++ )
- {
- IF( E_fx[i] == 0 )
- {
- /* 10 * log(1e-4) = 10 * (-4) = -40 */
- v_fx[i] = -41943040; // -40.0 in Q20
- move32();
- }
- ELSE
- {
- v_fx[i] = Mpy_32_32( 671088640 /*10 in Q26*/, BASOP_Util_Log10( E_fx[i], hFdCngEnc->msNoiseEst_fx_exp ) ); // Q20 = 26+25-31
- move32();
- }
- e_fx = L_add( e_fx, v_fx[i] ); // Q20
- }
-
- /* Normalize MSVQ input */
- gain_fx = 0;
- move32();
- FOR( i = N_GAIN_MIN; i < N_GAIN_MAX; i++ )
- {
- gain_fx = L_add( gain_fx, v_fx[i] ); // Q20
- }
-
- /*gain /= (float) ( N_GAIN_MAX - N_GAIN_MIN );*/
- gain_fx = Mpy_32_32( gain_fx, 165191050 /* 1/13 in Q31*/ ); // Q20
-
- FOR( i = 0; i < N; i++ )
- {
- v_fx[i] = L_sub( v_fx[i], gain_fx ); // Q20
- move32();
- }
-
- v_e = 11; // Q20
- move16();
-
- /* MSVQ encoder */
- set_val_Word16( w_fx, ONE_IN_Q8, N );
-
- IF( st->element_mode != EVS_MONO )
- {
- /* DCT domain compressed/truncated indices used for first stage */
- /* quantization with stage1 stored in DCT24 domain, stages 2 through 6 directly dearched
- in FDCNG band domain
- */
- IF( EQ_16( N, FDCNG_VQ_MAX_LEN_WB ) )
- {
- /* truncated DCT21 analysis */
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31
-
- dctT2_N_apply_matrix_fx( v_fx /*Q20*/, dct_target_fx, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); // Q20
-
- /* truncated IDCT21 extension to 24 bands */
- extend_dctN_input_fx( v_fx, dct_target_fx, N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); // Q20
-
- Copy32( tot_sig_ext_fx, v_fx, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ // Q20
- }
-
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31
-
- msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, v_fx, v_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w_fx, N, FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices );
-
- msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix_fx, v_fx, NULL, 7 );
-
- v_e = sub( 31, sub( 20, find_guarded_bits_fx( N ) ) );
- }
- ELSE
- { /* EVS_MONO tables */
- msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, v_fx, v_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w_fx, N, FD_CNG_maxN_37bits, 0, NULL, indices );
-
- msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v_fx, NULL, 7 );
-
- v_e = sub( 31, sub( 20, find_guarded_bits_fx( N ) ) );
- }
-
- /* Compute gain */
- gain_fx = 0;
- move32();
- FOR( i = 0; i < N; i++ )
- {
- gain_fx = L_add( gain_fx, v_fx[i] ); // Q = 31 - v_e
- }
-
- e_fx = L_shl( e_fx, sub( 11, v_e ) ); // Q = 31 - v_e
- gain_fx = Mpy_32_16_1( L_sub( e_fx, gain_fx ), div_s( 1, N ) ); // Q = 31 - v_e
- gain_fx = L_shl( gain_fx, sub( v_e, 8 ) ); // Q23
-
- /* Apply bitrate-dependant scale */
- IF( st->element_mode > EVS_MONO )
- {
- apply_scale( &gain_fx, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
- }
- ELSE
- {
- apply_scale( &gain_fx, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableMono, SIZE_SCALE_TABLE_MONO );
- }
-
- /* Quantize gain */
- temp = Madd_32_32( L_shl( gain_q_offset, 22 ), gain_fx, 1610612736 /*1.5 in Q30*/ ); // Q22
- index = extract_l( L_shr( L_add( temp, ONE_IN_Q21 ), 22 ) ); // Q0
-
- if ( index < 0 )
- {
- index = 0;
- move16();
- }
-
- if ( GT_16( index, 127 ) )
- {
- index = 127;
- move16();
- }
-
- gain_fx = L_shl( L_mult0( sub( index, gain_q_offset ), 21845 /*1.5 in Q15*/ ), sub( 16, v_e ) ); // Q = 31-v_e
-
- /* Apply gain and undo log */
- FOR( i = 0; i < N; i++ )
- {
- temp = Mpy_32_32( L_add( v_fx[i], gain_fx ), 214748365 /* 0.1 in Q31*/ ); // Q = 31-v_e
- hFdCngCom->sidNoiseEst[i] = BASOP_Util_fPow( 10, 31, temp, v_e, &exp[i] );
- move32();
- }
-
- maximum_s( exp, N, &hFdCngCom->sidNoiseEstExp );
-
- FOR( i = 0; i < N; i++ )
- {
- hFdCngCom->sidNoiseEst[i] = L_shr( hFdCngCom->sidNoiseEst[i], sub( hFdCngCom->sidNoiseEstExp, exp[i] ) ); // exp = hFdCngCom->sidNoiseEstExp
- move32();
- }
-
- /* NB last band energy compensation */
- IF( hFdCngCom->CngBandwidth == NB )
- {
- hFdCngCom->sidNoiseEst[N - 1] = Mpy_32_16_1( hFdCngCom->sidNoiseEst[N - 1], NB_LAST_BAND_SCALE ); // exp(hFdCngCom->sidNoiseEstExp)
- move32();
- }
-
- test();
- IF( EQ_16( hFdCngCom->CngBandwidth, SWB ) && LE_32( hFdCngCom->CngBitrate, ACELP_13k20 ) )
- {
- hFdCngCom->sidNoiseEst[N - 1] = Mpy_32_16_1( hFdCngCom->sidNoiseEst[N - 1], SWB_13k2_LAST_BAND_SCALE ); // exp(hFdCngCom->sidNoiseEstExp)
- move32();
- }
-
- /* Write bitstream */
- IF( EQ_16( st->codec_mode, MODE2 ) )
- {
- FOR( i = 0; i < FD_CNG_stages_37bits; i++ )
- {
- push_next_indice( hBstr, indices[i], bits_37bits[i] );
- }
-
- push_next_indice( hBstr, index, 7 );
- }
- ELSE
- {
- Word16 is_frame_len_16k = 0;
- move16();
- if ( EQ_16( st->L_frame, L_FRAME16k ) )
- {
- is_frame_len_16k = 1;
- move16();
- }
- push_indice( hBstr, IND_SID_TYPE, 1, 1 );
- push_indice( hBstr, IND_BWIDTH, st->bwidth, 2 );
- push_indice( hBstr, IND_ACELP_16KHZ, is_frame_len_16k, 1 );
-
- FOR( i = 0; i < FD_CNG_stages_37bits; i++ )
- {
- push_indice( hBstr, IND_LSF, indices[i], bits_37bits[i] );
- }
-
- push_indice( hBstr, IND_ENERGY, index, 7 );
- }
-
- /* Interpolate the bin/band-wise levels from the partition levels */
- scalebands( hFdCngCom->sidNoiseEst, hFdCngEnc->partDec, hFdCngEnc->npartDec, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
- hFdCngCom->cngNoiseLevelExp = hFdCngCom->sidNoiseEstExp;
- move16();
-
- lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, preemph_fac );
-
- return;
-}
-
-
-/*-------------------------------------------------------------------*
- * stereoFdCngCoherence()
- *
- * compute coherence of channels for use in FD-CNG
- *-------------------------------------------------------------------*/
-void stereoFdCngCoherence_fx(
- Encoder_State **sts, /* i/o: core encoder structures */
- const Word16 last_element_mode, /* i : last element mode Q0*/
- Word16 fft_buf_fx[CPE_CHANNELS][2 * L_FFT], /* i : fft buffers for L and R channels fft_exp*/
- Word16 fft_exp )
-{
- const Word16 *pt_fftL, *pt_fftR;
- Word16 i_subfr, i;
- Word32 cr, ci, eL, eR;
- Word16 cr_exp, ci_exp, eL_exp, eR_exp;
- Word32 *mem;
- Word16 *mem_exp;
-
- IF( NE_16( last_element_mode, IVAS_CPE_MDCT ) )
- {
- set32_fx( sts[0]->hFdCngEnc->mem_coherence_fx, EPSILON_FX, 4 );
- set16_fx( sts[0]->hFdCngEnc->mem_coherence_exp, 0, 4 );
- }
- test();
- test();
- IF( EQ_32( sts[0]->core_brate, -1 ) || EQ_32( sts[1]->core_brate, -1 ) )
- {
- /* case: at least one channel has triggered VAD -> ACTIVE FRAME */
- IF( EQ_32( sts[0]->core_brate, -1 ) )
- {
- sts[1]->total_brate = sts[0]->total_brate; /* Q0 */
- move32();
- sts[1]->active_cnt = sts[0]->active_cnt; /* Q0 */
- move16();
- if ( GE_32( sts[1]->active_cnt, CNG_TYPE_HO ) )
- {
- sts[1]->last_total_brate_cng = -1;
- move16();
- }
- }
- IF( EQ_32( sts[1]->core_brate, -1 ) )
- {
- sts[0]->total_brate = sts[1]->total_brate; /* Q0 */
- move32();
- sts[0]->active_cnt = sts[1]->active_cnt; /* Q0 */
- move16();
- if ( GE_16( sts[0]->active_cnt, CNG_TYPE_HO ) )
- {
- sts[0]->last_total_brate_cng = -1;
- move16();
- }
- }
- sts[0]->core_brate = -1;
- move32();
- sts[1]->core_brate = -1;
- move32();
- sts[0]->hDtxEnc->cnt_SID = 0;
- move16();
- sts[1]->hDtxEnc->cnt_SID = 0;
- move16();
- }
- ELSE IF( LE_32( sts[0]->core_brate, SID_2k40 ) && LE_32( sts[1]->core_brate, SID_2k40 ) )
- {
- /* case: no VAD for both channels -> INACTIVE FRAME */
- reset_indices_enc( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot );
-
- reset_indices_enc( sts[1]->hBstr, sts[1]->hBstr->nb_ind_tot );
-
- /* synchronize SID sending for variable SID rate */
- IF( EQ_32( sts[0]->core_brate, sts[1]->core_brate ) )
- {
- sts[0]->core_brate = SID_2k40;
- move32();
- sts[1]->core_brate = SID_2k40;
- move32();
- }
-
- /* synchronize SID counters */
- sts[0]->hDtxEnc->cnt_SID = s_min( sts[0]->hDtxEnc->cnt_SID, sts[1]->hDtxEnc->cnt_SID ); /* Q0 */
- sts[1]->hDtxEnc->cnt_SID = sts[0]->hDtxEnc->cnt_SID; /* Q0 */
- move16();
- move16();
- }
-
- pt_fftL = fft_buf_fx[0];
- pt_fftR = fft_buf_fx[1];
- mem = sts[0]->hFdCngEnc->mem_coherence_fx; /* exp(sts[0]->hFdCngEnc->mem_coherence_exp) */
- mem_exp = sts[0]->hFdCngEnc->mem_coherence_exp;
- FOR( i_subfr = 0; i_subfr < 2; i_subfr++ )
- {
- cr = ci = eL = eR = EPSILON_FX;
- move32();
- move32();
- move32();
- move32();
- cr_exp = ci_exp = eL_exp = eR_exp = 0;
- move16();
- move16();
- move16();
- move16();
-
- cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[0], pt_fftR[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */
- eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[0], pt_fftL[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftL[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */
- eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[0], pt_fftR[0] ), L_mult( pt_fftR[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */
-
- FOR( i = 1; i < L_FFT / 2; i++ )
- {
- cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[i], pt_fftR[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */
- ci = BASOP_Util_Add_Mant32Exp( ci, ci_exp, L_add( L_mult( -pt_fftL[i], pt_fftR[L_FFT - i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[i] ) ), shl( fft_exp, 1 ), &ci_exp ); /* exp(ci_exp) */
- eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[i], pt_fftL[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftL[L_FFT - i] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */
- eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[i], pt_fftR[i] ), L_mult( pt_fftR[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */
- }
- test();
- test();
- IF( LE_32( sts[0]->ini_frame, 50 ) || ( sts[0]->vad_flag == 0 && sts[1]->vad_flag == 0 ) )
- {
- mem[0] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[0], 31129 /*0.95f*/ ), mem_exp[0], Mpy_32_16_1( cr, 1638 /*0.05f*/ ), cr_exp, &mem_exp[0] ); /* exp(mem_exp[0]) */
- move32();
- mem[1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[1], 31129 /*0.95f*/ ), mem_exp[1], Mpy_32_16_1( ci, 1638 /*0.05f*/ ), ci_exp, &mem_exp[1] ); /* exp(mem_exp[1]) */
- move32();
- mem[2] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[2], 31129 /*0.95f*/ ), mem_exp[2], Mpy_32_16_1( eL, 1638 /*0.05f*/ ), eL_exp, &mem_exp[2] ); /* exp(mem_exp[2]) */
- move32();
- mem[3] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[3], 31129 /*0.95f*/ ), mem_exp[3], Mpy_32_16_1( eR, 1638 /*0.05f*/ ), eR_exp, &mem_exp[3] ); /* exp(mem_exp[3]) */
- move32();
- }
-
- pt_fftL += L_FFT;
- pt_fftR += L_FFT;
- }
-
- Word16 sqr_inp, temp, sqr_out, sqr_inp_exp;
- Word32 sqr_inp32 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( mem[0], mem[0] ), shl( mem_exp[0], 1 ), Mpy_32_32( mem[1], mem[1] ), shl( mem_exp[1], 1 ), &sqr_inp_exp ); /* exp(sqr_inp_exp) */
- sqr_inp = BASOP_Util_Divide3232_Scale( sqr_inp32, Mpy_32_32( mem[2], mem[3] ), &temp );
- sqr_inp_exp = add( temp, sub( sqr_inp_exp, add( mem_exp[2], mem_exp[3] ) ) );
- sqr_out = Sqrt16( sqr_inp, &sqr_inp_exp );
- sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = shl_sat( sqr_out, sqr_inp_exp ); // Q15 expected.
- move16();
- return;
-}
-
-/*-------------------------------------------------------------------*
- * FdCngEncodeMDCTStereoSID()
- *
- * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX
- *-------------------------------------------------------------------*/
-
-void FdCngEncodeMDCTStereoSID_fx(
- CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */
-)
-{
- ENC_CORE_HANDLE sts[CPE_CHANNELS];
- Word16 indices[CPE_CHANNELS][FD_CNG_stages_37bits];
- Word16 gain_idx[CPE_CHANNELS];
- Word16 N, stages, ch, p, coh_idx;
- Word32 *lr_in_ptr_fx[CPE_CHANNELS];
- Word16 lr_in_ptr_e[CPE_CHANNELS];
- Word32 *ms_ptr_fx[CPE_CHANNELS];
- Word16 ms_ptr_e;
- Word32 *lr_out_ptr_fx[CPE_CHANNELS];
- Word16 lr_out_ptr_e[CPE_CHANNELS];
- Word32 logNoiseEst_fx[CPE_CHANNELS][NPART];
- Word32 E_fx[CPE_CHANNELS];
- Word32 gain_fx[CPE_CHANNELS];
- Word16 weights_fx[NPART];
- Word32 side_energy_fx;
- Word16 Qside_energy;
- Word32 *invTrfMatrix_fx;
- Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/
- invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
- Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN], dct_target_fx[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/
- Word16 tmp, tmp_e;
- Word16 no_side_flag;
- Word16 is_inp_ms;
- Word16 size_value, temp_e, gb, shift;
- Word32 tmp32, t1, t2;
-
- is_inp_ms = 0;
- move16();
- IF( EQ_16( hCPE->hCoreCoder[0]->cng_sba_flag, 1 ) )
- {
- is_inp_ms = 1;
- move16();
- }
-
- /* set pointers and initialize */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- sts[ch] = hCPE->hCoreCoder[ch];
- lr_in_ptr_fx[ch] = &sts[ch]->hFdCngEnc->msNoiseEst_fx[0]; /* exp(sts[ch]->hFdCngEnc->msNoiseEst_fx_exp) */
- lr_in_ptr_e[ch] = sts[ch]->hFdCngEnc->msNoiseEst_fx_exp;
- ms_ptr_fx[ch] = &logNoiseEst_fx[ch][0];
- lr_out_ptr_fx[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; /* exp(sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp) */
- lr_out_ptr_e[ch] = sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp;
- }
- N = sts[0]->hFdCngEnc->npartDec; /* Q0 */
- move16();
- set16_fx( weights_fx, ONE_IN_Q8, NPART );
-
- /* apply log and save energy of original left and right channels */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- // E[ch] = 0.0f;
- E_fx[ch] = 0;
- move32();
- FOR( p = 0; p < N; p++ )
- {
- IF( lr_in_ptr_fx[ch][p] )
- {
- t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] ); // Q25
- t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25
- }
- ELSE
- {
- t2 = 0;
- move32();
- }
- ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23
- move32();
- E_fx[ch] = L_add( E_fx[ch], L_shr( ms_ptr_fx[ch][p], 4 ) ); // Q19
- move32();
- }
- }
- ms_ptr_e = Q31 - Q23;
- move16();
-
- /* M/S transform on log envelopes */
- IF( is_inp_ms == 0 )
- {
- convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 ); // ms_ptr_e = Q23;
- }
-
- gb = find_guarded_bits_fx( N );
- side_energy_fx = sum2_f_32_fx( ms_ptr_fx[1], N, gb );
- Qside_energy = sub( sub( shl( sub( 31, ms_ptr_e ), 1 ), 31 ), gb );
-
- /* do not transmit side shape if initial noise shapes are very similar */
- IF( LE_32( side_energy_fx, L_shl( 214748365, sub( Qside_energy, Q31 ) ) ) )
- {
- no_side_flag = 1;
- move16();
- }
- ELSE
- {
- no_side_flag = 0;
- move16();
- }
-
- /* Quantize noise shapes */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- /* Normalize MSVQ input */
- gain_fx[ch] = 0;
- move32();
- FOR( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ )
- {
- tmp32 = Mpy_32_32( ms_ptr_fx[ch][p], 165191050 /* 0.07 in Q31*/ ); // Q23
- gain_fx[ch] = L_add( gain_fx[ch], tmp32 ); // Q23
- move32();
- }
-
- FOR( p = 0; p < N; p++ )
- {
- ms_ptr_fx[ch][p] = L_sub( ms_ptr_fx[ch][p], gain_fx[ch] ); // Q23
- move32();
- }
- }
-
- /* always split channel targetloop */
-
- /* extend fdcng envelope from length 21 to a 24 length fdncg domain envelope signal */
- /* High quality cosine smooth basis extension used to not introduce noise in stage#1 DCT24 analysis and subsequent VQ-steps */
- IF( EQ_16( N, FDCNG_VQ_MAX_LEN_WB ) )
- {
- size_value = BASOP_Util_Divide1616_Scale( sizeof( tmpRAM_fx ), ( sizeof( Word32 ) ), &temp_e ); /*Q15*/
- size_value = shr( size_value, sub( 15, temp_e ) );
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, size_value ); // Q31 /*WB: create truncated IDCT21 matrix */
- for ( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- /* run DCT_N N==21 , truncated at 18/21 ~= 86% , i.e use a bit better better quality in extrapolation , than subsequent DCT24 analysis which is truncated at 75%*/
- /* truncated DCT 21 analysis */
- dctT2_N_apply_matrix_fx( (const Word32 *) ms_ptr_fx[ch], dct_target_fx[ch], FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
- /* extrapolate extend fdcng envelope signal in the fdncg ienvelope/"time" domain using DCT21 basis vectors,
- estimated DCT21 coeffs scaling extended basis vectors are used to create extrapolated length 24 input target envelope signal */
- /* this DCT21 extension does not introduce DCT24 coefficient noise for the subsequent dct24 target analysis, and later in IDCT24 synthesis */
-
- /* truncated IDCT 21 extension synthesis */
- extend_dctN_input_fx( ms_ptr_fx[ch], dct_target_fx[ch], N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx /* DCT_N basis vectors */, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
-
- Copy32( tot_sig_ext_fx, ms_ptr_fx[ch], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ */
- }
- }
-
- size_value = BASOP_Util_Divide1616_Scale( sizeof( tmpRAM_fx ), ( sizeof( Word32 ) ), &temp_e ); /*Q15*/
- size_value = shr( size_value, sub( 15, temp_e ) );
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, size_value ); /*always create/set up IDCT24 matrix in RAM */
-
- /* end split */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- /* MSVQ */
- IF( ch )
- {
- stages = FD_CNG_JOINT_stages_25bits;
- move16();
- }
- ELSE
- {
- stages = FD_CNG_stages_37bits;
- move16();
- }
-
- /* DCT24 domain compressed/truncated indices used for first stage */
- /* mid channel quantization using stages 1 through 6 */
- /* & side channel quantization using stages 1 through 4 */
-
- {
- msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, ms_ptr_fx[ch], ms_ptr_e, levels_37bits, FD_CNG_maxC_37bits, stages, weights_fx, N, FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices[ch] );
- msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix_fx, ms_ptr_fx[ch], NULL, 7 );
- }
- }
- shift = find_guarded_bits_fx( N );
- ms_ptr_e = sub( 31, sub( 20, shift ) );
-
- IF( no_side_flag )
- {
- set32_fx( ms_ptr_fx[1], 0, N );
- }
-
- /* undo M/S */
- IF( is_inp_ms == 0 )
- {
- convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 );
- }
-
- /* Compute gain against original left and right channels */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- gain_fx[ch] = 0;
- move32();
-
- tmp_e = 15;
- move16();
- tmp = Inv16( N, &tmp_e );
- FOR( p = 0; p < N; p++ )
- {
- gain_fx[ch] = L_add( gain_fx[ch], Mpy_32_16_1( ms_ptr_fx[ch][p], shl( tmp, tmp_e ) ) ); // Q23
- move32();
- }
- gain_fx[ch] = L_sub( L_shl( Mpy_32_16_1( E_fx[ch], shl( tmp, tmp_e ) ), Q23 - Q19 ), L_shl( gain_fx[ch], sub( ms_ptr_e, 8 ) ) ); // Q23
- move32();
-
- apply_scale( &gain_fx[ch], sts[ch]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[ch]->element_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
-
- /* quantize gain */
- gain_idx[ch] = (Word16) Mpy_32_32_r( L_add( gain_fx[ch], 251658240 ), 384 ); // Q23
- move16();
- gain_idx[ch] = s_max( 0, s_min( 127, gain_idx[ch] ) );
- move16();
-
- gain_fx[ch] = Mpy_32_16_1( L_shl( sub( gain_idx[ch], GAIN_Q_OFFSET_IVAS_FX_Q0 ), 23 ), 21845 ); // Q23
- move32();
- }
-
- /* restore channel noise envelopes */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc;
- HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
-
- tmp_e = 0;
- move16();
- Word32 pow;
-
- Word16 e_lr_out[NPART];
-
- FOR( p = 0; p < N; p++ )
- {
- pow = L_shl( gain_fx[ch], 8 - ms_ptr_e );
- pow = L_add( ms_ptr_fx[ch][p], pow );
- pow = Mpy_32_32( pow, 214748365 ); /*pow = 0.1*/
- lr_out_ptr_fx[ch][p] = BASOP_Util_fPow( 10, 31, pow, ms_ptr_e, &e_lr_out[p] );
- move32();
- tmp_e = s_max( tmp_e, e_lr_out[p] );
- }
-
- FOR( p = 0; p < N; p++ )
- {
- lr_out_ptr_fx[ch][p] = L_shl( lr_out_ptr_fx[ch][p], e_lr_out[p] - tmp_e );
- move32();
- }
- lr_out_ptr_e[ch] = tmp_e;
- move32();
-
- sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp = tmp_e;
- move16();
-
- /* scale bands and get scalefactors */
- scalebands( lr_out_ptr_fx[ch], hFdCngEnc->partDec, N, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
- hFdCngCom->cngNoiseLevelExp = lr_out_ptr_e[ch];
- move16();
-
- lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac );
-
- sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame;
- }
-
- /* quantize channel coherence */
- coh_idx = mult_r( sts[0]->hFdCngEnc->hFdCngCom->coherence_fx, 15 );
- coh_idx = max( 0, min( coh_idx, 15 ) );
-
- /* ---- Write SID bitstream ---- */
-
-
- /* noise shapes and channel gains */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- IF( ch )
- {
- stages = FD_CNG_JOINT_stages_25bits;
- sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
-
- /* side info */
- push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 );
- push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 );
- }
- ELSE
- {
- stages = FD_CNG_stages_37bits;
- /* side info */
- push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 );
- push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
- push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 );
- }
-
- FOR( Word16 i = 0; i < stages; i++ )
- {
- push_indice( sts[ch]->hBstr, IND_LSF, indices[ch][i], bits_37bits[i] );
- }
- push_indice( sts[ch]->hBstr, IND_ENERGY, gain_idx[ch], 7 );
- }
-
- /* pad with zeros to reach common SID frame size */
- push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
-
- return;
-}
-
-/*-------------------------------------------------------------------*
- * FdCngEncodeDiracMDCTStereoSID()
- *
- * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX
- * together with Dirac
- *-------------------------------------------------------------------*/
-
-void FdCngEncodeDiracMDCTStereoSID_fx(
- CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */
-)
-{
- ENC_CORE_HANDLE sts[CPE_CHANNELS];
- Word32 *lr_in_ptr_fx[CPE_CHANNELS];
- Word16 lr_in_ptr_e[CPE_CHANNELS];
- Word32 *ms_ptr_fx[CPE_CHANNELS];
- Word16 ms_ptr_e;
- Word32 *lr_out_ptr_fx[CPE_CHANNELS];
- Word16 lr_out_ptr_e[CPE_CHANNELS];
- Word32 logNoiseEst_fx[CPE_CHANNELS][NPART];
- Word32 E_fx[CPE_CHANNELS];
- Word32 gain_fx[CPE_CHANNELS];
- Word16 weights_fx[NPART];
- Word16 N[CPE_CHANNELS];
- Word16 indices[CPE_CHANNELS][FD_CNG_stages_37bits];
- Word16 gain_idx[CPE_CHANNELS];
- Word16 ch, p;
- Word16 tmp, tmp_e, shift;
- Word32 *invTrfMatrix_fx;
- Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
- Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC];
- Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN];
- invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
- Word32 t1, t2, tmp32;
- /* set pointers and initialize */
-
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- sts[ch] = hCPE->hCoreCoder[ch];
- N[ch] = sts[ch]->hFdCngEnc->npartDec;
- lr_in_ptr_fx[ch] = &sts[ch]->hFdCngEnc->msNoiseEst_fx[0];
- lr_in_ptr_e[ch] = sts[ch]->hFdCngEnc->msNoiseEst_fx_exp;
- ms_ptr_fx[ch] = &logNoiseEst_fx[ch][0];
- lr_out_ptr_fx[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0];
- lr_out_ptr_e[ch] = sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp;
- move16();
- }
- set16_fx( weights_fx, ONE_IN_Q8, NPART );
-
- /* apply log and save energy of original left and right channels */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- // E[ch] = 0.0f;
- E_fx[ch] = 0;
- move32();
- FOR( p = 0; p < N[ch]; p++ )
- {
- t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] + EPSILLON_FX ); // Q25
- t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25
- ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23
- move32();
- E_fx[ch] = L_add( E_fx[ch], L_shr( ms_ptr_fx[ch][p], 5 ) ); // Q18
- move32();
- }
- }
- ms_ptr_e = Q31 - Q23;
- move16();
-
- /* M/S transform on log envelopes */
- convertToMS_fx( N[0], ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 );
- E_fx[0] = 0;
- move32();
- FOR( p = 0; p < N[0]; p++ )
- {
- E_fx[0] = L_add( E_fx[0], L_shr( ms_ptr_fx[0][p], 5 ) ); // Q18
- move32();
- }
-
- /* Quantize M noise shape */
- /* Normalize MSVQ input */
- gain_fx[0] = 0;
- move16();
- FOR( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ )
- {
- tmp32 = Mpy_32_32( ms_ptr_fx[0][p], 165191050 /* 0.07 in Q31 */ ); // Q23
- gain_fx[0] = L_add( gain_fx[0], tmp32 ); // Q23
- move32();
- }
-
- FOR( p = 0; p < N[0]; p++ )
- {
- ms_ptr_fx[0][p] = L_sub( ms_ptr_fx[0][p], gain_fx[0] ); // Q23
- move32();
- }
-
-
- /* MSVQ */
- /* DCT domain compressed/truncated indices used for first stage */
- /* mid quantization using stages #1 through 6 */
- scale_sig32( ms_ptr_fx[0], N[0], -6 );
- ms_ptr_e = add( ms_ptr_e, 6 );
- move16();
- IF( EQ_16( N[0], FDCNG_VQ_MAX_LEN_WB ) )
- {
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N[0], FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) );
- /* truncated DCT 21 analysis */
- dctT2_N_apply_matrix_fx( (const Word32 *) ms_ptr_fx[0], dct_target_fx, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
- /* truncated IDCT21 extension to 24 synthesis */
-
- extend_dctN_input_fx( ms_ptr_fx[0], dct_target_fx, N[0], tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
-
- Copy32( tot_sig_ext_fx, ms_ptr_fx[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 Q23*/
- }
- create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) );
-
- msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, ms_ptr_fx[0], ms_ptr_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights_fx, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices[0] );
- msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix_fx, ms_ptr_fx[0], NULL, 7 );
- shift = find_guarded_bits_fx( N[0] );
- ms_ptr_e = sub( 31, sub( 20, shift ) );
- scale_sig32( ms_ptr_fx[1], N[1], sub( 8, ms_ptr_e ) ); /* Q31 - ms_ptr_e */
-
- /* set S to zero */
- set32_fx( ms_ptr_fx[1], 0, NPART );
-
- /* compute M gain */
- gain_fx[0] = 0;
- move32();
- tmp_e = 15;
- move16();
- tmp = Inv16( N[0], &tmp_e );
- FOR( p = 0; p < N[0]; p++ )
- {
- gain_fx[0] = L_add( gain_fx[0], Mpy_32_16_1( ms_ptr_fx[0][p], shl( tmp, tmp_e ) ) ); // Q23
- move32();
- }
- gain_fx[0] = L_sub( L_shl( Mpy_32_16_1( E_fx[0], shl( tmp, tmp_e ) ), Q23 - Q18 ), L_shl( gain_fx[0], ms_ptr_e - 8 ) ); // Q23
- move32();
-
- apply_scale( &gain_fx[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
-
- /* quantize gain */
- gain_idx[0] = extract_l( Mpy_32_32_r( L_add( gain_fx[0], 251658240 ), 384 ) );
- move16();
- gain_idx[0] = s_max( 0, s_min( 127, gain_idx[0] ) );
- move16();
-
- gain_fx[0] = Mpy_32_16_1( L_shl( sub( gain_idx[0], GAIN_Q_OFFSET_IVAS_FX_Q0 ), 23 ), 21845 /* 0.66 in Q15 */ ); // Q23
- move32();
- gain_fx[1] = gain_fx[0]; // Q23
- move32();
-
- /* undo M/S */
- convertToMS_fx( NPART, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 );
-
- /* restore channel noise envelopes */
- FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
- {
- HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc;
- HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
-
- Word32 pow;
- Word16 e_lr_out[NPART];
- tmp_e = -MAX_16;
- FOR( p = 0; p < N[ch]; p++ )
- {
- pow = L_shl( gain_fx[ch], sub( 8, ms_ptr_e ) ); /* Q31 - ms_ptr_e */
- pow = L_add( ms_ptr_fx[ch][p], pow ); /* Q31 - ms_ptr_e */
- pow = Mpy_32_32( pow, 214748365 /* 0.1 in Q31 */ ); /*pow = 0.1 Q31 - ms_ptr_e*/
- lr_out_ptr_fx[ch][p] = BASOP_Util_fPow( 10, 31, pow, ms_ptr_e, &e_lr_out[p] );
- tmp_e = s_max( tmp_e, e_lr_out[p] );
- }
-
- FOR( p = 0; p < N[ch]; p++ )
- {
- lr_out_ptr_fx[ch][p] = L_shl( lr_out_ptr_fx[ch][p], sub( e_lr_out[p], tmp_e ) ); // Q(31 - tmp_e)
- }
-
- sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp = tmp_e;
- move16();
- lr_out_ptr_e[ch] = tmp_e;
- move16();
-
- /* NB last band energy compensation */
- IF( hFdCngCom->CngBandwidth == NB )
- {
- lr_out_ptr_fx[ch][N[ch] - 1] = Mpy_32_16_1( lr_out_ptr_fx[ch][N[ch] - 1], NB_LAST_BAND_SCALE ); // Q(31 - tmp_e)
- move32();
- }
- ELSE IF( hFdCngCom->CngBandwidth == SWB && LE_32( hFdCngCom->CngBitrate, ACELP_13k20 ) )
- {
- lr_out_ptr_fx[ch][N[ch] - 1] = Mpy_32_16_1( lr_out_ptr_fx[ch][N[ch] - 1], SWB_13k2_LAST_BAND_SCALE ); // Q(31 - tmp_e)
- move32();
- }
- /* scale bands and get scalefactors */
- scalebands( lr_out_ptr_fx[ch], hFdCngEnc->partDec, N[ch], hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
- hFdCngCom->cngNoiseLevelExp = lr_out_ptr_e[ch];
- move16();
- lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac );
- sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame;
- }
- sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = 0;
- move16();
- sts[1]->hFdCngEnc->hFdCngCom->coherence_fx = 0;
- move16();
-
- /* ---- Write SID bitstream ---- */
-
- /* side info */
- push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 );
- push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
- IF( EQ_16( sts[0]->L_frame, L_FRAME16k ) )
- {
- push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, 1, 1 );
- }
- ELSE
- {
- push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, 0, 1 );
- }
-
- /* noise shapes and channel gains */
- FOR( Word16 i = 0; i < FD_CNG_stages_37bits; i++ )
- {
- push_indice( sts[0]->hBstr, IND_LSF, indices[0][i], bits_37bits[i] );
- }
- push_indice( sts[0]->hBstr, IND_ENERGY, gain_idx[0], 7 );
-
- return;
-}
diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c
index 93a954ae83fa1617b1f98f08e33e1df0a2dc0362..50f479d8dca98638b2cf5ea2752a05ba5a9649a8 100644
--- a/lib_enc/fd_cng_enc_fx.c
+++ b/lib_enc/fd_cng_enc_fx.c
@@ -14,6 +14,7 @@
#include "prot.h"
#include "prot_fx.h"
#include "prot_fx_enc.h"
+#include "ivas_prot_fx.h"
#include "basop_util.h"
#include "rom_basop_util.h"
@@ -2267,3 +2268,1102 @@ Word16 cng_energy_ivas_fx(
}
return enr;
}
+
+void perform_noise_estimation_enc_ivas_fx(
+ Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN band_energies_exp*/
+ Word16 band_energies_exp,
+ Word32 *enerBuffer, /* enerBuffer_exp */
+ Word16 enerBuffer_exp,
+ HANDLE_FD_CNG_ENC hFdCngEnc, /* i/o: CNG structure containing all buffers and variables */
+ const Word32 input_Fs, /* i : input sampling rate Q0*/
+ CPE_ENC_HANDLE hCPE /* i : CPE encoder structure */
+)
+{
+ Word16 i, j, s, s1, s2;
+ Word16 numBands;
+ Word16 numCoreBands = hFdCngEnc->hFdCngCom->numCoreBands; /* Q0 */
+ move16();
+ Word16 regularStopBand = hFdCngEnc->hFdCngCom->regularStopBand; /* Q0 */
+ move16();
+ Word16 numSlots = hFdCngEnc->hFdCngCom->numSlots; /* Q0 */
+ move16();
+ assert( numSlots == 16 );
+
+ Word32 numSlots_inv_fx = 1073741824; // Q34 of .0625
+ move32();
+ Word32 *periodog = hFdCngEnc->hFdCngCom->periodog; /* exp(peridog_exp) */
+ Word32 *ptr_per_fx = periodog;
+ Word64 periodog_64;
+ Word16 periodog_exp[PERIODOGLEN];
+ Word16 npart = hFdCngEnc->hFdCngCom->npart; /* Q0 */
+ move16();
+ Word16 nFFTpart = hFdCngEnc->hFdCngCom->nFFTpart; /* Q0 */
+ move16();
+ Word16 nCLDFBpart = hFdCngEnc->hFdCngCom->nCLDFBpart; /* Q0 */
+ move16();
+
+ Word16 *psize = hFdCngEnc->hFdCngCom->psize; // 6Q9
+ Word32 *msPeriodog_fx = hFdCngEnc->msPeriodog_fx;
+ Word32 *msNoiseEst_fx = hFdCngEnc->msNoiseEst_fx; /* exp(msNoiseEst_fx_exp) */
+
+ Word16 *msLogPeriodog_fx = hFdCngEnc->msLogPeriodog_fx;
+ Word16 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_fx;
+
+ Word32 scaleEB_fx = 0;
+ move32();
+ Word32 tmp;
+
+ test();
+ IF( hCPE != NULL && hCPE->hStereoDft != NULL )
+ {
+ // band_res_dft = ( (float) input_Fs ) / hCPE->hStereoDft->NFFT;
+ // chan_width_f = 24000.f / CLDFB_NO_CHANNELS_MAX;
+ // chan_width_bins = chan_width_f / band_res_dft;
+
+ ///* Scaling of Energy buffer to get energy per sample, same scaling as for band_energies, 3 is to compensate for the 1/3 scaling in calculate_energy_buffer */
+ // scaleEB = 3 * 4.0f / ( hCPE->hStereoDft->NFFT * hCPE->hStereoDft->NFFT );
+
+ ///* Scale with number of bins in one band */
+ // scaleEB = scaleEB / chan_width_bins;
+
+ SWITCH( input_Fs )
+ {
+ case 8000:
+ scaleEB_fx = 251648; // Q35
+ move32();
+ BREAK;
+ case 16000:
+ scaleEB_fx = 62912; // Q35
+ move32();
+ BREAK;
+ case 32000:
+ scaleEB_fx = 15728; // Q35
+ move32();
+ BREAK;
+ case 48000:
+ scaleEB_fx = 6991; // Q35
+ move32();
+ BREAK;
+ default:
+ assert( 0 && "invalid sample rate" );
+ }
+ }
+ ELSE
+ {
+ scaleEB_fx = Mpy_32_32( numSlots_inv_fx, L_deposit_l( hFdCngEnc->hFdCngCom->scalingFactor ) ); // Q34 + Q30 - Q31 = Q33
+ scaleEB_fx = L_shl( scaleEB_fx, 2 ); // Q35
+ }
+
+ /* preemphasis compensation and grouping of per bin energies into msPeriodog */
+ FOR( i = 0; i < nFFTpart; i++ )
+ {
+ tmp = L_add( L_shr( band_energies[i], 1 ), L_shr( band_energies[i + NB_BANDS], 1 ) );
+ msPeriodog_fx[i] = Mpy_32_16_1( tmp, preemphCompensation_fx[i] );
+ move32();
+ }
+
+ /* exponent for fft part of msPeriodog */
+ hFdCngEnc->msPeriodog_fx_exp_fft = add( band_energies_exp, PREEMPH_COMPENSATION_EXP );
+ move16();
+
+ Word16 max_exp = -31;
+ move16();
+ i = 0;
+ move16();
+ /* Adjust to the desired time resolution by averaging the periodograms over the time slots */
+ FOR( j = numCoreBands; j < regularStopBand; j++ )
+ {
+ periodog_64 = W_mult_32_32( enerBuffer[j], scaleEB_fx );
+ Word16 scale = W_norm( periodog_64 );
+ *ptr_per_fx = W_extract_h( W_shl( periodog_64, scale ) );
+ move32();
+ periodog_exp[i] = sub( Q31, add( add( sub( Q31, enerBuffer_exp ), 35 - 31 ), scale ) );
+ move16();
+ max_exp = s_max( max_exp, periodog_exp[i] );
+
+ ptr_per_fx++;
+ i++;
+ }
+ /* exponent for cldfb part of msPeriodog */
+ // hFdCngEnc->hFdCngCom->exp_cldfb_periodog = add( sub( enerBuffer_exp, 4 ), CLDFBscalingFactor_EXP );
+ // move16();
+
+ numBands = sub( regularStopBand, numCoreBands ); /* Q0 */
+ FOR( i = 0; i < numBands; i++ )
+ {
+
+ periodog[i] = L_shr( periodog[i], sub( max_exp, periodog_exp[i] ) );
+
+ move16();
+ }
+ hFdCngEnc->hFdCngCom->exp_cldfb_periodog = max_exp;
+ move16();
+ IF( numBands > 0 )
+ {
+ ///* Adjust CLDFB filterbank to the desired frequency resolution by averaging over spectral partitions for SID transmission */
+ bandcombinepow(
+ periodog,
+ hFdCngEnc->hFdCngCom->exp_cldfb_periodog,
+ numBands,
+ hFdCngEnc->hFdCngCom->CLDFBpart,
+ nCLDFBpart,
+ hFdCngEnc->hFdCngCom->CLDFBpsize_inv,
+ &msPeriodog_fx[nFFTpart],
+ &hFdCngEnc->msPeriodog_fx_exp_cldfb );
+
+ ///* find common exponent for fft part and cldfb part of msperiodog */
+ s1 = getScaleFactor32( msPeriodog_fx, nFFTpart );
+ s2 = getScaleFactor32( &msPeriodog_fx[nFFTpart], nCLDFBpart );
+
+ s = s_max( sub( hFdCngEnc->msPeriodog_fx_exp_fft, s1 ), sub( hFdCngEnc->msPeriodog_fx_exp_cldfb, s2 ) );
+ s1 = sub( s, hFdCngEnc->msPeriodog_fx_exp_fft );
+ s2 = sub( s, hFdCngEnc->msPeriodog_fx_exp_cldfb );
+
+ hFdCngEnc->msPeriodog_fx_exp_fft = s;
+ move16();
+ hFdCngEnc->msPeriodog_fx_exp_cldfb = s;
+ move16();
+
+ FOR( i = 0; i < nFFTpart; i++ )
+ {
+ msPeriodog_fx[i] = L_shr( msPeriodog_fx[i], s1 ); /* hFdCngEnc->msPeriodog_fx_exp_fft */
+ move32();
+ }
+
+ FOR( i = 0; i < nCLDFBpart; i++ )
+ {
+ msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s_min( 31, s2 ) ); /* hFdCngEnc->msPeriodog_fx_exp_fft */
+ move32();
+ }
+ }
+ /* exponent for entire msPeriodog vector */
+ hFdCngEnc->msPeriodog_fx_exp = hFdCngEnc->msPeriodog_fx_exp_fft;
+ move16();
+
+ /* Compress MS inputs */
+ // compress_range_flt( msPeriodog, msLogPeriodog, npart );
+ compress_range( msPeriodog_fx, hFdCngEnc->msPeriodog_fx_exp, msLogPeriodog_fx, npart );
+
+
+ /* Call the minimum statistics routine for noise estimation */
+
+ minimum_statistics_fx( npart, nFFTpart, psize, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx,
+ hFdCngEnc->msPsdSecondMoment_fx, hFdCngEnc->msMinBuf_fx, hFdCngEnc->msBminWin_fx, hFdCngEnc->msBminSubWin_fx, hFdCngEnc->msCurrentMin_fx, hFdCngEnc->msCurrentMinOut_fx, hFdCngEnc->msCurrentMinSubWindow_fx, hFdCngEnc->msLocalMinFlag, hFdCngEnc->msNewMinFlag, hFdCngEnc->msPeriodogBuf_fx, &( hFdCngEnc->msPeriodogBufPtr ), hFdCngEnc->hFdCngCom,
+ ENC, ( hCPE == NULL ) ? 0 : hCPE->element_mode );
+
+ /* Expand MS outputs */
+ expand_range( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * FdCng_encodeSID()
+ *
+ * Generate a bitstream out of the partition levels
+ *-------------------------------------------------------------------*/
+void FdCng_encodeSID_ivas_fx(
+ Encoder_State *st /* i/o: encoder state structure */
+)
+{
+ Word16 N;
+ HANDLE_FD_CNG_ENC hFdCngEnc = st->hFdCngEnc;
+ HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
+ BSTR_ENC_HANDLE hBstr = st->hBstr;
+
+ Word32 *invTrfMatrix_fx, *E_fx;
+ Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+ Word32 v_fx[32], gain_fx, e_fx, temp;
+ Word16 w_fx[32], indices[32], exp[32];
+ Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC];
+ Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN];
+ Word16 v_e, gain_q_offset, preemph_fac;
+ Word16 i, index;
+
+ gain_q_offset = GAIN_Q_OFFSET_IVAS_FX_Q0;
+ move16();
+
+ if ( st->element_mode == EVS_MONO )
+ {
+ gain_q_offset = GAIN_Q_OFFSET_EVS_FX_Q0;
+ move16();
+ }
+
+ preemph_fac = st->preemph_fac; // Q15
+ move16();
+
+ /* Init */
+ N = hFdCngEnc->npartDec;
+ move16();
+
+ E_fx = hFdCngEnc->msNoiseEst_fx;
+
+ invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
+
+ set_zero_fx( v_fx, FDCNG_VQ_MAX_LEN );
+
+ /* Convert to LOG */
+ e_fx = 0;
+ move32();
+ FOR( i = 0; i < N; i++ )
+ {
+ IF( E_fx[i] == 0 )
+ {
+ /* 10 * log(1e-4) = 10 * (-4) = -40 */
+ v_fx[i] = -41943040; // -40.0 in Q20
+ move32();
+ }
+ ELSE
+ {
+ v_fx[i] = Mpy_32_32( 671088640 /*10 in Q26*/, BASOP_Util_Log10( E_fx[i], hFdCngEnc->msNoiseEst_fx_exp ) ); // Q20 = 26+25-31
+ move32();
+ }
+ e_fx = L_add( e_fx, v_fx[i] ); // Q20
+ }
+
+ /* Normalize MSVQ input */
+ gain_fx = 0;
+ move32();
+ FOR( i = N_GAIN_MIN; i < N_GAIN_MAX; i++ )
+ {
+ gain_fx = L_add( gain_fx, v_fx[i] ); // Q20
+ }
+
+ /*gain /= (float) ( N_GAIN_MAX - N_GAIN_MIN );*/
+ gain_fx = Mpy_32_32( gain_fx, 165191050 /* 1/13 in Q31*/ ); // Q20
+
+ FOR( i = 0; i < N; i++ )
+ {
+ v_fx[i] = L_sub( v_fx[i], gain_fx ); // Q20
+ move32();
+ }
+
+ v_e = 11; // Q20
+ move16();
+
+ /* MSVQ encoder */
+ set_val_Word16( w_fx, ONE_IN_Q8, N );
+
+ IF( st->element_mode != EVS_MONO )
+ {
+ /* DCT domain compressed/truncated indices used for first stage */
+ /* quantization with stage1 stored in DCT24 domain, stages 2 through 6 directly dearched
+ in FDCNG band domain
+ */
+ IF( EQ_16( N, FDCNG_VQ_MAX_LEN_WB ) )
+ {
+ /* truncated DCT21 analysis */
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31
+
+ dctT2_N_apply_matrix_fx( v_fx /*Q20*/, dct_target_fx, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); // Q20
+
+ /* truncated IDCT21 extension to 24 bands */
+ extend_dctN_input_fx( v_fx, dct_target_fx, N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); // Q20
+
+ Copy32( tot_sig_ext_fx, v_fx, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ // Q20
+ }
+
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31
+
+ msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, v_fx, v_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w_fx, N, FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices );
+
+ msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix_fx, v_fx, NULL, 7 );
+
+ v_e = sub( 31, sub( 20, find_guarded_bits_fx( N ) ) );
+ }
+ ELSE
+ { /* EVS_MONO tables */
+ msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, v_fx, v_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w_fx, N, FD_CNG_maxN_37bits, 0, NULL, indices );
+
+ msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v_fx, NULL, 7 );
+
+ v_e = sub( 31, sub( 20, find_guarded_bits_fx( N ) ) );
+ }
+
+ /* Compute gain */
+ gain_fx = 0;
+ move32();
+ FOR( i = 0; i < N; i++ )
+ {
+ gain_fx = L_add( gain_fx, v_fx[i] ); // Q = 31 - v_e
+ }
+
+ e_fx = L_shl( e_fx, sub( 11, v_e ) ); // Q = 31 - v_e
+ gain_fx = Mpy_32_16_1( L_sub( e_fx, gain_fx ), div_s( 1, N ) ); // Q = 31 - v_e
+ gain_fx = L_shl( gain_fx, sub( v_e, 8 ) ); // Q23
+
+ /* Apply bitrate-dependant scale */
+ IF( st->element_mode > EVS_MONO )
+ {
+ apply_scale( &gain_fx, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
+ }
+ ELSE
+ {
+ apply_scale( &gain_fx, hFdCngCom->CngBandwidth, hFdCngCom->CngBitrate, scaleTableMono, SIZE_SCALE_TABLE_MONO );
+ }
+
+ /* Quantize gain */
+ temp = Madd_32_32( L_shl( gain_q_offset, 22 ), gain_fx, 1610612736 /*1.5 in Q30*/ ); // Q22
+ index = extract_l( L_shr( L_add( temp, ONE_IN_Q21 ), 22 ) ); // Q0
+
+ if ( index < 0 )
+ {
+ index = 0;
+ move16();
+ }
+
+ if ( GT_16( index, 127 ) )
+ {
+ index = 127;
+ move16();
+ }
+
+ gain_fx = L_shl( L_mult0( sub( index, gain_q_offset ), 21845 /*1.5 in Q15*/ ), sub( 16, v_e ) ); // Q = 31-v_e
+
+ /* Apply gain and undo log */
+ FOR( i = 0; i < N; i++ )
+ {
+ temp = Mpy_32_32( L_add( v_fx[i], gain_fx ), 214748365 /* 0.1 in Q31*/ ); // Q = 31-v_e
+ hFdCngCom->sidNoiseEst[i] = BASOP_Util_fPow( 10, 31, temp, v_e, &exp[i] );
+ move32();
+ }
+
+ maximum_s( exp, N, &hFdCngCom->sidNoiseEstExp );
+
+ FOR( i = 0; i < N; i++ )
+ {
+ hFdCngCom->sidNoiseEst[i] = L_shr( hFdCngCom->sidNoiseEst[i], sub( hFdCngCom->sidNoiseEstExp, exp[i] ) ); // exp = hFdCngCom->sidNoiseEstExp
+ move32();
+ }
+
+ /* NB last band energy compensation */
+ IF( hFdCngCom->CngBandwidth == NB )
+ {
+ hFdCngCom->sidNoiseEst[N - 1] = Mpy_32_16_1( hFdCngCom->sidNoiseEst[N - 1], NB_LAST_BAND_SCALE ); // exp(hFdCngCom->sidNoiseEstExp)
+ move32();
+ }
+
+ test();
+ IF( EQ_16( hFdCngCom->CngBandwidth, SWB ) && LE_32( hFdCngCom->CngBitrate, ACELP_13k20 ) )
+ {
+ hFdCngCom->sidNoiseEst[N - 1] = Mpy_32_16_1( hFdCngCom->sidNoiseEst[N - 1], SWB_13k2_LAST_BAND_SCALE ); // exp(hFdCngCom->sidNoiseEstExp)
+ move32();
+ }
+
+ /* Write bitstream */
+ IF( EQ_16( st->codec_mode, MODE2 ) )
+ {
+ FOR( i = 0; i < FD_CNG_stages_37bits; i++ )
+ {
+ push_next_indice( hBstr, indices[i], bits_37bits[i] );
+ }
+
+ push_next_indice( hBstr, index, 7 );
+ }
+ ELSE
+ {
+ Word16 is_frame_len_16k = 0;
+ move16();
+ if ( EQ_16( st->L_frame, L_FRAME16k ) )
+ {
+ is_frame_len_16k = 1;
+ move16();
+ }
+ push_indice( hBstr, IND_SID_TYPE, 1, 1 );
+ push_indice( hBstr, IND_BWIDTH, st->bwidth, 2 );
+ push_indice( hBstr, IND_ACELP_16KHZ, is_frame_len_16k, 1 );
+
+ FOR( i = 0; i < FD_CNG_stages_37bits; i++ )
+ {
+ push_indice( hBstr, IND_LSF, indices[i], bits_37bits[i] );
+ }
+
+ push_indice( hBstr, IND_ENERGY, index, 7 );
+ }
+
+ /* Interpolate the bin/band-wise levels from the partition levels */
+ scalebands( hFdCngCom->sidNoiseEst, hFdCngEnc->partDec, hFdCngEnc->npartDec, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
+ hFdCngCom->cngNoiseLevelExp = hFdCngCom->sidNoiseEstExp;
+ move16();
+
+ lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, preemph_fac );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * stereoFdCngCoherence()
+ *
+ * compute coherence of channels for use in FD-CNG
+ *-------------------------------------------------------------------*/
+void stereoFdCngCoherence_fx(
+ Encoder_State **sts, /* i/o: core encoder structures */
+ const Word16 last_element_mode, /* i : last element mode Q0*/
+ Word16 fft_buf_fx[CPE_CHANNELS][2 * L_FFT], /* i : fft buffers for L and R channels fft_exp*/
+ Word16 fft_exp )
+{
+ const Word16 *pt_fftL, *pt_fftR;
+ Word16 i_subfr, i;
+ Word32 cr, ci, eL, eR;
+ Word16 cr_exp, ci_exp, eL_exp, eR_exp;
+ Word32 *mem;
+ Word16 *mem_exp;
+
+ IF( NE_16( last_element_mode, IVAS_CPE_MDCT ) )
+ {
+ set32_fx( sts[0]->hFdCngEnc->mem_coherence_fx, EPSILON_FX, 4 );
+ set16_fx( sts[0]->hFdCngEnc->mem_coherence_exp, 0, 4 );
+ }
+ test();
+ test();
+ IF( EQ_32( sts[0]->core_brate, -1 ) || EQ_32( sts[1]->core_brate, -1 ) )
+ {
+ /* case: at least one channel has triggered VAD -> ACTIVE FRAME */
+ IF( EQ_32( sts[0]->core_brate, -1 ) )
+ {
+ sts[1]->total_brate = sts[0]->total_brate; /* Q0 */
+ move32();
+ sts[1]->active_cnt = sts[0]->active_cnt; /* Q0 */
+ move16();
+ if ( GE_32( sts[1]->active_cnt, CNG_TYPE_HO ) )
+ {
+ sts[1]->last_total_brate_cng = -1;
+ move16();
+ }
+ }
+ IF( EQ_32( sts[1]->core_brate, -1 ) )
+ {
+ sts[0]->total_brate = sts[1]->total_brate; /* Q0 */
+ move32();
+ sts[0]->active_cnt = sts[1]->active_cnt; /* Q0 */
+ move16();
+ if ( GE_16( sts[0]->active_cnt, CNG_TYPE_HO ) )
+ {
+ sts[0]->last_total_brate_cng = -1;
+ move16();
+ }
+ }
+ sts[0]->core_brate = -1;
+ move32();
+ sts[1]->core_brate = -1;
+ move32();
+ sts[0]->hDtxEnc->cnt_SID = 0;
+ move16();
+ sts[1]->hDtxEnc->cnt_SID = 0;
+ move16();
+ }
+ ELSE IF( LE_32( sts[0]->core_brate, SID_2k40 ) && LE_32( sts[1]->core_brate, SID_2k40 ) )
+ {
+ /* case: no VAD for both channels -> INACTIVE FRAME */
+ reset_indices_enc( sts[0]->hBstr, sts[0]->hBstr->nb_ind_tot );
+
+ reset_indices_enc( sts[1]->hBstr, sts[1]->hBstr->nb_ind_tot );
+
+ /* synchronize SID sending for variable SID rate */
+ IF( EQ_32( sts[0]->core_brate, sts[1]->core_brate ) )
+ {
+ sts[0]->core_brate = SID_2k40;
+ move32();
+ sts[1]->core_brate = SID_2k40;
+ move32();
+ }
+
+ /* synchronize SID counters */
+ sts[0]->hDtxEnc->cnt_SID = s_min( sts[0]->hDtxEnc->cnt_SID, sts[1]->hDtxEnc->cnt_SID ); /* Q0 */
+ sts[1]->hDtxEnc->cnt_SID = sts[0]->hDtxEnc->cnt_SID; /* Q0 */
+ move16();
+ move16();
+ }
+
+ pt_fftL = fft_buf_fx[0];
+ pt_fftR = fft_buf_fx[1];
+ mem = sts[0]->hFdCngEnc->mem_coherence_fx; /* exp(sts[0]->hFdCngEnc->mem_coherence_exp) */
+ mem_exp = sts[0]->hFdCngEnc->mem_coherence_exp;
+ FOR( i_subfr = 0; i_subfr < 2; i_subfr++ )
+ {
+ cr = ci = eL = eR = EPSILON_FX;
+ move32();
+ move32();
+ move32();
+ move32();
+ cr_exp = ci_exp = eL_exp = eR_exp = 0;
+ move16();
+ move16();
+ move16();
+ move16();
+
+ cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[0], pt_fftR[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */
+ eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[0], pt_fftL[0] ), L_mult( pt_fftL[L_FFT / 2], pt_fftL[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */
+ eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[0], pt_fftR[0] ), L_mult( pt_fftR[L_FFT / 2], pt_fftR[L_FFT / 2] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */
+
+ FOR( i = 1; i < L_FFT / 2; i++ )
+ {
+ cr = BASOP_Util_Add_Mant32Exp( cr, cr_exp, L_add( L_mult( pt_fftL[i], pt_fftR[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &cr_exp ); /* exp(cr_exp) */
+ ci = BASOP_Util_Add_Mant32Exp( ci, ci_exp, L_add( L_mult( -pt_fftL[i], pt_fftR[L_FFT - i] ), L_mult( pt_fftL[L_FFT - i], pt_fftR[i] ) ), shl( fft_exp, 1 ), &ci_exp ); /* exp(ci_exp) */
+ eL = BASOP_Util_Add_Mant32Exp( eL, eL_exp, L_add( L_mult( pt_fftL[i], pt_fftL[i] ), L_mult( pt_fftL[L_FFT - i], pt_fftL[L_FFT - i] ) ), shl( fft_exp, 1 ), &eL_exp ); /* exp(eL_exp) */
+ eR = BASOP_Util_Add_Mant32Exp( eR, eR_exp, L_add( L_mult( pt_fftR[i], pt_fftR[i] ), L_mult( pt_fftR[L_FFT - i], pt_fftR[L_FFT - i] ) ), shl( fft_exp, 1 ), &eR_exp ); /* exp(eR_exp) */
+ }
+ test();
+ test();
+ IF( LE_32( sts[0]->ini_frame, 50 ) || ( sts[0]->vad_flag == 0 && sts[1]->vad_flag == 0 ) )
+ {
+ mem[0] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[0], 31129 /*0.95f*/ ), mem_exp[0], Mpy_32_16_1( cr, 1638 /*0.05f*/ ), cr_exp, &mem_exp[0] ); /* exp(mem_exp[0]) */
+ move32();
+ mem[1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[1], 31129 /*0.95f*/ ), mem_exp[1], Mpy_32_16_1( ci, 1638 /*0.05f*/ ), ci_exp, &mem_exp[1] ); /* exp(mem_exp[1]) */
+ move32();
+ mem[2] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[2], 31129 /*0.95f*/ ), mem_exp[2], Mpy_32_16_1( eL, 1638 /*0.05f*/ ), eL_exp, &mem_exp[2] ); /* exp(mem_exp[2]) */
+ move32();
+ mem[3] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( mem[3], 31129 /*0.95f*/ ), mem_exp[3], Mpy_32_16_1( eR, 1638 /*0.05f*/ ), eR_exp, &mem_exp[3] ); /* exp(mem_exp[3]) */
+ move32();
+ }
+
+ pt_fftL += L_FFT;
+ pt_fftR += L_FFT;
+ }
+
+ Word16 sqr_inp, temp, sqr_out, sqr_inp_exp;
+ Word32 sqr_inp32 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( mem[0], mem[0] ), shl( mem_exp[0], 1 ), Mpy_32_32( mem[1], mem[1] ), shl( mem_exp[1], 1 ), &sqr_inp_exp ); /* exp(sqr_inp_exp) */
+ sqr_inp = BASOP_Util_Divide3232_Scale( sqr_inp32, Mpy_32_32( mem[2], mem[3] ), &temp );
+ sqr_inp_exp = add( temp, sub( sqr_inp_exp, add( mem_exp[2], mem_exp[3] ) ) );
+ sqr_out = Sqrt16( sqr_inp, &sqr_inp_exp );
+ sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = shl_sat( sqr_out, sqr_inp_exp ); // Q15 expected.
+ move16();
+ return;
+}
+
+/*-------------------------------------------------------------------*
+ * FdCngEncodeMDCTStereoSID()
+ *
+ * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX
+ *-------------------------------------------------------------------*/
+
+void FdCngEncodeMDCTStereoSID_fx(
+ CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */
+)
+{
+ ENC_CORE_HANDLE sts[CPE_CHANNELS];
+ Word16 indices[CPE_CHANNELS][FD_CNG_stages_37bits];
+ Word16 gain_idx[CPE_CHANNELS];
+ Word16 N, stages, ch, p, coh_idx;
+ Word32 *lr_in_ptr_fx[CPE_CHANNELS];
+ Word16 lr_in_ptr_e[CPE_CHANNELS];
+ Word32 *ms_ptr_fx[CPE_CHANNELS];
+ Word16 ms_ptr_e;
+ Word32 *lr_out_ptr_fx[CPE_CHANNELS];
+ Word16 lr_out_ptr_e[CPE_CHANNELS];
+ Word32 logNoiseEst_fx[CPE_CHANNELS][NPART];
+ Word32 E_fx[CPE_CHANNELS];
+ Word32 gain_fx[CPE_CHANNELS];
+ Word16 weights_fx[NPART];
+ Word32 side_energy_fx;
+ Word16 Qside_energy;
+ Word32 *invTrfMatrix_fx;
+ Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/
+ invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
+ Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN], dct_target_fx[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/
+ Word16 tmp, tmp_e;
+ Word16 no_side_flag;
+ Word16 is_inp_ms;
+ Word16 size_value, temp_e, gb, shift;
+ Word32 tmp32, t1, t2;
+
+ is_inp_ms = 0;
+ move16();
+ IF( EQ_16( hCPE->hCoreCoder[0]->cng_sba_flag, 1 ) )
+ {
+ is_inp_ms = 1;
+ move16();
+ }
+
+ /* set pointers and initialize */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ sts[ch] = hCPE->hCoreCoder[ch];
+ lr_in_ptr_fx[ch] = &sts[ch]->hFdCngEnc->msNoiseEst_fx[0]; /* exp(sts[ch]->hFdCngEnc->msNoiseEst_fx_exp) */
+ lr_in_ptr_e[ch] = sts[ch]->hFdCngEnc->msNoiseEst_fx_exp;
+ ms_ptr_fx[ch] = &logNoiseEst_fx[ch][0];
+ lr_out_ptr_fx[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; /* exp(sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp) */
+ lr_out_ptr_e[ch] = sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp;
+ }
+ N = sts[0]->hFdCngEnc->npartDec; /* Q0 */
+ move16();
+ set16_fx( weights_fx, ONE_IN_Q8, NPART );
+
+ /* apply log and save energy of original left and right channels */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ // E[ch] = 0.0f;
+ E_fx[ch] = 0;
+ move32();
+ FOR( p = 0; p < N; p++ )
+ {
+ IF( lr_in_ptr_fx[ch][p] )
+ {
+ t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] ); // Q25
+ t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25
+ }
+ ELSE
+ {
+ t2 = 0;
+ move32();
+ }
+ ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23
+ move32();
+ E_fx[ch] = L_add( E_fx[ch], L_shr( ms_ptr_fx[ch][p], 4 ) ); // Q19
+ move32();
+ }
+ }
+ ms_ptr_e = Q31 - Q23;
+ move16();
+
+ /* M/S transform on log envelopes */
+ IF( is_inp_ms == 0 )
+ {
+ convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 ); // ms_ptr_e = Q23;
+ }
+
+ gb = find_guarded_bits_fx( N );
+ side_energy_fx = sum2_f_32_fx( ms_ptr_fx[1], N, gb );
+ Qside_energy = sub( sub( shl( sub( 31, ms_ptr_e ), 1 ), 31 ), gb );
+
+ /* do not transmit side shape if initial noise shapes are very similar */
+ IF( LE_32( side_energy_fx, L_shl( 214748365, sub( Qside_energy, Q31 ) ) ) )
+ {
+ no_side_flag = 1;
+ move16();
+ }
+ ELSE
+ {
+ no_side_flag = 0;
+ move16();
+ }
+
+ /* Quantize noise shapes */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ /* Normalize MSVQ input */
+ gain_fx[ch] = 0;
+ move32();
+ FOR( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ )
+ {
+ tmp32 = Mpy_32_32( ms_ptr_fx[ch][p], 165191050 /* 0.07 in Q31*/ ); // Q23
+ gain_fx[ch] = L_add( gain_fx[ch], tmp32 ); // Q23
+ move32();
+ }
+
+ FOR( p = 0; p < N; p++ )
+ {
+ ms_ptr_fx[ch][p] = L_sub( ms_ptr_fx[ch][p], gain_fx[ch] ); // Q23
+ move32();
+ }
+ }
+
+ /* always split channel targetloop */
+
+ /* extend fdcng envelope from length 21 to a 24 length fdncg domain envelope signal */
+ /* High quality cosine smooth basis extension used to not introduce noise in stage#1 DCT24 analysis and subsequent VQ-steps */
+ IF( EQ_16( N, FDCNG_VQ_MAX_LEN_WB ) )
+ {
+ size_value = BASOP_Util_Divide1616_Scale( sizeof( tmpRAM_fx ), ( sizeof( Word32 ) ), &temp_e ); /*Q15*/
+ size_value = shr( size_value, sub( 15, temp_e ) );
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, size_value ); // Q31 /*WB: create truncated IDCT21 matrix */
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ /* run DCT_N N==21 , truncated at 18/21 ~= 86% , i.e use a bit better better quality in extrapolation , than subsequent DCT24 analysis which is truncated at 75%*/
+ /* truncated DCT 21 analysis */
+ dctT2_N_apply_matrix_fx( (const Word32 *) ms_ptr_fx[ch], dct_target_fx[ch], FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
+ /* extrapolate extend fdcng envelope signal in the fdncg ienvelope/"time" domain using DCT21 basis vectors,
+ estimated DCT21 coeffs scaling extended basis vectors are used to create extrapolated length 24 input target envelope signal */
+ /* this DCT21 extension does not introduce DCT24 coefficient noise for the subsequent dct24 target analysis, and later in IDCT24 synthesis */
+
+ /* truncated IDCT 21 extension synthesis */
+ extend_dctN_input_fx( ms_ptr_fx[ch], dct_target_fx[ch], N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx /* DCT_N basis vectors */, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
+
+ Copy32( tot_sig_ext_fx, ms_ptr_fx[ch], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ */
+ }
+ }
+
+ size_value = BASOP_Util_Divide1616_Scale( sizeof( tmpRAM_fx ), ( sizeof( Word32 ) ), &temp_e ); /*Q15*/
+ size_value = shr( size_value, sub( 15, temp_e ) );
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, size_value ); /*always create/set up IDCT24 matrix in RAM */
+
+ /* end split */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ /* MSVQ */
+ IF( ch )
+ {
+ stages = FD_CNG_JOINT_stages_25bits;
+ move16();
+ }
+ ELSE
+ {
+ stages = FD_CNG_stages_37bits;
+ move16();
+ }
+
+ /* DCT24 domain compressed/truncated indices used for first stage */
+ /* mid channel quantization using stages 1 through 6 */
+ /* & side channel quantization using stages 1 through 4 */
+
+ {
+ msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, ms_ptr_fx[ch], ms_ptr_e, levels_37bits, FD_CNG_maxC_37bits, stages, weights_fx, N, FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices[ch] );
+ msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix_fx, ms_ptr_fx[ch], NULL, 7 );
+ }
+ }
+ shift = find_guarded_bits_fx( N );
+ ms_ptr_e = sub( 31, sub( 20, shift ) );
+
+ IF( no_side_flag )
+ {
+ set32_fx( ms_ptr_fx[1], 0, N );
+ }
+
+ /* undo M/S */
+ IF( is_inp_ms == 0 )
+ {
+ convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 );
+ }
+
+ /* Compute gain against original left and right channels */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ gain_fx[ch] = 0;
+ move32();
+
+ tmp_e = 15;
+ move16();
+ tmp = Inv16( N, &tmp_e );
+ FOR( p = 0; p < N; p++ )
+ {
+ gain_fx[ch] = L_add( gain_fx[ch], Mpy_32_16_1( ms_ptr_fx[ch][p], shl( tmp, tmp_e ) ) ); // Q23
+ move32();
+ }
+ gain_fx[ch] = L_sub( L_shl( Mpy_32_16_1( E_fx[ch], shl( tmp, tmp_e ) ), Q23 - Q19 ), L_shl( gain_fx[ch], sub( ms_ptr_e, 8 ) ) ); // Q23
+ move32();
+
+ apply_scale( &gain_fx[ch], sts[ch]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[ch]->element_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
+
+ /* quantize gain */
+ gain_idx[ch] = (Word16) Mpy_32_32_r( L_add( gain_fx[ch], 251658240 ), 384 ); // Q23
+ move16();
+ gain_idx[ch] = s_max( 0, s_min( 127, gain_idx[ch] ) );
+ move16();
+
+ gain_fx[ch] = Mpy_32_16_1( L_shl( sub( gain_idx[ch], GAIN_Q_OFFSET_IVAS_FX_Q0 ), 23 ), 21845 ); // Q23
+ move32();
+ }
+
+ /* restore channel noise envelopes */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc;
+ HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
+
+ tmp_e = 0;
+ move16();
+ Word32 pow;
+
+ Word16 e_lr_out[NPART];
+
+ FOR( p = 0; p < N; p++ )
+ {
+ pow = L_shl( gain_fx[ch], 8 - ms_ptr_e );
+ pow = L_add( ms_ptr_fx[ch][p], pow );
+ pow = Mpy_32_32( pow, 214748365 ); /*pow = 0.1*/
+ lr_out_ptr_fx[ch][p] = BASOP_Util_fPow( 10, 31, pow, ms_ptr_e, &e_lr_out[p] );
+ move32();
+ tmp_e = s_max( tmp_e, e_lr_out[p] );
+ }
+
+ FOR( p = 0; p < N; p++ )
+ {
+ lr_out_ptr_fx[ch][p] = L_shl( lr_out_ptr_fx[ch][p], e_lr_out[p] - tmp_e );
+ move32();
+ }
+ lr_out_ptr_e[ch] = tmp_e;
+ move32();
+
+ sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp = tmp_e;
+ move16();
+
+ /* scale bands and get scalefactors */
+ scalebands( lr_out_ptr_fx[ch], hFdCngEnc->partDec, N, hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
+ hFdCngCom->cngNoiseLevelExp = lr_out_ptr_e[ch];
+ move16();
+
+ lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac );
+
+ sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame;
+ }
+
+ /* quantize channel coherence */
+ coh_idx = mult_r( sts[0]->hFdCngEnc->hFdCngCom->coherence_fx, 15 );
+ coh_idx = max( 0, min( coh_idx, 15 ) );
+
+ /* ---- Write SID bitstream ---- */
+
+
+ /* noise shapes and channel gains */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ IF( ch )
+ {
+ stages = FD_CNG_JOINT_stages_25bits;
+ sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+
+ /* side info */
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 );
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 );
+ }
+ ELSE
+ {
+ stages = FD_CNG_stages_37bits;
+ /* side info */
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 );
+ push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
+ push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 );
+ }
+
+ FOR( Word16 i = 0; i < stages; i++ )
+ {
+ push_indice( sts[ch]->hBstr, IND_LSF, indices[ch][i], bits_37bits[i] );
+ }
+ push_indice( sts[ch]->hBstr, IND_ENERGY, gain_idx[ch], 7 );
+ }
+
+ /* pad with zeros to reach common SID frame size */
+ push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
+
+ return;
+}
+
+/*-------------------------------------------------------------------*
+ * FdCngEncodeDiracMDCTStereoSID()
+ *
+ * Encode DTX parameters and noise shapes into SID for MDCT-Stereo DTX
+ * together with Dirac
+ *-------------------------------------------------------------------*/
+
+void FdCngEncodeDiracMDCTStereoSID_fx(
+ CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */
+)
+{
+ ENC_CORE_HANDLE sts[CPE_CHANNELS];
+ Word32 *lr_in_ptr_fx[CPE_CHANNELS];
+ Word16 lr_in_ptr_e[CPE_CHANNELS];
+ Word32 *ms_ptr_fx[CPE_CHANNELS];
+ Word16 ms_ptr_e;
+ Word32 *lr_out_ptr_fx[CPE_CHANNELS];
+ Word16 lr_out_ptr_e[CPE_CHANNELS];
+ Word32 logNoiseEst_fx[CPE_CHANNELS][NPART];
+ Word32 E_fx[CPE_CHANNELS];
+ Word32 gain_fx[CPE_CHANNELS];
+ Word16 weights_fx[NPART];
+ Word16 N[CPE_CHANNELS];
+ Word16 indices[CPE_CHANNELS][FD_CNG_stages_37bits];
+ Word16 gain_idx[CPE_CHANNELS];
+ Word16 ch, p;
+ Word16 tmp, tmp_e, shift;
+ Word32 *invTrfMatrix_fx;
+ Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+ Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC];
+ Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN];
+ invTrfMatrix_fx = (Word32 *) tmpRAM_fx; /* dynamically filled */
+ Word32 t1, t2, tmp32;
+ /* set pointers and initialize */
+
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ sts[ch] = hCPE->hCoreCoder[ch];
+ N[ch] = sts[ch]->hFdCngEnc->npartDec;
+ lr_in_ptr_fx[ch] = &sts[ch]->hFdCngEnc->msNoiseEst_fx[0];
+ lr_in_ptr_e[ch] = sts[ch]->hFdCngEnc->msNoiseEst_fx_exp;
+ ms_ptr_fx[ch] = &logNoiseEst_fx[ch][0];
+ lr_out_ptr_fx[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0];
+ lr_out_ptr_e[ch] = sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp;
+ move16();
+ }
+ set16_fx( weights_fx, ONE_IN_Q8, NPART );
+
+ /* apply log and save energy of original left and right channels */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ // E[ch] = 0.0f;
+ E_fx[ch] = 0;
+ move32();
+ FOR( p = 0; p < N[ch]; p++ )
+ {
+ t1 = BASOP_Util_Log2( lr_in_ptr_fx[ch][p] + EPSILLON_FX ); // Q25
+ t2 = L_add( t1, L_shl( lr_in_ptr_e[ch], Q25 ) ); // Q25
+ ms_ptr_fx[ch][p] = Mpy_32_32( t2, TEN_MULT_LOG10_2_IN_Q29 ); // Q23
+ move32();
+ E_fx[ch] = L_add( E_fx[ch], L_shr( ms_ptr_fx[ch][p], 5 ) ); // Q18
+ move32();
+ }
+ }
+ ms_ptr_e = Q31 - Q23;
+ move16();
+
+ /* M/S transform on log envelopes */
+ convertToMS_fx( N[0], ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 );
+ E_fx[0] = 0;
+ move32();
+ FOR( p = 0; p < N[0]; p++ )
+ {
+ E_fx[0] = L_add( E_fx[0], L_shr( ms_ptr_fx[0][p], 5 ) ); // Q18
+ move32();
+ }
+
+ /* Quantize M noise shape */
+ /* Normalize MSVQ input */
+ gain_fx[0] = 0;
+ move16();
+ FOR( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ )
+ {
+ tmp32 = Mpy_32_32( ms_ptr_fx[0][p], 165191050 /* 0.07 in Q31 */ ); // Q23
+ gain_fx[0] = L_add( gain_fx[0], tmp32 ); // Q23
+ move32();
+ }
+
+ FOR( p = 0; p < N[0]; p++ )
+ {
+ ms_ptr_fx[0][p] = L_sub( ms_ptr_fx[0][p], gain_fx[0] ); // Q23
+ move32();
+ }
+
+
+ /* MSVQ */
+ /* DCT domain compressed/truncated indices used for first stage */
+ /* mid quantization using stages #1 through 6 */
+ scale_sig32( ms_ptr_fx[0], N[0], -6 );
+ ms_ptr_e = add( ms_ptr_e, 6 );
+ move16();
+ IF( EQ_16( N[0], FDCNG_VQ_MAX_LEN_WB ) )
+ {
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N[0], FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) );
+ /* truncated DCT 21 analysis */
+ dctT2_N_apply_matrix_fx( (const Word32 *) ms_ptr_fx[0], dct_target_fx, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
+ /* truncated IDCT21 extension to 24 synthesis */
+
+ extend_dctN_input_fx( ms_ptr_fx[0], dct_target_fx, N[0], tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
+
+ Copy32( tot_sig_ext_fx, ms_ptr_fx[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 Q23*/
+ }
+ create_IDCT_N_Matrix_fx( invTrfMatrix_fx, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) );
+
+ msvq_enc_ivas_fx( ivas_cdk_37bits_fx, Q7, NULL, NULL, ms_ptr_fx[0], ms_ptr_e, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights_fx, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix_fx, indices[0] );
+ msvq_dec_fx( ivas_cdk_37bits_fx, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix_fx, ms_ptr_fx[0], NULL, 7 );
+ shift = find_guarded_bits_fx( N[0] );
+ ms_ptr_e = sub( 31, sub( 20, shift ) );
+ scale_sig32( ms_ptr_fx[1], N[1], sub( 8, ms_ptr_e ) ); /* Q31 - ms_ptr_e */
+
+ /* set S to zero */
+ set32_fx( ms_ptr_fx[1], 0, NPART );
+
+ /* compute M gain */
+ gain_fx[0] = 0;
+ move32();
+ tmp_e = 15;
+ move16();
+ tmp = Inv16( N[0], &tmp_e );
+ FOR( p = 0; p < N[0]; p++ )
+ {
+ gain_fx[0] = L_add( gain_fx[0], Mpy_32_16_1( ms_ptr_fx[0][p], shl( tmp, tmp_e ) ) ); // Q23
+ move32();
+ }
+ gain_fx[0] = L_sub( L_shl( Mpy_32_16_1( E_fx[0], shl( tmp, tmp_e ) ), Q23 - Q18 ), L_shl( gain_fx[0], ms_ptr_e - 8 ) ); // Q23
+ move32();
+
+ apply_scale( &gain_fx[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
+
+ /* quantize gain */
+ gain_idx[0] = extract_l( Mpy_32_32_r( L_add( gain_fx[0], 251658240 ), 384 ) );
+ move16();
+ gain_idx[0] = s_max( 0, s_min( 127, gain_idx[0] ) );
+ move16();
+
+ gain_fx[0] = Mpy_32_16_1( L_shl( sub( gain_idx[0], GAIN_Q_OFFSET_IVAS_FX_Q0 ), 23 ), 21845 /* 0.66 in Q15 */ ); // Q23
+ move32();
+ gain_fx[1] = gain_fx[0]; // Q23
+ move32();
+
+ /* undo M/S */
+ convertToMS_fx( NPART, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 );
+
+ /* restore channel noise envelopes */
+ FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc;
+ HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
+
+ Word32 pow;
+ Word16 e_lr_out[NPART];
+ tmp_e = -MAX_16;
+ FOR( p = 0; p < N[ch]; p++ )
+ {
+ pow = L_shl( gain_fx[ch], sub( 8, ms_ptr_e ) ); /* Q31 - ms_ptr_e */
+ pow = L_add( ms_ptr_fx[ch][p], pow ); /* Q31 - ms_ptr_e */
+ pow = Mpy_32_32( pow, 214748365 /* 0.1 in Q31 */ ); /*pow = 0.1 Q31 - ms_ptr_e*/
+ lr_out_ptr_fx[ch][p] = BASOP_Util_fPow( 10, 31, pow, ms_ptr_e, &e_lr_out[p] );
+ tmp_e = s_max( tmp_e, e_lr_out[p] );
+ }
+
+ FOR( p = 0; p < N[ch]; p++ )
+ {
+ lr_out_ptr_fx[ch][p] = L_shl( lr_out_ptr_fx[ch][p], sub( e_lr_out[p], tmp_e ) ); // Q(31 - tmp_e)
+ }
+
+ sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEstExp = tmp_e;
+ move16();
+ lr_out_ptr_e[ch] = tmp_e;
+ move16();
+
+ /* NB last band energy compensation */
+ IF( hFdCngCom->CngBandwidth == NB )
+ {
+ lr_out_ptr_fx[ch][N[ch] - 1] = Mpy_32_16_1( lr_out_ptr_fx[ch][N[ch] - 1], NB_LAST_BAND_SCALE ); // Q(31 - tmp_e)
+ move32();
+ }
+ ELSE IF( hFdCngCom->CngBandwidth == SWB && LE_32( hFdCngCom->CngBitrate, ACELP_13k20 ) )
+ {
+ lr_out_ptr_fx[ch][N[ch] - 1] = Mpy_32_16_1( lr_out_ptr_fx[ch][N[ch] - 1], SWB_13k2_LAST_BAND_SCALE ); // Q(31 - tmp_e)
+ move32();
+ }
+ /* scale bands and get scalefactors */
+ scalebands( lr_out_ptr_fx[ch], hFdCngEnc->partDec, N[ch], hFdCngEnc->midbandDec, hFdCngEnc->nFFTpartDec, sub( hFdCngEnc->stopBandDec, hFdCngEnc->startBandDec ), hFdCngCom->cngNoiseLevel, 1 );
+ hFdCngCom->cngNoiseLevelExp = lr_out_ptr_e[ch];
+ move16();
+ lpc_from_spectrum( hFdCngCom, hFdCngEnc->startBandDec, hFdCngEnc->stopFFTbinDec, sts[ch]->preemph_fac );
+ sts[ch]->hDtxEnc->last_CNG_L_frame = sts[ch]->L_frame;
+ }
+ sts[0]->hFdCngEnc->hFdCngCom->coherence_fx = 0;
+ move16();
+ sts[1]->hFdCngEnc->hFdCngCom->coherence_fx = 0;
+ move16();
+
+ /* ---- Write SID bitstream ---- */
+
+ /* side info */
+ push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 );
+ push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
+ IF( EQ_16( sts[0]->L_frame, L_FRAME16k ) )
+ {
+ push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, 1, 1 );
+ }
+ ELSE
+ {
+ push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, 0, 1 );
+ }
+
+ /* noise shapes and channel gains */
+ FOR( Word16 i = 0; i < FD_CNG_stages_37bits; i++ )
+ {
+ push_indice( sts[0]->hBstr, IND_LSF, indices[0][i], bits_37bits[i] );
+ }
+ push_indice( sts[0]->hBstr, IND_ENERGY, gain_idx[0], 7 );
+
+ return;
+}
diff --git a/lib_enc/find_tilt.c b/lib_enc/find_tilt.c
deleted file mode 100644
index efd1b44d24f231e0f64b16cdcc5d79c7daf4d77b..0000000000000000000000000000000000000000
--- a/lib_enc/find_tilt.c
+++ /dev/null
@@ -1,303 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-#include "prot_fx.h" /* Function prototypes */
-#include "prot_fx_enc.h" /* Function prototypes */
-
-
-/*---------------------------------------------------------------------*
- * Local constants
- *---------------------------------------------------------------------*/
-
-
-/*-------------------------------------------------------------------*
- * find_tilt()
- *
- * Find LF/HF energy ratio
- *-------------------------------------------------------------------*/
-void find_tilt_ivas_fx(
- const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/
- const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/
- const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/
- const Word16 q_bckr, /* i : Q of bckr Q0*/
- Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/
- const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/
- const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/
- const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/
- const Word16 q_lf_E, /* i : Q of lf_E */
- const Word16 corr_shift, /* i : normalized correlation correction Q15*/
- const Word16 bwidth, /* i : input signal bandwidth */
- const Word16 max_band, /* i : maximum critical band */
- Word32 hp_E[], /* o : energy in HF Q_new*/
- const Word16 codec_mode, /* i : MODE1 or MODE2 */
- Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16 */
- Word16 Opt_vbr_mode )
-{
- Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
- const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
- Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
- Word16 i, nb_bands;
- Word16 e_tmp, m_tmp;
- Word16 m_Fs, e_Fs;
- Word16 m_cnt, e_cnt;
- Word16 m_hpE, e_hpE;
- Word64 sum;
- Word16 inv_bands, q_lp_E;
- Word32 Le_min_scaled, Ltmp2;
-#ifdef BASOP_NOGLOB_DECLARE_LOCAL
- Flag Overflow = 0;
- move32();
-#endif
- move32();
- move32();
- /*-----------------------------------------------------------------*
- * Initializations
- *-----------------------------------------------------------------*/
-
- IF( ( bwidth != NB ) )
- {
- /* WB processing */
- bin = BIN4_FX;
- move16(); /* First useful frequency bin ~ 50 Hz */
- pt_bands = fr_bands; /* Q_new */
- tmp_E = lf_E; /* Q_new - 2 */
- pt_bckr = bckr; /* Q_new */
- nb_bands = 10;
- inv_bands = 3277 /* 1/10 in Q15 */;
- move16();
- move16();
- }
- ELSE
- {
- /* NB processing */
- bin = 3 * BIN4_FX; /* First useful frequency bin ~ 150 Hz */
- pt_bands = fr_bands + 1; /* Exlcude 1st critical band */
- tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) */
- pt_bckr = bckr + 1; /* Exlcude 1st critical band */
- nb_bands = 9;
- inv_bands = 3641; /* 1/9 in Q15 */
- move16();
- move16(); /* Nb. of "low" frequency bands taken into account in NB processing */
- }
-
- /*-----------------------------------------------------------------*
- * Find spectrum tilt
- *-----------------------------------------------------------------*/
-
- pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector */
- hf_bands = fr_bands;
-
- /* bckr + voicing */
- /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
- sum = 0;
- move64();
- FOR( i = 0; i < nb_bands; i++ )
- {
- sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
- }
- lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr
- /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */
- hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr
- if ( hp_bckr == 0 ) /* Avoid division by zero. */
- {
- hp_bckr = L_deposit_l( 1 );
- }
- Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp );
- Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
- Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
- *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
- move32();
-
- test();
- IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
- {
- /*lp_bckr *= FACT;*/
- /*hp_bckr *= FACT;*/
- lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
- hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
- }
- /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
- Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); // Q31
- Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31
- Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
- mean_voi = round_fx_o( Ltmp, &Overflow ); // Q15
-
- /*f0 = INT_FS_FX / pitch[2];*/
- e_tmp = norm_s( pitch[2] );
- m_tmp = shl( pitch[2], e_tmp );
-
- m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
- e_Fs = sub( 15, e_tmp );
- f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
-
- Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
-
- FOR( i = 0; i < 2; i++ )
- {
- /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */
- Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands
- Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands
-
- Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31
- if ( Opt_vbr_mode == 0 )
- {
- Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
- }
- hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
- move32();
-
- test();
- IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
- {
- freq = bin; // Q4
- move16(); /* 1st useful frequency bin */
- m_cnt = 0;
- move16();
- sum = 0;
- move64();
-
- f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
- f2 = f0;
- move16();
- WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
- {
- FOR( ; freq <= f1; freq += BIN4_FX )
- {
- /* include only bins sufficiently close to harmonics */
- tmp = sub( freq, f2 );
- IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
- {
- sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
- m_cnt = add( m_cnt, 1 );
- }
- pt_E++;
- }
- f1 = add_o( f1, f0, &Overflow );
- f2 = add_o( f2, f0, &Overflow );
- }
- /*lp_E = lp_E / (float)cnt - lp_bckr;*/
- e_tmp = sub( W_norm( sum ), 1 );
- m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
- e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
-
- e_cnt = norm_s( m_cnt );
- m_cnt = shl( m_cnt, e_cnt ); // e_cnt
-
- m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
- e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
- sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
- sum = W_msu_32_16( sum, lp_bckr, 1 ); // q_bckr+1
- q_lp_E = W_norm( sum );
- lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
- q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
-
- pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */
- }
- ELSE /* Other than high-pitched voiced frames */
- {
- /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
- sum = 0;
- move64();
- FOR( Word16 j = 0; j < nb_bands; j++ )
- {
- sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
- }
- sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
- lp_E = W_round48_L( sum ); // q_fr_bands=q_bckr
- q_lp_E = q_bckr; // q_fr_bands=q_bckr
- move16();
- }
- test();
- IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
- {
- lp_E = E_MIN_FXQ31;
- q_lp_E = Q31;
- move32();
- move16();
- }
- if ( Opt_vbr_mode != 0 )
- {
- lp_E = L_max( lp_E, 0 ); // q_lp_E
- }
- /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
-
- if ( lp_E == 0 )
- {
- ee[i] = 0;
- move32();
- }
- test();
- IF( lp_E != 0 )
- {
- e_tmp = sub( norm_l( lp_E ), 1 );
- m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
- e_hpE = norm_l( hp_E[i] );
- m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
- m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
- e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
- ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */
- move32();
- }
-
- IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
- {
- Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
- IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
- {
- Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/
- ee[i] = L_shl_sat( Ltmp, 3 ); /* Q6 */
- move32(); /* x8 */
- }
- ELSE
- {
- ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
- move32(); /* 6/8 */
- }
- }
-
- pt_bands += NB_BANDS; /* Update for next half-frame */
- hf_bands += NB_BANDS;
- }
-
- return;
-}
diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c
index 44ad404e379b1ba6cc234b1b013d9d6e7e2942c2..ea71b09bc9f73f71ada928bed3bd19be2ef090dd 100644
--- a/lib_enc/find_tilt_fx.c
+++ b/lib_enc/find_tilt_fx.c
@@ -240,3 +240,255 @@ void find_tilt_fx(
return;
}
+
+/*-------------------------------------------------------------------*
+ * find_tilt()
+ *
+ * Find LF/HF energy ratio
+ *-------------------------------------------------------------------*/
+void find_tilt_ivas_fx(
+ const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/
+ const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/
+ const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/
+ const Word16 q_bckr, /* i : Q of bckr Q0*/
+ Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/
+ const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/
+ const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/
+ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/
+ const Word16 q_lf_E, /* i : Q of lf_E */
+ const Word16 corr_shift, /* i : normalized correlation correction Q15*/
+ const Word16 bwidth, /* i : input signal bandwidth */
+ const Word16 max_band, /* i : maximum critical band */
+ Word32 hp_E[], /* o : energy in HF Q_new*/
+ const Word16 codec_mode, /* i : MODE1 or MODE2 */
+ Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16 */
+ Word16 Opt_vbr_mode )
+{
+ Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
+ const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
+ Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
+ Word16 i, nb_bands;
+ Word16 e_tmp, m_tmp;
+ Word16 m_Fs, e_Fs;
+ Word16 m_cnt, e_cnt;
+ Word16 m_hpE, e_hpE;
+ Word64 sum;
+ Word16 inv_bands, q_lp_E;
+ Word32 Le_min_scaled, Ltmp2;
+#ifdef BASOP_NOGLOB_DECLARE_LOCAL
+ Flag Overflow = 0;
+ move32();
+#endif
+ move32();
+ move32();
+ /*-----------------------------------------------------------------*
+ * Initializations
+ *-----------------------------------------------------------------*/
+
+ IF( ( bwidth != NB ) )
+ {
+ /* WB processing */
+ bin = BIN4_FX;
+ move16(); /* First useful frequency bin ~ 50 Hz */
+ pt_bands = fr_bands; /* Q_new */
+ tmp_E = lf_E; /* Q_new - 2 */
+ pt_bckr = bckr; /* Q_new */
+ nb_bands = 10;
+ inv_bands = 3277 /* 1/10 in Q15 */;
+ move16();
+ move16();
+ }
+ ELSE
+ {
+ /* NB processing */
+ bin = 3 * BIN4_FX; /* First useful frequency bin ~ 150 Hz */
+ pt_bands = fr_bands + 1; /* Exlcude 1st critical band */
+ tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) */
+ pt_bckr = bckr + 1; /* Exlcude 1st critical band */
+ nb_bands = 9;
+ inv_bands = 3641; /* 1/9 in Q15 */
+ move16();
+ move16(); /* Nb. of "low" frequency bands taken into account in NB processing */
+ }
+
+ /*-----------------------------------------------------------------*
+ * Find spectrum tilt
+ *-----------------------------------------------------------------*/
+
+ pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector */
+ hf_bands = fr_bands;
+
+ /* bckr + voicing */
+ /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
+ sum = 0;
+ move64();
+ FOR( i = 0; i < nb_bands; i++ )
+ {
+ sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
+ }
+ lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr
+ /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */
+ hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr
+ if ( hp_bckr == 0 ) /* Avoid division by zero. */
+ {
+ hp_bckr = L_deposit_l( 1 );
+ }
+ Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp );
+ Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
+ Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
+ *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
+ move32();
+
+ test();
+ IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
+ {
+ /*lp_bckr *= FACT;*/
+ /*hp_bckr *= FACT;*/
+ lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
+ hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
+ }
+ /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
+ Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); // Q31
+ Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31
+ Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
+ mean_voi = round_fx_o( Ltmp, &Overflow ); // Q15
+
+ /*f0 = INT_FS_FX / pitch[2];*/
+ e_tmp = norm_s( pitch[2] );
+ m_tmp = shl( pitch[2], e_tmp );
+
+ m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
+ e_Fs = sub( 15, e_tmp );
+ f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
+
+ Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
+
+ FOR( i = 0; i < 2; i++ )
+ {
+ /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */
+ Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands
+ Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands
+
+ Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31
+ if ( Opt_vbr_mode == 0 )
+ {
+ Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
+ }
+ hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
+ move32();
+
+ test();
+ IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
+ {
+ freq = bin; // Q4
+ move16(); /* 1st useful frequency bin */
+ m_cnt = 0;
+ move16();
+ sum = 0;
+ move64();
+
+ f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
+ f2 = f0;
+ move16();
+ WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
+ {
+ FOR( ; freq <= f1; freq += BIN4_FX )
+ {
+ /* include only bins sufficiently close to harmonics */
+ tmp = sub( freq, f2 );
+ IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
+ {
+ sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
+ m_cnt = add( m_cnt, 1 );
+ }
+ pt_E++;
+ }
+ f1 = add_o( f1, f0, &Overflow );
+ f2 = add_o( f2, f0, &Overflow );
+ }
+ /*lp_E = lp_E / (float)cnt - lp_bckr;*/
+ e_tmp = sub( W_norm( sum ), 1 );
+ m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
+ e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
+
+ e_cnt = norm_s( m_cnt );
+ m_cnt = shl( m_cnt, e_cnt ); // e_cnt
+
+ m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
+ e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
+ sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
+ sum = W_msu_32_16( sum, lp_bckr, 1 ); // q_bckr+1
+ q_lp_E = W_norm( sum );
+ lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
+ q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
+
+ pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */
+ }
+ ELSE /* Other than high-pitched voiced frames */
+ {
+ /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
+ sum = 0;
+ move64();
+ FOR( Word16 j = 0; j < nb_bands; j++ )
+ {
+ sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
+ }
+ sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
+ lp_E = W_round48_L( sum ); // q_fr_bands=q_bckr
+ q_lp_E = q_bckr; // q_fr_bands=q_bckr
+ move16();
+ }
+ test();
+ IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
+ {
+ lp_E = E_MIN_FXQ31;
+ q_lp_E = Q31;
+ move32();
+ move16();
+ }
+ if ( Opt_vbr_mode != 0 )
+ {
+ lp_E = L_max( lp_E, 0 ); // q_lp_E
+ }
+ /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
+
+ if ( lp_E == 0 )
+ {
+ ee[i] = 0;
+ move32();
+ }
+ test();
+ IF( lp_E != 0 )
+ {
+ e_tmp = sub( norm_l( lp_E ), 1 );
+ m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
+ e_hpE = norm_l( hp_E[i] );
+ m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
+ m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
+ e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
+ ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */
+ move32();
+ }
+
+ IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
+ {
+ Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
+ IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
+ {
+ Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/
+ ee[i] = L_shl_sat( Ltmp, 3 ); /* Q6 */
+ move32(); /* x8 */
+ }
+ ELSE
+ {
+ ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
+ move32(); /* 6/8 */
+ }
+ }
+
+ pt_bands += NB_BANDS; /* Update for next half-frame */
+ hf_bands += NB_BANDS;
+ }
+
+ return;
+}
diff --git a/lib_enc/find_uv.c b/lib_enc/find_uv.c
deleted file mode 100644
index c6ae02a76934bb14b64ac4a5d08615d15b4f6754..0000000000000000000000000000000000000000
--- a/lib_enc/find_uv.c
+++ /dev/null
@@ -1,660 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-#include "prot_fx.h" /* Function prototypes */
-#include "prot_fx_enc.h" /* Function prototypes */
-
-/*-------------------------------------------------------------------*
- * Local constants
- *-------------------------------------------------------------------*/
-
-#define L_ENR ( NB_SSF + 2 )
-
-/*-------------------------------------------------------------------*
- * find_ener_decrease()
- *
- * Find maximum energy ratio between short sub-subframes in case
- * energy is trailing off after a spike
- *-------------------------------------------------------------------*/
-
-/*! r: maximum energy ratio */
-static Word16 find_ener_decrease_fx( /* o : maximum energy ratio Q10*/
- const Word16 ind_deltaMax, /* i : index of the beginning of maximum energy search Q0*/
- const Word32 *pt_enr_ssf /* i : Pointer to the energy buffer Qx*/
-)
-{
- Word16 i, j, end, flag;
- Word16 wtmp0, wtmp1;
- Word32 maxEnr, minEnr;
- Word16 dE2, exp0, exp1;
-#ifdef BASOP_NOGLOB_DECLARE_LOCAL
- Flag Overflow = 0;
- move32();
-#endif
- dE2 = 0;
- move16();
-
- j = add( ind_deltaMax, 2 ); /* Q0 */
- move16();
- end = add( j, L_ENR );
- move16();
- maxEnr = L_add( pt_enr_ssf[j], 0 );
- j = add( j, 1 );
- flag = 0;
- move16();
- FOR( i = j; i < end; i++ )
- {
- test();
- IF( ( GT_32( pt_enr_ssf[i], maxEnr ) ) && ( flag == 0 ) )
- {
- maxEnr = pt_enr_ssf[i]; /* Qx */
- j = add( j, 1 );
- }
- ELSE
- {
- flag = 1;
- move16();
- }
- }
-
- minEnr = L_add( maxEnr, 0 );
- FOR( i = j; i < end; i++ )
- {
- minEnr = L_min( minEnr, pt_enr_ssf[i] ); /* Qx */
- }
-
-
- minEnr = L_add_sat( minEnr, 100000 );
- exp0 = norm_l( minEnr );
- wtmp0 = extract_h( L_shl( minEnr, exp0 ) );
- exp1 = sub( norm_l( maxEnr ), 1 );
- wtmp1 = extract_h( L_shl( maxEnr, exp1 ) );
- wtmp1 = div_s( wtmp1, wtmp0 );
- dE2 = shr_ro( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ), &Overflow ); /*Q10*/
-
- return dE2;
-}
-
-/*-------------------------------------------------------------------*
- * find_uv()
- *
- * Decision about coder type
- *-------------------------------------------------------------------*/
-Word16 find_uv_ivas_fx( /* o : coding type */
- Encoder_State *st_fx, /* i/o: encoder state structure */
- const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/
- const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/
- const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/
- const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/
- Word32 *dE1X, /* o : sudden energy increase for S/M classifier Q13*/
- const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/
- const Word16 relE, /* i : relative frame energy Q8*/
- const Word16 Etot, /* i : total energy Q8*/
- const Word32 hp_E[], /* i : energy in HF q_hp_E*/
- Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/
- const Word16 last_core_orig, /* i : original last core Q0*/
- STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */
- const Word16 Q_new,
- const Word16 q_hp_E )
-{
- Word16 coder_type, i;
- Word32 mean_ee, dE1, fac_32;
- const Word16 *pt_speech;
- Word32 L_tmp, enr_ssf[2 * NB_SSF + 2 * NB_SSF + 2], E_min_th;
- Word16 dE2;
- Word16 ind_deltaMax, tmp_offset_flag;
- Word32 Ltmp0, *pt_enr_ssf, *pt_enr_ssf1, dE2_th;
- Word16 exp0, exp1;
- Word16 wtmp0, wtmp1;
- Word16 fac, mean_voi3, dE3;
- Word16 relE_thres;
- Word16 mean_voi3_offset;
- Word16 voicing_m, dpit1, dpit2, dpit3;
- Word16 ee0_th, ee1_th, voi_th, nb_cond, flag_low_relE;
- NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst;
- SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
-#ifdef BASOP_NOGLOB_DECLARE_LOCAL
- Flag Overflow = 0;
- move32();
-#endif
- Word16 Last_Resort;
- Word16 vadnoise;
-
- IF( hSC_VBR != NULL )
- {
- Last_Resort = hSC_VBR->Last_Resort; /* Q0 */
- move16();
- vadnoise = hSC_VBR->vadnoise_fx; /* Q8 */
- move16();
- }
- ELSE
- {
- Last_Resort = 0;
- move16();
- vadnoise = 0;
- move16();
- }
-
- /*-----------------------------------------------------------------*
- * Detect sudden energy increases to catch voice and music
- * temporal events (dE1)
- *
- * - Find maximum energy per short subblocks.
- * Two subblock sets are used shifted by half the subblock length
- * - Find maximum energy ratio between adjacent subblocks
- *-----------------------------------------------------------------*/
-
- /* Find maximum energy per short subblocks */
- pt_speech = speech - SSF;
- pt_enr_ssf = enr_ssf + 2 * NB_SSF;
- FOR( i = 0; i < 2 * ( NB_SSF + 1 ); i++ )
- {
- emaximum_fx( Q_new, pt_speech, SSF, pt_enr_ssf );
- pt_speech += ( SSF / 2 );
- pt_enr_ssf++;
- }
-
- dE1 = 0;
- move16();
- ind_deltaMax = 0;
- move16();
- pt_enr_ssf = enr_ssf + 2 * NB_SSF;
- pt_enr_ssf1 = pt_enr_ssf + 2;
-
- /* Test on energy increase between adjacent sub-subframes */
- exp1 = 0;
- move16();
- FOR( i = 0; i < 2 * NB_SSF; i++ )
- {
- /*fac = *pt_enr_ssf1 / (*pt_enr_ssf + 1);*/
- Ltmp0 = L_max( *pt_enr_ssf, 1 );
- exp0 = norm_l( Ltmp0 );
- wtmp0 = extract_h( L_shl( Ltmp0, exp0 ) );
- exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 );
- wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) );
- fac = div_s( wtmp1, wtmp0 );
- fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/
-
- if ( GT_32( fac_32, dE1 ) )
- {
- ind_deltaMax = i;
- move16();
- }
-
- dE1 = L_max( dE1, fac_32 ); /* Q13 */
-
- pt_enr_ssf++;
- pt_enr_ssf1++;
- }
-
- IF( hStereoClassif != NULL )
- {
- IF( st_fx->idchan == 0 )
- {
- hStereoClassif->dE1_ch1_fx = dE1; /* Q13 */
- move32();
- hStereoClassif->dE1_ch1_e = 31 - Q13;
- move16();
- }
- ELSE
- {
- hStereoClassif->dE1_ch2_fx = dE1; /* Q13 */
- move32();
- hStereoClassif->dE1_ch2_e = 31 - Q13;
- move16();
- }
- }
-
- if ( dE1X != NULL )
- {
- *dE1X = dE1; /* Q13 */
- move32();
- }
-
- /*-----------------------------------------------------------------*
- * Average spectral tilt
- * Average voicing (normalized correlation)
- *-----------------------------------------------------------------*/
-
- /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */
- mean_ee = L_add_o( L_add_o( st_fx->ee_old_fx, ee[0], &Overflow ), ee[1], &Overflow ); /* Q6 */
- mean_ee = Mult_32_16( mean_ee, 10923 ); /*Q6*/
-
- /* mean_voi3 = 1.0f/3.0f * (voicing[0] + voicing[1] + voicing[2]);*/
- Ltmp0 = L_mult( st_fx->voicing_fx[0], 10923 /* 1/3 in Q15 */ ); /* Q31 */
- Ltmp0 = L_mac( Ltmp0, st_fx->voicing_fx[1], 10923 /* 1/3 in Q15 */ ); /* Q31 */
- mean_voi3 = mac_r_sat( Ltmp0, st_fx->voicing_fx[2], 10923 /* 1/3 in Q15 */ ); /*Q15*/
- /*-----------------------------------------------------------------*
- * Total frame energy difference (dE3)
- *-----------------------------------------------------------------*/
-
- dE3 = sub( Etot, hNoiseEst->Etot_last_fx ); /*Q8*/
-
- /*-----------------------------------------------------------------*
- * Energy decrease after spike (dE2)
- *-----------------------------------------------------------------*/
-
- /* set different thresholds and conditions for NB and WB input */
- dE2_th = 30 << 10;
- move32();
- nb_cond = 1;
- move16(); /* no additional condition for WB input */
- IF( st_fx->input_bwidth == NB )
- {
- dE2_th = 21 << 10;
- move32();
- if ( GE_16( add_o( mean_voi3, corr_shift, &Overflow ), 22282 ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/
- {
- nb_cond = 0;
- move16();
- }
- }
-
- /* calcualte maximum energy decrease */
- dE2 = 0;
- move16(); /* Test on energy decrease after an energy spike */
- pt_enr_ssf = enr_ssf + 2 * NB_SSF;
-
- test();
- IF( GT_32( dE1, 30 << 13 ) && nb_cond ) /*>30 Q13*/
- {
- IF( LT_16( sub( shl( NB_SSF, 1 ), ind_deltaMax ), L_ENR ) )
- {
- st_fx->old_ind_deltaMax = ind_deltaMax; /* Q0 */
- move16();
- Copy32( pt_enr_ssf, st_fx->old_enr_ssf_fx, 2 * NB_SSF ); /* Qx */
- }
- ELSE
- {
- st_fx->old_ind_deltaMax = -1;
- move16();
- dE2 = find_ener_decrease_fx( ind_deltaMax, pt_enr_ssf ); /*Q10*/
-
- if ( GT_32( dE2, dE2_th ) )
- {
- st_fx->spike_hyst = 0;
- move16();
- }
- }
- }
- ELSE
- {
- IF( st_fx->old_ind_deltaMax >= 0 )
- {
- Copy32( st_fx->old_enr_ssf_fx, enr_ssf, 2 * NB_SSF ); /* Qx */
- dE2 = find_ener_decrease_fx( st_fx->old_ind_deltaMax, enr_ssf ); /* Q10 */
-
- if ( GT_32( dE2, dE2_th ) )
- {
- st_fx->spike_hyst = 1;
- move16();
- }
- }
-
- st_fx->old_ind_deltaMax = -1;
- move16();
- }
-
- /*-----------------------------------------------------------------*
- * Detection of voiced offsets (tmp_offset_flag)
- *-----------------------------------------------------------------*/
-
- tmp_offset_flag = 1;
- move16();
-
- IF( st_fx->input_bwidth != NB )
- {
- ee0_th = 154; /*2.4 in Q6 */
- move16();
- voi_th = 24248; /*0.74f Q15 */
- move16();
- }
- ELSE
- {
- ee0_th = 627; /*9.8f Q6 */
- move16();
- voi_th = 24904; /*0.76f Q15*/
- move16();
- }
-
- E_min_th = L_shl( E_MIN_IVAS_FX_Q31, sub( q_hp_E, Q31 ) );
-
- test();
- test();
- test();
- IF( ( EQ_16( st_fx->last_coder_type_raw, UNVOICED ) ) || /* previous frame was unvoiced */
- ( ( LT_32( ee[0], ee0_th ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy is concentrated in high frequencies provided that some energy is present in HF */
- ( LT_16( add_o( st_fx->voicing_fx[0], corr_shift, &Overflow ), voi_th ) ) ) ) /* normalized correlation is low */
- {
- tmp_offset_flag = 0;
- move16();
- }
-
- /*-----------------------------------------------------------------*
- * Decision about UC
- *-----------------------------------------------------------------*/
-
- /* SC-VBR - set additional parameters and thresholds for SC-VBR */
- mean_voi3_offset = 0;
- move16();
- flag_low_relE = 0;
- move16();
- ee1_th = 608; /*9.5 Q6*/
- move16();
- test();
- test();
- IF( st_fx->Opt_SC_VBR || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) /* Allow the low energy flag for the secondary channel */
- {
- ee1_th = 544; /*8.5f Q6*/
- move16();
-
- /* SC-VBR - determine the threshold on relative energy as a function of lp_noise */
- IF( st_fx->input_bwidth != NB )
- {
- /*relE_thres = 0.700f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16) */
- L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, st_fx->lp_noise_fx ); // Q24
- IF( Last_Resort == 0 )
- {
- /*relE_thres = 0.650f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16)*/
- L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, st_fx->lp_noise_fx ); // Q24
- }
- relE_thres = round_fx( L_tmp );
- }
- ELSE
- {
-
- /*relE_thres = 0.60f * st->lp_noise - 28.2f; (lp_noise in Q8, constant Q8<<16)*/
- L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, st_fx->lp_noise_fx ); // Q24
- relE_thres = round_fx( L_tmp );
- }
- relE_thres = s_max( relE_thres, -6400 /* -25.0f in Q8 */ ); /* Q8 */
-
- /* SC-VBR = set flag on low relative energy */
- if ( LT_16( relE, relE_thres ) )
- {
- flag_low_relE = 1;
- move16();
- }
-
- /* SC-VBR - correction of voicing threshold for NB inputs (important only in noisy conditions) */
- test();
- if ( st_fx->input_bwidth == NB && LT_16( vadnoise, 20 << 8 ) ) /* vadnoise in Q8, constant Q0<<8 */
- {
- mean_voi3_offset = 1638; /*0.05f Q15*/
- move16();
- }
- }
-
- /* make decision whether frame is unvoiced */
- coder_type = GENERIC;
- move16();
- IF( st_fx->input_bwidth == NB )
- {
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */
- ( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */
- ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */
- ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */
- ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */
- /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */
- ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */
- ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */
- ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */
- flag_low_relE ) /* low relative frame energy (only for SC-VBR) */
- {
- coder_type = UNVOICED;
- move16();
- }
- }
- ELSE
- {
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- if ( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */
- /*( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 ) ) && */ /* normalized correlation low on look-ahead - onset detection */
- ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */
- ( LT_32( ee[1], 397 /* 6.2f in Q16 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */
- ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */
- /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */
- ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */
- ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */
- ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */
- || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */
- {
- coder_type = UNVOICED;
- move16();
- }
- }
-
- /*-----------------------------------------------------------------*
- * Decision about VC
- *-----------------------------------------------------------------*/
- if ( st_fx->Opt_SC_VBR )
- {
- hSC_VBR->set_ppp_generic = 0;
- }
- move16();
-
- test();
- test();
- IF( EQ_16( st_fx->localVAD, 1 ) && EQ_16( coder_type, GENERIC ) && NE_16( last_core_orig, AMR_WB_CORE ) )
- {
- dpit1 = abs_s( sub( T_op_fr[1], T_op_fr[0] ) ); /* Q6 */
- dpit2 = abs_s( sub( T_op_fr[2], T_op_fr[1] ) ); /* Q6 */
- dpit3 = abs_s( sub( T_op_fr[3], T_op_fr[2] ) ); /* Q6 */
-
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( ( GT_16( voicing_fr[0], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 1st sf. */
- ( GT_16( voicing_fr[1], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
- ( GT_16( voicing_fr[2], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 3st sf. */
- ( GT_16( voicing_fr[3], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 4st sf. */
- ( GT_32( mean_ee, 256 /* 4.0f in Q6 */ ) ) && /* energy concentrated in low frequencies */
- ( LT_16( dpit1, 3 << 6 ) ) &&
- ( LT_16( dpit2, 3 << 6 ) ) &&
- ( LT_16( dpit3, 3 << 6 ) ) )
- {
- coder_type = VOICED;
- move16();
- }
- ELSE IF( st_fx->Opt_SC_VBR && st_fx->input_bwidth == NB && LT_16( vadnoise, 20 << 8 ) )
- {
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( GT_16( voicing_fr[0], 8192 /* 0.25 in Q15 */ ) && /* normalized correlation high in 1st sf. */
- ( GT_16( voicing_fr[1], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
- ( GT_16( voicing_fr[2], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 3st sf. */
- ( GT_16( voicing_fr[3], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 4st sf. */
- ( GT_32( mean_ee, 64 /* 1.0f in Q6 */ ) ) && /* energy concentrated in low frequencies */
- ( LT_16( dpit1, 5 << 6 ) ) &&
- ( LT_16( dpit2, 5 << 6 ) ) &&
- ( LT_16( dpit3, 5 << 6 ) ) )
- {
- hSC_VBR->set_ppp_generic = 1;
- move16();
- coder_type = VOICED;
- move16();
- }
- }
-
- /* set VOICED mode for frames with very stable pitch and high correlation
- and avoid to switch to AUDIO/MUSIC later */
- voicing_m = mac_r( L_mac( L_mac( L_mult( voicing_fr[3], 8192 /* 0.25 in Q15 */ ), voicing_fr[2], 8192 /* 0.25 in Q15 */ ), voicing_fr[1], 8192 /* 0.25 in Q15 */ ), voicing_fr[0], 8192 /* 0.25 in Q15 */ ); /* Q15 */
- test();
- test();
- test();
- test();
- test();
- IF( *flag_spitch || ( LE_16( dpit1, 3 << 6 ) && LE_16( dpit2, 3 << 6 ) && LE_16( dpit3, 3 << 6 ) &&
- GT_16( voicing_m, 31130 /* 0.95f in Q15 */ ) && GT_16( st_fx->voicing_sm_fx, 31785 /* 0.97f in Q15 */ ) ) )
- {
- coder_type = VOICED;
- move16();
- *flag_spitch = 1;
- move16(); /*to avoid switch to AUDIO/MUSIC later*/
- }
- }
-
- /*-----------------------------------------------------------------*
- * Channel-aware mode - set RF mode and total bitrate
- *-----------------------------------------------------------------*/
-
- st_fx->rf_mode = st_fx->Opt_RF_ON; /* Q0 */
- move16();
-
- IF( EQ_16( coder_type, GENERIC ) )
- {
- test();
- test();
- test();
- test();
- IF( ( LT_16( voicing_fr[0], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
- ( LT_16( voicing_fr[1], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
- ( LT_16( voicing_fr[2], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 3rd sf. */
- ( LT_16( voicing_fr[3], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 4th sf. */
- ( GT_16( vadnoise, 25 << 8 ) ) ) /* when speech is clean */
-
- {
- st_fx->rf_mode = 0;
- move16();
- /* Current frame cannot be compressed to pack the partial redundancy;*/
-
- IF( NE_16( st_fx->rf_mode, st_fx->Opt_RF_ON ) )
- {
- core_coder_mode_switch_ivas_fx( st_fx, st_fx->last_total_brate, 0 );
- }
- }
- }
-
- /*-----------------------------------------------------------------*
- * UNCLR classifier
- *-----------------------------------------------------------------*/
-
- IF( hStereoClassif != NULL )
- {
- test();
- test();
- test();
- test();
- test();
- IF( st_fx->element_mode > EVS_MONO && ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, UNVOICED ) || coder_type == INACTIVE || st_fx->localVAD == 0 ) && LT_16( hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan], MAX_UV_CNT ) )
- {
- hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan] = add( hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan], 1 );
- move16();
- }
- ELSE
- {
- hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan] = 0;
- move16();
- }
- }
-
- /*-----------------------------------------------------------------*
- * Updates
- *-----------------------------------------------------------------*/
-
- /* update spike hysteresis parameters */
- test();
- if ( st_fx->spike_hyst >= 0 && LT_16( st_fx->spike_hyst, 2 ) )
- {
- st_fx->spike_hyst = add( st_fx->spike_hyst, 1 ); /* Q0 */
- move16();
- }
-
- /* reset spike hysteresis */
- test();
- test();
- test();
- if ( ( GT_16( st_fx->spike_hyst, 1 ) ) &&
- ( GT_16( dE3, 5 << 8 ) || /* energy increases */
- ( GT_16( relE, -3328 /* 13 in Q8 */ ) && ( GT_16( add_sat( mean_voi3, corr_shift ), 22774 /* 0.695 in Q15 */ ) ) ) ) ) /* normalized correlation is high */
- {
- st_fx->spike_hyst = -1;
- move16();
- }
-
- /* update tilt parameters */
- st_fx->ee_old_fx = ee[1];
- move32(); /*Q6*/
- st_fx->old_dE1_fx = dE1;
- move32(); /*Q13*/
-
- /* save the raw coder_type for various modules later in the codec (the reason is that e.g. UNVOICED is lost at higher rates) */
- st_fx->coder_type_raw = coder_type; /* Q0 */
- move16();
-
- return coder_type;
-}
-/*-------------------------------------------------------------------*
- * find_uv()
- *
- * Decision about coder type
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c
index 3f4c8abc7103221d0b9558cfe49d893e531b23ce..200e538e4b2a8380a8293fd86ecf7af960d07421 100644
--- a/lib_enc/find_uv_fx.c
+++ b/lib_enc/find_uv_fx.c
@@ -618,3 +618,542 @@ Word16 find_uv_fx( /* o : coding type */
return coder_type;
}
+
+/*-------------------------------------------------------------------*
+ * find_uv()
+ *
+ * Decision about coder type
+ *-------------------------------------------------------------------*/
+Word16 find_uv_ivas_fx( /* o : coding type */
+ Encoder_State *st_fx, /* i/o: encoder state structure */
+ const Word16 *T_op_fr, /* i : pointer to adjusted fractional pitch (4 val.) Q6*/
+ const Word16 *voicing_fr, /* i : refined correlation for each subframes Q15*/
+ const Word16 *speech, /* i : pointer to speech signal for E computation Q_new*/
+ const Word32 *ee, /* i : lf/hf Energy ratio for present frame Q6*/
+ Word32 *dE1X, /* o : sudden energy increase for S/M classifier Q13*/
+ const Word16 corr_shift, /* i : normalized correlation correction in noise Q15*/
+ const Word16 relE, /* i : relative frame energy Q8*/
+ const Word16 Etot, /* i : total energy Q8*/
+ const Word32 hp_E[], /* i : energy in HF q_hp_E*/
+ Word16 *flag_spitch, /* i/o: flag to indicate very short stable pitch and high correlation Q0*/
+ const Word16 last_core_orig, /* i : original last core Q0*/
+ STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */
+ const Word16 Q_new,
+ const Word16 q_hp_E )
+{
+ Word16 coder_type, i;
+ Word32 mean_ee, dE1, fac_32;
+ const Word16 *pt_speech;
+ Word32 L_tmp, enr_ssf[2 * NB_SSF + 2 * NB_SSF + 2], E_min_th;
+ Word16 dE2;
+ Word16 ind_deltaMax, tmp_offset_flag;
+ Word32 Ltmp0, *pt_enr_ssf, *pt_enr_ssf1, dE2_th;
+ Word16 exp0, exp1;
+ Word16 wtmp0, wtmp1;
+ Word16 fac, mean_voi3, dE3;
+ Word16 relE_thres;
+ Word16 mean_voi3_offset;
+ Word16 voicing_m, dpit1, dpit2, dpit3;
+ Word16 ee0_th, ee1_th, voi_th, nb_cond, flag_low_relE;
+ NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst;
+ SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
+#ifdef BASOP_NOGLOB_DECLARE_LOCAL
+ Flag Overflow = 0;
+ move32();
+#endif
+ Word16 Last_Resort;
+ Word16 vadnoise;
+
+ IF( hSC_VBR != NULL )
+ {
+ Last_Resort = hSC_VBR->Last_Resort; /* Q0 */
+ move16();
+ vadnoise = hSC_VBR->vadnoise_fx; /* Q8 */
+ move16();
+ }
+ ELSE
+ {
+ Last_Resort = 0;
+ move16();
+ vadnoise = 0;
+ move16();
+ }
+
+ /*-----------------------------------------------------------------*
+ * Detect sudden energy increases to catch voice and music
+ * temporal events (dE1)
+ *
+ * - Find maximum energy per short subblocks.
+ * Two subblock sets are used shifted by half the subblock length
+ * - Find maximum energy ratio between adjacent subblocks
+ *-----------------------------------------------------------------*/
+
+ /* Find maximum energy per short subblocks */
+ pt_speech = speech - SSF;
+ pt_enr_ssf = enr_ssf + 2 * NB_SSF;
+ FOR( i = 0; i < 2 * ( NB_SSF + 1 ); i++ )
+ {
+ emaximum_fx( Q_new, pt_speech, SSF, pt_enr_ssf );
+ pt_speech += ( SSF / 2 );
+ pt_enr_ssf++;
+ }
+
+ dE1 = 0;
+ move16();
+ ind_deltaMax = 0;
+ move16();
+ pt_enr_ssf = enr_ssf + 2 * NB_SSF;
+ pt_enr_ssf1 = pt_enr_ssf + 2;
+
+ /* Test on energy increase between adjacent sub-subframes */
+ exp1 = 0;
+ move16();
+ FOR( i = 0; i < 2 * NB_SSF; i++ )
+ {
+ /*fac = *pt_enr_ssf1 / (*pt_enr_ssf + 1);*/
+ Ltmp0 = L_max( *pt_enr_ssf, 1 );
+ exp0 = norm_l( Ltmp0 );
+ wtmp0 = extract_h( L_shl( Ltmp0, exp0 ) );
+ exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 );
+ wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) );
+ fac = div_s( wtmp1, wtmp0 );
+ fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/
+
+ if ( GT_32( fac_32, dE1 ) )
+ {
+ ind_deltaMax = i;
+ move16();
+ }
+
+ dE1 = L_max( dE1, fac_32 ); /* Q13 */
+
+ pt_enr_ssf++;
+ pt_enr_ssf1++;
+ }
+
+ IF( hStereoClassif != NULL )
+ {
+ IF( st_fx->idchan == 0 )
+ {
+ hStereoClassif->dE1_ch1_fx = dE1; /* Q13 */
+ move32();
+ hStereoClassif->dE1_ch1_e = 31 - Q13;
+ move16();
+ }
+ ELSE
+ {
+ hStereoClassif->dE1_ch2_fx = dE1; /* Q13 */
+ move32();
+ hStereoClassif->dE1_ch2_e = 31 - Q13;
+ move16();
+ }
+ }
+
+ if ( dE1X != NULL )
+ {
+ *dE1X = dE1; /* Q13 */
+ move32();
+ }
+
+ /*-----------------------------------------------------------------*
+ * Average spectral tilt
+ * Average voicing (normalized correlation)
+ *-----------------------------------------------------------------*/
+
+ /*mean_ee = 1.0f/3.0f * (st->ee_old + ee[0] + ee[1]); */ /* coefficients take into account the position of the window */
+ mean_ee = L_add_o( L_add_o( st_fx->ee_old_fx, ee[0], &Overflow ), ee[1], &Overflow ); /* Q6 */
+ mean_ee = Mult_32_16( mean_ee, 10923 ); /*Q6*/
+
+ /* mean_voi3 = 1.0f/3.0f * (voicing[0] + voicing[1] + voicing[2]);*/
+ Ltmp0 = L_mult( st_fx->voicing_fx[0], 10923 /* 1/3 in Q15 */ ); /* Q31 */
+ Ltmp0 = L_mac( Ltmp0, st_fx->voicing_fx[1], 10923 /* 1/3 in Q15 */ ); /* Q31 */
+ mean_voi3 = mac_r_sat( Ltmp0, st_fx->voicing_fx[2], 10923 /* 1/3 in Q15 */ ); /*Q15*/
+ /*-----------------------------------------------------------------*
+ * Total frame energy difference (dE3)
+ *-----------------------------------------------------------------*/
+
+ dE3 = sub( Etot, hNoiseEst->Etot_last_fx ); /*Q8*/
+
+ /*-----------------------------------------------------------------*
+ * Energy decrease after spike (dE2)
+ *-----------------------------------------------------------------*/
+
+ /* set different thresholds and conditions for NB and WB input */
+ dE2_th = 30 << 10;
+ move32();
+ nb_cond = 1;
+ move16(); /* no additional condition for WB input */
+ IF( st_fx->input_bwidth == NB )
+ {
+ dE2_th = 21 << 10;
+ move32();
+ if ( GE_16( add_o( mean_voi3, corr_shift, &Overflow ), 22282 ) ) /*( mean_voi3 + corr_shift ) >= 0.68f*/
+ {
+ nb_cond = 0;
+ move16();
+ }
+ }
+
+ /* calcualte maximum energy decrease */
+ dE2 = 0;
+ move16(); /* Test on energy decrease after an energy spike */
+ pt_enr_ssf = enr_ssf + 2 * NB_SSF;
+
+ test();
+ IF( GT_32( dE1, 30 << 13 ) && nb_cond ) /*>30 Q13*/
+ {
+ IF( LT_16( sub( shl( NB_SSF, 1 ), ind_deltaMax ), L_ENR ) )
+ {
+ st_fx->old_ind_deltaMax = ind_deltaMax; /* Q0 */
+ move16();
+ Copy32( pt_enr_ssf, st_fx->old_enr_ssf_fx, 2 * NB_SSF ); /* Qx */
+ }
+ ELSE
+ {
+ st_fx->old_ind_deltaMax = -1;
+ move16();
+ dE2 = find_ener_decrease_fx( ind_deltaMax, pt_enr_ssf ); /*Q10*/
+
+ if ( GT_32( dE2, dE2_th ) )
+ {
+ st_fx->spike_hyst = 0;
+ move16();
+ }
+ }
+ }
+ ELSE
+ {
+ IF( st_fx->old_ind_deltaMax >= 0 )
+ {
+ Copy32( st_fx->old_enr_ssf_fx, enr_ssf, 2 * NB_SSF ); /* Qx */
+ dE2 = find_ener_decrease_fx( st_fx->old_ind_deltaMax, enr_ssf ); /* Q10 */
+
+ if ( GT_32( dE2, dE2_th ) )
+ {
+ st_fx->spike_hyst = 1;
+ move16();
+ }
+ }
+
+ st_fx->old_ind_deltaMax = -1;
+ move16();
+ }
+
+ /*-----------------------------------------------------------------*
+ * Detection of voiced offsets (tmp_offset_flag)
+ *-----------------------------------------------------------------*/
+
+ tmp_offset_flag = 1;
+ move16();
+
+ IF( st_fx->input_bwidth != NB )
+ {
+ ee0_th = 154; /*2.4 in Q6 */
+ move16();
+ voi_th = 24248; /*0.74f Q15 */
+ move16();
+ }
+ ELSE
+ {
+ ee0_th = 627; /*9.8f Q6 */
+ move16();
+ voi_th = 24904; /*0.76f Q15*/
+ move16();
+ }
+
+ E_min_th = L_shl( E_MIN_IVAS_FX_Q31, sub( q_hp_E, Q31 ) );
+
+ test();
+ test();
+ test();
+ IF( ( EQ_16( st_fx->last_coder_type_raw, UNVOICED ) ) || /* previous frame was unvoiced */
+ ( ( LT_32( ee[0], ee0_th ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy is concentrated in high frequencies provided that some energy is present in HF */
+ ( LT_16( add_o( st_fx->voicing_fx[0], corr_shift, &Overflow ), voi_th ) ) ) ) /* normalized correlation is low */
+ {
+ tmp_offset_flag = 0;
+ move16();
+ }
+
+ /*-----------------------------------------------------------------*
+ * Decision about UC
+ *-----------------------------------------------------------------*/
+
+ /* SC-VBR - set additional parameters and thresholds for SC-VBR */
+ mean_voi3_offset = 0;
+ move16();
+ flag_low_relE = 0;
+ move16();
+ ee1_th = 608; /*9.5 Q6*/
+ move16();
+ test();
+ test();
+ IF( st_fx->Opt_SC_VBR || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) /* Allow the low energy flag for the secondary channel */
+ {
+ ee1_th = 544; /*8.5f Q6*/
+ move16();
+
+ /* SC-VBR - determine the threshold on relative energy as a function of lp_noise */
+ IF( st_fx->input_bwidth != NB )
+ {
+ /*relE_thres = 0.700f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16) */
+ L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, st_fx->lp_noise_fx ); // Q24
+ IF( Last_Resort == 0 )
+ {
+ /*relE_thres = 0.650f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16)*/
+ L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, st_fx->lp_noise_fx ); // Q24
+ }
+ relE_thres = round_fx( L_tmp );
+ }
+ ELSE
+ {
+
+ /*relE_thres = 0.60f * st->lp_noise - 28.2f; (lp_noise in Q8, constant Q8<<16)*/
+ L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, st_fx->lp_noise_fx ); // Q24
+ relE_thres = round_fx( L_tmp );
+ }
+ relE_thres = s_max( relE_thres, -6400 /* -25.0f in Q8 */ ); /* Q8 */
+
+ /* SC-VBR = set flag on low relative energy */
+ if ( LT_16( relE, relE_thres ) )
+ {
+ flag_low_relE = 1;
+ move16();
+ }
+
+ /* SC-VBR - correction of voicing threshold for NB inputs (important only in noisy conditions) */
+ test();
+ if ( st_fx->input_bwidth == NB && LT_16( vadnoise, 20 << 8 ) ) /* vadnoise in Q8, constant Q0<<8 */
+ {
+ mean_voi3_offset = 1638; /*0.05f Q15*/
+ move16();
+ }
+ }
+
+ /* make decision whether frame is unvoiced */
+ coder_type = GENERIC;
+ move16();
+ IF( st_fx->input_bwidth == NB )
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22282 /* 0.68 in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */
+ ( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 /* 0.79 in Q15 */ ) ) && /* normalized correlation low on look-ahead - onset detection */
+ ( LT_32( ee[0], 640 /* 10.0f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */
+ ( LT_32( ee[1], ee1_th ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */
+ ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */
+ /*( st_fx->music_hysteresis_fx == 0 ) &&*/ /* ... and in segment after AUDIO frames */
+ ( LE_32( dE1, 237568 /* 29.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */
+ ( LE_32( st_fx->old_dE1_fx, 237568 /* 29.0f in Q13 */ ) ) && /* + one frame hysteresis */
+ ( st_fx->spike_hyst < 0 ) ) || /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */
+ flag_low_relE ) /* low relative frame energy (only for SC-VBR) */
+ {
+ coder_type = UNVOICED;
+ move16();
+ }
+ }
+ ELSE
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ if ( ( ( LT_16( add_o( mean_voi3, corr_shift, &Overflow ), add( 22774 /* 0.695f in Q15 */, mean_voi3_offset ) ) ) && /* normalized correlation low */
+ /*( LT_16( add_o( st_fx->voicing_fx[2], corr_shift, &Overflow ), 25887 ) ) && */ /* normalized correlation low on look-ahead - onset detection */
+ ( LT_32( ee[0], 397 /* 6.2f in Q6 */ ) ) && ( GT_32( hp_E[0], E_min_th ) ) && /* energy concentrated in high frequencies provided that some energy is present in HF... */
+ ( LT_32( ee[1], 397 /* 6.2f in Q16 */ ) ) && ( GT_32( hp_E[1], E_min_th ) ) && /* ... biased towards look-ahead to detect onsets */
+ ( tmp_offset_flag == 0 ) && /* Take care of voiced offsets */
+ /*( st_fx->music_hysteresis_fx == 0 ) && */ /* ... and in segment after AUDIO frames */
+ ( LE_32( dE1, 245760 /* 30.0f in Q13 */ ) ) && /* Avoid on sharp energy spikes */
+ ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) && /* + one frame hysteresis */
+ ( st_fx->spike_hyst < 0 ) ) /* Avoid after sharp energy spikes followed by decay (e.g. castanets) */
+ || ( flag_low_relE && ( LE_32( st_fx->old_dE1_fx, 245760 /* 30.0f in Q13 */ ) ) ) ) /* low relative frame energy (only for SC-VBR) */
+ {
+ coder_type = UNVOICED;
+ move16();
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Decision about VC
+ *-----------------------------------------------------------------*/
+ if ( st_fx->Opt_SC_VBR )
+ {
+ hSC_VBR->set_ppp_generic = 0;
+ }
+ move16();
+
+ test();
+ test();
+ IF( EQ_16( st_fx->localVAD, 1 ) && EQ_16( coder_type, GENERIC ) && NE_16( last_core_orig, AMR_WB_CORE ) )
+ {
+ dpit1 = abs_s( sub( T_op_fr[1], T_op_fr[0] ) ); /* Q6 */
+ dpit2 = abs_s( sub( T_op_fr[2], T_op_fr[1] ) ); /* Q6 */
+ dpit3 = abs_s( sub( T_op_fr[3], T_op_fr[2] ) ); /* Q6 */
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( GT_16( voicing_fr[0], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 1st sf. */
+ ( GT_16( voicing_fr[1], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
+ ( GT_16( voicing_fr[2], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 3st sf. */
+ ( GT_16( voicing_fr[3], 19825 /* 0.605 in Q15 */ ) ) && /* normalized correlation high in 4st sf. */
+ ( GT_32( mean_ee, 256 /* 4.0f in Q6 */ ) ) && /* energy concentrated in low frequencies */
+ ( LT_16( dpit1, 3 << 6 ) ) &&
+ ( LT_16( dpit2, 3 << 6 ) ) &&
+ ( LT_16( dpit3, 3 << 6 ) ) )
+ {
+ coder_type = VOICED;
+ move16();
+ }
+ ELSE IF( st_fx->Opt_SC_VBR && st_fx->input_bwidth == NB && LT_16( vadnoise, 20 << 8 ) )
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( GT_16( voicing_fr[0], 8192 /* 0.25 in Q15 */ ) && /* normalized correlation high in 1st sf. */
+ ( GT_16( voicing_fr[1], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
+ ( GT_16( voicing_fr[2], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 3st sf. */
+ ( GT_16( voicing_fr[3], 8192 /* 0.25 in Q15 */ ) ) && /* normalized correlation high in 4st sf. */
+ ( GT_32( mean_ee, 64 /* 1.0f in Q6 */ ) ) && /* energy concentrated in low frequencies */
+ ( LT_16( dpit1, 5 << 6 ) ) &&
+ ( LT_16( dpit2, 5 << 6 ) ) &&
+ ( LT_16( dpit3, 5 << 6 ) ) )
+ {
+ hSC_VBR->set_ppp_generic = 1;
+ move16();
+ coder_type = VOICED;
+ move16();
+ }
+ }
+
+ /* set VOICED mode for frames with very stable pitch and high correlation
+ and avoid to switch to AUDIO/MUSIC later */
+ voicing_m = mac_r( L_mac( L_mac( L_mult( voicing_fr[3], 8192 /* 0.25 in Q15 */ ), voicing_fr[2], 8192 /* 0.25 in Q15 */ ), voicing_fr[1], 8192 /* 0.25 in Q15 */ ), voicing_fr[0], 8192 /* 0.25 in Q15 */ ); /* Q15 */
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( *flag_spitch || ( LE_16( dpit1, 3 << 6 ) && LE_16( dpit2, 3 << 6 ) && LE_16( dpit3, 3 << 6 ) &&
+ GT_16( voicing_m, 31130 /* 0.95f in Q15 */ ) && GT_16( st_fx->voicing_sm_fx, 31785 /* 0.97f in Q15 */ ) ) )
+ {
+ coder_type = VOICED;
+ move16();
+ *flag_spitch = 1;
+ move16(); /*to avoid switch to AUDIO/MUSIC later*/
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Channel-aware mode - set RF mode and total bitrate
+ *-----------------------------------------------------------------*/
+
+ st_fx->rf_mode = st_fx->Opt_RF_ON; /* Q0 */
+ move16();
+
+ IF( EQ_16( coder_type, GENERIC ) )
+ {
+ test();
+ test();
+ test();
+ test();
+ IF( ( LT_16( voicing_fr[0], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
+ ( LT_16( voicing_fr[1], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 2st sf. */
+ ( LT_16( voicing_fr[2], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 3rd sf. */
+ ( LT_16( voicing_fr[3], 6554 /* 0.2f in Q15 */ ) ) && /* normalized correlation high in 4th sf. */
+ ( GT_16( vadnoise, 25 << 8 ) ) ) /* when speech is clean */
+
+ {
+ st_fx->rf_mode = 0;
+ move16();
+ /* Current frame cannot be compressed to pack the partial redundancy;*/
+
+ IF( NE_16( st_fx->rf_mode, st_fx->Opt_RF_ON ) )
+ {
+ core_coder_mode_switch_ivas_fx( st_fx, st_fx->last_total_brate, 0 );
+ }
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * UNCLR classifier
+ *-----------------------------------------------------------------*/
+
+ IF( hStereoClassif != NULL )
+ {
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( st_fx->element_mode > EVS_MONO && ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, UNVOICED ) || coder_type == INACTIVE || st_fx->localVAD == 0 ) && LT_16( hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan], MAX_UV_CNT ) )
+ {
+ hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan] = add( hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan], 1 );
+ move16();
+ }
+ ELSE
+ {
+ hStereoClassif->unclr_sw_enable_cnt[st_fx->idchan] = 0;
+ move16();
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Updates
+ *-----------------------------------------------------------------*/
+
+ /* update spike hysteresis parameters */
+ test();
+ if ( st_fx->spike_hyst >= 0 && LT_16( st_fx->spike_hyst, 2 ) )
+ {
+ st_fx->spike_hyst = add( st_fx->spike_hyst, 1 ); /* Q0 */
+ move16();
+ }
+
+ /* reset spike hysteresis */
+ test();
+ test();
+ test();
+ if ( ( GT_16( st_fx->spike_hyst, 1 ) ) &&
+ ( GT_16( dE3, 5 << 8 ) || /* energy increases */
+ ( GT_16( relE, -3328 /* 13 in Q8 */ ) && ( GT_16( add_sat( mean_voi3, corr_shift ), 22774 /* 0.695 in Q15 */ ) ) ) ) ) /* normalized correlation is high */
+ {
+ st_fx->spike_hyst = -1;
+ move16();
+ }
+
+ /* update tilt parameters */
+ st_fx->ee_old_fx = ee[1];
+ move32(); /*Q6*/
+ st_fx->old_dE1_fx = dE1;
+ move32(); /*Q13*/
+
+ /* save the raw coder_type for various modules later in the codec (the reason is that e.g. UNVOICED is lost at higher rates) */
+ st_fx->coder_type_raw = coder_type; /* Q0 */
+ move16();
+
+ return coder_type;
+}
diff --git a/lib_enc/find_wsp.c b/lib_enc/find_wsp.c
deleted file mode 100644
index 89b77d351c6cf8467fdc846030411d69ecec9f82..0000000000000000000000000000000000000000
--- a/lib_enc/find_wsp.c
+++ /dev/null
@@ -1,98 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-/*-------------------------------------------------------------------*
- * ivas_find_wsp_fx()
- *
- * Compute weighted speech used in open-loop pitch search
- *-------------------------------------------------------------------*/
-void ivas_find_wsp_fx(
- const Word16 L_frame, /* i : length of the frame Q0*/
- const Word16 L_subfr, /* i : length of subframe Q0*/
- const Word16 nb_subfr, /* i : number of subframes Q0*/
- const Word16 *A_fx,
- /* i : A(z) filter coefficients */ // Q12
- Word16 *Aw_fx,
- /* o : weighted A(z) filter coefficients */ // Q12
- const Word16 *speech_fx,
- /* i : pointer to the denoised speech frame */ // Q_new
- const Word16 tilt_fact,
- /* i : tilt factor */ // Q15
- Word16 *wsp_fx,
- /* o : poitnter to the weighted speech frame */ // Q_new
- Word16 *mem_wsp_fx,
- /* i/o: W(Z) denominator memory */ // Q_new
- const Word16 gamma,
- /* i : weighting factor */ // Q15
- const Word16 L_look /* i : look-ahead Q0*/
-)
-{
- Word16 *p_Aw_fx, tmp_fx;
- Word16 i_subfr;
-
-
- /*-----------------------------------------------------------------*
- * Compute weighted A(z) unquantized for subframes
- *-----------------------------------------------------------------*/
- weight_a_subfr_fx( nb_subfr, A_fx, Aw_fx, gamma, M );
-
- /*-----------------------------------------------------------------*
- * Compute weighted speech for all subframes
- *-----------------------------------------------------------------*/
- p_Aw_fx = Aw_fx;
- FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr )
- {
- Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr, 0 );
- p_Aw_fx += ( M + 1 );
- }
- p_Aw_fx -= ( M + 1 );
-
- /*-----------------------------------------------------------------*
- * Weighted speech computation is extended on look-ahead
- *-----------------------------------------------------------------*/
-
- deemph_fx( wsp_fx, tilt_fact, L_frame, mem_wsp_fx );
- Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look, 0 );
- tmp_fx = *mem_wsp_fx;
- deemph_fx( &wsp_fx[L_frame], tilt_fact, L_look, &tmp_fx );
- return;
-}
diff --git a/lib_enc/find_wsp_fx.c b/lib_enc/find_wsp_fx.c
index 7468c3dc77c5fd6064b8665f05a46dbb5e6c806b..d08922a2a479c3d3c4f0b2566433b25568af0342 100644
--- a/lib_enc/find_wsp_fx.c
+++ b/lib_enc/find_wsp_fx.c
@@ -6,7 +6,7 @@
#include
#include "options.h"
#include "cnst.h"
-//#include "prot_fx.h"
+#include "prot.h"
#include "prot_fx.h" /* Function prototypes */
#include "prot_fx_enc.h" /* Function prototypes */
@@ -78,3 +78,60 @@ void find_wsp_fx(
deemph_fx( &wsp[L_frame], preemph_fac, lookahead, &wtmp );
}
}
+
+/*-------------------------------------------------------------------*
+ * ivas_find_wsp_fx()
+ *
+ * Compute weighted speech used in open-loop pitch search
+ *-------------------------------------------------------------------*/
+void ivas_find_wsp_fx(
+ const Word16 L_frame, /* i : length of the frame Q0*/
+ const Word16 L_subfr, /* i : length of subframe Q0*/
+ const Word16 nb_subfr, /* i : number of subframes Q0*/
+ const Word16 *A_fx,
+ /* i : A(z) filter coefficients */ // Q12
+ Word16 *Aw_fx,
+ /* o : weighted A(z) filter coefficients */ // Q12
+ const Word16 *speech_fx,
+ /* i : pointer to the denoised speech frame */ // Q_new
+ const Word16 tilt_fact,
+ /* i : tilt factor */ // Q15
+ Word16 *wsp_fx,
+ /* o : poitnter to the weighted speech frame */ // Q_new
+ Word16 *mem_wsp_fx,
+ /* i/o: W(Z) denominator memory */ // Q_new
+ const Word16 gamma,
+ /* i : weighting factor */ // Q15
+ const Word16 L_look /* i : look-ahead Q0*/
+)
+{
+ Word16 *p_Aw_fx, tmp_fx;
+ Word16 i_subfr;
+
+
+ /*-----------------------------------------------------------------*
+ * Compute weighted A(z) unquantized for subframes
+ *-----------------------------------------------------------------*/
+ weight_a_subfr_fx( nb_subfr, A_fx, Aw_fx, gamma, M );
+
+ /*-----------------------------------------------------------------*
+ * Compute weighted speech for all subframes
+ *-----------------------------------------------------------------*/
+ p_Aw_fx = Aw_fx;
+ FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr )
+ {
+ Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr, 0 );
+ p_Aw_fx += ( M + 1 );
+ }
+ p_Aw_fx -= ( M + 1 );
+
+ /*-----------------------------------------------------------------*
+ * Weighted speech computation is extended on look-ahead
+ *-----------------------------------------------------------------*/
+
+ deemph_fx( wsp_fx, tilt_fact, L_frame, mem_wsp_fx );
+ Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look, 0 );
+ tmp_fx = *mem_wsp_fx;
+ deemph_fx( &wsp_fx[L_frame], tilt_fact, L_look, &tmp_fx );
+ return;
+}
diff --git a/lib_enc/frame_spec_dif_cor_rate.c b/lib_enc/frame_spec_dif_cor_rate.c
deleted file mode 100644
index 9185f37bd8e368b71eb77f97de5cd1044afc3320..0000000000000000000000000000000000000000
--- a/lib_enc/frame_spec_dif_cor_rate.c
+++ /dev/null
@@ -1,47 +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 "options.h"
-#include
-#include "prot.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * frame_spec_dif_cor_rate()
- *
- *
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/gain_enc.c b/lib_enc/gain_enc.c
deleted file mode 100644
index 276e2073828ba5e96768d35da3c89e2d4b36ca34..0000000000000000000000000000000000000000
--- a/lib_enc/gain_enc.c
+++ /dev/null
@@ -1,55 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * Local constants
- *-------------------------------------------------------------------*/
-
-#define RANGE 64
-
-/*---------------------------------------------------------------------*
- * Es_pred_enc()
- *
- * Calculation and quantization of average predicted innovation energy to be
- *---------------------------------------------------------------------*/
diff --git a/lib_enc/gs_enc.c b/lib_enc/gs_enc.c
deleted file mode 100644
index 900c381bf2fb9fa9e3f0de002b2dccc0293feba0..0000000000000000000000000000000000000000
--- a/lib_enc/gs_enc.c
+++ /dev/null
@@ -1,56 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-
-/*-------------------------------------------------------------------*
- * Local function prototypes
- *-------------------------------------------------------------------*/
-
-
-/*-------------------------------------------------------------------*
- * GSC_enc_init()
- *
- * Initialize GSC encoder state structure
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c
index 7ae8fb42ed40965aee263bf0ba201cfe444f8181..a804c131122d4f68787e51574495b9936d2eae8a 100644
--- a/lib_enc/gs_enc_fx.c
+++ b/lib_enc/gs_enc_fx.c
@@ -679,9 +679,9 @@ void encod_audio_ivas_fx(
*--------------------------------------------------------------------------------------*/
edct_16fx( dct_epit, exc, st_fx->L_frame, 7, st_fx->element_mode );
- scale_sig( exc, st_fx->L_frame, sub( Q_new, Q_exc ) );
+ Scale_sig( exc, st_fx->L_frame, sub( Q_new, Q_exc ) );
edct_16fx( exc_wo_nf, exc_wo_nf, st_fx->L_frame, 7, st_fx->element_mode );
- scale_sig( exc_wo_nf, st_fx->L_frame, sub( Q_new, Q_exc ) );
+ Scale_sig( exc_wo_nf, st_fx->L_frame, sub( Q_new, Q_exc ) );
Q_exc = Q_new;
move16();
/*--------------------------------------------------------------------------------------*
diff --git a/lib_enc/guided_plc_enc.c b/lib_enc/guided_plc_enc.c
deleted file mode 100644
index 6c0e9022d866ca0b8b7d9804a9f735d41694353f..0000000000000000000000000000000000000000
--- a/lib_enc/guided_plc_enc.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include
-#include "prot.h"
-#include "stat_enc.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/hf_cod_amrwb.c b/lib_enc/hf_cod_amrwb.c
deleted file mode 100644
index 7ea6e47a56c1a7f087419f3073eeecbdeb81478f..0000000000000000000000000000000000000000
--- a/lib_enc/hf_cod_amrwb.c
+++ /dev/null
@@ -1,43 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/hq_classifier_enc.c b/lib_enc/hq_classifier_enc.c
deleted file mode 100644
index 634f4297184d4375f7d0aabd7a68fd7f6840212b..0000000000000000000000000000000000000000
--- a/lib_enc/hq_classifier_enc.c
+++ /dev/null
@@ -1,52 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-/*-----------------------------------------------------------------*
- * Local constants
- *-----------------------------------------------------------------*/
-
-/*-----------------------------------------------------------------*
- * Local function prototypes
- *-----------------------------------------------------------------*/
diff --git a/lib_enc/hq_core_enc.c b/lib_enc/hq_core_enc.c
deleted file mode 100644
index 24579e74e9e695a1b57188df5c597c98580412e8..0000000000000000000000000000000000000000
--- a/lib_enc/hq_core_enc.c
+++ /dev/null
@@ -1,410 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-
-/*--------------------------------------------------------------------------
- * hq_core_enc()
- *
- * HQ core encoder
- *--------------------------------------------------------------------------*/
-
-void hq_core_enc_ivas_fx(
- Encoder_State *st, /* i/o: encoder state structure */
- const Word16 *audio_fx, /* i : input audio signal Q0 */
- const Word16 input_frame_orig, /* i : frame length Q0*/
- const Word16 hq_core_type, /* i : HQ core type Q0*/
- const Word16 Voicing_flag, /* i : Voicing flag for FER method selection Q0*/
- const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/
-)
-{
- Word16 i, is_transient, num_bits, extra_unused;
-
- Word32 t_audio_fx[L_FRAME48k_EXT];
- Word16 wtda_audio_fx16[2 * L_FRAME48k];
- Word32 wtda_audio_fx32[2 * L_FRAME48k];
- Word16 two_frames_buffer[2 * L_FRAME48k];
- Word16 tmp;
- Word16 Aq_old_fx[M + 1];
- Word16 output_fx[L_FRAME48k];
- Word16 Q_audio;
- Word16 out_q = 0, old_q = 0;
- move16();
- move16();
- Word16 inner_frame, input_frame, L_frame;
- Word16 L_spec, overlap, nz, tcx_offset;
- Word16 left_overlap, right_overlap;
- BSTR_ENC_HANDLE hBstr = st->hBstr;
- Word16 q = 0;
- Word16 exp;
- move16();
-
- push_wmops( "hq_core_enc" );
-
- set16_fx( wtda_audio_fx16, 0, 2 * L_FRAME48k );
- set32_fx( wtda_audio_fx32, 0, 2 * L_FRAME48k );
- st->Nb_ACELP_frames = 0;
- move16();
- set_zero_fx( t_audio_fx, L_FRAME48k_EXT );
- /* set input_frame length */
- input_frame = input_frame_orig; /* Q0 */
-
- /* Sanity check, it should never happen at the encoder side (no BFI) */
- IF( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP )
- {
- st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW;
- move16();
- }
- ELSE
- {
- st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode;
- move16();
- }
- st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW;
- move16();
-
- /*--------------------------------------------------------------------------
- * Preprocessing in the first HQ frame after ACELP frame
- * Find the number of bits for PVQ coding
- * Write signaling information
- *--------------------------------------------------------------------------*/
-
- num_bits = BASOP_Util_Divide3232_Scale( st->total_brate, FRAMES_PER_SEC, &exp ); /* Q15-exp */
- num_bits = shr( num_bits, sub( 15, exp ) ); /* Q0 */
- extra_unused = 0;
- move16();
-
- /*--------------------------------------------------------------------------
- * Detect signal transition
- *--------------------------------------------------------------------------*/
-
- is_transient = detect_transient_fx( audio_fx, input_frame, 0, st ); /* Q0 */
- move16();
-
- test();
- test();
- IF( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) )
- {
- /*--------------------------------------------------------------------------
- * IVAS switching frame
- *--------------------------------------------------------------------------*/
-
- L_spec = input_frame;
- left_overlap = -1;
- right_overlap = -1;
- move16();
- move16();
- move16();
-
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio_fx16, 1, 1 );
-
- q = 0;
- move16();
- Q_audio = sub( Q16, q );
- TCX_MDCT( wtda_audio_fx16, t_audio_fx, &Q_audio, left_overlap, sub( L_spec, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode );
- Q_audio = sub( Q31, Q_audio );
-#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */
-#else
- Copy_Scale_sig_16_32_DEPREC( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */
-#endif
- inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */
- L_spec = l_spec_ext_tbl[st->bwidth]; /* Q0 */
- is_transient = 0;
- move16();
- move16();
- move16();
- }
- ELSE
- {
- /*--------------------------------------------------------------------------
- * Windowing and time-domain aliasing
- * DCT transform
- *--------------------------------------------------------------------------*/
- Q_audio = 0;
- move16();
- Scale_sig( st->old_input_signal_fx, input_frame, negate( st->q_old_inp ) ); /* Q0 */
- Scale_sig( st->input_fx, add( input_frame, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), negate( st->q_inp ) ); /* Q0 */
- st->q_old_inp = 0;
- move16();
- st->q_inp = 0;
- move16();
- Copy( st->old_input_signal_fx, two_frames_buffer, input_frame ); /* Q0 */
- Copy( audio_fx, two_frames_buffer + input_frame, input_frame ); /* Q0 */
-
- wtda_fx( two_frames_buffer + input_frame, &Q_audio, wtda_audio_fx32, NULL, 0,
- st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, input_frame );
-
- test();
- IF( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) )
- {
- /* Preprocessing in the first HQ frame after ACELP frame */
- core_switching_hq_prepare_enc_fx( st, &num_bits, input_frame, wtda_audio_fx32, two_frames_buffer + input_frame );
-
- /* During ACELP->HQ core switching, limit the HQ core bitrate to 48kbps */
- IF( GT_16( num_bits, ACELP_48k_BITS ) )
- {
- extra_unused = sub( num_bits, ACELP_48k_BITS );
- num_bits = ACELP_48k_BITS;
- move16();
- }
- }
-
- Word16 tmp_q = Q_audio;
- move16();
- direct_transform_fx( wtda_audio_fx32, t_audio_fx, is_transient, input_frame, &Q_audio, st->element_mode );
- scale_sig32( wtda_audio_fx32, L_FRAME48k_EXT, sub( Q_audio, tmp_q ) ); /* Q_audio */
-
- /* scale coefficients to their nominal level (8kHz) */
- IF( NE_16( input_frame, NORM_MDCT_FACTOR ) )
- {
- UWord16 lsb;
- tmp = mult_r( input_frame, 410 / 2 ); /* 1/8000 in Q15 */
- Word16 ener_match_fx = hq_nominal_scaling[tmp];
- move16();
- FOR( i = 0; i < input_frame; i++ )
- {
- /*t_audio_q[i] *= ener_match; */
- Mpy_32_16_ss( t_audio_fx[i], ener_match_fx, &t_audio_fx[i], &lsb ); /* Q12 */
- move16();
- }
- }
-
- /* limit encoded band-width according to the command-line OR BWD limitation */
- inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */
- L_spec = l_spec_tbl[st->bwidth]; /* Q0 */
-
- move16();
- move16();
-
-
- IF( GT_16( input_frame, inner_frame ) )
- {
- IF( EQ_16( is_transient, 1 ) )
- {
- FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
- {
- tmp = shr( inner_frame, 2 );
- Copy32( t_audio_fx + i_mult2( i, shr( input_frame, 2 ) ), t_audio_fx + i_mult2( i, tmp ), tmp ); /* Q_audio */
- }
- }
-
- set32_fx( t_audio_fx + inner_frame, 0, sub( input_frame, inner_frame ) );
- }
- }
-
-
- /* subtract signaling bits */
- num_bits = sub( num_bits, hBstr->nb_bits_tot ); /* Q0 */
-
- /*--------------------------------------------------------------------------
- * High-band gain control in case of BWS
- *--------------------------------------------------------------------------*/
-
- IF( st->bwidth_sw_cnt > 0 )
- {
- Word32 L_tmp;
- tmp = BASOP_Util_Divide1616_Scale( 3, BWS_TRAN_PERIOD, &exp ); /* Q15-exp */
- shr( tmp, exp );
- L_tmp = L_deposit_h( tmp ); /* Q31-exp */
- IF( is_transient )
- {
- FOR( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
- {
- v_multc_fixed( t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), L_tmp, t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), sub( shr( inner_frame, 2 ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ) ); // Q_audio + Q31 - Q31 -> Q_audio
- }
- }
- ELSE
- {
- v_multc_fixed( t_audio_fx + L_FRAME16k, L_tmp, t_audio_fx + L_FRAME16k, L_spec - L_FRAME16k ); // Q_audio + Q31 - Q31 -> Q_audio
- }
- }
-
- /*--------------------------------------------------------------------------
- * Classify whether to put extra bits for FER mitigation
- *--------------------------------------------------------------------------*/
-
- test();
- test();
- test();
- IF( ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, HQ_CORE ) ) && GT_32( st->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) )
- {
- IF( Voicing_flag > 0 )
- {
- push_indice( hBstr, IND_HQ_VOICING_FLAG, 1, 1 );
- num_bits = sub( num_bits, 1 );
- }
- ELSE
- {
- push_indice( hBstr, IND_HQ_VOICING_FLAG, 0, 1 );
- num_bits = sub( num_bits, 1 );
- }
- }
-
- /*--------------------------------------------------------------------------
- * Transform-domain encoding
- *--------------------------------------------------------------------------*/
-
- scale_sig32( t_audio_fx, L_FRAME48k_EXT, sub( Q12, Q_audio ) );
- scale_sig32( wtda_audio_fx32, 2 * L_FRAME48k, sub( Q12, Q_audio ) );
- Q_audio = 12;
- move16();
- IF( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) )
- {
-
- hq_lr_enc_ivas_fx( st, t_audio_fx, inner_frame, &num_bits, is_transient );
- }
- ELSE
- {
- /* HQ high rate encoder */
- hq_hr_enc_ivas_fx( st, t_audio_fx, L_spec, &num_bits, is_transient, vad_hover_flag );
- }
-
- /* write all unused bits to the bitstream */
- num_bits = add( num_bits, extra_unused );
-
- WHILE( GT_16( num_bits, 16 ) )
- {
- push_indice( hBstr, IND_UNUSED, 0, 16 );
- num_bits = sub( num_bits, 16 );
- }
-
- IF( num_bits != 0 )
- {
- push_indice( hBstr, IND_UNUSED, 0, num_bits );
- }
-
- test();
- test();
- IF( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) )
- {
- overlap = st->hTcxCfg->tcx_mdct_window_length; /* Q0 */
- move16();
-
- nz = NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS );
- move16();
- L_frame = sub( st->L_frame + st->hTcxCfg->tcx_offset, st->hTcxCfg->lfacNext );
- tcx_offset = st->hTcxCfg->lfacNext;
- move16();
-
- set16_fx( Aq_old_fx, 0, M + 1 ); /* Dummy filter */
- Aq_old_fx[0] = 1;
- move16();
-
- /* Code taken from InternalTCXDecoder() */
- Copy_Scale_sig_32_16( wtda_audio_fx32, wtda_audio_fx16, 2 * L_FRAME48k, negate( Q_audio ) ); // Q0
- TCX_MDCT_Inverse( t_audio_fx, sub( sub( 31, Q_audio ), 15 ), wtda_audio_fx16, overlap, sub( L_frame, overlap ), overlap, st->element_mode );
-
-
- /* Window current frame */
- Word16 tcx_offset_tmp;
-
- IF( tcx_offset < 0 )
- {
- tcx_offset_tmp = negate( tcx_offset );
- }
- ELSE
- {
- tcx_offset_tmp = 0;
- move16();
- }
- tcx_windowing_synthesis_current_frame( wtda_audio_fx16, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old_fx, st->hTcxCfg->tcx_mdct_window_trans, shr( st->L_frame, 1 ), tcx_offset_tmp, st->last_core, 0, 0 );
-
-
- /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/
- Copy( wtda_audio_fx16 + sub( L_frame, nz ), st->hTcxEnc->old_out_fx, nz + overlap ); /* Q0 */
- set16_fx( st->hTcxEnc->old_out_fx + add( nz, overlap ), 0, nz );
-
- tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out_fx + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, FULL_OVERLAP );
-
- FOR( i = 0; i < nz / 2; i++ )
- {
- // This implementation is diffrent in float code need to revisit to check its correctness.
- st->hTcxEnc->old_out_fx[nz + overlap + i] = mult( wtda_audio_fx16[L_frame - 1 - i], st->hTcxCfg->tcx_aldo_window_1_trunc[i].v.re ); // Q0 + Q15 - Q15 -> Q0;
- st->hTcxEnc->old_out_fx[nz / 2 + ( nz + overlap + i )] = mult( wtda_audio_fx16[nz / 2 + ( L_frame - 1 - i )], st->hTcxCfg->tcx_aldo_window_1_trunc[nz / 2 - 1 - i].v.im ); // Q0 + Q15 - Q15 -> Q0;
- move16();
- move16();
- }
-
- Copy( wtda_audio_fx16 + sub( shr( overlap, 1 ), tcx_offset ), output_fx, st->L_frame ); /* Q0 */
- }
- ELSE
- {
- Word16 tmp_q = Q_audio;
- move16();
- Word32 ener_match_fx = SQRT2_FIXED;
- move32();
- FOR( i = 0; i < input_frame; i++ )
- {
- t_audio_fx[i] = Mpy_32_32( t_audio_fx[i], ener_match_fx ); /* Q12 - 1 -> Q11 */
- move32();
- }
-
- Q_audio = sub( Q_audio, 1 );
- scale_sig32( wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, tmp_q ) ); /* Q_audio */
- Inverse_Transform( t_audio_fx, &Q_audio, wtda_audio_fx32, is_transient, L_FRAME16k, inner_frame, st->element_mode );
-
-
- out_q = Q_audio;
- move16();
- window_ola_fx( wtda_audio_fx32, output_fx, &out_q, st->hTcxEnc->old_out_fx, &old_q, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL );
-
- Scale_sig( output_fx, L_FRAME16k, negate( out_q ) ); /* Q0 */
- Scale_sig( st->hTcxEnc->old_out_fx, L_FRAME32k, negate( old_q ) ); /* Q0 */
- st->hTcxEnc->Q_old_out = 0;
- move16();
- }
-
- IF( st->element_mode > EVS_MONO )
- {
- /* Store LB synthesis in case of switch to ACELP */
- Copy( output_fx, st->hLPDmem->old_exc, L_FRAME16k );
- st->hLPDmem->q_lpd_old_exc = 0;
- move16();
- }
- pop_wmops();
-
- return;
-}
diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c
index 6dc7bb5b95f981002a28f310591ca9e2393384cb..11583ea117ab11b8796617cda7c0c9f904d799c8 100644
--- a/lib_enc/hq_core_enc_fx.c
+++ b/lib_enc/hq_core_enc_fx.c
@@ -7,6 +7,7 @@
#include "rom_com_fx.h" /* Static table prototypes */
#include "rom_com.h" /* Static table prototypes */
//#include "prot_fx.h" /* Function prototypes */
+#include "prot.h" /* Function prototypes */
#include "prot_fx.h" /* Function prototypes */
#include "prot_fx_enc.h" /* Function prototypes */
@@ -388,3 +389,361 @@ void HQ_core_enc_init_fx(
return;
}
+
+void hq_core_enc_ivas_fx(
+ Encoder_State *st, /* i/o: encoder state structure */
+ const Word16 *audio_fx, /* i : input audio signal Q0 */
+ const Word16 input_frame_orig, /* i : frame length Q0*/
+ const Word16 hq_core_type, /* i : HQ core type Q0*/
+ const Word16 Voicing_flag, /* i : Voicing flag for FER method selection Q0*/
+ const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/
+)
+{
+ Word16 i, is_transient, num_bits, extra_unused;
+
+ Word32 t_audio_fx[L_FRAME48k_EXT];
+ Word16 wtda_audio_fx16[2 * L_FRAME48k];
+ Word32 wtda_audio_fx32[2 * L_FRAME48k];
+ Word16 two_frames_buffer[2 * L_FRAME48k];
+ Word16 tmp;
+ Word16 Aq_old_fx[M + 1];
+ Word16 output_fx[L_FRAME48k];
+ Word16 Q_audio;
+ Word16 out_q = 0, old_q = 0;
+ move16();
+ move16();
+ Word16 inner_frame, input_frame, L_frame;
+ Word16 L_spec, overlap, nz, tcx_offset;
+ Word16 left_overlap, right_overlap;
+ BSTR_ENC_HANDLE hBstr = st->hBstr;
+ Word16 q = 0;
+ Word16 exp;
+ move16();
+
+ push_wmops( "hq_core_enc" );
+
+ set16_fx( wtda_audio_fx16, 0, 2 * L_FRAME48k );
+ set32_fx( wtda_audio_fx32, 0, 2 * L_FRAME48k );
+ st->Nb_ACELP_frames = 0;
+ move16();
+ set_zero_fx( t_audio_fx, L_FRAME48k_EXT );
+ /* set input_frame length */
+ input_frame = input_frame_orig; /* Q0 */
+
+ /* Sanity check, it should never happen at the encoder side (no BFI) */
+ IF( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP )
+ {
+ st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW;
+ move16();
+ }
+ ELSE
+ {
+ st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode;
+ move16();
+ }
+ st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW;
+ move16();
+
+ /*--------------------------------------------------------------------------
+ * Preprocessing in the first HQ frame after ACELP frame
+ * Find the number of bits for PVQ coding
+ * Write signaling information
+ *--------------------------------------------------------------------------*/
+
+ num_bits = BASOP_Util_Divide3232_Scale( st->total_brate, FRAMES_PER_SEC, &exp ); /* Q15-exp */
+ num_bits = shr( num_bits, sub( 15, exp ) ); /* Q0 */
+ extra_unused = 0;
+ move16();
+
+ /*--------------------------------------------------------------------------
+ * Detect signal transition
+ *--------------------------------------------------------------------------*/
+
+ is_transient = detect_transient_fx( audio_fx, input_frame, 0, st ); /* Q0 */
+ move16();
+
+ test();
+ test();
+ IF( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) )
+ {
+ /*--------------------------------------------------------------------------
+ * IVAS switching frame
+ *--------------------------------------------------------------------------*/
+
+ L_spec = input_frame;
+ left_overlap = -1;
+ right_overlap = -1;
+ move16();
+ move16();
+ move16();
+
+ WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio_fx16, 1, 1 );
+
+ q = 0;
+ move16();
+ Q_audio = sub( Q16, q );
+ TCX_MDCT( wtda_audio_fx16, t_audio_fx, &Q_audio, left_overlap, sub( L_spec, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode );
+ Q_audio = sub( Q31, Q_audio );
+#ifdef FIX_ISSUE_1237
+ Copy_Scale_sig_16_32_no_sat( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */
+#else
+ Copy_Scale_sig_16_32_DEPREC( wtda_audio_fx16, wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, q ) ); /* Q_audio */
+#endif
+ inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */
+ L_spec = l_spec_ext_tbl[st->bwidth]; /* Q0 */
+ is_transient = 0;
+ move16();
+ move16();
+ move16();
+ }
+ ELSE
+ {
+ /*--------------------------------------------------------------------------
+ * Windowing and time-domain aliasing
+ * DCT transform
+ *--------------------------------------------------------------------------*/
+ Q_audio = 0;
+ move16();
+ Scale_sig( st->old_input_signal_fx, input_frame, negate( st->q_old_inp ) ); /* Q0 */
+ Scale_sig( st->input_fx, add( input_frame, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), negate( st->q_inp ) ); /* Q0 */
+ st->q_old_inp = 0;
+ move16();
+ st->q_inp = 0;
+ move16();
+ Copy( st->old_input_signal_fx, two_frames_buffer, input_frame ); /* Q0 */
+ Copy( audio_fx, two_frames_buffer + input_frame, input_frame ); /* Q0 */
+
+ wtda_fx( two_frames_buffer + input_frame, &Q_audio, wtda_audio_fx32, NULL, 0,
+ st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, input_frame );
+
+ test();
+ IF( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) )
+ {
+ /* Preprocessing in the first HQ frame after ACELP frame */
+ core_switching_hq_prepare_enc_fx( st, &num_bits, input_frame, wtda_audio_fx32, two_frames_buffer + input_frame );
+
+ /* During ACELP->HQ core switching, limit the HQ core bitrate to 48kbps */
+ IF( GT_16( num_bits, ACELP_48k_BITS ) )
+ {
+ extra_unused = sub( num_bits, ACELP_48k_BITS );
+ num_bits = ACELP_48k_BITS;
+ move16();
+ }
+ }
+
+ Word16 tmp_q = Q_audio;
+ move16();
+ direct_transform_fx( wtda_audio_fx32, t_audio_fx, is_transient, input_frame, &Q_audio, st->element_mode );
+ scale_sig32( wtda_audio_fx32, L_FRAME48k_EXT, sub( Q_audio, tmp_q ) ); /* Q_audio */
+
+ /* scale coefficients to their nominal level (8kHz) */
+ IF( NE_16( input_frame, NORM_MDCT_FACTOR ) )
+ {
+ UWord16 lsb;
+ tmp = mult_r( input_frame, 410 / 2 ); /* 1/8000 in Q15 */
+ Word16 ener_match_fx = hq_nominal_scaling[tmp];
+ move16();
+ FOR( i = 0; i < input_frame; i++ )
+ {
+ /*t_audio_q[i] *= ener_match; */
+ Mpy_32_16_ss( t_audio_fx[i], ener_match_fx, &t_audio_fx[i], &lsb ); /* Q12 */
+ move16();
+ }
+ }
+
+ /* limit encoded band-width according to the command-line OR BWD limitation */
+ inner_frame = inner_frame_tbl[st->bwidth]; /* Q0 */
+ L_spec = l_spec_tbl[st->bwidth]; /* Q0 */
+
+ move16();
+ move16();
+
+
+ IF( GT_16( input_frame, inner_frame ) )
+ {
+ IF( EQ_16( is_transient, 1 ) )
+ {
+ FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
+ {
+ tmp = shr( inner_frame, 2 );
+ Copy32( t_audio_fx + i_mult2( i, shr( input_frame, 2 ) ), t_audio_fx + i_mult2( i, tmp ), tmp ); /* Q_audio */
+ }
+ }
+
+ set32_fx( t_audio_fx + inner_frame, 0, sub( input_frame, inner_frame ) );
+ }
+ }
+
+
+ /* subtract signaling bits */
+ num_bits = sub( num_bits, hBstr->nb_bits_tot ); /* Q0 */
+
+ /*--------------------------------------------------------------------------
+ * High-band gain control in case of BWS
+ *--------------------------------------------------------------------------*/
+
+ IF( st->bwidth_sw_cnt > 0 )
+ {
+ Word32 L_tmp;
+ tmp = BASOP_Util_Divide1616_Scale( 3, BWS_TRAN_PERIOD, &exp ); /* Q15-exp */
+ shr( tmp, exp );
+ L_tmp = L_deposit_h( tmp ); /* Q31-exp */
+ IF( is_transient )
+ {
+ FOR( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
+ {
+ v_multc_fixed( t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), L_tmp, t_audio_fx + add( i_mult2( i, shr( inner_frame, 2 ) ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ), sub( shr( inner_frame, 2 ), L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ) ); // Q_audio + Q31 - Q31 -> Q_audio
+ }
+ }
+ ELSE
+ {
+ v_multc_fixed( t_audio_fx + L_FRAME16k, L_tmp, t_audio_fx + L_FRAME16k, L_spec - L_FRAME16k ); // Q_audio + Q31 - Q31 -> Q_audio
+ }
+ }
+
+ /*--------------------------------------------------------------------------
+ * Classify whether to put extra bits for FER mitigation
+ *--------------------------------------------------------------------------*/
+
+ test();
+ test();
+ test();
+ IF( ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, HQ_CORE ) ) && GT_32( st->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) )
+ {
+ IF( Voicing_flag > 0 )
+ {
+ push_indice( hBstr, IND_HQ_VOICING_FLAG, 1, 1 );
+ num_bits = sub( num_bits, 1 );
+ }
+ ELSE
+ {
+ push_indice( hBstr, IND_HQ_VOICING_FLAG, 0, 1 );
+ num_bits = sub( num_bits, 1 );
+ }
+ }
+
+ /*--------------------------------------------------------------------------
+ * Transform-domain encoding
+ *--------------------------------------------------------------------------*/
+
+ scale_sig32( t_audio_fx, L_FRAME48k_EXT, sub( Q12, Q_audio ) );
+ scale_sig32( wtda_audio_fx32, 2 * L_FRAME48k, sub( Q12, Q_audio ) );
+ Q_audio = 12;
+ move16();
+ IF( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) )
+ {
+
+ hq_lr_enc_ivas_fx( st, t_audio_fx, inner_frame, &num_bits, is_transient );
+ }
+ ELSE
+ {
+ /* HQ high rate encoder */
+ hq_hr_enc_ivas_fx( st, t_audio_fx, L_spec, &num_bits, is_transient, vad_hover_flag );
+ }
+
+ /* write all unused bits to the bitstream */
+ num_bits = add( num_bits, extra_unused );
+
+ WHILE( GT_16( num_bits, 16 ) )
+ {
+ push_indice( hBstr, IND_UNUSED, 0, 16 );
+ num_bits = sub( num_bits, 16 );
+ }
+
+ IF( num_bits != 0 )
+ {
+ push_indice( hBstr, IND_UNUSED, 0, num_bits );
+ }
+
+ test();
+ test();
+ IF( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) )
+ {
+ overlap = st->hTcxCfg->tcx_mdct_window_length; /* Q0 */
+ move16();
+
+ nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS );
+ move16();
+ L_frame = sub( st->L_frame + st->hTcxCfg->tcx_offset, st->hTcxCfg->lfacNext );
+ tcx_offset = st->hTcxCfg->lfacNext;
+ move16();
+
+ set16_fx( Aq_old_fx, 0, M + 1 ); /* Dummy filter */
+ Aq_old_fx[0] = 1;
+ move16();
+
+ /* Code taken from InternalTCXDecoder() */
+ Copy_Scale_sig_32_16( wtda_audio_fx32, wtda_audio_fx16, 2 * L_FRAME48k, negate( Q_audio ) ); // Q0
+ TCX_MDCT_Inverse( t_audio_fx, sub( sub( 31, Q_audio ), 15 ), wtda_audio_fx16, overlap, sub( L_frame, overlap ), overlap, st->element_mode );
+
+
+ /* Window current frame */
+ Word16 tcx_offset_tmp;
+
+ IF( tcx_offset < 0 )
+ {
+ tcx_offset_tmp = negate( tcx_offset );
+ }
+ ELSE
+ {
+ tcx_offset_tmp = 0;
+ move16();
+ }
+ tcx_windowing_synthesis_current_frame( wtda_audio_fx16, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old_fx, st->hTcxCfg->tcx_mdct_window_trans, shr( st->L_frame, 1 ), tcx_offset_tmp, st->last_core, 0, 0 );
+
+
+ /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/
+ Copy( wtda_audio_fx16 + sub( L_frame, nz ), st->hTcxEnc->old_out_fx, nz + overlap ); /* Q0 */
+ set16_fx( st->hTcxEnc->old_out_fx + add( nz, overlap ), 0, nz );
+
+ tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out_fx + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, FULL_OVERLAP );
+
+ FOR( i = 0; i < nz / 2; i++ )
+ {
+ // This implementation is diffrent in float code need to revisit to check its correctness.
+ st->hTcxEnc->old_out_fx[nz + overlap + i] = mult( wtda_audio_fx16[L_frame - 1 - i], st->hTcxCfg->tcx_aldo_window_1_trunc[i].v.re ); // Q0 + Q15 - Q15 -> Q0;
+ st->hTcxEnc->old_out_fx[nz / 2 + ( nz + overlap + i )] = mult( wtda_audio_fx16[nz / 2 + ( L_frame - 1 - i )], st->hTcxCfg->tcx_aldo_window_1_trunc[nz / 2 - 1 - i].v.im ); // Q0 + Q15 - Q15 -> Q0;
+ move16();
+ move16();
+ }
+
+ Copy( wtda_audio_fx16 + sub( shr( overlap, 1 ), tcx_offset ), output_fx, st->L_frame ); /* Q0 */
+ }
+ ELSE
+ {
+ Word16 tmp_q = Q_audio;
+ move16();
+ Word32 ener_match_fx = SQRT2_FIXED;
+ move32();
+ FOR( i = 0; i < input_frame; i++ )
+ {
+ t_audio_fx[i] = Mpy_32_32( t_audio_fx[i], ener_match_fx ); /* Q12 - 1 -> Q11 */
+ move32();
+ }
+
+ Q_audio = sub( Q_audio, 1 );
+ scale_sig32( wtda_audio_fx32, 2 * L_FRAME48k, sub( Q_audio, tmp_q ) ); /* Q_audio */
+ Inverse_Transform( t_audio_fx, &Q_audio, wtda_audio_fx32, is_transient, L_FRAME16k, inner_frame, st->element_mode );
+
+
+ out_q = Q_audio;
+ move16();
+ window_ola_fx( wtda_audio_fx32, output_fx, &out_q, st->hTcxEnc->old_out_fx, &old_q, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL );
+
+ Scale_sig( output_fx, L_FRAME16k, negate( out_q ) ); /* Q0 */
+ Scale_sig( st->hTcxEnc->old_out_fx, L_FRAME32k, negate( old_q ) ); /* Q0 */
+ st->hTcxEnc->Q_old_out = 0;
+ move16();
+ }
+
+ IF( st->element_mode > EVS_MONO )
+ {
+ /* Store LB synthesis in case of switch to ACELP */
+ Copy( output_fx, st->hLPDmem->old_exc, L_FRAME16k );
+ st->hLPDmem->q_lpd_old_exc = 0;
+ move16();
+ }
+ pop_wmops();
+
+ return;
+}
diff --git a/lib_enc/hq_env_enc.c b/lib_enc/hq_env_enc.c
deleted file mode 100644
index e8859676cedf5e4a5fd56b3a2bd2e0c0846d4d36..0000000000000000000000000000000000000000
--- a/lib_enc/hq_env_enc.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/hq_hr_enc.c b/lib_enc/hq_hr_enc.c
deleted file mode 100644
index 42f661f6e43b62aeab28d104ac985e1657671549..0000000000000000000000000000000000000000
--- a/lib_enc/hq_hr_enc.c
+++ /dev/null
@@ -1,280 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "prot_fx.h"
-#include "ivas_prot_fx.h"
-#include "prot_fx_enc.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-/*--------------------------------------------------------------------------*
- * hq_hr_enc()
- *
- * HQ high rate encoding routine
- *--------------------------------------------------------------------------*/
-
-void hq_hr_enc_ivas_fx(
- Encoder_State *st, /* i/o: encoder state structure */
- Word32 *t_audio_fx, /* i/o: transform-domain coefficients Q12*/
- const Word16 length, /* i : length of spectrum Q0*/
- Word16 *num_bits, /* i/o: number of available bits Q0*/
- const Word16 is_transient, /* i : transient flag Q0*/
- const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/
-)
-{
- Word16 nb_sfm;
- Word16 sum, hcode_l;
- Word16 difidx[NB_SFM];
- Word16 normqlg2[NB_SFM], ynrm[NB_SFM];
- Word16 nf_idx;
- Word16 bits;
- Word16 LCmode;
- Word16 shape_bits, num_sfm, numnrmibits;
- Word16 hqswb_clas;
- Word16 num_env_bands;
- Word16 Npeaks, start_norm;
- Word16 difidx_org[NB_SFM];
- Word16 R[NB_SFM];
- Word16 peaks[HVQ_MAX_PEAKS];
- Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
- Word16 npulses[NB_SFM], maxpulse[NB_SFM];
- Word16 Rsubband[NB_SFM]; /* Q3 */
- Word32 t_audio_q_fx[L_SPEC48k_EXT];
- Word16 noise_level_fx[HVQ_BWE_NOISE_BANDS];
- Word16 hq_generic_offset;
- Word16 hq_generic_exc_clas = 0;
- move16();
- Word16 core_sfm;
- Word16 har_freq_est1 = 0, har_freq_est2 = 0;
- move16();
- move16();
- Word16 flag_dis = 1;
- move16();
- const Word16 *subband_search_offset;
- Word16 wBands[2];
- Word16 b_delta_env;
- HQ_ENC_HANDLE hHQ_core = st->hHQ_core;
- BSTR_ENC_HANDLE hBstr = st->hBstr;
- Word16 att_fx;
- Word16 t_audio_norm[L_FRAME48k_EXT];
- Word16 t_audio_q_norm[L_FRAME48k_EXT];
- Word32 nf_gains_fx[HVQ_NF_GROUPS], pe_gains_fx[HVQ_NF_GROUPS];
- Word16 hq_generic_fenv_fx[HQ_FB_FENV];
- /*------------------------------------------------------------------*
- * Initializations
- *------------------------------------------------------------------*/
-
- Npeaks = 0;
- move16();
- set16_fx( npulses, 0, NB_SFM );
- set16_fx( maxpulse, 0, NB_SFM );
- set16_fx( difidx_org, 0, NB_SFM );
- set32_fx( t_audio_q_fx, 0, L_FRAME48k );
- set32_fx( nf_gains_fx, 0, HVQ_NF_GROUPS );
- set32_fx( pe_gains_fx, 0, HVQ_NF_GROUPS );
- /*------------------------------------------------------------------*
- * Classification
- *------------------------------------------------------------------*/
- bits = hq_classifier_enc_ivas_fx( st, length, t_audio_fx, is_transient, &Npeaks, peaks, pe_gains_fx, nf_gains_fx, &hqswb_clas ); /* Q0 */
- *num_bits = sub( *num_bits, bits );
- move16();
-
- /*------------------------------------------------------------------*
- * Set quantization parameters
- *------------------------------------------------------------------*/
-
- hq_configure_fx( length, hqswb_clas, st->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
-
- /*------------------------------------------------------------------*
- * Transient frame handling
- *------------------------------------------------------------------*/
- /* Interleave MLT coefficients of 4 sub-vectors in case of transient frame */
- IF( is_transient )
- {
- interleave_spectrum_ivas_fx( t_audio_fx, length );
- }
- test();
- IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
- {
- calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag );
- v_multc_att32( t_audio_fx, att_fx, t_audio_fx, sfm_end[( num_sfm - 1 )] ); /* Q12 */
- }
-
- /*------------------------------------------------------------------*
- * Scalar quantization of norms
- * Encode norm indices
- *------------------------------------------------------------------*/
-
- /* calculate and quantize norms */
- calc_norm_ivas_fx( t_audio_fx, ynrm, normqlg2, start_norm, num_env_bands, sfmsize, sfm_start );
- /* create differential code of quantized norm indices */
- diff_envelope_coding_fx( is_transient, num_env_bands, start_norm, ynrm, normqlg2, difidx );
-
- /* Find norm coding mode and calculate number of bits */
- hcode_l = encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 0, NORMAL_HQ_CORE, is_transient ); /* Q0 */
-
- *num_bits = sub( *num_bits, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );
- move16();
- /* Encode norm indices */
- encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 1, NORMAL_HQ_CORE, is_transient );
-
- /*------------------------------------------------------------------*
- * HQ GENERIC BWE encoding
- *------------------------------------------------------------------*/
-
- test();
- IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
- {
- hq_generic_hf_encoding_fx( t_audio_fx, hq_generic_fenv_fx, hq_generic_offset, st, &hq_generic_exc_clas, length );
-
- IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
- {
- *num_bits = add( *num_bits, 1 ); /* conditional 1 bit saving for representing FD3 BWE excitation class */
- move16();
- }
- map_hq_generic_fenv_norm_fx( hqswb_clas, hq_generic_fenv_fx, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
- }
-
- /*------------------------------------------------------------------*
- * Bit allocation
- *------------------------------------------------------------------*/
-
- ivas_hq_bit_allocation_fx( st->core_brate, length, hqswb_clas, num_bits, normqlg2, nb_sfm, sfmsize, noise_level_fx, R, Rsubband, &sum, &core_sfm, num_env_bands );
-
- /*------------------------------------------------------------------*
- * Normalize coefficients with quantized norms
- *------------------------------------------------------------------*/
- IF( NE_16( hqswb_clas, HQ_HVQ ) )
- {
- test();
- IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
- {
- b_delta_env = calc_nor_delta_hf_ivas_fx( hBstr, t_audio_fx, ynrm, Rsubband, num_env_bands, nb_sfm, sfmsize, sfm_start, core_sfm ); /* Q0 */
- sum = sub( sum, b_delta_env );
- }
- normalizecoefs_fx( t_audio_fx, ynrm, nb_sfm, sfm_start, sfm_end, t_audio_norm );
- }
- Word16 Q_audio = 12, Q_shift;
- move16();
- /*------------------------------------------------------------------*
- * Quantize/code spectral fine structure using PVQ or HVQ
- *------------------------------------------------------------------*/
- IF( EQ_16( hqswb_clas, HQ_HVQ ) )
- {
- sum = hvq_enc_ivas_fx( st, st->core_brate, *num_bits, Npeaks, ynrm, R, peaks, nf_gains_fx, noise_level_fx, pe_gains_fx, t_audio_fx, t_audio_q_fx );
- *num_bits = sub( *num_bits, sum );
- move16();
- }
- ELSE
- {
- shape_bits = pvq_core_enc_ivas_fx( hBstr, t_audio_norm, t_audio_q_norm, &Q_audio, sum, nb_sfm, sfm_start, sfm_end, sfmsize, Rsubband, R, npulses, maxpulse, HQ_CORE ); /* Q0 */
- *num_bits = add( *num_bits, sub( sum, shape_bits ) );
- move16();
- }
-
- test();
- IF( EQ_16( hqswb_clas, HQ_HVQ ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
- {
- subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
- wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
- wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
- move16();
- move16();
- IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
- {
- Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
- FOR( Word16 i = 0; i < 300; i++ )
- {
- t_audio_q_fx[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
- move32();
- }
- }
- har_est_fx( t_audio_q_fx, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
-
- hHQ_core->prev_frm_hfe2 = har_freq_est2;
- move16();
- }
-
- /* reset LR-HQ memories */
- hHQ_core->prev_frm_hfe2 = 0; /*reset*/
- hHQ_core->prev_stab_hfe2 = 0;
- move16();
- move16();
- nf_idx = 0;
- move16();
- test();
- test();
- test();
- IF( NE_16( is_transient, 1 ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st->core_brate, HQ_32k ) ) )
- {
- test();
- IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
- {
- nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */
- push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
- }
- ELSE
- {
- nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */
- push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
- }
- }
-
-
- /* updates */
- hHQ_core->prev_hqswb_clas = hqswb_clas; /* Q0 */
- move16();
- /* Prepare synthesis for LB generation in case of switch to ACELP */
- IF( NE_16( hqswb_clas, HQ_HVQ ) )
- {
- apply_envelope_enc_ivas_fx( t_audio_q_norm, ynrm, num_sfm, sfm_start, sfm_end, t_audio_q_fx );
- scale_sig32( t_audio_q_fx, length, sub( Q12, Q_audio ) ); // Q12
- }
-
- IF( is_transient )
- {
- ivas_de_interleave_spectrum_fx( t_audio_q_fx, length );
- }
-
- MVR2R_WORD32( t_audio_q_fx, t_audio_fx, length );
-
- return;
-}
diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c
index f73a926dc5177ed57cbbcfaeeec3c93b77eb3512..4d4742cc167daaad8a0ddee080a7f1c3934e7616 100644
--- a/lib_enc/hq_hr_enc_fx.c
+++ b/lib_enc/hq_hr_enc_fx.c
@@ -5,9 +5,11 @@
#include "options.h" /* Compilation switches */
#include "cnst.h" /* Common constants */
//#include "prot_fx.h" /* Function prototypes */
-#include "rom_com_fx.h" /* Static table prototypes */
-#include "rom_com.h" /* Static table prototypes */
-#include "prot_fx.h" /* Function prototypes */
+#include "rom_com_fx.h" /* Static table prototypes */
+#include "rom_com.h" /* Static table prototypes */
+#include "prot.h" /* Function prototypes */
+#include "prot_fx.h" /* Function prototypes */
+#include "ivas_prot_fx.h"
#include "prot_fx_enc.h" /* Function prototypes */
/*--------------------------------------------------------------------------*
* hq_hr_enc_fx()
@@ -264,3 +266,231 @@ void hq_hr_enc_fx(
return;
}
+
+void hq_hr_enc_ivas_fx(
+ Encoder_State *st, /* i/o: encoder state structure */
+ Word32 *t_audio_fx, /* i/o: transform-domain coefficients Q12*/
+ const Word16 length, /* i : length of spectrum Q0*/
+ Word16 *num_bits, /* i/o: number of available bits Q0*/
+ const Word16 is_transient, /* i : transient flag Q0*/
+ const Word16 vad_hover_flag /* i : VAD hangover flag Q0*/
+)
+{
+ Word16 nb_sfm;
+ Word16 sum, hcode_l;
+ Word16 difidx[NB_SFM];
+ Word16 normqlg2[NB_SFM], ynrm[NB_SFM];
+ Word16 nf_idx;
+ Word16 bits;
+ Word16 LCmode;
+ Word16 shape_bits, num_sfm, numnrmibits;
+ Word16 hqswb_clas;
+ Word16 num_env_bands;
+ Word16 Npeaks, start_norm;
+ Word16 difidx_org[NB_SFM];
+ Word16 R[NB_SFM];
+ Word16 peaks[HVQ_MAX_PEAKS];
+ Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
+ Word16 npulses[NB_SFM], maxpulse[NB_SFM];
+ Word16 Rsubband[NB_SFM]; /* Q3 */
+ Word32 t_audio_q_fx[L_SPEC48k_EXT];
+ Word16 noise_level_fx[HVQ_BWE_NOISE_BANDS];
+ Word16 hq_generic_offset;
+ Word16 hq_generic_exc_clas = 0;
+ move16();
+ Word16 core_sfm;
+ Word16 har_freq_est1 = 0, har_freq_est2 = 0;
+ move16();
+ move16();
+ Word16 flag_dis = 1;
+ move16();
+ const Word16 *subband_search_offset;
+ Word16 wBands[2];
+ Word16 b_delta_env;
+ HQ_ENC_HANDLE hHQ_core = st->hHQ_core;
+ BSTR_ENC_HANDLE hBstr = st->hBstr;
+ Word16 att_fx;
+ Word16 t_audio_norm[L_FRAME48k_EXT];
+ Word16 t_audio_q_norm[L_FRAME48k_EXT];
+ Word32 nf_gains_fx[HVQ_NF_GROUPS], pe_gains_fx[HVQ_NF_GROUPS];
+ Word16 hq_generic_fenv_fx[HQ_FB_FENV];
+ /*------------------------------------------------------------------*
+ * Initializations
+ *------------------------------------------------------------------*/
+
+ Npeaks = 0;
+ move16();
+ set16_fx( npulses, 0, NB_SFM );
+ set16_fx( maxpulse, 0, NB_SFM );
+ set16_fx( difidx_org, 0, NB_SFM );
+ set32_fx( t_audio_q_fx, 0, L_FRAME48k );
+ set32_fx( nf_gains_fx, 0, HVQ_NF_GROUPS );
+ set32_fx( pe_gains_fx, 0, HVQ_NF_GROUPS );
+ /*------------------------------------------------------------------*
+ * Classification
+ *------------------------------------------------------------------*/
+ bits = hq_classifier_enc_ivas_fx( st, length, t_audio_fx, is_transient, &Npeaks, peaks, pe_gains_fx, nf_gains_fx, &hqswb_clas ); /* Q0 */
+ *num_bits = sub( *num_bits, bits );
+ move16();
+
+ /*------------------------------------------------------------------*
+ * Set quantization parameters
+ *------------------------------------------------------------------*/
+
+ hq_configure_fx( length, hqswb_clas, st->core_brate, &num_sfm, &nb_sfm, &start_norm, &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
+
+ /*------------------------------------------------------------------*
+ * Transient frame handling
+ *------------------------------------------------------------------*/
+ /* Interleave MLT coefficients of 4 sub-vectors in case of transient frame */
+ IF( is_transient )
+ {
+ interleave_spectrum_ivas_fx( t_audio_fx, length );
+ }
+ test();
+ IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
+ {
+ calculate_hangover_attenuation_gain_ivas_fx( st, &att_fx, vad_hover_flag );
+ v_multc_att32( t_audio_fx, att_fx, t_audio_fx, sfm_end[( num_sfm - 1 )] ); /* Q12 */
+ }
+
+ /*------------------------------------------------------------------*
+ * Scalar quantization of norms
+ * Encode norm indices
+ *------------------------------------------------------------------*/
+
+ /* calculate and quantize norms */
+ calc_norm_ivas_fx( t_audio_fx, ynrm, normqlg2, start_norm, num_env_bands, sfmsize, sfm_start );
+ /* create differential code of quantized norm indices */
+ diff_envelope_coding_fx( is_transient, num_env_bands, start_norm, ynrm, normqlg2, difidx );
+
+ /* Find norm coding mode and calculate number of bits */
+ hcode_l = encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 0, NORMAL_HQ_CORE, is_transient ); /* Q0 */
+
+ *num_bits = sub( *num_bits, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );
+ move16();
+ /* Encode norm indices */
+ encode_envelope_indices_ivas_fx( hBstr, num_env_bands, numnrmibits, difidx, &LCmode, 1, NORMAL_HQ_CORE, is_transient );
+
+ /*------------------------------------------------------------------*
+ * HQ GENERIC BWE encoding
+ *------------------------------------------------------------------*/
+
+ test();
+ IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
+ {
+ hq_generic_hf_encoding_fx( t_audio_fx, hq_generic_fenv_fx, hq_generic_offset, st, &hq_generic_exc_clas, length );
+
+ IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
+ {
+ *num_bits = add( *num_bits, 1 ); /* conditional 1 bit saving for representing FD3 BWE excitation class */
+ move16();
+ }
+ map_hq_generic_fenv_norm_fx( hqswb_clas, hq_generic_fenv_fx, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
+ }
+
+ /*------------------------------------------------------------------*
+ * Bit allocation
+ *------------------------------------------------------------------*/
+
+ ivas_hq_bit_allocation_fx( st->core_brate, length, hqswb_clas, num_bits, normqlg2, nb_sfm, sfmsize, noise_level_fx, R, Rsubband, &sum, &core_sfm, num_env_bands );
+
+ /*------------------------------------------------------------------*
+ * Normalize coefficients with quantized norms
+ *------------------------------------------------------------------*/
+ IF( NE_16( hqswb_clas, HQ_HVQ ) )
+ {
+ test();
+ IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
+ {
+ b_delta_env = calc_nor_delta_hf_ivas_fx( hBstr, t_audio_fx, ynrm, Rsubband, num_env_bands, nb_sfm, sfmsize, sfm_start, core_sfm ); /* Q0 */
+ sum = sub( sum, b_delta_env );
+ }
+ normalizecoefs_fx( t_audio_fx, ynrm, nb_sfm, sfm_start, sfm_end, t_audio_norm );
+ }
+ Word16 Q_audio = 12, Q_shift;
+ move16();
+ /*------------------------------------------------------------------*
+ * Quantize/code spectral fine structure using PVQ or HVQ
+ *------------------------------------------------------------------*/
+ IF( EQ_16( hqswb_clas, HQ_HVQ ) )
+ {
+ sum = hvq_enc_ivas_fx( st, st->core_brate, *num_bits, Npeaks, ynrm, R, peaks, nf_gains_fx, noise_level_fx, pe_gains_fx, t_audio_fx, t_audio_q_fx );
+ *num_bits = sub( *num_bits, sum );
+ move16();
+ }
+ ELSE
+ {
+ shape_bits = pvq_core_enc_ivas_fx( hBstr, t_audio_norm, t_audio_q_norm, &Q_audio, sum, nb_sfm, sfm_start, sfm_end, sfmsize, Rsubband, R, npulses, maxpulse, HQ_CORE ); /* Q0 */
+ *num_bits = add( *num_bits, sub( sum, shape_bits ) );
+ move16();
+ }
+
+ test();
+ IF( EQ_16( hqswb_clas, HQ_HVQ ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
+ {
+ subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
+ wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR; /* Q0 */
+ wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
+ move16();
+ move16();
+ IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
+ {
+ Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
+ FOR( Word16 i = 0; i < 300; i++ )
+ {
+ t_audio_q_fx[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
+ move32();
+ }
+ }
+ har_est_fx( t_audio_q_fx, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
+
+ hHQ_core->prev_frm_hfe2 = har_freq_est2;
+ move16();
+ }
+
+ /* reset LR-HQ memories */
+ hHQ_core->prev_frm_hfe2 = 0; /*reset*/
+ hHQ_core->prev_stab_hfe2 = 0;
+ move16();
+ move16();
+ nf_idx = 0;
+ move16();
+ test();
+ test();
+ test();
+ IF( NE_16( is_transient, 1 ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st->core_brate, HQ_32k ) ) )
+ {
+ test();
+ IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
+ {
+ nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */
+ push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
+ }
+ ELSE
+ {
+ nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */
+ push_indice( hBstr, IND_NF_IDX, nf_idx, 2 );
+ }
+ }
+
+
+ /* updates */
+ hHQ_core->prev_hqswb_clas = hqswb_clas; /* Q0 */
+ move16();
+ /* Prepare synthesis for LB generation in case of switch to ACELP */
+ IF( NE_16( hqswb_clas, HQ_HVQ ) )
+ {
+ apply_envelope_enc_ivas_fx( t_audio_q_norm, ynrm, num_sfm, sfm_start, sfm_end, t_audio_q_fx );
+ scale_sig32( t_audio_q_fx, length, sub( Q12, Q_audio ) ); // Q12
+ }
+
+ IF( is_transient )
+ {
+ ivas_de_interleave_spectrum_fx( t_audio_q_fx, length );
+ }
+
+ MVR2R_WORD32( t_audio_q_fx, t_audio_fx, length );
+
+ return;
+}
diff --git a/lib_enc/hq_lr_enc.c b/lib_enc/hq_lr_enc.c
deleted file mode 100644
index d0941db74b9b897cf7a495cf2ff6be93cfe03b9a..0000000000000000000000000000000000000000
--- a/lib_enc/hq_lr_enc.c
+++ /dev/null
@@ -1,46 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "stl.h"
-#include "basop_util.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/hvq_enc.c b/lib_enc/hvq_enc.c
deleted file mode 100644
index adf7751a1b5347c65c7374476238c351033e19bd..0000000000000000000000000000000000000000
--- a/lib_enc/hvq_enc.c
+++ /dev/null
@@ -1,44 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c
deleted file mode 100644
index 1d4964ab8d01e63bc80e2d0bd295c8a6f17d8040..0000000000000000000000000000000000000000
--- a/lib_enc/init_enc.c
+++ /dev/null
@@ -1,1215 +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 "options.h"
-#include "cnst.h"
-#include "rom_com.h"
-#include "rom_enc.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "prot_fx.h"
-#include "ivas_cnst.h"
-#include "wmc_auto.h"
-#include "ivas_prot_fx.h"
-#include "prot_fx_enc.h"
-ivas_error init_encoder_ivas_fx(
- Encoder_State *st, /* i/o: state structure */
- Encoder_Struct *st_ivas, /* i/o: encoder state structure */
- const Word16 idchan, /* i : channel ID */
- const Word16 var_SID_rate_flag, /* i : flag for variable SID update rate */
- const Word16 interval_SID, /* i : interval for SID update */
- const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */
- const ISM_MODE ism_mode, /* i : ISM mode */
- const Word32 element_brate /* i : element bitrate */
-)
-{
- Word16 i;
- ivas_error error;
- Word32 igf_brate;
-
- error = IVAS_ERR_OK;
- move32();
-
- /*-----------------------------------------------------------------*
- * General parameters
- *-----------------------------------------------------------------*/
-
- IF( st->Opt_AMR_WB )
- {
- st->last_core = AMR_WB_CORE;
- }
- ELSE
- {
- st->last_core = -1;
- }
- move16();
-
- st->L_frame = L_FRAME;
- move16();
- st->last_coder_type = GENERIC;
- move16();
- st->coder_type = GENERIC;
- move16();
- st->last_total_brate = st->total_brate;
- move32();
- st->last_bits_frame_nominal = -1;
- move16();
- st->last_total_brate_cng = -1;
- move16();
- st->last_core_brate = st->total_brate;
- move32();
- st->dtx_sce_sba = 0;
- move16();
- st->extl = -1;
- move16();
- st->last_extl = -1;
- move16();
- st->last_L_frame = L_FRAME;
- move16();
- st->rate_switching_reset = 0;
- move16();
- st->rate_switching_reset_16kHz = 0;
- move16();
- st->clas = UNVOICED_CLAS;
- move16();
- st->low_rate_mode = 0;
- move16();
- st->ini_frame = 0;
- move16();
- st->inactive_coder_type_flag = 0;
- move16();
- st->sba_br_sw_while_no_data = 0;
- move16();
-
- st->coder_type_raw = VOICED;
- move16();
- st->last_coder_type_raw = st->coder_type_raw;
- move16();
-
- st->flag_ACELP16k = set_ACELP_flag_IVAS( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 );
- move16();
-
- st->is_ism_format = 0;
- move16();
-
- IF( NE_16( ism_mode, ISM_MODE_NONE ) )
- {
- st->is_ism_format = 1;
- move16();
- }
-
- /*-----------------------------------------------------------------*
- * Bitstream
- *-----------------------------------------------------------------*/
-
- IF( !vad_only_flag )
- {
- IF( ( st->hBstr = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) );
- }
-
- /* set pointer to the buffer of indices */
- st->hBstr->ind_list = st_ivas->ind_list;
- st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list;
- st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices;
- st->hBstr->nb_ind_tot = 0;
- move16();
- st->hBstr->nb_bits_tot = 0;
- move16();
- st->hBstr->st_ivas = st_ivas;
- }
- ELSE
- {
- st->hBstr = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * Pre-processing and ACELP core parameters
- *-----------------------------------------------------------------*/
-
- Copy( GEWB_Ave_fx, st->mem_AR_fx, M );
- Copy( GEWB_Ave_fx, st->lsfoldbfi0_fx, M );
- Copy( GEWB_Ave_fx, st->lsfoldbfi1_fx, M );
- Copy( GEWB_Ave_fx, st->lsf_adaptive_mean_fx, M );
-
- st->next_force_safety_net = 0;
- move16();
-
- st->pstreaklen = 0;
- move16();
- st->streaklimit_fx = MAX_WORD16;
- move16();
- set16_fx( st->mem_MA_fx, 0, M );
-
- init_gp_clip_fx( st->clip_var_fx );
- pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx );
- set16_fx( st->old_wsp_fx, 0, L_WSP_MEM );
- st->exp_old_wsp = 0;
- move16();
- set16_fx( st->old_wsp2_fx, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); // Needs to change depending on usage.
- st->Q_old_wsp2 = 0;
- move16();
-
- st->mem_preemph_fx = 0;
- move16();
- st->mem_preemph16k_fx = 0;
- move16();
- st->mem_preemph_enc = 0;
- move16();
- st->exp_mem_preemph_enc = 0;
- move16();
-
-#if 1 // TODO: Float Initializations. To be removed later
- st->active_cnt = 0;
- move16();
-#endif
-
- st->pst_mem_deemp_err_fx = 0;
- move16();
- st->pst_lp_ener_fx = 0;
- move16();
-
- /* AVQ pre-quantizer memory */
- st->mem_preemp_preQ_fx = 0;
- move16();
- st->mem_deemp_preQ_fx = 0;
- move16();
- st->last_nq_preQ = 0;
- move16();
- st->last_code_preq = 0;
- move16();
- st->use_acelp_preq = 0;
- move16();
- st->last_harm_flag_acelp = 0;
- move16();
-
- /* (Decimated) Weighted Speech Memory */
- st->mem_wsp_enc = 0;
- move16();
- st->mem_wsp_fx = 0;
- move16();
- st->mem_wsp_q = 0;
- move16();
- set16_fx( st->mem_decim2_fx, 0, 3 );
- set32_fx( st->Bin_E_fx, 0, L_FFT );
- st->q_Bin_E = Q31;
- move16();
- st->ee_old_fx = 640; /* 10.0f in Q6 */
- move16();
- st->Nb_ACELP_frames = 0;
- move16();
- st->audio_frame_cnt = AUDIO_COUNTER_INI; /* Initialization of the audio frame counter mildly into the audio mode */
- move16();
-
- /* adaptive lag window memory */
- st->old_pitch_la = 0;
- move16();
-
- st->prev_Q_new = 0;
- move16();
-
- IF( EQ_32( st->input_Fs, 8000 ) )
- {
- st->min_band = 1;
- move16();
- st->max_band = 16;
- move16();
- }
- ELSE
- {
- st->min_band = 0;
- move16();
- st->max_band = 19;
- move16();
- }
-
- IF( st->Opt_AMR_WB )
- {
- Copy( mean_isf_amr_wb_fx, st->lsf_old_fx, M );
- E_LPC_isf_isp_conversion( st->lsf_old_fx, st->lsp_old1_fx, M );
- }
- ELSE
- {
- Copy( GEWB_Ave_fx, st->lsf_old_fx, M );
- lsf2lsp_fx( st->lsf_old_fx, st->lsp_old1_fx, M, INT_FS_12k8 );
- }
-
- Copy( st->lsf_old_fx, st->lsf_old1_fx, M );
- Copy( st->lsp_old1_fx, st->lsp_old_fx, M );
- Copy( st->lsp_old_fx, st->lsp_old16k_fx, M );
- Copy( st->lsp_old_fx, st->lspold_enc_fx, M );
-
- st->stab_fac_fx = 0;
- move16();
-
- /* Bass post-filter memories - encoder side of MODE2 */
- st->bpf_off = 0;
- move16();
- st->pst_mem_deemp_err_fx = 0;
- move16();
- st->pst_lp_ener_fx = 0;
- move16();
-
- /* TC coder type */
- st->tc_cnt = 0;
- move16();
-
- /* find_uv() parameters */
- st->old_dE1_fx = 0;
- move16();
- st->old_ind_deltaMax = 0;
- move16();
- set32_fx( st->old_enr_ssf_fx, 0, shl( NB_SSF, 1 ) );
- st->spike_hyst = -1;
- move16();
-
- /* stereo switching memories */
- st->mem_preemph_DFT_fx = 0;
- move16();
- set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) );
- st->mem_preemph16k_DFT_fx = 0;
- move16();
- set16_fx( st->inp_16k_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_16k, L_MEM_RECALC_16K ), L_FILT16k ) );
-
- st->sharpFlag = 0;
- move16();
-
- /* Stationary noise UV modification */
- st->ge_sm_fx = L_deposit_l( 640 ); /*Q(GE_SHIFT)*/
- move16();
- st->uv_count = 0;
- move16();
- st->act_count = 3;
- move16();
- Copy( st->lsp_old_fx, st->lspold_s_fx, M );
- st->noimix_seed = RANDOM_INITSEED;
- move16();
- st->min_alpha_fx = 32767;
- move16();
- st->exc_pe_fx = 0;
- move16();
- st->Q_stat_noise = 15;
- move16();
- /* FEC */
- st->last_clas = UNVOICED_CLAS;
- move16();
- st->prev_fmerit = 0;
- move16();
- st->fmerit_dt = 0;
- move16();
- st->Last_pulse_pos = 0;
- move16();
-
- FOR( i = 0; i < shl( NB_SUBFR16k, 1 ); i++ )
- {
- st->old_pitch_buf_fx[i] = L_SUBFR_Q6;
- move16();
- }
-
- /* mode1 core switching */
- st->old_Es_pred_fx = 0;
- move16();
- set16_fx( st->old_Aq_12_8_fx + 1, 0, M );
- st->old_Aq_12_8_fx[0] = ONE_IN_Q12;
- move16();
-
- /* stable short pitch detection */
- st->voicing0_sm_fx = 0;
- move16();
- st->voicing_sm_fx = 0;
- move16();
- st->LF_EnergyRatio_sm_fx = 1;
- move16();
- st->predecision_flag = 0;
- move16();
- st->diff_sm_fx = 0;
- move32();
- st->energy_sm_fx = 0;
- move32();
-
- set16_fx( st->pitch, L_SUBFR, 3 );
- set16_fx( st->voicing_fx, 0, 3 );
-
- /*-----------------------------------------------------------------*
- * General signal buffers
- *-----------------------------------------------------------------*/
-
- IF( !vad_only_flag )
- {
- IF( ( st->hSignalBuf = (SIGNAL_BUFFERS_ENC_HANDLE) malloc( sizeof( SIGNAL_BUFFERS_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Signal buffers\n" ) );
- }
-
- st->Bin_E_old_fx = st->hSignalBuf->Bin_E_old_fx;
- st->mem_decim_fx = st->hSignalBuf->mem_decim_fx;
- st->mem_decim16k_fx = st->hSignalBuf->mem_decim16k_fx;
- st->old_inp_12k8_fx = st->hSignalBuf->old_inp_12k8_fx;
- st->old_inp_16k_fx = st->hSignalBuf->old_inp_16k_fx;
- st->buf_speech_enc_pe = st->hSignalBuf->buf_speech_enc_pe;
- st->buf_synth = st->hSignalBuf->buf_synth;
- st->buf_speech_enc = st->hSignalBuf->buf_speech_enc;
- st->buf_wspeech_enc = st->hSignalBuf->buf_wspeech_enc;
-
- set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 );
- st->q_Bin_E_old = Q31;
- move16();
- set16_fx( st->hSignalBuf->buf_speech_enc, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
- st->exp_buf_speech_enc = 0;
- move16();
- set16_fx( st->hSignalBuf->buf_wspeech_enc, 0, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 );
- st->exp_buf_wspeech_enc = 0;
- move16();
- /* initializations */
-#ifndef MSAN_FIX
- set32_fx( st->Bin_E_old_fx, 0, shr( L_FFT, 2 ) );
-#else
- set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 );
-#endif
- st->q_Bin_E_old = Q31;
- move16();
- set16_fx( st->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) );
- set16_fx( st->mem_decim16k_fx, 0, shl( L_FILT_MAX, 1 ) );
- set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM );
- set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM );
- st->exp_old_inp_16k = 0;
- st->exp_old_inp_12k8 = 0;
- move16();
- move16();
-
- st->input_buff_fx = st->hSignalBuf->input_buff;
- st->input_buff32_fx = st->hSignalBuf->input_buff32;
- set16_fx( st->input_buff_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) );
- st->q_inp = Q15;
- move16();
- st->q_old_inp = Q15;
- move16();
- set32_fx( st->input_buff32_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) );
- st->q_inp32 = Q31;
- move16();
- st->old_input_signal_fx = st->input_buff_fx;
- /* st->input_Fs / FRAMES_PER_SEC */
- Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) );
-
- IF( st->element_mode == EVS_MONO )
- {
- st->input32_fx = st->input_buff32_fx + st->input_Fs / FRAMES_PER_SEC + NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS );
- st->input_fx = st->input_buff_fx + add( frame_length, (Word16) NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ) );
- }
- ELSE
- {
- st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC
- st->input_fx = st->input_buff_fx + frame_length;
- }
-#if 1 // TODO: To be removed later
-#endif
- }
- ELSE
- {
- st->hSignalBuf = NULL;
- st->Bin_E_old_fx = NULL;
- st->mem_decim_fx = NULL;
- st->mem_decim16k_fx = NULL;
- st->old_inp_12k8_fx = NULL;
- st->old_inp_16k_fx = NULL;
- st->buf_speech_enc_pe = NULL;
- st->buf_synth = NULL;
- st->buf_speech_enc = NULL;
- st->buf_wspeech_enc = NULL;
- st->input_buff_fx = NULL;
-#if 1
-#endif
- }
-
- /*-----------------------------------------------------------------*
- * Noise estimator
- *-----------------------------------------------------------------*/
-
- test();
- test();
- test();
- IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO )
- {
- IF( ( st->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL )
- {
- return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" );
- }
-
- noise_est_init_ivas_fx( st->hNoiseEst );
- }
- ELSE
- {
- st->hNoiseEst = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * VAD
- *-----------------------------------------------------------------*/
-
- st->vad_flag = 1;
- move16();
- st->localVAD = 0;
- move16();
-
- IF( ( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && ( !vad_only_flag ) )
- {
- IF( ( st->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) );
- }
-
- wb_vad_init_ivas_fx( st->hVAD );
- }
- ELSE
- {
- st->hVAD = NULL;
- }
- st->Pos_relE_cnt = 20;
- move16();
-
- /* CLDFB-based VAD */
- IF( st->element_mode == EVS_MONO )
- {
- /* This is done to as in EVS T_CldfbVadState structure is present in Encoder State */
- /*
- if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) );
- }
- */
- st->hVAD_CLDFB = &st->vad_st;
-
- vad_init_fx( st->hVAD_CLDFB );
- }
- ELSE
- {
- st->hVAD_CLDFB = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * Speech/music classifier
- *-----------------------------------------------------------------*/
-
- IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO )
- {
- IF( ( st->hSpMusClas = (SP_MUS_CLAS_HANDLE) malloc( sizeof( SP_MUS_CLAS_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) );
- }
-
- speech_music_clas_init_ivas_fx( st->hSpMusClas );
- st->sp_aud_decision0 = 0;
- move16();
- st->sp_aud_decision1 = 0;
- move16();
- st->sp_aud_decision2 = 0;
- move16();
- }
- ELSE
- {
- st->hSpMusClas = NULL;
- }
-
-
- /*-----------------------------------------------------------------*
- * WB, SWB and FB bandwidth detector
- *-----------------------------------------------------------------*/
-
- st->lt_mean_NB_fx = 0;
- move16();
- st->lt_mean_WB_fx = 0;
- move16();
- st->lt_mean_SWB_fx = 0;
- move16();
- st->count_WB = BWD_COUNT_MAX;
- move16();
- st->count_SWB = BWD_COUNT_MAX;
- move16();
- st->count_FB = BWD_COUNT_MAX;
- move16();
- st->bwidth = st->max_bwidth;
- move16();
- st->last_input_bwidth = st->bwidth;
- move16();
- st->last_bwidth = st->bwidth;
- move16();
- st->last_bwidth_cng = st->bwidth;
- move16();
- st->bwidth_sw_cnt = 0;
- move16();
-
-
- /*-----------------------------------------------------------------*
- * DTX
- *-----------------------------------------------------------------*/
-
- st->lp_speech_fx = 11520; /*Q8 (45.0) */ /* Initialize the long-term active speech level in dB */
- move16();
- st->lp_noise_fx = 0;
- move16();
- st->flag_noisy_speech_snr = 0;
- move16();
- st->fd_cng_reset_flag = 0;
- move16();
- st->cng_type = -1;
- move16();
- st->bckr_tilt_lt = 0;
- move16();
- st->active_cnt = 0;
- move16();
-
- test();
- test();
- test();
- test();
- IF( ( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
- {
- IF( ( st->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) );
- }
- dtx_enc_init_fx( st, var_SID_rate_flag, interval_SID );
- }
- ELSE
- {
- st->hDtxEnc = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * No other handles needed to be allocated for front-VAD structure
- *-----------------------------------------------------------------*/
-
- IF( vad_only_flag )
- {
- st->hTdCngEnc = NULL;
- st->cldfbAnaEnc = NULL;
- st->hFdCngEnc = NULL;
- st->hSC_VBR = NULL;
- st->hAmrwb_IO = NULL;
- st->hLPDmem = NULL;
- st->hGSCEnc = NULL;
- st->hBWE_TD = NULL;
- st->cldfbSynTd = NULL;
- st->hBWE_FD = NULL;
- st->hHQ_core = NULL;
- st->hRF = NULL;
- st->hTECEnc = NULL;
- st->hTcxEnc = NULL;
- st->hTcxCfg = NULL;
- st->hIGFEnc = NULL;
- st->hPlcExt = NULL;
- st->hTranDet = NULL;
-
- st->element_mode = IVAS_SCE;
- move16();
- st->idchan = 100; /* indicates hCoreCoderVAD */
- move16();
- st->core = -1;
- move16();
- st->rf_mode = 0;
- move16();
-
- return error;
- }
-
- /*-----------------------------------------------------------------*
- * LP-CNG
- *-----------------------------------------------------------------*/
-
- test();
- test();
- test();
- test();
- test();
- IF( ( ( idchan == 0 && st->Opt_DTX_ON && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || st->element_mode == EVS_MONO ) && !( EQ_16( ism_mode, ISM_MODE_PARAM ) || EQ_16( ism_mode, ISM_MODE_DISC ) ) )
- {
- IF( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) );
- }
-
- td_cng_enc_init_ivas_fx( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth );
- }
- ELSE
- {
- st->hTdCngEnc = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * CLDFB & resampling tools parameters
- *-----------------------------------------------------------------*/
- test();
- test();
- test();
- IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
- {
- IF( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
- ELSE
- {
- st->cldfbAnaEnc = NULL;
- }
-
- st->energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */
- move32();
- st->sf_energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */
- move16();
-
- /*-----------------------------------------------------------------*
- * SC-VBR parameters
- *-----------------------------------------------------------------*/
-
- test();
- IF( st->Opt_SC_VBR || st->element_mode == EVS_MONO )
- {
- IF( ( st->hSC_VBR = (SC_VBR_ENC_HANDLE) malloc( sizeof( SC_VBR_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) );
- }
-
- sc_vbr_enc_init_fx( st->hSC_VBR );
- }
- ELSE
- {
- st->hSC_VBR = NULL;
- }
-
- st->last_Opt_SC_VBR = 0;
- move16();
-
-
- /*-----------------------------------------------------------------*
- * AMR-WB IO initialization
- *-----------------------------------------------------------------*/
-
- test();
- IF( st->Opt_AMR_WB || st->element_mode == EVS_MONO )
- {
- IF( ( st->hAmrwb_IO = (AMRWB_IO_ENC_HANDLE) malloc( sizeof( AMRWB_IO_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) );
- }
-
- amr_wb_enc_init_fx( st->hAmrwb_IO );
- }
- ELSE
- {
- st->hAmrwb_IO = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * ACELP LPDmem
- *-----------------------------------------------------------------*/
-
- test();
- test();
- IF( ( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
- {
- IF( ( st->hLPDmem = (LPD_state_HANDLE) malloc( sizeof( LPD_state ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) );
- }
-
- LPDmem_enc_init_ivas_fx( st->hLPDmem );
- }
- ELSE
- {
- st->hLPDmem = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * parameters for AC coder type (GSC)
- *-----------------------------------------------------------------*/
-
- st->GSC_noisy_speech = 0;
- move16();
- st->GSC_IVAS_mode = 0;
- move16();
-
- test();
- test();
- IF( ( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
- {
- IF( ( st->hGSCEnc = (GSC_ENC_HANDLE) malloc( sizeof( GSC_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) );
- }
-
- GSC_enc_init_fx( st->hGSCEnc );
- }
- ELSE
- {
- st->hGSCEnc = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * TBE parameters
- *-----------------------------------------------------------------*/
-
- test();
- IF( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- IF( ( st->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
- }
-
- IF( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
- {
- return error;
- }
-
- InitSWBencBuffer_ivas_fx( st );
- ResetSHBbuffer_Enc_fx( st );
- }
- ELSE
- {
- st->hBWE_TD = NULL;
- st->cldfbSynTd = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * SWB BWE parameters
- *-----------------------------------------------------------------*/
-
- test();
- IF( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- IF( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) );
- }
-
- fd_bwe_enc_init_fx( st->hBWE_FD );
-#ifdef MSAN_FIX
- st->Q_old_wtda = 0;
- move16();
-#endif
- }
- ELSE
- {
- st->hBWE_FD = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * HQ core parameters
- *-----------------------------------------------------------------*/
-
- IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 )
- {
- IF( ( st->hHQ_core = (HQ_ENC_HANDLE) malloc( sizeof( HQ_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) );
- }
-
- HQ_core_enc_init_fx( st->hHQ_core );
- }
- ELSE
- {
- st->hHQ_core = NULL;
- }
-
- /* init memory for detect_transient(), used by HQ core and swb_bwe_enc */
- st->old_hpfilt_in_fx = 0;
- move16();
- st->old_hpfilt_out_fx = 0;
- move16();
- st->EnergyLT_fx = 0;
- move32();
- st->Energy_Old_fx = 0;
- move32();
- st->TransientHangOver = 0;
- move16();
- st->EnergyLT_fx_exp = 30;
- move16();
- st->last_enerBuffer_exp = 0;
- move16();
-
- /*-----------------------------------------------------------------*
- * Channel-aware mode
- *-----------------------------------------------------------------*/
-
- test();
- test();
- test();
- IF( !st->Opt_RF_ON || ( NE_16( st->bwidth, WB ) && NE_16( st->bwidth, SWB ) ) || NE_32( st->total_brate, ACELP_13k20 ) )
- {
- st->rf_mode = 0;
- move16();
- }
- ELSE
- {
- st->rf_mode = st->Opt_RF_ON;
- move16();
- }
-
- st->rf_mode_last = st->rf_mode;
- move16();
-
- test();
- IF( st->Opt_RF_ON || st->element_mode == EVS_MONO )
- {
- IF( ( st->hRF = (RF_ENC_HANDLE) malloc( sizeof( RF_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for RF\n" ) );
- }
-
- /* initialize RF indice buffers */
- reset_rf_indices_fx( st );
- }
- ELSE
- {
- st->hRF = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * Temporal Envelope Coding
- *-----------------------------------------------------------------*/
-
- IF( st->element_mode == EVS_MONO )
- {
- IF( ( st->hTECEnc = (TEC_ENC_HANDLE) malloc( sizeof( TEC_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TEC\n" ) );
- }
- }
- ELSE
- {
- st->hTECEnc = NULL;
- }
- /* note: initialization done later in init_coder_ace_plus() */
-
- /*-----------------------------------------------------------------*
- * TCX core
- *-----------------------------------------------------------------*/
-
- // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel
- test();
- IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- IF( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) );
- }
- set32_fx( st->hTcxEnc->spectrum_long_fx, 0, N_MAX );
- st->hTcxEnc->spectrum_long_e = 0;
- move16();
- /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */
- st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx;
- st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX;
- move32();
- move32();
- st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0;
- move16();
- move16();
-#if 1
- // set_f( st->hTcxEnc->spectrum_long, 0, N_MAX );
- // st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long;
- // st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX;
- // set_f( st->hTcxEnc->old_out, 0, L_FRAME32k );
-#endif
-
- set16_fx( st->hTcxEnc->old_out_fx, 0, L_FRAME32k );
- st->hTcxEnc->Q_old_out = 0;
- move16();
-
- /* MDCT selector */
- MDCT_selector_reset_fx( st->hTcxEnc );
-
- /* MDCT classifier */
- MDCT_classifier_reset_fx( st->hTcxEnc );
-
- IF( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) );
- }
- }
- ELSE
- {
- st->hTcxEnc = NULL;
- st->hTcxCfg = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * IGF
- *-----------------------------------------------------------------*/
-
- igf_brate = st->total_brate;
- move32();
-
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( EQ_16( st->element_mode, IVAS_SCE ) && ( EQ_16( st_ivas->hEncoderConfig->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) )
- {
- igf_brate = L_sub( st->total_brate, i_mult( ISM_NB_BITS_METADATA_NOMINAL, FRAMES_PER_SEC ) );
- }
- ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && ( EQ_16( st_ivas->hEncoderConfig->ivas_format, SBA_FORMAT ) ||
- EQ_16( st_ivas->hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ||
- EQ_16( st_ivas->hEncoderConfig->ivas_format, MC_FORMAT ) ||
- EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_FORMAT ) ) ) )
- {
- /* use nominal bitrates for DFT Stereo and (O)SBA, same as in stereo_dft_config()/ivas_spar_config() */
- IF( EQ_32( element_brate, IVAS_13k2 ) )
- {
- igf_brate = ACELP_9k60;
- }
- ELSE IF( EQ_32( element_brate, IVAS_16k4 ) )
- {
- igf_brate = ACELP_13k20;
- }
- ELSE IF( EQ_32( element_brate, IVAS_24k4 ) )
- {
- igf_brate = ACELP_16k40;
- }
- ELSE IF( EQ_32( element_brate, IVAS_32k ) )
- {
- igf_brate = ACELP_24k40;
- }
- }
- ELSE IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
- {
- igf_brate = element_brate;
- }
- move32();
- test();
- IF( EQ_16( st->codec_mode, MODE2 ) || GT_16( st->element_mode, EVS_MONO ) )
- {
- st->igf = getIgfPresent_fx( st->element_mode, igf_brate, st->max_bwidth, st->rf_mode );
- }
- ELSE
- {
- st->igf = 0;
- }
- move16();
-
- test();
- test();
- test();
- IF( ( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) && ( st->igf || st->element_mode == EVS_MONO ) )
- {
- IF( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
- }
- }
- ELSE
- {
- st->hIGFEnc = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * Mode 2 initialization
- *-----------------------------------------------------------------*/
-
- st->last_sr_core = L_mult0( st->last_L_frame, FRAMES_PER_SEC );
- move32();
-
-
- /* PLC encoder */
- IF( st->element_mode == EVS_MONO )
- {
- IF( ( st->hPlcExt = (PLC_ENC_EVS_HANDLE) malloc( sizeof( PLC_ENC_EVS ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hPlcExt\n" ) );
- }
- }
- ELSE
- {
- st->hPlcExt = NULL;
- }
-
- /* Init Mode 2 core coder */
- st->last_totalNoise_fx = 0;
- move16();
- set16_fx( st->totalNoise_increase_hist_fx, 0, TOTALNOISE_HIST_SIZE );
- st->totalNoise_increase_len = 0;
- move16();
-#ifdef IVAS_FLOAT_FIXED_CONVERSIONS
- TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
- IF( hTcxEnc != NULL )
- {
- hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
- move16();
- }
- st->currEnergyHF_fx = 0;
- move32();
- st->currEnergyHF_e_fx = 0;
- move16();
-#ifdef MSAN_FIX
- st->prevEnergyHF_fx = 0;
- move32();
-#endif
-
- /* Initialize TCX */
-
- /* Initialize Signal Buffers */
- Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM );
- Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift );
- st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift );
- move16();
- shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM );
- Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift );
- st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift );
- move16();
- /* Initialize ACELP */
-#endif
-#ifdef FIX_920_IGF_INIT_ERROR
- init_coder_ace_plus_ivas_fx( st, st->last_total_brate, igf_brate, 0 );
-#else
- init_coder_ace_plus_ivas_fx( st, st->last_total_brate, 0 );
-#endif
-
- IF( st->hLPDmem != NULL )
- {
- st->hLPDmem->q_lpd_old_exc = st->prev_Q_new;
- move16();
- }
- /*-----------------------------------------------------------------*
- * FD-CNG encoder
- *-----------------------------------------------------------------*/
-
- test();
- test();
- test();
- test();
- IF( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
- {
- createFdCngEnc_fx( &st->hFdCngEnc );
- initFdCngEnc_fx( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale );
- /* initialization for IVAS modes happens in first frame pre-processing */
- IF( st->element_mode == EVS_MONO )
- {
- Word32 total_brate;
-
- test();
- IF( st->rf_mode && EQ_32( st->total_brate, ACELP_13k20 ) )
- {
- total_brate = ACELP_9k60;
- move32();
- }
- ELSE
- {
- total_brate = st->total_brate;
- move32();
- }
-
- configureFdCngEnc_ivas_fx( st->hFdCngEnc, st->bwidth, total_brate );
- }
- }
- ELSE
- {
- st->hFdCngEnc = NULL;
- }
-
- /*-----------------------------------------------------------------*
- * Transient detector
- *-----------------------------------------------------------------*/
-
- IF( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) );
- }
- Word16 temp;
- Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp );
- frame_length = shr( frame_length, sub( 15, temp ) );
-
- IF( GT_16( st->element_mode, EVS_MONO ) )
- {
- InitTransientDetection_ivas_fx( frame_length, 0, st->hTranDet, 1 );
- }
- ELSE
- {
- InitTransientDetection_ivas_fx( frame_length, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 );
- }
-
- /*-----------------------------------------------------------------*
- * IVAS parameters
- *-----------------------------------------------------------------*/
-
- st->tdm_LRTD_flag = 0;
- move16();
- st->cng_sba_flag = 0;
- move16();
- st->bits_frame_channel = 0;
- move16();
- st->side_bits_frame_channel = 0;
- move16();
- st->Q_syn2 = 0;
- move16();
- st->Q_syn = 0;
- move16();
- set16_fx( st->Q_max, Q_MAX, L_Q_MEM );
- set16_fx( st->Q_max_16k, Q_MAX, L_Q_MEM );
- st->Q_old = 15;
- move16();
- st->old_wsp_max = 0;
- move16();
- st->old_wsp_shift = 0;
- move16();
- st->sharpFlag = 0;
- move16();
-
- return error;
-}
-
-
-/*-----------------------------------------------------------------------*
- * destroy_cldfb_encoder()
- *
- * Free memory which was allocated in init_encoder()
- *-----------------------------------------------------------------------*/
-
-void destroy_cldfb_encoder_fx(
- Encoder_State *st /* i/o: Encoder static variables structure */
-)
-{
- deleteCldfb_ivas_fx( &st->cldfbSynTd );
- deleteCldfb_ivas_fx( &st->cldfbAnaEnc );
-
- deleteFdCngEnc_fx( &st->hFdCngEnc );
-
- return;
-}
diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c
index 58706279ea43c7346bccf4b02901cf262946543d..ca8b70ca23d533043ad7f29a76b996f0ae06e4d9 100644
--- a/lib_enc/init_enc_fx.c
+++ b/lib_enc/init_enc_fx.c
@@ -10,8 +10,10 @@
#include "stl.h"
#include "ivas_cnst.h"
#include "ivas_error.h"
+#include "prot.h" /* Function prototypes */
#include "prot_fx.h" /* Function prototypes */
#include "prot_fx_enc.h" /* Function prototypes */
+#include "ivas_prot_fx.h"
/*-----------------------------------------------------------------------*
@@ -1062,3 +1064,1171 @@ void destroy_encoder_fx(
return;
}
+
+ivas_error init_encoder_ivas_fx(
+ Encoder_State *st, /* i/o: state structure */
+ Encoder_Struct *st_ivas, /* i/o: encoder state structure */
+ const Word16 idchan, /* i : channel ID */
+ const Word16 var_SID_rate_flag, /* i : flag for variable SID update rate */
+ const Word16 interval_SID, /* i : interval for SID update */
+ const Word16 vad_only_flag, /* i : flag to indicate front-VAD structure */
+ const ISM_MODE ism_mode, /* i : ISM mode */
+ const Word32 element_brate /* i : element bitrate */
+)
+{
+ Word16 i;
+ ivas_error error;
+ Word32 igf_brate;
+
+ error = IVAS_ERR_OK;
+ move32();
+
+ /*-----------------------------------------------------------------*
+ * General parameters
+ *-----------------------------------------------------------------*/
+
+ IF( st->Opt_AMR_WB )
+ {
+ st->last_core = AMR_WB_CORE;
+ }
+ ELSE
+ {
+ st->last_core = -1;
+ }
+ move16();
+
+ st->L_frame = L_FRAME;
+ move16();
+ st->last_coder_type = GENERIC;
+ move16();
+ st->coder_type = GENERIC;
+ move16();
+ st->last_total_brate = st->total_brate;
+ move32();
+ st->last_bits_frame_nominal = -1;
+ move16();
+ st->last_total_brate_cng = -1;
+ move16();
+ st->last_core_brate = st->total_brate;
+ move32();
+ st->dtx_sce_sba = 0;
+ move16();
+ st->extl = -1;
+ move16();
+ st->last_extl = -1;
+ move16();
+ st->last_L_frame = L_FRAME;
+ move16();
+ st->rate_switching_reset = 0;
+ move16();
+ st->rate_switching_reset_16kHz = 0;
+ move16();
+ st->clas = UNVOICED_CLAS;
+ move16();
+ st->low_rate_mode = 0;
+ move16();
+ st->ini_frame = 0;
+ move16();
+ st->inactive_coder_type_flag = 0;
+ move16();
+ st->sba_br_sw_while_no_data = 0;
+ move16();
+
+ st->coder_type_raw = VOICED;
+ move16();
+ st->last_coder_type_raw = st->coder_type_raw;
+ move16();
+
+ st->flag_ACELP16k = set_ACELP_flag_IVAS( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 );
+ move16();
+
+ st->is_ism_format = 0;
+ move16();
+
+ IF( NE_16( ism_mode, ISM_MODE_NONE ) )
+ {
+ st->is_ism_format = 1;
+ move16();
+ }
+
+ /*-----------------------------------------------------------------*
+ * Bitstream
+ *-----------------------------------------------------------------*/
+
+ IF( !vad_only_flag )
+ {
+ IF( ( st->hBstr = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) );
+ }
+
+ /* set pointer to the buffer of indices */
+ st->hBstr->ind_list = st_ivas->ind_list;
+ st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list;
+ st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices;
+ st->hBstr->nb_ind_tot = 0;
+ move16();
+ st->hBstr->nb_bits_tot = 0;
+ move16();
+ st->hBstr->st_ivas = st_ivas;
+ }
+ ELSE
+ {
+ st->hBstr = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Pre-processing and ACELP core parameters
+ *-----------------------------------------------------------------*/
+
+ Copy( GEWB_Ave_fx, st->mem_AR_fx, M );
+ Copy( GEWB_Ave_fx, st->lsfoldbfi0_fx, M );
+ Copy( GEWB_Ave_fx, st->lsfoldbfi1_fx, M );
+ Copy( GEWB_Ave_fx, st->lsf_adaptive_mean_fx, M );
+
+ st->next_force_safety_net = 0;
+ move16();
+
+ st->pstreaklen = 0;
+ move16();
+ st->streaklimit_fx = MAX_WORD16;
+ move16();
+ set16_fx( st->mem_MA_fx, 0, M );
+
+ init_gp_clip_fx( st->clip_var_fx );
+ pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx );
+ set16_fx( st->old_wsp_fx, 0, L_WSP_MEM );
+ st->exp_old_wsp = 0;
+ move16();
+ set16_fx( st->old_wsp2_fx, 0, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); // Needs to change depending on usage.
+ st->Q_old_wsp2 = 0;
+ move16();
+
+ st->mem_preemph_fx = 0;
+ move16();
+ st->mem_preemph16k_fx = 0;
+ move16();
+ st->mem_preemph_enc = 0;
+ move16();
+ st->exp_mem_preemph_enc = 0;
+ move16();
+
+#if 1 // TODO: Float Initializations. To be removed later
+ st->active_cnt = 0;
+ move16();
+#endif
+
+ st->pst_mem_deemp_err_fx = 0;
+ move16();
+ st->pst_lp_ener_fx = 0;
+ move16();
+
+ /* AVQ pre-quantizer memory */
+ st->mem_preemp_preQ_fx = 0;
+ move16();
+ st->mem_deemp_preQ_fx = 0;
+ move16();
+ st->last_nq_preQ = 0;
+ move16();
+ st->last_code_preq = 0;
+ move16();
+ st->use_acelp_preq = 0;
+ move16();
+ st->last_harm_flag_acelp = 0;
+ move16();
+
+ /* (Decimated) Weighted Speech Memory */
+ st->mem_wsp_enc = 0;
+ move16();
+ st->mem_wsp_fx = 0;
+ move16();
+ st->mem_wsp_q = 0;
+ move16();
+ set16_fx( st->mem_decim2_fx, 0, 3 );
+ set32_fx( st->Bin_E_fx, 0, L_FFT );
+ st->q_Bin_E = Q31;
+ move16();
+ st->ee_old_fx = 640; /* 10.0f in Q6 */
+ move16();
+ st->Nb_ACELP_frames = 0;
+ move16();
+ st->audio_frame_cnt = AUDIO_COUNTER_INI; /* Initialization of the audio frame counter mildly into the audio mode */
+ move16();
+
+ /* adaptive lag window memory */
+ st->old_pitch_la = 0;
+ move16();
+
+ st->prev_Q_new = 0;
+ move16();
+
+ IF( EQ_32( st->input_Fs, 8000 ) )
+ {
+ st->min_band = 1;
+ move16();
+ st->max_band = 16;
+ move16();
+ }
+ ELSE
+ {
+ st->min_band = 0;
+ move16();
+ st->max_band = 19;
+ move16();
+ }
+
+ IF( st->Opt_AMR_WB )
+ {
+ Copy( mean_isf_amr_wb_fx, st->lsf_old_fx, M );
+ E_LPC_isf_isp_conversion( st->lsf_old_fx, st->lsp_old1_fx, M );
+ }
+ ELSE
+ {
+ Copy( GEWB_Ave_fx, st->lsf_old_fx, M );
+ lsf2lsp_fx( st->lsf_old_fx, st->lsp_old1_fx, M, INT_FS_12k8 );
+ }
+
+ Copy( st->lsf_old_fx, st->lsf_old1_fx, M );
+ Copy( st->lsp_old1_fx, st->lsp_old_fx, M );
+ Copy( st->lsp_old_fx, st->lsp_old16k_fx, M );
+ Copy( st->lsp_old_fx, st->lspold_enc_fx, M );
+
+ st->stab_fac_fx = 0;
+ move16();
+
+ /* Bass post-filter memories - encoder side of MODE2 */
+ st->bpf_off = 0;
+ move16();
+ st->pst_mem_deemp_err_fx = 0;
+ move16();
+ st->pst_lp_ener_fx = 0;
+ move16();
+
+ /* TC coder type */
+ st->tc_cnt = 0;
+ move16();
+
+ /* find_uv() parameters */
+ st->old_dE1_fx = 0;
+ move16();
+ st->old_ind_deltaMax = 0;
+ move16();
+ set32_fx( st->old_enr_ssf_fx, 0, shl( NB_SSF, 1 ) );
+ st->spike_hyst = -1;
+ move16();
+
+ /* stereo switching memories */
+ st->mem_preemph_DFT_fx = 0;
+ move16();
+ set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) );
+ st->mem_preemph16k_DFT_fx = 0;
+ move16();
+ set16_fx( st->inp_16k_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_16k, L_MEM_RECALC_16K ), L_FILT16k ) );
+
+ st->sharpFlag = 0;
+ move16();
+
+ /* Stationary noise UV modification */
+ st->ge_sm_fx = L_deposit_l( 640 ); /*Q(GE_SHIFT)*/
+ move16();
+ st->uv_count = 0;
+ move16();
+ st->act_count = 3;
+ move16();
+ Copy( st->lsp_old_fx, st->lspold_s_fx, M );
+ st->noimix_seed = RANDOM_INITSEED;
+ move16();
+ st->min_alpha_fx = 32767;
+ move16();
+ st->exc_pe_fx = 0;
+ move16();
+ st->Q_stat_noise = 15;
+ move16();
+ /* FEC */
+ st->last_clas = UNVOICED_CLAS;
+ move16();
+ st->prev_fmerit = 0;
+ move16();
+ st->fmerit_dt = 0;
+ move16();
+ st->Last_pulse_pos = 0;
+ move16();
+
+ FOR( i = 0; i < shl( NB_SUBFR16k, 1 ); i++ )
+ {
+ st->old_pitch_buf_fx[i] = L_SUBFR_Q6;
+ move16();
+ }
+
+ /* mode1 core switching */
+ st->old_Es_pred_fx = 0;
+ move16();
+ set16_fx( st->old_Aq_12_8_fx + 1, 0, M );
+ st->old_Aq_12_8_fx[0] = ONE_IN_Q12;
+ move16();
+
+ /* stable short pitch detection */
+ st->voicing0_sm_fx = 0;
+ move16();
+ st->voicing_sm_fx = 0;
+ move16();
+ st->LF_EnergyRatio_sm_fx = 1;
+ move16();
+ st->predecision_flag = 0;
+ move16();
+ st->diff_sm_fx = 0;
+ move32();
+ st->energy_sm_fx = 0;
+ move32();
+
+ set16_fx( st->pitch, L_SUBFR, 3 );
+ set16_fx( st->voicing_fx, 0, 3 );
+
+ /*-----------------------------------------------------------------*
+ * General signal buffers
+ *-----------------------------------------------------------------*/
+
+ IF( !vad_only_flag )
+ {
+ IF( ( st->hSignalBuf = (SIGNAL_BUFFERS_ENC_HANDLE) malloc( sizeof( SIGNAL_BUFFERS_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Signal buffers\n" ) );
+ }
+
+ st->Bin_E_old_fx = st->hSignalBuf->Bin_E_old_fx;
+ st->mem_decim_fx = st->hSignalBuf->mem_decim_fx;
+ st->mem_decim16k_fx = st->hSignalBuf->mem_decim16k_fx;
+ st->old_inp_12k8_fx = st->hSignalBuf->old_inp_12k8_fx;
+ st->old_inp_16k_fx = st->hSignalBuf->old_inp_16k_fx;
+ st->buf_speech_enc_pe = st->hSignalBuf->buf_speech_enc_pe;
+ st->buf_synth = st->hSignalBuf->buf_synth;
+ st->buf_speech_enc = st->hSignalBuf->buf_speech_enc;
+ st->buf_wspeech_enc = st->hSignalBuf->buf_wspeech_enc;
+
+ set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 );
+ st->q_Bin_E_old = Q31;
+ move16();
+ set16_fx( st->hSignalBuf->buf_speech_enc, 0, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k );
+ st->exp_buf_speech_enc = 0;
+ move16();
+ set16_fx( st->hSignalBuf->buf_wspeech_enc, 0, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 );
+ st->exp_buf_wspeech_enc = 0;
+ move16();
+ /* initializations */
+#ifndef MSAN_FIX
+ set32_fx( st->Bin_E_old_fx, 0, shr( L_FFT, 2 ) );
+#else
+ set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 );
+#endif
+ st->q_Bin_E_old = Q31;
+ move16();
+ set16_fx( st->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) );
+ set16_fx( st->mem_decim16k_fx, 0, shl( L_FILT_MAX, 1 ) );
+ set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM );
+ set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM );
+ st->exp_old_inp_16k = 0;
+ st->exp_old_inp_12k8 = 0;
+ move16();
+ move16();
+
+ st->input_buff_fx = st->hSignalBuf->input_buff;
+ st->input_buff32_fx = st->hSignalBuf->input_buff32;
+ set16_fx( st->input_buff_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) );
+ st->q_inp = Q15;
+ move16();
+ st->q_old_inp = Q15;
+ move16();
+ set32_fx( st->input_buff32_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) );
+ st->q_inp32 = Q31;
+ move16();
+ st->old_input_signal_fx = st->input_buff_fx;
+ /* st->input_Fs / FRAMES_PER_SEC */
+ Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) );
+
+ IF( st->element_mode == EVS_MONO )
+ {
+ st->input32_fx = st->input_buff32_fx + st->input_Fs / FRAMES_PER_SEC + NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS );
+ st->input_fx = st->input_buff_fx + add( frame_length, (Word16) NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ) );
+ }
+ ELSE
+ {
+ st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC
+ st->input_fx = st->input_buff_fx + frame_length;
+ }
+#if 1 // TODO: To be removed later
+#endif
+ }
+ ELSE
+ {
+ st->hSignalBuf = NULL;
+ st->Bin_E_old_fx = NULL;
+ st->mem_decim_fx = NULL;
+ st->mem_decim16k_fx = NULL;
+ st->old_inp_12k8_fx = NULL;
+ st->old_inp_16k_fx = NULL;
+ st->buf_speech_enc_pe = NULL;
+ st->buf_synth = NULL;
+ st->buf_speech_enc = NULL;
+ st->buf_wspeech_enc = NULL;
+ st->input_buff_fx = NULL;
+#if 1
+#endif
+ }
+
+ /*-----------------------------------------------------------------*
+ * Noise estimator
+ *-----------------------------------------------------------------*/
+
+ test();
+ test();
+ test();
+ IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hNoiseEst = (NOISE_EST_HANDLE) malloc( sizeof( NOISE_EST_DATA ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Noise estimation\n" );
+ }
+
+ noise_est_init_ivas_fx( st->hNoiseEst );
+ }
+ ELSE
+ {
+ st->hNoiseEst = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * VAD
+ *-----------------------------------------------------------------*/
+
+ st->vad_flag = 1;
+ move16();
+ st->localVAD = 0;
+ move16();
+
+ IF( ( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && ( !vad_only_flag ) )
+ {
+ IF( ( st->hVAD = (VAD_HANDLE) malloc( sizeof( VAD_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) );
+ }
+
+ wb_vad_init_ivas_fx( st->hVAD );
+ }
+ ELSE
+ {
+ st->hVAD = NULL;
+ }
+ st->Pos_relE_cnt = 20;
+ move16();
+
+ /* CLDFB-based VAD */
+ IF( st->element_mode == EVS_MONO )
+ {
+ /* This is done to as in EVS T_CldfbVadState structure is present in Encoder State */
+ /*
+ if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) );
+ }
+ */
+ st->hVAD_CLDFB = &st->vad_st;
+
+ vad_init_fx( st->hVAD_CLDFB );
+ }
+ ELSE
+ {
+ st->hVAD_CLDFB = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Speech/music classifier
+ *-----------------------------------------------------------------*/
+
+ IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hSpMusClas = (SP_MUS_CLAS_HANDLE) malloc( sizeof( SP_MUS_CLAS_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Speech/music classifier\n" ) );
+ }
+
+ speech_music_clas_init_ivas_fx( st->hSpMusClas );
+ st->sp_aud_decision0 = 0;
+ move16();
+ st->sp_aud_decision1 = 0;
+ move16();
+ st->sp_aud_decision2 = 0;
+ move16();
+ }
+ ELSE
+ {
+ st->hSpMusClas = NULL;
+ }
+
+
+ /*-----------------------------------------------------------------*
+ * WB, SWB and FB bandwidth detector
+ *-----------------------------------------------------------------*/
+
+ st->lt_mean_NB_fx = 0;
+ move16();
+ st->lt_mean_WB_fx = 0;
+ move16();
+ st->lt_mean_SWB_fx = 0;
+ move16();
+ st->count_WB = BWD_COUNT_MAX;
+ move16();
+ st->count_SWB = BWD_COUNT_MAX;
+ move16();
+ st->count_FB = BWD_COUNT_MAX;
+ move16();
+ st->bwidth = st->max_bwidth;
+ move16();
+ st->last_input_bwidth = st->bwidth;
+ move16();
+ st->last_bwidth = st->bwidth;
+ move16();
+ st->last_bwidth_cng = st->bwidth;
+ move16();
+ st->bwidth_sw_cnt = 0;
+ move16();
+
+
+ /*-----------------------------------------------------------------*
+ * DTX
+ *-----------------------------------------------------------------*/
+
+ st->lp_speech_fx = 11520; /*Q8 (45.0) */ /* Initialize the long-term active speech level in dB */
+ move16();
+ st->lp_noise_fx = 0;
+ move16();
+ st->flag_noisy_speech_snr = 0;
+ move16();
+ st->fd_cng_reset_flag = 0;
+ move16();
+ st->cng_type = -1;
+ move16();
+ st->bckr_tilt_lt = 0;
+ move16();
+ st->active_cnt = 0;
+ move16();
+
+ test();
+ test();
+ test();
+ test();
+ IF( ( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
+ {
+ IF( ( st->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) );
+ }
+ dtx_enc_init_fx( st, var_SID_rate_flag, interval_SID );
+ }
+ ELSE
+ {
+ st->hDtxEnc = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * No other handles needed to be allocated for front-VAD structure
+ *-----------------------------------------------------------------*/
+
+ IF( vad_only_flag )
+ {
+ st->hTdCngEnc = NULL;
+ st->cldfbAnaEnc = NULL;
+ st->hFdCngEnc = NULL;
+ st->hSC_VBR = NULL;
+ st->hAmrwb_IO = NULL;
+ st->hLPDmem = NULL;
+ st->hGSCEnc = NULL;
+ st->hBWE_TD = NULL;
+ st->cldfbSynTd = NULL;
+ st->hBWE_FD = NULL;
+ st->hHQ_core = NULL;
+ st->hRF = NULL;
+ st->hTECEnc = NULL;
+ st->hTcxEnc = NULL;
+ st->hTcxCfg = NULL;
+ st->hIGFEnc = NULL;
+ st->hPlcExt = NULL;
+ st->hTranDet = NULL;
+
+ st->element_mode = IVAS_SCE;
+ move16();
+ st->idchan = 100; /* indicates hCoreCoderVAD */
+ move16();
+ st->core = -1;
+ move16();
+ st->rf_mode = 0;
+ move16();
+
+ return error;
+ }
+
+ /*-----------------------------------------------------------------*
+ * LP-CNG
+ *-----------------------------------------------------------------*/
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( ( idchan == 0 && st->Opt_DTX_ON && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || st->element_mode == EVS_MONO ) && !( EQ_16( ism_mode, ISM_MODE_PARAM ) || EQ_16( ism_mode, ISM_MODE_DISC ) ) )
+ {
+ IF( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) );
+ }
+
+ td_cng_enc_init_ivas_fx( st->hTdCngEnc, st->Opt_DTX_ON, st->max_bwidth );
+ }
+ ELSE
+ {
+ st->hTdCngEnc = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * CLDFB & resampling tools parameters
+ *-----------------------------------------------------------------*/
+ test();
+ test();
+ test();
+ IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
+ {
+ IF( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ ELSE
+ {
+ st->cldfbAnaEnc = NULL;
+ }
+
+ st->energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */
+ move32();
+ st->sf_energyCoreLookahead_Fx = 2; /* 6.1e-5f in Q15 */
+ move16();
+
+ /*-----------------------------------------------------------------*
+ * SC-VBR parameters
+ *-----------------------------------------------------------------*/
+
+ test();
+ IF( st->Opt_SC_VBR || st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hSC_VBR = (SC_VBR_ENC_HANDLE) malloc( sizeof( SC_VBR_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SC-VBR\n" ) );
+ }
+
+ sc_vbr_enc_init_fx( st->hSC_VBR );
+ }
+ ELSE
+ {
+ st->hSC_VBR = NULL;
+ }
+
+ st->last_Opt_SC_VBR = 0;
+ move16();
+
+
+ /*-----------------------------------------------------------------*
+ * AMR-WB IO initialization
+ *-----------------------------------------------------------------*/
+
+ test();
+ IF( st->Opt_AMR_WB || st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hAmrwb_IO = (AMRWB_IO_ENC_HANDLE) malloc( sizeof( AMRWB_IO_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for AMR-WB IO\n" ) );
+ }
+
+ amr_wb_enc_init_fx( st->hAmrwb_IO );
+ }
+ ELSE
+ {
+ st->hAmrwb_IO = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * ACELP LPDmem
+ *-----------------------------------------------------------------*/
+
+ test();
+ test();
+ IF( ( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
+ {
+ IF( ( st->hLPDmem = (LPD_state_HANDLE) malloc( sizeof( LPD_state ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LPDmem\n" ) );
+ }
+
+ LPDmem_enc_init_ivas_fx( st->hLPDmem );
+ }
+ ELSE
+ {
+ st->hLPDmem = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * parameters for AC coder type (GSC)
+ *-----------------------------------------------------------------*/
+
+ st->GSC_noisy_speech = 0;
+ move16();
+ st->GSC_IVAS_mode = 0;
+ move16();
+
+ test();
+ test();
+ IF( ( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st->element_mode, IVAS_CPE_TD ) )
+ {
+ IF( ( st->hGSCEnc = (GSC_ENC_HANDLE) malloc( sizeof( GSC_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for GSC\n" ) );
+ }
+
+ GSC_enc_init_fx( st->hGSCEnc );
+ }
+ ELSE
+ {
+ st->hGSCEnc = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * TBE parameters
+ *-----------------------------------------------------------------*/
+
+ test();
+ IF( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ IF( ( st->hBWE_TD = (TD_BWE_ENC_HANDLE) malloc( sizeof( TD_BWE_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
+ }
+
+ IF( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ InitSWBencBuffer_ivas_fx( st );
+ ResetSHBbuffer_Enc_fx( st );
+ }
+ ELSE
+ {
+ st->hBWE_TD = NULL;
+ st->cldfbSynTd = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * SWB BWE parameters
+ *-----------------------------------------------------------------*/
+
+ test();
+ IF( idchan == 0 && NE_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ IF( ( st->hBWE_FD = (FD_BWE_ENC_HANDLE) malloc( sizeof( FD_BWE_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) );
+ }
+
+ fd_bwe_enc_init_fx( st->hBWE_FD );
+#ifdef MSAN_FIX
+ st->Q_old_wtda = 0;
+ move16();
+#endif
+ }
+ ELSE
+ {
+ st->hBWE_FD = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * HQ core parameters
+ *-----------------------------------------------------------------*/
+
+ IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 )
+ {
+ IF( ( st->hHQ_core = (HQ_ENC_HANDLE) malloc( sizeof( HQ_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) );
+ }
+
+ HQ_core_enc_init_fx( st->hHQ_core );
+ }
+ ELSE
+ {
+ st->hHQ_core = NULL;
+ }
+
+ /* init memory for detect_transient(), used by HQ core and swb_bwe_enc */
+ st->old_hpfilt_in_fx = 0;
+ move16();
+ st->old_hpfilt_out_fx = 0;
+ move16();
+ st->EnergyLT_fx = 0;
+ move32();
+ st->Energy_Old_fx = 0;
+ move32();
+ st->TransientHangOver = 0;
+ move16();
+ st->EnergyLT_fx_exp = 30;
+ move16();
+ st->last_enerBuffer_exp = 0;
+ move16();
+
+ /*-----------------------------------------------------------------*
+ * Channel-aware mode
+ *-----------------------------------------------------------------*/
+
+ test();
+ test();
+ test();
+ IF( !st->Opt_RF_ON || ( NE_16( st->bwidth, WB ) && NE_16( st->bwidth, SWB ) ) || NE_32( st->total_brate, ACELP_13k20 ) )
+ {
+ st->rf_mode = 0;
+ move16();
+ }
+ ELSE
+ {
+ st->rf_mode = st->Opt_RF_ON;
+ move16();
+ }
+
+ st->rf_mode_last = st->rf_mode;
+ move16();
+
+ test();
+ IF( st->Opt_RF_ON || st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hRF = (RF_ENC_HANDLE) malloc( sizeof( RF_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for RF\n" ) );
+ }
+
+ /* initialize RF indice buffers */
+ reset_rf_indices_fx( st );
+ }
+ ELSE
+ {
+ st->hRF = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Temporal Envelope Coding
+ *-----------------------------------------------------------------*/
+
+ IF( st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hTECEnc = (TEC_ENC_HANDLE) malloc( sizeof( TEC_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TEC\n" ) );
+ }
+ }
+ ELSE
+ {
+ st->hTECEnc = NULL;
+ }
+ /* note: initialization done later in init_coder_ace_plus() */
+
+ /*-----------------------------------------------------------------*
+ * TCX core
+ *-----------------------------------------------------------------*/
+
+ // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel
+ test();
+ IF( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ IF( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) );
+ }
+ set32_fx( st->hTcxEnc->spectrum_long_fx, 0, N_MAX );
+ st->hTcxEnc->spectrum_long_e = 0;
+ move16();
+ /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */
+ st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx;
+ st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX;
+ move32();
+ move32();
+ st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0;
+ move16();
+ move16();
+#if 1
+ // set_f( st->hTcxEnc->spectrum_long, 0, N_MAX );
+ // st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long;
+ // st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX;
+ // set_f( st->hTcxEnc->old_out, 0, L_FRAME32k );
+#endif
+
+ set16_fx( st->hTcxEnc->old_out_fx, 0, L_FRAME32k );
+ st->hTcxEnc->Q_old_out = 0;
+ move16();
+
+ /* MDCT selector */
+ MDCT_selector_reset_fx( st->hTcxEnc );
+
+ /* MDCT classifier */
+ MDCT_classifier_reset_fx( st->hTcxEnc );
+
+ IF( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) );
+ }
+ }
+ ELSE
+ {
+ st->hTcxEnc = NULL;
+ st->hTcxCfg = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * IGF
+ *-----------------------------------------------------------------*/
+
+ igf_brate = st->total_brate;
+ move32();
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( EQ_16( st->element_mode, IVAS_SCE ) && ( EQ_16( st_ivas->hEncoderConfig->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) )
+ {
+ igf_brate = L_sub( st->total_brate, i_mult( ISM_NB_BITS_METADATA_NOMINAL, FRAMES_PER_SEC ) );
+ }
+ ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && ( EQ_16( st_ivas->hEncoderConfig->ivas_format, SBA_FORMAT ) ||
+ EQ_16( st_ivas->hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ||
+ EQ_16( st_ivas->hEncoderConfig->ivas_format, MC_FORMAT ) ||
+ EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_FORMAT ) ) ) )
+ {
+ /* use nominal bitrates for DFT Stereo and (O)SBA, same as in stereo_dft_config()/ivas_spar_config() */
+ IF( EQ_32( element_brate, IVAS_13k2 ) )
+ {
+ igf_brate = ACELP_9k60;
+ }
+ ELSE IF( EQ_32( element_brate, IVAS_16k4 ) )
+ {
+ igf_brate = ACELP_13k20;
+ }
+ ELSE IF( EQ_32( element_brate, IVAS_24k4 ) )
+ {
+ igf_brate = ACELP_16k40;
+ }
+ ELSE IF( EQ_32( element_brate, IVAS_32k ) )
+ {
+ igf_brate = ACELP_24k40;
+ }
+ }
+ ELSE IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
+ {
+ igf_brate = element_brate;
+ }
+ move32();
+ test();
+ IF( EQ_16( st->codec_mode, MODE2 ) || GT_16( st->element_mode, EVS_MONO ) )
+ {
+ st->igf = getIgfPresent_fx( st->element_mode, igf_brate, st->max_bwidth, st->rf_mode );
+ }
+ ELSE
+ {
+ st->igf = 0;
+ }
+ move16();
+
+ test();
+ test();
+ test();
+ IF( ( idchan == 0 || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) && ( st->igf || st->element_mode == EVS_MONO ) )
+ {
+ IF( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
+ }
+ }
+ ELSE
+ {
+ st->hIGFEnc = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Mode 2 initialization
+ *-----------------------------------------------------------------*/
+
+ st->last_sr_core = L_mult0( st->last_L_frame, FRAMES_PER_SEC );
+ move32();
+
+
+ /* PLC encoder */
+ IF( st->element_mode == EVS_MONO )
+ {
+ IF( ( st->hPlcExt = (PLC_ENC_EVS_HANDLE) malloc( sizeof( PLC_ENC_EVS ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hPlcExt\n" ) );
+ }
+ }
+ ELSE
+ {
+ st->hPlcExt = NULL;
+ }
+
+ /* Init Mode 2 core coder */
+ st->last_totalNoise_fx = 0;
+ move16();
+ set16_fx( st->totalNoise_increase_hist_fx, 0, TOTALNOISE_HIST_SIZE );
+ st->totalNoise_increase_len = 0;
+ move16();
+#ifdef IVAS_FLOAT_FIXED_CONVERSIONS
+ TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
+ IF( hTcxEnc != NULL )
+ {
+ hTcxEnc->L_frameTCX = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); /* 0x0290 is 1/FRAMES_PER_SEC in Q15*/
+ move16();
+ }
+ st->currEnergyHF_fx = 0;
+ move32();
+ st->currEnergyHF_e_fx = 0;
+ move16();
+#ifdef MSAN_FIX
+ st->prevEnergyHF_fx = 0;
+ move32();
+#endif
+
+ /* Initialize TCX */
+
+ /* Initialize Signal Buffers */
+ Word16 shift = getScaleFactor16( st->old_inp_16k_fx, L_INP_MEM );
+ Scale_sig( st->old_inp_16k_fx, L_INP_MEM, shift );
+ st->exp_old_inp_16k = sub( st->exp_old_inp_16k, shift );
+ move16();
+ shift = getScaleFactor16( st->old_inp_12k8_fx, L_INP_MEM );
+ Scale_sig( st->old_inp_12k8_fx, L_INP_MEM, shift );
+ st->exp_old_inp_12k8 = sub( st->exp_old_inp_12k8, shift );
+ move16();
+ /* Initialize ACELP */
+#endif
+#ifdef FIX_920_IGF_INIT_ERROR
+ init_coder_ace_plus_ivas_fx( st, st->last_total_brate, igf_brate, 0 );
+#else
+ init_coder_ace_plus_ivas_fx( st, st->last_total_brate, 0 );
+#endif
+
+ IF( st->hLPDmem != NULL )
+ {
+ st->hLPDmem->q_lpd_old_exc = st->prev_Q_new;
+ move16();
+ }
+ /*-----------------------------------------------------------------*
+ * FD-CNG encoder
+ *-----------------------------------------------------------------*/
+
+ test();
+ test();
+ test();
+ test();
+ IF( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) )
+ {
+ createFdCngEnc_fx( &st->hFdCngEnc );
+ initFdCngEnc_fx( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale );
+ /* initialization for IVAS modes happens in first frame pre-processing */
+ IF( st->element_mode == EVS_MONO )
+ {
+ Word32 total_brate;
+
+ test();
+ IF( st->rf_mode && EQ_32( st->total_brate, ACELP_13k20 ) )
+ {
+ total_brate = ACELP_9k60;
+ move32();
+ }
+ ELSE
+ {
+ total_brate = st->total_brate;
+ move32();
+ }
+
+ configureFdCngEnc_ivas_fx( st->hFdCngEnc, st->bwidth, total_brate );
+ }
+ }
+ ELSE
+ {
+ st->hFdCngEnc = NULL;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Transient detector
+ *-----------------------------------------------------------------*/
+
+ IF( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) );
+ }
+ Word16 temp;
+ Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp );
+ frame_length = shr( frame_length, sub( 15, temp ) );
+
+ IF( GT_16( st->element_mode, EVS_MONO ) )
+ {
+ InitTransientDetection_ivas_fx( frame_length, 0, st->hTranDet, 1 );
+ }
+ ELSE
+ {
+ InitTransientDetection_ivas_fx( frame_length, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 );
+ }
+
+ /*-----------------------------------------------------------------*
+ * IVAS parameters
+ *-----------------------------------------------------------------*/
+
+ st->tdm_LRTD_flag = 0;
+ move16();
+ st->cng_sba_flag = 0;
+ move16();
+ st->bits_frame_channel = 0;
+ move16();
+ st->side_bits_frame_channel = 0;
+ move16();
+ st->Q_syn2 = 0;
+ move16();
+ st->Q_syn = 0;
+ move16();
+ set16_fx( st->Q_max, Q_MAX, L_Q_MEM );
+ set16_fx( st->Q_max_16k, Q_MAX, L_Q_MEM );
+ st->Q_old = 15;
+ move16();
+ st->old_wsp_max = 0;
+ move16();
+ st->old_wsp_shift = 0;
+ move16();
+ st->sharpFlag = 0;
+ move16();
+
+ return error;
+}
+
+
+/*-----------------------------------------------------------------------*
+ * destroy_cldfb_encoder()
+ *
+ * Free memory which was allocated in init_encoder()
+ *-----------------------------------------------------------------------*/
+
+void destroy_cldfb_encoder_fx(
+ Encoder_State *st /* i/o: Encoder static variables structure */
+)
+{
+ deleteCldfb_ivas_fx( &st->cldfbSynTd );
+ deleteCldfb_ivas_fx( &st->cldfbAnaEnc );
+
+ deleteFdCngEnc_fx( &st->hFdCngEnc );
+
+ return;
+}
diff --git a/lib_enc/inov_enc.c b/lib_enc/inov_enc.c
deleted file mode 100644
index 08f1e768fd1b91f4ee491e9fb12b1c9883f5b2cf..0000000000000000000000000000000000000000
--- a/lib_enc/inov_enc.c
+++ /dev/null
@@ -1,49 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "ivas_prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-
-/*---------------------------------------------------------------------*
- * inov_encode()
- *
- * Encode the algebraic innovation
- *---------------------------------------------------------------------*/
diff --git a/lib_enc/isf_enc_amr_wb.c b/lib_enc/isf_enc_amr_wb.c
deleted file mode 100644
index 7bb7c56fef7c52986fa854abb5a3d93eb18bcd1c..0000000000000000000000000000000000000000
--- a/lib_enc/isf_enc_amr_wb.c
+++ /dev/null
@@ -1,43 +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 "options.h"
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c
index 0dd0f5aa1e4c86f492163a04675fe7e4060f9090..eb82aa78a39177678b00136ccd5c6910322f6e6e 100644
--- a/lib_enc/ivas_entropy_coder.c
+++ b/lib_enc/ivas_entropy_coder.c
@@ -35,6 +35,7 @@
#include "options.h"
#include "ivas_cnst.h"
#include "prot.h"
+#include "prot_fx.h"
#include "ivas_prot.h"
#include "ivas_rom_com.h"
#include "math.h"
@@ -174,7 +175,7 @@ static Word16 ivas_arith_encode_array_fx(
pCum_freq = pArith->cum_freq[0]; /* Q0 */
}
- ari_start_encoding_14bits( &as );
+ ari_start_encoding_14bits_ivas_fx( &as );
FOR( i = 0; i < in_len; i++ )
{
diff --git a/lib_enc/lead_indexing.c b/lib_enc/lead_indexing.c
deleted file mode 100644
index 3a6a477b9966906fbba99ec77ad972026bca9f86..0000000000000000000000000000000000000000
--- a/lib_enc/lead_indexing.c
+++ /dev/null
@@ -1,208 +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 "options.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * Local function prototypes
- *-------------------------------------------------------------------*/
-
-static int16_t fcb_encode_pos( const int16_t pos_vector[], const int16_t pulse_num, const int16_t pos_num );
-
-
-/*-------------------------------------------------------------------*
- * re8_compute_base_index:
- *
- * Compute base index for RE8
- *-------------------------------------------------------------------*/
-
-void re8_compute_base_index(
- const int16_t *x, /* i : Elemen of Q2, Q3 or Q4 */
- const int16_t ka, /* i : Identifier of the absolute leader related to x */
- uint16_t *I /* o : index */
-)
-{
- int16_t i, j, k1, m;
- int16_t setor_8p[8], setor_8p_temp[8];
- int16_t sign_8p;
- int16_t code_index, code_level, code_area;
- uint16_t offset;
- const int16_t *a1, *a2;
-
- a1 = vals_a[ka];
- a2 = vals_q[ka];
-
- /* the sign process */
-
- sign_8p = 0;
- m = 0;
- code_index = 0;
- k1 = a2[0];
-
- if ( ( a2[1] == 2 ) && ( a1[0] ^ 1 ) && ( ka != 5 ) )
- {
- for ( i = 0; i < 8; i++ )
- {
- if ( x[i] != 0 )
- {
- sign_8p = sign_8p * 2;
- setor_8p_temp[m] = i;
- m++;
- }
- if ( x[i] < 0 )
- {
- sign_8p += 1;
- }
- }
-
- code_index = fcb_encode_pos( setor_8p_temp, 8, m );
- code_index = ( code_index << k1 ) + sign_8p;
-
- offset = Is[ka];
-
-
- *I = offset + code_index;
- }
- else
- {
- for ( i = 0; i < 8; i++ )
- {
- setor_8p[i] = (int16_t) abs( x[i] );
-
- if ( x[i] < 0 )
- {
- sign_8p = sign_8p * 2 + 1;
- m++;
- }
- if ( x[i] > 0 )
- {
- sign_8p = sign_8p * 2;
- m++;
- }
- }
-
- if ( k1 != m )
- {
- sign_8p = sign_8p >> 1;
- }
-
- /* code level by level */
-
- code_level = a2[1];
- code_area = 8;
-
- if ( a2[2] != 1 )
- {
- for ( j = 0; j < code_level - 1; j++ )
- {
- m = 0;
-
- for ( i = 0; i < code_area; i++ )
- {
- if ( setor_8p[i] != a1[j] )
- {
- setor_8p_temp[m] = i;
- setor_8p[m] = setor_8p[i];
- m++;
- }
- }
- code_index *= select_table22[m][code_area];
-
- code_index += fcb_encode_pos( setor_8p_temp, code_area, m );
-
- code_area = m;
- }
- }
- else
- {
- for ( i = 0; i < code_area; i++ )
- {
- if ( setor_8p[i] == a1[1] )
- {
- code_index += i;
- }
- }
- }
-
- code_index = ( code_index << k1 ) + sign_8p;
-
- offset = Is[ka];
-
- *I = offset + code_index;
- }
-
- return;
-}
-
-/*-------------------------------------------------------------------*
- * fcb_encode_pos:
- *
- * Base function to compute base index for RE8
- *-------------------------------------------------------------------*/
-
-/*! r: Code index */
-static int16_t fcb_encode_pos(
- const int16_t pos_vector[], /* i : Position vectort */
- const int16_t pulse_num, /* i : Pulse number */
- const int16_t pos_num /* i : Position number */
-)
-{
- int16_t i, j;
- int16_t code_index;
- int16_t temp, temp1;
- const int16_t *select_table23;
-
- temp = pulse_num - 1;
-
- select_table23 = select_table22[pos_num];
-
- code_index = select_table23[pulse_num] - select_table23[pulse_num - pos_vector[0]];
-
- for ( i = 0, j = 1; i < pos_num - 1; i++, j++ )
- {
- temp1 = pos_num - j;
-
- select_table23 = select_table22[temp1];
-
- code_index += select_table23[temp - pos_vector[i]] - select_table23[pulse_num - pos_vector[j]];
- }
-
- return code_index;
-}
diff --git a/lib_enc/long_enr.c b/lib_enc/long_enr.c
deleted file mode 100644
index 31ab8f0198feb70a1b66b00aee7f81040f085bf8..0000000000000000000000000000000000000000
--- a/lib_enc/long_enr.c
+++ /dev/null
@@ -1,47 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-/*-------------------------------------------------------------------*
- * long_enr()
- *
- * Compute relative energy, long-term average total noise energy and total active speech energy
- *-------------------------------------------------------------------*/
diff --git a/lib_enc/lp_exc_e.c b/lib_enc/lp_exc_e.c
deleted file mode 100644
index 5c3581f4f1c4bf43ac4c588aedcfcb74046e0acb..0000000000000000000000000000000000000000
--- a/lib_enc/lp_exc_e.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c
deleted file mode 100644
index 3ac84b28ece9055d9f0ba0895ac2151e540ebe62..0000000000000000000000000000000000000000
--- a/lib_enc/lsf_enc.c
+++ /dev/null
@@ -1,49 +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 "options.h"
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "prot_fx.h"
-#include "prot_fx_enc.h"
-#include "basop_proto_func.h"
-#include "ivas_prot.h"
-#include "ivas_prot_fx.h"
-#include "ivas_rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/ltd_stable.c b/lib_enc/ltd_stable.c
deleted file mode 100644
index 0e2004abf2b74fc291df1fafb1f856b731c8e611..0000000000000000000000000000000000000000
--- a/lib_enc/ltd_stable.c
+++ /dev/null
@@ -1,41 +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 "options.h"
-#include
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/mdct_classifier.c b/lib_enc/mdct_classifier.c
deleted file mode 100644
index 047f023553e6d1c96b01303ed005550893a112a8..0000000000000000000000000000000000000000
--- a/lib_enc/mdct_classifier.c
+++ /dev/null
@@ -1,43 +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 "options.h"
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
-#include
-#include "ivas_prot_fx.h"
diff --git a/lib_enc/mdct_selector.c b/lib_enc/mdct_selector.c
deleted file mode 100644
index 952043e3aa0d31a41f84cf2a71d2fcf967ed9f46..0000000000000000000000000000000000000000
--- a/lib_enc/mdct_selector.c
+++ /dev/null
@@ -1,44 +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 "options.h"
-#include
-#include "cnst.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/mslvq_enc.c b/lib_enc/mslvq_enc.c
deleted file mode 100644
index a49d435c35bdad42f98067b91db5a115f334ec92..0000000000000000000000000000000000000000
--- a/lib_enc/mslvq_enc.c
+++ /dev/null
@@ -1,308 +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 "options.h"
-#include
-#include "prot.h"
-#include "prot_fx.h"
-#include "rom_com.h"
-#include "cnst.h"
-#include "wmc_auto.h"
-#include "ivas_prot.h"
-
-/*-----------------------------------------------------------------*
- * Local function prototypes
- *-----------------------------------------------------------------*/
-
-Word32 quantize_data_ivas_fx( Word16 *data, const Word16 *w_in, Word16 *qin, Word16 *cv_out, Word16 *idx_lead, Word16 *idx_scale, const Word16 *sigma, const Word16 *inv_sigma, const Word16 *scales, const Word16 *no_lead );
-
-/*-----------------------------------------------------------------*
- * mslvq()
- *
- * Encodes the LSF residual
- *-----------------------------------------------------------------*/
-
-Word32 mslvq_ivas_16(
- Word16 *pTmp, /* i : M-dimensional input vector */
- Word16 *quant, /* o : quantized vector */
- Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */
- Word16 *idx_lead, /* o : leader index for each 8-dim subvector */
- Word16 *idx_scale, /* o : scale index for each subvector */
- const Word16 *w, /* i : weights for LSF quantization */
- const Word16 mode, /* i : number indicating the coding type (V/UV/G...)*/
- const Word16 mode_glb, /* i : LVQ coding mode */
- const Word16 pred_flag /* i : prediction flag (0: safety net, 1,2 - predictive )*/
- /*Retunr dist in q 22*/
-)
-{
- Word32 dist, L_tmp;
- const Word16 *p_scales, *p_sigma, *p_inv_sigma;
- Word16 i, tmp, tmp1;
- Word16 p_no_lead[MAX_NO_SCALES * 2];
- dist = L_deposit_l( 0 );
- IF( pred_flag == 0 )
- {
- p_sigma = sigma_MSLVQ_fx[mode];
- /* inverse sigma is precomputed to save complexity */
- p_inv_sigma = inv_sigma_MSLVQ_fx[mode];
- p_scales = scales_ivas_fx[mode_glb];
-
- tmp = no_lead_idx[mode_glb][0];
- move16();
- tmp1 = no_lead_idx[mode_glb][1];
- move16();
- test();
- if ( LE_16( tmp, LIMIT_LEADER ) && LT_16( tmp, sub( tmp1, 2 ) ) )
- {
- tmp = add( tmp, DELTA_LEADER );
- }
- FOR( i = 0; i < MAX_NO_SCALES; i++ )
- {
- p_no_lead[i] = (Word16) leaders_short[tmp][i];
- move16();
- p_no_lead[i + MAX_NO_SCALES] = (Word16) leaders_short[tmp1][i];
- move16();
- }
- }
- ELSE
- {
- IF( GE_16( pred_flag, 5 ) )
- {
- /* assert( pred_flag >= 12 && pred_flag <= 15 ); */
- /* pred_flag is here the number of bits for MSLVQ */
-
- p_sigma = &modified_sigma_BWE_fx[mode_glb * LATTICE_DIM];
-
- /* inverse sigma is precomputed to save complexity */
- p_inv_sigma = &inv_modified_sigma_BWE_fx[mode_glb * LATTICE_DIM];
- IF( mode_glb == 0 )
- {
- p_scales = &scales_BWE_fx_new[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )];
-
- FOR( i = 0; i < MAX_NO_SCALES; i++ )
- {
- p_no_lead[i] = (Word16) no_lead_BWE[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3];
- move16();
- }
- }
- ELSE
- {
- p_scales = &scales_BWE_3b_fx_new[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )];
- FOR( i = 0; i < MAX_NO_SCALES; i++ )
- {
- p_no_lead[i] = (Word16) no_lead_BWE_3b[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3];
- move16();
- }
- }
- }
- ELSE
- {
- p_sigma = sigma_p_fx[mode];
-
- /* inverse sigma is precomputed to save complexity */
- p_inv_sigma = inv_sigma_p_fx[mode];
-
- p_scales = scales_p_ivas_fx[mode_glb];
-
- tmp = no_lead_p_idx[mode_glb][0];
- move16();
- tmp1 = no_lead_p_idx[mode_glb][1];
- move16();
-
- test();
- IF( LE_16( tmp, LIMIT_LEADER ) && LT_16( tmp, sub( tmp1, 2 ) ) )
- {
- tmp = add( tmp, DELTA_LEADER );
- }
-
- test();
- IF( EQ_16( tmp, LIMIT_LEADER ) && ( tmp1 == 0 ) )
- {
- tmp = add( tmp, DELTA_LEADER );
- tmp1 = add( tmp1, DELTA_LEADER );
- }
-
- FOR( i = 0; i < MAX_NO_SCALES; i++ )
- {
- p_no_lead[i] = (Word16) leaders_short[tmp][i];
- move16();
- p_no_lead[i + MAX_NO_SCALES] = (Word16) leaders_short[tmp1][i];
- move16();
- }
- }
- }
-
- /* first subvector */
- dist = quantize_data_ivas_fx( pTmp, w, quant, cv_out, idx_lead, idx_scale,
- p_sigma, p_inv_sigma, p_scales, p_no_lead );
-
- IF( LT_16( pred_flag, 5 ) )
- {
- /* second subvector */
- L_tmp = quantize_data_ivas_fx( pTmp + LATTICE_DIM, w + LATTICE_DIM, quant + LATTICE_DIM, cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, p_no_lead + MAX_NO_SCALES );
-
- dist = L_add( dist, L_tmp );
- }
-
- return dist;
-}
-
-/*-----------------------------------------------------------------*
- * mslvq_cng()
- *
- * Encodes the LSF residual in SID frames
- *-----------------------------------------------------------------*/
-
-/*-----------------------------------------------------------------*
- * prepare_data()
- *
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * calculate_min_dist()
- *
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * quantize_data()
- *
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * index_lvq()
- *
- * sorts in descending order and computes indices in the sorted vector
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * encode_comb()
- *
- * creates an index for the lattice codevector
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * index_leaders()
- *
- * gives the index in a class of leaders without considering the sign yet
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * find_pos()
- *
- * Finds the positions in vector c for which the vector components are equal to 'arg'.
- * It returns the number of such positions and their values in the array 'p'.
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * encode_sign_pc1()
- *
- * Creates an index for signs of the significant codevector components
- * Gives the index of the signs - binary representation where negative sign stands for 1
- * and positive sign stands for 1.
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * take_out_val()
- *
- * removes the value val from the vector v
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * c2idx()
- *
- *-----------------------------------------------------------------*/
-
-
-/*-----------------------------------------------------------------*
- * index_lvq_SHB()
- *
- *-----------------------------------------------------------------*/
-
-
-UWord32 index_lvq_SHB_fx(
- const Word16 idx_lead,
- const Word16 idx_scale,
- const Word16 nbits,
- Word16 *lat_cv,
- const Word16 mode )
-{
- UWord16 i;
- const Word8 *p_no_lead;
- UWord32 index;
-
- IF( mode == 0 )
- {
- p_no_lead = &no_lead_BWE[( nbits - mslvq_SHB_min_bits[0] ) * 3];
- }
- ELSE
- {
- p_no_lead = &no_lead_BWE_3b[( nbits - mslvq_SHB_min_bits[1] ) * 3];
- }
-
- index = 0;
- move32();
- IF( GT_16( idx_lead, -1 ) )
- {
- index = 1;
- move32();
- FOR( i = 0; i < idx_scale; i++ )
- {
- index = index + table_no_cv[p_no_lead[i]];
- move32();
- }
-
- IF( idx_lead > 0 )
- {
- index = index + table_no_cv[idx_lead];
- move32();
- }
-
- index = index + encode_comb_fx( lat_cv, idx_lead );
- move32();
- }
-
- return index;
-}
diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c
index b6445443bdf549b9e0775e347e3554317373a111..d8a78c525a728498ecd3e950fea9840031e3e7b3 100644
--- a/lib_enc/mslvq_enc_fx.c
+++ b/lib_enc/mslvq_enc_fx.c
@@ -1140,3 +1140,180 @@ Word16 c2idx_fx( /* o: index */
return tmp;
}
}
+
+/*-----------------------------------------------------------------*
+ * mslvq()
+ *
+ * Encodes the LSF residual
+ *-----------------------------------------------------------------*/
+
+Word32 mslvq_ivas_16(
+ Word16 *pTmp, /* i : M-dimensional input vector */
+ Word16 *quant, /* o : quantized vector */
+ Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */
+ Word16 *idx_lead, /* o : leader index for each 8-dim subvector */
+ Word16 *idx_scale, /* o : scale index for each subvector */
+ const Word16 *w, /* i : weights for LSF quantization */
+ const Word16 mode, /* i : number indicating the coding type (V/UV/G...)*/
+ const Word16 mode_glb, /* i : LVQ coding mode */
+ const Word16 pred_flag /* i : prediction flag (0: safety net, 1,2 - predictive )*/
+ /*Retunr dist in q 22*/
+)
+{
+ Word32 dist, L_tmp;
+ const Word16 *p_scales, *p_sigma, *p_inv_sigma;
+ Word16 i, tmp, tmp1;
+ Word16 p_no_lead[MAX_NO_SCALES * 2];
+ dist = L_deposit_l( 0 );
+ IF( pred_flag == 0 )
+ {
+ p_sigma = sigma_MSLVQ_fx[mode];
+ /* inverse sigma is precomputed to save complexity */
+ p_inv_sigma = inv_sigma_MSLVQ_fx[mode];
+ p_scales = scales_ivas_fx[mode_glb];
+
+ tmp = no_lead_idx[mode_glb][0];
+ move16();
+ tmp1 = no_lead_idx[mode_glb][1];
+ move16();
+ test();
+ if ( LE_16( tmp, LIMIT_LEADER ) && LT_16( tmp, sub( tmp1, 2 ) ) )
+ {
+ tmp = add( tmp, DELTA_LEADER );
+ }
+ FOR( i = 0; i < MAX_NO_SCALES; i++ )
+ {
+ p_no_lead[i] = (Word16) leaders_short[tmp][i];
+ move16();
+ p_no_lead[i + MAX_NO_SCALES] = (Word16) leaders_short[tmp1][i];
+ move16();
+ }
+ }
+ ELSE
+ {
+ IF( GE_16( pred_flag, 5 ) )
+ {
+ /* assert( pred_flag >= 12 && pred_flag <= 15 ); */
+ /* pred_flag is here the number of bits for MSLVQ */
+
+ p_sigma = &modified_sigma_BWE_fx[mode_glb * LATTICE_DIM];
+
+ /* inverse sigma is precomputed to save complexity */
+ p_inv_sigma = &inv_modified_sigma_BWE_fx[mode_glb * LATTICE_DIM];
+ IF( mode_glb == 0 )
+ {
+ p_scales = &scales_BWE_fx_new[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )];
+
+ FOR( i = 0; i < MAX_NO_SCALES; i++ )
+ {
+ p_no_lead[i] = (Word16) no_lead_BWE[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3];
+ move16();
+ }
+ }
+ ELSE
+ {
+ p_scales = &scales_BWE_3b_fx_new[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )];
+ FOR( i = 0; i < MAX_NO_SCALES; i++ )
+ {
+ p_no_lead[i] = (Word16) no_lead_BWE_3b[i + ( pred_flag - mslvq_SHB_min_bits[mode_glb] ) * 3];
+ move16();
+ }
+ }
+ }
+ ELSE
+ {
+ p_sigma = sigma_p_fx[mode];
+
+ /* inverse sigma is precomputed to save complexity */
+ p_inv_sigma = inv_sigma_p_fx[mode];
+
+ p_scales = scales_p_ivas_fx[mode_glb];
+
+ tmp = no_lead_p_idx[mode_glb][0];
+ move16();
+ tmp1 = no_lead_p_idx[mode_glb][1];
+ move16();
+
+ test();
+ IF( LE_16( tmp, LIMIT_LEADER ) && LT_16( tmp, sub( tmp1, 2 ) ) )
+ {
+ tmp = add( tmp, DELTA_LEADER );
+ }
+
+ test();
+ IF( EQ_16( tmp, LIMIT_LEADER ) && ( tmp1 == 0 ) )
+ {
+ tmp = add( tmp, DELTA_LEADER );
+ tmp1 = add( tmp1, DELTA_LEADER );
+ }
+
+ FOR( i = 0; i < MAX_NO_SCALES; i++ )
+ {
+ p_no_lead[i] = (Word16) leaders_short[tmp][i];
+ move16();
+ p_no_lead[i + MAX_NO_SCALES] = (Word16) leaders_short[tmp1][i];
+ move16();
+ }
+ }
+ }
+
+ /* first subvector */
+ dist = quantize_data_ivas_fx( pTmp, w, quant, cv_out, idx_lead, idx_scale,
+ p_sigma, p_inv_sigma, p_scales, p_no_lead );
+
+ IF( LT_16( pred_flag, 5 ) )
+ {
+ /* second subvector */
+ L_tmp = quantize_data_ivas_fx( pTmp + LATTICE_DIM, w + LATTICE_DIM, quant + LATTICE_DIM, cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, p_no_lead + MAX_NO_SCALES );
+
+ dist = L_add( dist, L_tmp );
+ }
+
+ return dist;
+}
+
+
+UWord32 index_lvq_SHB_fx(
+ const Word16 idx_lead,
+ const Word16 idx_scale,
+ const Word16 nbits,
+ Word16 *lat_cv,
+ const Word16 mode )
+{
+ UWord16 i;
+ const Word8 *p_no_lead;
+ UWord32 index;
+
+ IF( mode == 0 )
+ {
+ p_no_lead = &no_lead_BWE[( nbits - mslvq_SHB_min_bits[0] ) * 3];
+ }
+ ELSE
+ {
+ p_no_lead = &no_lead_BWE_3b[( nbits - mslvq_SHB_min_bits[1] ) * 3];
+ }
+
+ index = 0;
+ move32();
+ IF( GT_16( idx_lead, -1 ) )
+ {
+ index = 1;
+ move32();
+ FOR( i = 0; i < idx_scale; i++ )
+ {
+ index = index + table_no_cv[p_no_lead[i]];
+ move32();
+ }
+
+ IF( idx_lead > 0 )
+ {
+ index = index + table_no_cv[idx_lead];
+ move32();
+ }
+
+ index = index + encode_comb_fx( lat_cv, idx_lead );
+ move32();
+ }
+
+ return index;
+}
diff --git a/lib_enc/multi_harm.c b/lib_enc/multi_harm.c
deleted file mode 100644
index 5c3581f4f1c4bf43ac4c588aedcfcb74046e0acb..0000000000000000000000000000000000000000
--- a/lib_enc/multi_harm.c
+++ /dev/null
@@ -1,42 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/nelp_enc.c b/lib_enc/nelp_enc.c
deleted file mode 100644
index 7ea6e47a56c1a7f087419f3073eeecbdeb81478f..0000000000000000000000000000000000000000
--- a/lib_enc/nelp_enc.c
+++ /dev/null
@@ -1,43 +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 "options.h"
-#include
-#include "cnst.h"
-#include "prot.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/pit_enc.c b/lib_enc/pit_enc.c
deleted file mode 100644
index 5bde0f4503d545d15fb515fb0bc947ee2facc8cb..0000000000000000000000000000000000000000
--- a/lib_enc/pit_enc.c
+++ /dev/null
@@ -1,45 +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
-#include "cnst.h"
-#include "prot.h"
-#include "rom_enc.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/pitch_ol.c b/lib_enc/pitch_ol.c
deleted file mode 100644
index 0853fd9fd0e6e923fc8273f4d49ce38608b3526e..0000000000000000000000000000000000000000
--- a/lib_enc/pitch_ol.c
+++ /dev/null
@@ -1,48 +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 "options.h"
-#include
-#include "prot.h"
-#include "cnst.h"
-#include "rom_com.h"
-#include "rom_enc.h"
-#include "wmc_auto.h"
-
-/*---------------------------------------------------------------------*
- * Local constants
- *---------------------------------------------------------------------*/
diff --git a/lib_enc/pitch_ol2.c b/lib_enc/pitch_ol2.c
deleted file mode 100644
index dc77e0dfa8c9a7dea75feea530732e532626ca70..0000000000000000000000000000000000000000
--- a/lib_enc/pitch_ol2.c
+++ /dev/null
@@ -1,274 +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 "options.h"
-#include "cnst.h"
-#include "rom_enc.h"
-#include "prot.h"
-#include "wmc_auto.h"
-
-#include "prot_fx.h" /* Function prototypes */
-#include "prot_fx_enc.h" /* Function prototypes */
-
-/*-------------------------------------------------------------------*
- * Local constants
- *-------------------------------------------------------------------*/
-
-#define MAX_DELTA 16 /* half-length of the delta search */
-#define COR_BUF_LEN ( L_INTERPOL1 * 2 + MAX_DELTA * 2 + 1 )
-/*-------------------------------------------------------------------*
- * pitch_ol2()
- *
- * Open-loop pitch precision improvement with 1/4 resolution
- * The pitch is searched in the interval 0 )
- {
- ratio = 0;
- move16();
- }
- ELSE
- {
- ratio = s_max( sub( energy1_16, energy0_16 ), 0 ); /*Q7 */
- }
- /*ratio *= max(voicing,0);*/
- tmp = s_max( voicing_m, 0 );
- ratio = mult_r( ratio, tmp ); /*Q7*/
- /**LF_EnergyRatio_sm = (15*(*LF_EnergyRatio_sm) + ratio)/16;*/
- L_tmp = L_mult( ratio, 2048 );
- L_tmp = L_mac( L_tmp, *LF_EnergyRatio_sm, 30720 );
- *LF_EnergyRatio_sm = round_fx( L_tmp );
- move16();
- test();
- if ( GT_16( *LF_EnergyRatio_sm, 4480 /*35.0f Q7*/ ) || GT_16( ratio, 6400 /*50.0f Q7*/ ) )
- {
- *predecision_flag = 1;
- move16();
- }
-
- if ( LT_16( *LF_EnergyRatio_sm, 2048 /*16.0f Q7*/ ) )
- {
- *predecision_flag = 0;
- move16();
- }
-
- /* short pitch candidate detection */
- Tp = pitch[1];
- move16();
- cor_max = 0;
- move16();
- pt_wsp = wsp + 3 * L_SUBFR;
- pit_min = PIT_MIN_DOUBLEEXTEND;
- move16();
- pit_min_up = PIT_MIN;
- move16();
- FOR( T = pit_min; T <= pit_min_up; T++ )
- {
- energy1 = Dot_product( pt_wsp, pt_wsp - T, L_SUBFR );
- test();
- IF( ( GT_32( energy1, cor_max ) ) || ( EQ_16( T, pit_min ) ) )
- {
- cor_max = L_add( energy1, 0 );
- Tp = T;
- move16();
- }
- }
- energy0 = Dot_product12( pt_wsp, pt_wsp, L_SUBFR, &exp1 );
- exp1 = sub( exp1, shl( Q_new, 1 ) );
- energy1 = Dot_product12( pt_wsp - Tp, pt_wsp - Tp, L_SUBFR, &exp2 );
- exp2 = sub( exp2, shl( Q_new, 1 ) );
- /* cor_max *= inv_sqrt( energy0*energy1 );*/
- L_tmp = Mult_32_32( energy0, energy1 );
- exp = norm_l( L_tmp );
- L_tmp1 = L_shl( L_tmp, exp );
-
- exp = sub( sub( 31, exp ), ( sub( sub( 31, exp1 ), exp2 ) ) );
- move16();
- L_tmp1 = Isqrt_lc( L_tmp1, &exp ); /*Q(31-exp)*/
- cor_max = Mult_32_32( cor_max, L_tmp1 );
- exp = add( sub( sub( 31, add( shl( Q_new, 1 ), 1 ) ), sub( 31, exp ) ), 31 );
- cor_max16 = round_fx_o( L_shl_o( cor_max, exp, &Overflow ), &Overflow ); /*Q15*/
- /**voicing0_sm = add(mult_r(24576 ,(*voicing0_sm)) , mult_r(8192 , cor_max16));*/
- *voicing0_sm = round_fx( L_mac( L_mult( 24576 /*.75f Q15*/, *voicing0_sm ), 8192 /*.25f Q15*/, cor_max16 ) );
- move16();
-
- /* final short pitch detection */
- test();
- test();
- test();
- *flag_spitch = 0;
- move16();
- IF( ( EQ_16( localVAD, 1 ) ) && ( EQ_16( *predecision_flag, 1 ) ) &&
- ( GT_16( *voicing0_sm, 21299 /*.65f in Q15*/ ) ) && ( GT_16( *voicing0_sm, mult_r( *voicing_sm, 22938 /*.7f in Q15*/ ) ) ) )
- {
- *flag_spitch = 1;
- move16();
- pitch[0] = Tp;
- move16();
- pitch[1] = Tp;
- move16();
- pitch[2] = Tp;
- move16();
- }
-
- return;
-}
diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c
index 5d68216c934793aa5e0cc6c1d9835d10358e0ec3..7ca13171ea309caea5710891b929962bcc6914b9 100644
--- a/lib_enc/pitch_ol2_fx.c
+++ b/lib_enc/pitch_ol2_fx.c
@@ -404,3 +404,227 @@ void StableHighPitchDetect_fx(
return;
}
+
+
+/*-------------------------------------------------------------------*
+ * pitch_ol2()
+ *
+ * Open-loop pitch precision improvement with 1/4 resolution
+ * The pitch is searched in the interval 0 )
+ {
+ ratio = 0;
+ move16();
+ }
+ ELSE
+ {
+ ratio = s_max( sub( energy1_16, energy0_16 ), 0 ); /*Q7 */
+ }
+ /*ratio *= max(voicing,0);*/
+ tmp = s_max( voicing_m, 0 );
+ ratio = mult_r( ratio, tmp ); /*Q7*/
+ /**LF_EnergyRatio_sm = (15*(*LF_EnergyRatio_sm) + ratio)/16;*/
+ L_tmp = L_mult( ratio, 2048 );
+ L_tmp = L_mac( L_tmp, *LF_EnergyRatio_sm, 30720 );
+ *LF_EnergyRatio_sm = round_fx( L_tmp );
+ move16();
+ test();
+ if ( GT_16( *LF_EnergyRatio_sm, 4480 /*35.0f Q7*/ ) || GT_16( ratio, 6400 /*50.0f Q7*/ ) )
+ {
+ *predecision_flag = 1;
+ move16();
+ }
+
+ if ( LT_16( *LF_EnergyRatio_sm, 2048 /*16.0f Q7*/ ) )
+ {
+ *predecision_flag = 0;
+ move16();
+ }
+
+ /* short pitch candidate detection */
+ Tp = pitch[1];
+ move16();
+ cor_max = 0;
+ move16();
+ pt_wsp = wsp + 3 * L_SUBFR;
+ pit_min = PIT_MIN_DOUBLEEXTEND;
+ move16();
+ pit_min_up = PIT_MIN;
+ move16();
+ FOR( T = pit_min; T <= pit_min_up; T++ )
+ {
+ energy1 = Dot_product( pt_wsp, pt_wsp - T, L_SUBFR );
+ test();
+ IF( ( GT_32( energy1, cor_max ) ) || ( EQ_16( T, pit_min ) ) )
+ {
+ cor_max = L_add( energy1, 0 );
+ Tp = T;
+ move16();
+ }
+ }
+ energy0 = Dot_product12( pt_wsp, pt_wsp, L_SUBFR, &exp1 );
+ exp1 = sub( exp1, shl( Q_new, 1 ) );
+ energy1 = Dot_product12( pt_wsp - Tp, pt_wsp - Tp, L_SUBFR, &exp2 );
+ exp2 = sub( exp2, shl( Q_new, 1 ) );
+ /* cor_max *= inv_sqrt( energy0*energy1 );*/
+ L_tmp = Mult_32_32( energy0, energy1 );
+ exp = norm_l( L_tmp );
+ L_tmp1 = L_shl( L_tmp, exp );
+
+ exp = sub( sub( 31, exp ), ( sub( sub( 31, exp1 ), exp2 ) ) );
+ move16();
+ L_tmp1 = Isqrt_lc( L_tmp1, &exp ); /*Q(31-exp)*/
+ cor_max = Mult_32_32( cor_max, L_tmp1 );
+ exp = add( sub( sub( 31, add( shl( Q_new, 1 ), 1 ) ), sub( 31, exp ) ), 31 );
+ cor_max16 = round_fx_o( L_shl_o( cor_max, exp, &Overflow ), &Overflow ); /*Q15*/
+ /**voicing0_sm = add(mult_r(24576 ,(*voicing0_sm)) , mult_r(8192 , cor_max16));*/
+ *voicing0_sm = round_fx( L_mac( L_mult( 24576 /*.75f Q15*/, *voicing0_sm ), 8192 /*.25f Q15*/, cor_max16 ) );
+ move16();
+
+ /* final short pitch detection */
+ test();
+ test();
+ test();
+ *flag_spitch = 0;
+ move16();
+ IF( ( EQ_16( localVAD, 1 ) ) && ( EQ_16( *predecision_flag, 1 ) ) &&
+ ( GT_16( *voicing0_sm, 21299 /*.65f in Q15*/ ) ) && ( GT_16( *voicing0_sm, mult_r( *voicing_sm, 22938 /*.7f in Q15*/ ) ) ) )
+ {
+ *flag_spitch = 1;
+ move16();
+ pitch[0] = Tp;
+ move16();
+ pitch[1] = Tp;
+ move16();
+ pitch[2] = Tp;
+ move16();
+ }
+
+ return;
+}
diff --git a/lib_enc/plc_enc_ext.c b/lib_enc/plc_enc_ext.c
deleted file mode 100644
index 17c76dee67fc489632e6e0b9e4fbe376f10bb4a6..0000000000000000000000000000000000000000
--- a/lib_enc/plc_enc_ext.c
+++ /dev/null
@@ -1,43 +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 "options.h"
-#include "prot.h"
-#include "stat_enc.h"
-#include "cnst.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
diff --git a/lib_enc/setmodeindex.c b/lib_enc/setmodeindex.c
deleted file mode 100644
index b7ff1d2b6e0168346e72a3b932262e7de13286c1..0000000000000000000000000000000000000000
--- a/lib_enc/setmodeindex.c
+++ /dev/null
@@ -1,97 +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 "options.h"
-#include "prot.h"
-#include "cnst.h"
-#include "ivas_cnst.h"
-#include "wmc_auto.h"
-#include "prot_fx.h"
-
-/*---------------------------------------------------------------------------
-
- function name: SetModeIndex
- description: function for configuring the codec between frames - currently bitrate and bandwidth only
- must not be called while a frame is encoded - hence mutexes must be used in MT environments
-
- format: BANDWIDTH*16 + BITRATE (mode index)
-
- ---------------------------------------------------------------------------*/
-
-void SetModeIndex_ivas_fx(
- Encoder_State *st, /* i : Encoder state */
- const Word32 last_total_brate, /* i : last total bitrate Q0*/
- const Word16 last_element_mode, /* i : last IVAS element mode Q0*/
- const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) Q0*/
-)
-{
- Word16 ini_frame_loc = st->ini_frame; // Q0
- move16();
-
- test();
- test();
- IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( last_element_mode, IVAS_CPE_MDCT ) && EQ_16( st->idchan, 1 ) )
- {
- st->ini_frame = 0;
- move16();
- }
-
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- /* Reconfigure the core coder */
- IF( ( NE_32( last_total_brate, st->total_brate ) ) ||
- ( NE_16( st->last_bwidth, st->bwidth ) ) ||
- ( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->element_mode, EVS_MONO ) ) ||
- ( ( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) && GT_16( st->element_mode, EVS_MONO ) ) ||
- ( NE_16( st->rf_mode_last, st->rf_mode ) ) ||
- ( st->element_mode > EVS_MONO && st->ini_frame == 0 ) )
- {
- core_coder_mode_switch_ivas_fx( st, last_total_brate, MCT_flag );
- }
-
- st->ini_frame = ini_frame_loc; // Q0
- move16();
-
- return;
-}
diff --git a/lib_enc/setmodeindex_fx.c b/lib_enc/setmodeindex_fx.c
index fc3025f5132805d4827637794a00375fb9202f2d..012c5757f2b9ea041c5bb4541e580f11fd27e656 100644
--- a/lib_enc/setmodeindex_fx.c
+++ b/lib_enc/setmodeindex_fx.c
@@ -55,3 +55,48 @@ void SetModeIndex_fx(
return;
}
+
+
+void SetModeIndex_ivas_fx(
+ Encoder_State *st, /* i : Encoder state */
+ const Word32 last_total_brate, /* i : last total bitrate Q0*/
+ const Word16 last_element_mode, /* i : last IVAS element mode Q0*/
+ const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0) Q0*/
+)
+{
+ Word16 ini_frame_loc = st->ini_frame; // Q0
+ move16();
+
+ test();
+ test();
+ IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( last_element_mode, IVAS_CPE_MDCT ) && EQ_16( st->idchan, 1 ) )
+ {
+ st->ini_frame = 0;
+ move16();
+ }
+
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ /* Reconfigure the core coder */
+ IF( ( NE_32( last_total_brate, st->total_brate ) ) ||
+ ( NE_16( st->last_bwidth, st->bwidth ) ) ||
+ ( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->element_mode, EVS_MONO ) ) ||
+ ( ( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) && GT_16( st->element_mode, EVS_MONO ) ) ||
+ ( NE_16( st->rf_mode_last, st->rf_mode ) ) ||
+ ( st->element_mode > EVS_MONO && st->ini_frame == 0 ) )
+ {
+ core_coder_mode_switch_ivas_fx( st, last_total_brate, MCT_flag );
+ }
+
+ st->ini_frame = ini_frame_loc; // Q0
+ move16();
+
+ return;
+}