diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1a99781cf92b7e61cfa6b71cc1c9df8f502b4a06..d296ff540b02f53c1e71ce3e2db9d16ff70b29fb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -752,6 +752,10 @@ stages:
script:
- *print-common-info
+ # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE
+ - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAXIMUM_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAXIMUM_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv
+ - mkdir $IMAGES_ARTIFACT_NAME
+
- set -euxo pipefail
- if [ -s $FAILED_TESTCASES_LIST ]; then
@@ -797,7 +801,6 @@ stages:
- mv tests/dut tests/dut_branch
# create the summary based on the branch
- - mkdir $IMAGES_ARTIFACT_NAME
- for MEASURE in MLD DIFF SSNR ODG;do python3 scripts/create_histogram_summary.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; done
- python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME
@@ -899,7 +902,7 @@ stages:
- set -euxo pipefail
- make_args="CLANG=$CLANG_NUM"
- if [[ $CLANG_NUM == 3 ]]; then
- - export UBSAN_OPTIONS="suppressions=scripts/ubsan_basop.supp,report_error_type=1"
+ - export UBSAN_OPTIONS="suppressions=scripts/ubsan_basop.supp,report_error_type=1,print_stacktrace=1"
- python3 scripts/basop_create_ignorelist_for_ubsan.py
- make_args="$make_args IGNORELIST=1"
- fi
diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj
index 4f40c8799a9d989123f553116067c1996e8e7f47..b44f506e1087e79c05c8a5af879d00220246487d 100644
--- a/Workspace_msvc/lib_com.vcxproj
+++ b/Workspace_msvc/lib_com.vcxproj
@@ -279,7 +279,6 @@
-
@@ -321,7 +320,6 @@
-
diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters
index eaacf1ba7ad247881e7aca1e8a8b2b1064ebc275..fb912becb20bc6ec6b66c5497a8d666e20a5e1c2 100644
--- a/Workspace_msvc/lib_com.vcxproj.filters
+++ b/Workspace_msvc/lib_com.vcxproj.filters
@@ -430,9 +430,6 @@
common_all_c
-
- common_all_c
-
common_all_c
@@ -575,9 +572,6 @@
common_h
-
- common_h
-
common_h
@@ -621,7 +615,7 @@
common_h
- common_all_c
+ common_h
diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c
index 79a659eb08094da54b43617b4ee77772b5a21c66..d8d4563ed3a60fdf6325d71a81a73384c100f911 100644
--- a/lib_com/bitstream.c
+++ b/lib_com/bitstream.c
@@ -1660,281 +1660,6 @@ static void decoder_selectCodec(
return;
}
-/*-------------------------------------------------------------------*
- * dec_prm_core()
- *
- *
- *-------------------------------------------------------------------*/
-
-static void dec_prm_core(
- Decoder_State *st )
-{
- int16_t n, frame_size_index = -1;
-
- st->core = -1;
-
- if ( st->total_brate == FRAME_NO_DATA )
- {
- st->m_frame_type = ZERO_FRAME;
- }
- else if ( st->total_brate == SID_2k40 )
- {
- st->m_frame_type = SID_FRAME;
- }
- else
- {
- st->m_frame_type = ACTIVE_FRAME;
- for ( n = 0; n < FRAME_SIZE_NB; ++n )
- {
- if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC )
- {
- frame_size_index = n;
- break;
- }
- }
-
- /* Get audio bandwidth info */
- st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits );
- st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min;
- if ( st->bwidth > FB )
- {
- st->bwidth = FB;
- st->BER_detect = 1;
- }
-
- if ( st->bwidth > SWB && st->total_brate < ACELP_16k40 )
- {
- st->bwidth = SWB;
- st->BER_detect = 1;
- }
- /* Skip reserved bit */
- get_next_indice_tmp( st, FrameSizeConfig[frame_size_index].reserved_bits );
-
- if ( get_next_indice_1( st ) ) /* TCX */
- {
- if ( get_next_indice_1( st ) )
- {
- st->core = HQ_CORE;
- }
- else
- {
- st->core = TCX_20_CORE;
- }
- }
- else /* ACELP */
- {
- st->core = ACELP_CORE;
- }
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * decision_matrix_core_dec()
- *
- * Read core signaling bits from the bitstream
- * Set st->core, and st->bwidth if signalled together with the core.
- *-----------------------------------------------------------------*/
-
-static void decision_matrix_core_dec(
- Decoder_State *st /* i/o: decoder state structure */
-)
-{
- int16_t start_idx;
- int32_t ind;
- int16_t nBits;
-
- assert( st->bfi != 1 );
-
- st->core = -1;
- st->bwidth = -1;
-
- if ( st->total_brate == FRAME_NO_DATA || st->total_brate == SID_2k40 )
- {
- st->core = ACELP_CORE;
- }
- /* SC-VBR */
- else if ( st->total_brate == PPP_NELP_2k80 )
- {
- st->core = ACELP_CORE;
- return;
- }
-
- /*---------------------------------------------------------------------*
- * ACELP/HQ core selection
- *---------------------------------------------------------------------*/
-
- if ( st->total_brate < ACELP_24k40 )
- {
- st->core = ACELP_CORE;
- }
- else if ( st->total_brate >= ACELP_24k40 && st->total_brate <= ACELP_64k )
- {
- /* read the ACELP/HQ core selection bit */
- st->core = get_next_indice( st, 1 ) * HQ_CORE;
- }
- else
- {
- st->core = HQ_CORE;
- }
-
- /*-----------------------------------------------------------------*
- * Read ACELP signaling bits from the bitstream
- *-----------------------------------------------------------------*/
-
- if ( st->core == ACELP_CORE )
- {
- /* find the section in the ACELP signaling table corresponding to bitrate */
- start_idx = 0;
- while ( acelp_sig_tbl[start_idx] != st->total_brate )
- {
- start_idx++;
- }
-
- /* skip the bitrate */
- start_idx += 1;
-
- /* retrieve the number of bits */
- nBits = (int16_t) acelp_sig_tbl[start_idx++];
-
- /* retrieve the signaling indice */
- ind = acelp_sig_tbl[start_idx + get_next_indice( st, nBits )];
- st->bwidth = ( ind >> 3 ) & 0x7;
-
- /* convert signaling indice into signaling information */
- if ( ( ind & 0x7 ) == LR_MDCT )
- {
- st->core = HQ_CORE;
- }
- }
-
- /*-----------------------------------------------------------------*
- * Read HQ signaling bits from the bitstream
- * Set HQ core type
- *-----------------------------------------------------------------*/
-
- if ( st->core == HQ_CORE )
- {
- /* read the HQ/TCX core switching flag */
- if ( get_next_indice( st, 1 ) )
- {
- st->core = TCX_20_CORE;
- }
-
- /* For TCX: read/set band-width (needed for different I/O sampling rate support) */
- if ( st->core == TCX_20_CORE && st->total_brate > ACELP_16k40 )
- {
- ind = get_next_indice( st, 2 );
-
- if ( ind == 0 )
- {
- st->bwidth = NB;
- }
- else if ( ind == 1 )
- {
- st->bwidth = WB;
- }
- else if ( ind == 2 )
- {
- st->bwidth = SWB;
- }
- else
- {
- st->bwidth = FB;
- }
- }
- }
-
- return;
-}
-
-/*-------------------------------------------------------------------*
- * mdct_switching_dec()
- *
- * Set up MDCT core switching if indicated in the bitstream
- *-------------------------------------------------------------------*/
-
-void mdct_switching_dec_ivas_fx(
- Decoder_State *st /* i/o: decoder state structure */
-)
-{
- if ( !st->bfi )
- {
-
- if ( st->Opt_AMR_WB )
- {
- return;
- }
-
-
- if ( st->total_brate == ACELP_13k20 || st->total_brate == ACELP_32k )
- {
- st->mdct_sw_enable = MODE1;
- }
- else if ( ACELP_16k40 <= st->total_brate && st->total_brate <= ACELP_24k40 )
- {
- st->mdct_sw_enable = MODE2;
- }
-
- if ( st->codec_mode == MODE1 && st->mdct_sw_enable == MODE1 )
- {
- /* Read ahead core signaling */
- int16_t next_bit_pos_save = st->next_bit_pos;
- int16_t core_save = st->core;
- int16_t bwidth_save = st->bwidth;
-
- decision_matrix_core_dec( st ); /* sets st->core */
-
- if ( st->core == TCX_20_CORE )
- {
- /* Trigger TCX */
- st->codec_mode = MODE2;
- st->mdct_sw = MODE1;
- }
- else
- {
- /* Rewind bitstream */
- st->next_bit_pos = next_bit_pos_save;
- if ( st->bfi )
- {
- st->core = core_save;
- st->bwidth = bwidth_save;
- }
- }
- }
- else if ( st->codec_mode == MODE2 && st->mdct_sw_enable == MODE2 )
- {
- /* Read ahead core signaling */
- int16_t next_bit_pos_save = st->next_bit_pos;
- int16_t core_save = st->core;
- int16_t bwidth_save = st->bwidth;
-
- dec_prm_core( st ); /* sets st->core */
-
- if ( st->core == HQ_CORE )
- {
- /* Trigger HQ_CORE */
- st->codec_mode = MODE1;
- st->mdct_sw = MODE2;
- }
- else
- {
- /* Rewind bitstream */
- st->next_bit_pos = next_bit_pos_save;
- if ( st->bfi )
- {
- st->core = core_save;
- }
- /* always reset bwidth, to not interfere with BER logic */
- st->bwidth = bwidth_save;
- }
- }
- }
-
- return;
-}
-
/*-------------------------------------------------------------------*
* reset_elements()
diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c
index d4938f399607265c110c754aa2eba32587d817b8..712a6905e67e78a5d38bc6406266f5d933fe86f3 100644
--- a/lib_com/bitstream_fx.c
+++ b/lib_com/bitstream_fx.c
@@ -143,29 +143,6 @@ void pack_bit(
return;
}
-/*-------------------------------------------------------------------*
- * unpack_bit()
- *
- * unpack a bit from packed octet
- *-------------------------------------------------------------------*/
-static Word16 unpack_bit(
- UWord8 **pt, /* i/o: pointer to octet array from which bit will be read */
- UWord8 *mask /* i/o: mask to indicate the bit in the octet */
-)
-{
- Word16 bit;
-
- bit = s_and( **pt, *mask ) != 0;
- *mask = (UWord8) shr( *mask, 1 );
- move16();
- IF( *mask == 0 )
- {
- *mask = 0x80;
- move16();
- ( *pt )++;
- }
- return bit;
-}
/*-------------------------------------------------------------------*
* rate2AMRWB_IOmode()
@@ -945,154 +922,6 @@ return;
}
-static void decoder_selectCodec(
- Decoder_State *st, /* i/o: decoder state structure */
- const Word32 total_brate, /* i : total bitrate */
- const Word16 bit0 )
-{
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- /* check if we are in AMR-WB IO mode */
- IF( EQ_32( total_brate, SID_1k75 ) ||
- EQ_32( total_brate, ACELP_6k60 ) || EQ_32( total_brate, ACELP_8k85 ) || EQ_32( total_brate, ACELP_12k65 ) ||
- EQ_32( total_brate, ACELP_14k25 ) || EQ_32( total_brate, ACELP_15k85 ) || EQ_32( total_brate, ACELP_18k25 ) ||
- EQ_32( total_brate, ACELP_19k85 ) || EQ_32( total_brate, ACELP_23k05 ) || EQ_32( total_brate, ACELP_23k85 ) )
- {
- st->Opt_AMR_WB = 1;
- move16();
- }
- ELSE IF( total_brate != FRAME_NO_DATA )
- {
- st->Opt_AMR_WB = 0;
- move16();
- }
-
- /* select MODE1 or MODE2 */
- IF( st->Opt_AMR_WB )
- {
- st->codec_mode = MODE1;
- move16(); /**/
- }
- ELSE
- {
- SWITCH( total_brate )
- {
- case 0:
- st->codec_mode = st->last_codec_mode;
- move16();
- BREAK;
- case 2400:
- st->codec_mode = st->last_codec_mode;
- move16();
- BREAK;
- case 2800:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 7200:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 8000:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 9600:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- case 13200:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 16400:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- case 24400:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- case 32000:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 48000:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- case 64000:
- st->codec_mode = MODE1;
- move16();
- BREAK;
- case 96000:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- case 128000:
- st->codec_mode = MODE2;
- move16();
- BREAK;
- default:
- /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bit rates */
- st->codec_mode = st->last_codec_mode;
- st->bfi = 1;
- move16();
- move16();
- BREAK;
- }
- }
-
- IF( st->ini_frame == 0 )
- {
- if ( EQ_16( st->codec_mode, -1 ) )
- {
- st->codec_mode = MODE1;
- move16();
- }
- st->last_codec_mode = st->codec_mode;
- move16();
- }
-
- /* set SID/CNG type */
- IF( EQ_32( total_brate, SID_2k40 ) )
- {
- IF( EQ_16( bit0, G192_BIN0 ) )
- {
- st->cng_type = LP_CNG;
- move16();
-
- /* force MODE1 when selecting LP_CNG */
- st->codec_mode = MODE1;
- move16();
- }
- ELSE
- {
- st->cng_type = FD_CNG;
- move16();
- test();
- if ( EQ_16( st->last_codec_mode, MODE2 ) && EQ_32( st->last_total_brate, 13200 ) )
- {
- st->codec_mode = MODE1;
- move16();
- }
- }
- st->hTdCngDec->last_cng_type_fx = st->cng_type; /* CNG type switching at the first correctly received SID frame */
- move16();
- }
-
-
- return;
-}
-
-
static void dec_prm_core( Decoder_State *st )
{
Word16 n, frame_size_index, num_bits;
@@ -1320,109 +1149,115 @@ static void decision_matrix_core_dec(
* Set up MDCT core switching if indicated in the bit stream
*-------------------------------------------------------------------*/
-static void mdct_switching_dec(
+void mdct_switching_dec_fx(
Decoder_State *st /* i/o: decoder state structure */
)
{
- IF( st->Opt_AMR_WB != 0 )
- {
- return;
- }
-
- test();
- test();
- IF( EQ_32( st->total_brate, ACELP_13k20 ) || EQ_32( st->total_brate, ACELP_32k ) )
- {
- st->mdct_sw_enable = MODE1;
- move16();
- }
- ELSE IF( LE_32( ACELP_16k40, st->total_brate ) && LE_32( st->total_brate, ACELP_24k40 ) )
+ if ( !st->bfi )
{
- st->mdct_sw_enable = MODE2;
- move16();
- }
-
- test();
- test();
- IF( EQ_16( st->codec_mode, MODE1 ) && EQ_16( st->mdct_sw_enable, MODE1 ) )
- {
- /* Read ahead core mode signaling */
- Word16 next_bit_pos_save;
- Word16 core_save;
- Word16 bwidth_save;
-
- next_bit_pos_save = st->next_bit_pos;
- move16();
- core_save = st->core;
- move16();
- bwidth_save = st->bwidth;
- move16();
-
- decision_matrix_core_dec( st ); /* sets st->core */
+ IF( st->Opt_AMR_WB != 0 )
+ {
+ return;
+ }
- IF( EQ_16( st->core, TCX_20_CORE ) )
+ test();
+ test();
+ IF( EQ_32( st->total_brate, ACELP_13k20 ) || EQ_32( st->total_brate, ACELP_32k ) )
{
- /* Trigger TCX */
- st->codec_mode = MODE2;
+ st->mdct_sw_enable = MODE1;
move16();
- st->mdct_sw = MODE1;
+ }
+ ELSE IF( LE_32( ACELP_16k40, st->total_brate ) && LE_32( st->total_brate, ACELP_24k40 ) )
+ {
+ st->mdct_sw_enable = MODE2;
move16();
}
- ELSE
+
+ test();
+ test();
+ IF( EQ_16( st->codec_mode, MODE1 ) && EQ_16( st->mdct_sw_enable, MODE1 ) )
{
- /* Rewind bitstream */
- st->next_bit_pos = next_bit_pos_save;
+ /* Read ahead core mode signaling */
+ Word16 next_bit_pos_save;
+ Word16 core_save;
+ Word16 bwidth_save;
+
+ next_bit_pos_save = st->next_bit_pos;
+ move16();
+ core_save = st->core;
+ move16();
+ bwidth_save = st->bwidth;
move16();
- IF( st->bfi != 0 )
+
+ decision_matrix_core_dec( st ); /* sets st->core */
+
+ IF( EQ_16( st->core, TCX_20_CORE ) )
{
- st->core = core_save;
+ /* Trigger TCX */
+ st->codec_mode = MODE2;
move16();
- st->bwidth = bwidth_save;
+ st->mdct_sw = MODE1;
+ move16();
+ }
+ ELSE
+ {
+ /* Rewind bitstream */
+ st->next_bit_pos = next_bit_pos_save;
move16();
+ IF( st->bfi != 0 )
+ {
+ st->core = core_save;
+ move16();
+ st->bwidth = bwidth_save;
+ move16();
+ }
}
}
- }
- ELSE IF( EQ_16( st->codec_mode, MODE2 ) && EQ_16( st->mdct_sw_enable, MODE2 ) )
- {
- /* Read ahead core mode signaling */
- Word16 next_bit_pos_save;
- Word16 core_save;
- Word16 bwidth_save;
-
- next_bit_pos_save = st->next_bit_pos;
- move16();
- core_save = st->core;
- move16();
- bwidth_save = st->bwidth;
- move16();
-
- dec_prm_core( st ); /* sets st->core */
-
- IF( EQ_16( st->core, HQ_CORE ) )
+ ELSE IF( EQ_16( st->codec_mode, MODE2 ) && EQ_16( st->mdct_sw_enable, MODE2 ) )
{
- /* Trigger HQ_CORE */
- st->codec_mode = MODE1;
+ /* Read ahead core mode signaling */
+ Word16 next_bit_pos_save;
+ Word16 core_save;
+ Word16 bwidth_save;
+
+ next_bit_pos_save = st->next_bit_pos;
move16();
- st->mdct_sw = MODE2;
+ core_save = st->core;
move16();
- }
- ELSE
- {
- /* Rewind bitstream */
- st->next_bit_pos = next_bit_pos_save;
+ bwidth_save = st->bwidth;
move16();
- if ( st->bfi != 0 )
+
+ dec_prm_core( st ); /* sets st->core */
+
+ IF( EQ_16( st->core, HQ_CORE ) )
{
- st->core = core_save;
+ /* Trigger HQ_CORE */
+ st->codec_mode = MODE1;
+ move16();
+ st->mdct_sw = MODE2;
+ move16();
+ }
+ ELSE
+ {
+ /* Rewind bitstream */
+ st->next_bit_pos = next_bit_pos_save;
+ move16();
+ if ( st->bfi != 0 )
+ {
+ st->core = core_save;
+ move16();
+ }
+ /* always reset bwidth, to not interfere with BER logic */
+ st->bwidth = bwidth_save;
move16();
}
- /* always reset bwidth, to not interfere with BER logic */
- st->bwidth = bwidth_save;
- move16();
}
}
+
+ return;
}
+
/*-------------------------------------------------------------------*
* BRATE2IDX_fx()
*
@@ -1548,594 +1383,84 @@ Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 t
return L_temp;
}
+
/*-------------------------------------------------------------------*
- * read_indices_mime_handle_dtx()
+ * berCheck()
*
- * Handle DTX for MIME and RTP_DUMP decoding.
- * Returns the actual total_brate.
+ * Check for bit errors in channel aware signalling.
*-------------------------------------------------------------------*/
-static Word32 read_indices_mime_handle_dtx(
- Decoder_State *st,
- Word16 isAMRWB_IOmode,
- Word16 core_mode,
- Word32 total_brate,
- Word16 sti,
- Word16 speech_lost,
- Word16 no_data )
+static void berCheck(
+ Decoder_State *st, /* i/o: decoder state structure */
+ Word16 *coder_type /* i/o: coder type */
+)
{
- Word16 curr_ft_good_sp = 0;
- Word16 speech_bad = 0;
- Word16 sid_upd_bad = 0, sid_update = 0;
- Word16 amrwb_sid_first = 0; /* derived from sti SID_FIRST indicator in AMRWB payload */
- move16();
- move16();
- move16();
- move16();
- move16();
-
- /* keep st->CNG , st_bfi and total_brate updated for proper synthesis in DTX and FER */
- IF( GT_32( total_brate, SID_2k40 ) )
+ /* In case of RF flag = 1, and valid RF packet with primary and partial copy */
+ test();
+ test();
+ IF( ( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, FB ) ) || ( GE_16( *coder_type, TRANSITION ) ) )
{
- if ( NE_16( st->bfi, 1 ) ) /* so far derived from q bit in AMRWB/AMRWBIO cases */
+ if ( EQ_16( st->use_partial_copy, 1 ) )
{
- curr_ft_good_sp = 1;
+ st->use_partial_copy = 0;
move16();
}
- }
- /* handle q_bit and lost_sp clash , assume worst case */
- IF( speech_lost != 0 ) /* overrides a good q_bit */
- {
- curr_ft_good_sp = 0;
+ st->bfi = 1;
+ move16();
+ st->bwidth = st->last_bwidth;
+ move16();
+ st->BER_detect = 1;
move16();
- st->bfi = 1; /* override qbit */
+ *coder_type = GENERIC;
move16();
}
- /* now_bfi_fx has been set based on q_bit and ToC fields */
+ return;
+}
+/*-------------------------------------------------------------------*
+ * getPartialCopyInfo()
+ *
+ * Check if the frame includes a partial copy for channel aware processing.
+ *-------------------------------------------------------------------*/
- /* SID_UPDATE check */
- test();
- IF( EQ_32( total_brate, SID_1k75 ) || EQ_32( total_brate, SID_2k40 ) )
+void getPartialCopyInfo(
+ Decoder_State *st, /* i/o: decoder state structure */
+ Word16 *coder_type,
+ Word16 *sharpFlag )
+{
+ Word16 nBits;
+ Word16 ind;
+ /* check the rf flag in the packet */
+ get_rfFlag( st, &( st->rf_flag ), &nBits, &ind );
+
+ /* get rf frame type info */
+ get_rfFrameType( st, &( st->rf_frame_type ) );
+
+ /* Get the FEC offset info */
+ get_rf_fec_offset( st, &( st->rf_fec_offset ) );
+
+ /* reset number of target bits in case of rate switching */
+ st->rf_target_bits = 0;
+ move16();
+
+ /* Get the number of bits used for RF*/
+ IF( EQ_16( st->rf_flag, 1 ) )
{
- IF( st->bfi == 0 )
+ *coder_type = s_and( ind, 0x7 );
+ move16();
+ st->bwidth = s_and( shr( ind, 3 ), 0x7 );
+ move16();
+ *sharpFlag = s_and( shr( ind, 6 ), 0x1 );
+ move16();
+ st->codec_mode = MODE2;
+ move16();
+ get_rfTargetBits( st->rf_frame_type, &( st->rf_target_bits ) );
+
+ IF( EQ_16( st->bfi, FRAMEMODE_FUTURE ) )
{
- /* typically from q bit */
- sid_update = 1;
- move16();
- }
- ELSE
- {
- sid_upd_bad = 1; /* may happen in saving from e.g. a CS-connection */
- move16();
- }
- }
-
- test();
- test();
- IF( isAMRWB_IOmode && total_brate == 0 && sti == 0 )
- {
- IF( st->bfi )
- {
- sid_upd_bad = 1; /* corrupt sid_first, signaled as bad sid */
- move16();
- }
- ELSE
- {
- amrwb_sid_first = 1; /* 1-sti */
- move16();
- }
- }
-
- test();
- test();
- test();
- test();
- IF( sid_upd_bad != 0 && ( ( isAMRWB_IOmode != 0 && st->Opt_AMR_WB == 0 ) || /* switch to AMRWBIO */
- ( NE_16( isAMRWB_IOmode, 1 ) && EQ_16( st->Opt_AMR_WB, 1 ) ) /* switch from AMRWBIO */
- ) )
- {
- /* do not allow a normal start of CNG synthesis if this SID(with BER or FER) is a switch to/from AMRWBIO */
- sid_upd_bad = 0; /* revert this detection due to AMRWBIO/EVS mode switch */
- move16();
- total_brate = 0;
- move32();
- no_data = 1;
- move16();
- assert( st->bfi == 1 ); /* bfi stays 1 */
- }
-
- test();
- if ( GT_32( total_brate, SID_2k40 ) && EQ_16( st->bfi, 1 ) ) /* typically from q bit */
- {
- speech_bad = 1; /* initial assumption, CNG synt state decides what to actually do */
- move16();
- }
- /* all frame types decoded */
-
- /* update CNG synthesis state */
- /* Decoder can only enter CNG-synthesis for CNG frame types (sid_upd, sid_bad, sid_first) */
- IF( st->CNG_fx != 0 )
- {
- /* We were in CNG synthesis */
- if ( curr_ft_good_sp != 0 )
- {
- /* only a good speech frame makes decoder leave CNG synthesis */
- st->CNG_fx = 0;
- move16();
- }
- }
- ELSE
- {
- /* We were in SPEECH synthesis */
- /* only a received SID frame can make the decoder enter into CNG synthesis */
- test();
- test();
- if ( amrwb_sid_first || sid_update || sid_upd_bad )
- {
- st->CNG_fx = 1;
- move16();
- }
- }
-
- /* Now modify bfi flag for the decoder's SPEECH/CNG synthesis logic */
- /* in SPEECH synthesis, make sure to activate speech plc for a received no_data frame,
- no_data frames may be injected by the network or by the dejitter buffer */
- /* modify bfi_flag to stay/move into the correct decoder PLC section */
- test();
- if ( ( st->CNG_fx == 0 ) && ( no_data != 0 ) )
- {
- /* treat no_data received in speech synthesis as SP_LOST frames, SPEECH PLC code will now become active */
- st->bfi = 1;
- move16();
- /* total_brate= 0; always zero for no_data */
- }
-
- /* in CNG */
- /* handle bad speech frame(and bad sid frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */
- test();
- test();
- test();
- test();
- IF( ( st->CNG_fx != 0 && ( speech_bad || speech_lost || no_data ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */
- sid_upd_bad ) /* SID_UPD_BAD --> start/stay CNG */
- {
- st->bfi = 0; /* mark as good to not start speech PLC */
- move16();
- total_brate = 0; /* this zeroing needed for speech_bad, sid_bad frames */
- move32();
- }
-
-
- /* now bfi, total_brate are set by RX-DTX handler::
- bfi==0, total_brate!=0 cng or speech pending bitrate
- bfi==0, total_brate==0 cng will continue or start(sid_first, sid_bad)
- bfi==1, total_brate!=0 speech plc
- bfi==1, total_brate==0 , speech plc
- */
-
-
- /* handle available AMRWB/AMRWBIO MIME header ToC rate-info at startup */
- test();
- test();
- test();
- test();
- IF( ( EQ_16( st->bfi, 1 ) && st->ini_frame == 0 ) &&
- ( ( st->amrwb_rfc4867_flag != 0 ) || ( st->amrwb_rfc4867_flag == 0 && isAMRWB_IOmode != 0 ) ) ) /*AMRWB ToC */
- {
- Word32 init_rate;
-
- init_rate = total_brate; /* default , may have been modified from original ToC value */
- move32();
-
- test();
- IF( speech_lost != 0 || no_data != 0 )
- {
- init_rate = ACELP_12k65; /* make sure the decoder starts up in a selected AMRWB mode */
- move32();
- }
- ELSE IF( speech_bad != 0 )
- {
- init_rate = AMRWB_IOmode2rate[core_mode]; /* read from from ToC */
- move32();
- }
- st->total_brate = init_rate; /* not updated on bfi as decoderSelectCodec is not called below */
- move32();
- st->core_brate = init_rate;
- move32();
- }
-
- return total_brate;
-}
-
-
-/*-------------------------------------------------------------------*
- * read_indices_mime_handle_sti_and_all_zero_bits()
- *
- * Handle STI and frames with all zero bits for MIME and RTP_DUMP decoding.
- *-------------------------------------------------------------------*/
-
-static void read_indices_mime_handle_sti_and_all_zero_bits(
- Decoder_State *st,
- Word32 *total_brate,
- Word16 sti )
-{
- Word16 k;
-
- IF( sti == 0 )
- {
- *total_brate = 0; /* signal received SID_FIRST as a good frame with no bits */
- move32();
- FOR( k = 0; k < 35; k++ )
- {
- st->bfi = s_or( st->bfi, st->bit_stream[k] ); /* partity check of 35 zeroes, any single 1 gives BFI */
- move16();
- }
- }
- /* all zero bit SID_update results in a valid LP filter with extremely high LP-filter-gain */
- /* all zero bits signal may be a result of CS bit errors or erronesouly injected by gateways or bad dejitter handlers */
- IF( EQ_16( sti, 1 ) )
- { /*sid_update received */
- Word16 sum = 0;
- move16();
- FOR( k = 0; k < 35; k++ )
- {
- sum = add( sum, st->bit_stream[k] ); /* check of 35 zeroes */
- }
-
- if ( sum == 0 )
- {
- st->bfi = 1; /* eventually becomes SID_UPD_BAD */
- move16();
- }
- }
-}
-
-
-/*------------------------------------------------------------------------------------------*
- * read_indices_mime()
- *
- * Read indices from MIME formatted bitstream to the buffer
- * The magic word and number of channnels should be consumed before calling this function
- *-------------------------------------------------------------------------------------------*/
-
-Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem */
- Decoder_State *st, /* i/o: decoder state structure */
- FILE *file, /* i : bitstream file */
- Word16 rew_flag /* i : rewind flag (rewind file after reading) */
-)
-{
- Word16 k, isAMRWB_IOmode, cmi, core_mode = -1, qbit, sti;
- UWord8 header;
- UWord8 pFrame[( MAX_BITS_PER_FRAME + 7 ) >> 3];
- UWord8 mask = 0x80, *pt_pFrame = pFrame;
- UWord16 *bit_stream_ptr;
- Word16 num_bits;
- Word32 total_brate;
- UWord16 utmp;
- Word32 L_tmp;
- Word16 speech_lost = 0, no_data = 0;
- Word16 num_bytes_read;
-
- move16();
- move16();
- move16();
- move16();
-
- st->BER_detect = 0;
- move16();
- st->bfi = 0;
- move16();
- st->mdct_sw_enable = 0;
- move16();
- st->mdct_sw = 0;
- move16();
- reset_indices_dec_fx( st );
-
- /* read the FT Header field from the bitstream */
- IF( NE_32( fread( &header, sizeof( UWord8 ), 1, file ), 1 ) )
- {
- IF( ferror( file ) )
- {
- /* error during reading */
- fprintf( stderr, "\nError reading the bitstream !" );
- exit( -1 );
- }
- ELSE
- {
- /* end of file reached */
- return 0;
- }
- }
-
- /* init local RXDTX flags */
- sti = -1;
- move16();
-
- IF( st->amrwb_rfc4867_flag != 0 )
- {
- /* RFC 4867
- 5.3 ....
- Each stored speech frame starts with a one-octet frame header with
- the following format:
- 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+
- |P| FT |Q|P|P|
- +-+-+-+-+-+-+-+-+
- The FT field and the Q bit are defined in the same way as in
- Section 4.3.2. The P bits are padding and MUST be set to 0, and MUST be ignored. */
-
- isAMRWB_IOmode = 1;
- move16();
- qbit = s_and( shr( header, 2 ), 0x01 ); /* b2 bit (b7 is the F bit ) */
- st->bfi = !qbit;
- move16();
- core_mode = s_and( shr( header, 3 ), 0x0F ); /* b6..b3 */
- total_brate = AMRWB_IOmode2rate[core_mode]; /* get the frame length from the header */
- move32();
- }
- ELSE
- {
- /*0 1 2 3 4 5 6 7 MS-bit ---> LS-bit
- +-+-+-+-+-+-+-+-+
- |H|F|E|x| brate |
- +-+-+-+-+-+-+-+-+
- where :
- "E|x| brate " is the 6 bit "FT" -field
- x is unused if E=0, (should be 0 )
- x is the q-bit if E=1, q==1(good), Q==0(bad, maybe bit errors in payload )
- H,F always 0 in RTP format.
- */
- isAMRWB_IOmode = extract_l( GT_16( s_and( header, 0x20 ), 0 ) ); /* get EVS mode-from header */ /* b2 */
- core_mode = s_and( header, 0x0F ); /* b4,b5,b6,b7 */
-
- IF( isAMRWB_IOmode )
- {
- qbit = extract_l( GT_16( s_and( header, 0x10 ), 0 ) ); /* get Q bit, valid for IO rates */ /* b3 */
- total_brate = AMRWB_IOmode2rate[core_mode];
- move32();
- }
- ELSE
- {
- qbit = 1; /* assume good q_bit for the unused EVS-mode bit, complete ToC validity checked later */
- move16();
- total_brate = PRIMARYmode2rate[core_mode];
- move32();
- }
- st->bfi = !qbit;
- move16();
- }
-
-
- /* set up RX-DTX-handler input */
- if ( EQ_16( core_mode, 14 ) )
- {
- /* SP_LOST */
- speech_lost = 1;
- move16();
- }
- if ( EQ_16( core_mode, 15 ) )
- {
- /* NO_DATA unsent CNG frame OR any frame marked or injected as no_data by e.g a signaling layer or dejitter buffer */
- no_data = 1;
- move16();
- }
-
- Mpy_32_16_ss( total_brate, 5243, &L_tmp, &utmp ); /* 5243 is 1/50 in Q18. (0+18-15=3) */
- num_bits = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */
- st->total_num_bits = num_bits;
- move16();
-
- IF( total_brate < 0 )
- {
- /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bit rates */
- fprintf( stderr, "\n Error. Illegal total bit rate (= %d) in MIME ToC header \n", total_brate );
- /* num_bits = -1; not needed as BASOP multiplication preserves sign */
- }
-
- /* Check correctness of ToC headers */
- IF( st->amrwb_rfc4867_flag == 0 )
- {
- /* EVS ToC header (FT field(b2-b7), H bit (b0), F bit (b1) , (EVS-modebit(b2)=0 unused(Qbit)(b3)==0) */
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( ( isAMRWB_IOmode == 0 ) && ( ( num_bits < 0 ) || ( s_and( header, 0x80 ) > 0 ) || ( s_and( header, 0x40 ) > 0 ) || s_and( header, 0x30 ) != 0x00 ) )
- {
- /* incorrect FT header */
- fprintf( stderr, "\nError in EVS FT ToC header(%02x) ! ", header );
- exit( -1 );
- }
- ELSE IF( ( isAMRWB_IOmode != 0 ) && ( ( num_bits < 0 ) || ( s_and( header, 0x80 ) > 0 ) || ( s_and( header, 0x40 ) > 0 ) ) ) /* AMRWBIO */
- {
- /* incorrect IO FT header */
- fprintf( stderr, "\nError in EVS(AMRWBIO) FT ToC header(%02x) ! ", header );
- exit( -1 );
- }
- }
- ELSE
- {
- /* legacy AMRWB ToC, is only using Padding bits which MUST be ignored */
- IF( num_bits < 0 )
- {
- /* incorrect FT header */
- fprintf( stderr, "\nError in AMRWB RFC4867 Toc(FT) header(%02x) !", header );
- exit( -1 );
- }
- }
-
- /* read serial stream of indices from file to the local buffer */
- num_bytes_read = extract_l( fread( pFrame, sizeof( UWord8 ), shr( add( num_bits, 7 ), 3 ), file ) );
- IF( NE_16( num_bytes_read, shr( add( num_bits, 7 ), 3 ) ) )
- {
- fprintf( stderr, "\nError, invalid number of bytes read ! Exiting ! \n" );
- exit( -1 );
- }
-
- /* in case rew_flag is set, rewind the file and return */
- /* (used in io_dec() to attempt print out info about technologies and to initialize the codec ) */
- IF( rew_flag )
- {
- st->total_brate = total_brate; /* used for the codec banner output */
- move32();
- test();
- test();
- IF( st->bfi == 0 && speech_lost == 0 && no_data == 0 )
- {
- decoder_selectCodec( st, total_brate, unpack_bit( &pt_pFrame, &mask ) ? G192_BIN1 : G192_BIN0 );
- }
- return 1;
- }
-
-
- /* unpack speech data */
- bit_stream_ptr = st->bit_stream;
- FOR( k = 0; k < num_bits; k++ )
- {
- IF( isAMRWB_IOmode )
- {
- st->bit_stream[sort_ptr[core_mode][k]] = unpack_bit( &pt_pFrame, &mask );
- move16();
- bit_stream_ptr++;
- }
- ELSE
- {
- *bit_stream_ptr++ = unpack_bit( &pt_pFrame, &mask );
- move16();
- }
- }
-
- /* unpack auxiliary bits */
- /* Note: the cmi bits are unpacked for demo purposes; */
- test();
- IF( isAMRWB_IOmode && EQ_32( total_brate, SID_1k75 ) )
- {
- sti = unpack_bit( &pt_pFrame, &mask );
- cmi = shl( unpack_bit( &pt_pFrame, &mask ), 3 );
- cmi = s_or( cmi, shl( unpack_bit( &pt_pFrame, &mask ), 2 ) );
- cmi = s_or( cmi, shl( unpack_bit( &pt_pFrame, &mask ), 1 ) );
- cmi = s_or( cmi, unpack_bit( &pt_pFrame, &mask ) );
-
- read_indices_mime_handle_sti_and_all_zero_bits( st, &total_brate, sti );
- }
-
- /*add two zero bytes for arithmetic coder flush*/
- FOR( k = 0; k < 2 * 8; ++k )
- {
- *bit_stream_ptr++ = 0;
- move16();
- }
-
- /* MIME RX_DTX handler */
- IF( !rew_flag )
- {
- total_brate = read_indices_mime_handle_dtx( st, isAMRWB_IOmode, core_mode, total_brate, sti, speech_lost, no_data );
- }
-
- IF( st->bfi == 0 )
- {
- /* select MODE1 or MODE2 in MIME */
- IF( *st->bit_stream )
- {
- decoder_selectCodec( st, total_brate, G192_BIN1 );
- }
- ELSE
- {
- decoder_selectCodec( st, total_brate, G192_BIN0 );
- }
- /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */
- st->total_brate = total_brate;
- move32();
- mdct_switching_dec( st );
- }
- /* else{ bfi stay in past synthesis mode(SP,CNG) } */
-
- return 1;
-}
-
-/*-------------------------------------------------------------------*
- * berCheck()
- *
- * Check for bit errors in channel aware signalling.
- *-------------------------------------------------------------------*/
-
-static void berCheck(
- Decoder_State *st, /* i/o: decoder state structure */
- Word16 *coder_type /* i/o: coder type */
-)
-{
- /* In case of RF flag = 1, and valid RF packet with primary and partial copy */
- test();
- test();
- IF( ( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, FB ) ) || ( GE_16( *coder_type, TRANSITION ) ) )
- {
- if ( EQ_16( st->use_partial_copy, 1 ) )
- {
- st->use_partial_copy = 0;
- move16();
- }
-
- st->bfi = 1;
- move16();
- st->bwidth = st->last_bwidth;
- move16();
- st->BER_detect = 1;
- move16();
- *coder_type = GENERIC;
- move16();
- }
-
- return;
-}
-
-/*-------------------------------------------------------------------*
- * getPartialCopyInfo()
- *
- * Check if the frame includes a partial copy for channel aware processing.
- *-------------------------------------------------------------------*/
-
-void getPartialCopyInfo(
- Decoder_State *st, /* i/o: decoder state structure */
- Word16 *coder_type,
- Word16 *sharpFlag )
-{
- Word16 nBits;
- Word16 ind;
- /* check the rf flag in the packet */
- get_rfFlag( st, &( st->rf_flag ), &nBits, &ind );
-
- /* get rf frame type info */
- get_rfFrameType( st, &( st->rf_frame_type ) );
-
- /* Get the FEC offset info */
- get_rf_fec_offset( st, &( st->rf_fec_offset ) );
-
- /* reset number of target bits in case of rate switching */
- st->rf_target_bits = 0;
- move16();
-
- /* Get the number of bits used for RF*/
- IF( EQ_16( st->rf_flag, 1 ) )
- {
- *coder_type = s_and( ind, 0x7 );
- move16();
- st->bwidth = s_and( shr( ind, 3 ), 0x7 );
- move16();
- *sharpFlag = s_and( shr( ind, 6 ), 0x1 );
- move16();
- st->codec_mode = MODE2;
- move16();
- get_rfTargetBits( st->rf_frame_type, &( st->rf_target_bits ) );
-
- IF( EQ_16( st->bfi, FRAMEMODE_FUTURE ) )
- {
- st->use_partial_copy = 1;
+ st->use_partial_copy = 1;
move16();
/* now set the frame mode to normal mode */
test();
@@ -2418,148 +1743,6 @@ void get_NextCoderType_fx(
move16();
}
-/*-------------------------------------------------------------------*
- * read_indices_from_djb_fx()
- *
- * Read indices from the de-jitter buffer payload (works also for AMR-WB IO mode)
- *-------------------------------------------------------------------*/
-
-void read_indices_from_djb_fx(
- Decoder_State *st, /* i/o: decoder state structure */
- UWord8 *pt_stream, /* i : bitstream file */
- Word16 num_bits, /* i : input frame length in bits */
- Word16 isAMRWB_IOmode,
- Word16 core_mode,
- Word16 qbit,
- Word16 partialframe, /* i : partial frame information */
- Word16 next_coder_type /* i : next coder type information */
-)
-{
- Word16 k;
- UWord8 mask = 0x80;
- Word16 no_data = 0;
- Word16 sti = -1;
- UWord16 *bit_stream_ptr;
- Word32 total_brate;
- Word16 speech_lost = 0;
-
- move16();
- move16();
- move16();
- move16();
-
- st->bfi = 0;
- move16();
- st->BER_detect = 0;
- move16();
- st->mdct_sw_enable = 0;
- move16();
- st->mdct_sw = 0;
- move16();
- reset_indices_dec_fx( st );
-
- st->bfi = !qbit;
- move16();
- total_brate = L_mult0( num_bits, 50 );
- st->total_num_bits = num_bits;
- move16();
-
- IF( num_bits == 0 ) /* guess type of missing frame for SP_LOST and NO_DATA */
- {
- speech_lost = st->CNG_fx == 0;
- move16();
- move16();
- no_data = st->CNG_fx != 0;
- move16();
- }
-
- test();
- IF( partialframe || st->prev_use_partial_copy )
- {
- st->next_coder_type = next_coder_type;
- move16();
- }
- ELSE
- {
- st->next_coder_type = INACTIVE;
- move16();
- }
-
- if ( EQ_16( partialframe, 1 ) )
- {
- st->bfi = 2;
- move16();
- }
-
- /* unpack speech data */
- bit_stream_ptr = st->bit_stream;
- /* convert bitstream from compact bytes to short values and store it in decoder state */
- FOR( k = 0; k < num_bits; k++ )
- {
- test();
- IF( EQ_16( st->bitstreamformat, VOIP_RTPDUMP ) && isAMRWB_IOmode )
- {
- st->bit_stream[sort_ptr[core_mode][k]] = unpack_bit( &pt_stream, &mask );
- move16();
- bit_stream_ptr++;
- }
- ELSE
- {
- *bit_stream_ptr++ = unpack_bit( &pt_stream, &mask );
- move16();
- }
- }
-
- /* unpack auxiliary bits */
- test();
- IF( isAMRWB_IOmode && EQ_32( total_brate, SID_1k75 ) )
- {
- IF( EQ_16( st->bitstreamformat, VOIP_RTPDUMP ) )
- {
- /* A.2.2.1.3: AMR-WB SID_1k75 frame is followed by STI bit and CMI bits */
- sti = unpack_bit( &pt_stream, &mask );
- }
- ELSE
- {
- /* VOIP_G192_RTP does not contain STI and CMI */
- sti = 1;
- move16();
- }
- read_indices_mime_handle_sti_and_all_zero_bits( st, &total_brate, sti );
- }
-
- /* add two zero bytes for arithmetic coder flush */
- FOR( k = 0; k < 8 * 2; ++k )
- {
- *bit_stream_ptr++ = 0;
- move16();
- }
-
- total_brate = read_indices_mime_handle_dtx( st, isAMRWB_IOmode, core_mode, total_brate, sti, speech_lost, no_data );
- /* st->CNG_fx set inside */
-
- IF( NE_16( st->bfi, 1 ) )
- {
- /* select Mode 1 or Mode 2 */
- IF( *st->bit_stream )
- {
- decoder_selectCodec( st, total_brate, G192_BIN1 );
- }
- ELSE
- {
- decoder_selectCodec( st, total_brate, G192_BIN0 );
- }
-
-
- /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */
- st->total_brate = total_brate;
- move32();
-
- mdct_switching_dec( st );
- }
-}
-
-
/*-------------------------------------------------------------------*
* get_indice_preview()
*
diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c
index 91b596ca5ace5c6443e19d8577176c00023b9327..e1afa3da7687b852a41ef7a7bb59b6323926b1ea 100644
--- a/lib_com/cldfb.c
+++ b/lib_com/cldfb.c
@@ -1096,10 +1096,13 @@ void cldfbAnalysis_ts_fx_fixed_q(
* Conduct inverse multple overlap cmplex low delay MDCT
*--------------------------------------------------------------------*/
void cldfbSynthesis_ivas_fx(
- Word32 **realBuffer_fx, /* i : real values Qx*/
- Word32 **imagBuffer_fx, /* i : imag values Qx*/
- Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/
- const Word16 samplesToProcess, /* i : number of processed samples */
+ Word32 **realBuffer_fx, /* i : real values Qx*/
+ Word32 **imagBuffer_fx, /* i : imag values Qx*/
+ Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/
+ const Word16 samplesToProcess, /* i : number of processed samples */
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ const Word16 shift, /* i : scale for state buffer */
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */
)
{
@@ -1265,25 +1268,56 @@ void cldfbSynthesis_ivas_fx(
}
/* synthesis prototype filter */
- FOR( i = 0; i < L2; i++ )
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( 0 == shift )
+ {
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+ FOR( i = 0; i < L2; i++ )
+ {
+ accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[i] ), p_filter_sf ); // Qx - 1
+ accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1
+ accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1
+ accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1
+ accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1
+
+ synthesisBuffer_fx[i] = accu0;
+ move32();
+ synthesisBuffer_fx[1 * L2 + i] = accu1;
+ move32();
+ synthesisBuffer_fx[2 * L2 + i] = accu2;
+ move32();
+ synthesisBuffer_fx[3 * L2 + i] = accu3;
+ move32();
+ synthesisBuffer_fx[4 * L2 + i] = accu4;
+ move32();
+ }
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ }
+ ELSE
{
- accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[i] ), p_filter_sf ); // Qx - 1
- accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1
- accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1
- accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1
- accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1
- synthesisBuffer_fx[i] = accu0;
- move32();
- synthesisBuffer_fx[1 * L2 + i] = accu1;
- move32();
- synthesisBuffer_fx[2 * L2 + i] = accu2;
- move32();
- synthesisBuffer_fx[3 * L2 + i] = accu3;
- move32();
- synthesisBuffer_fx[4 * L2 + i] = accu4;
- move32();
+ FOR( i = 0; i < L2; i++ )
+ {
+ Word32 prod = L_shl_sat( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter_sf ), shift );
+ accu0 = Madd_32_16( synthesisBuffer_fx[i], prod, p_filter[i] ); // Qx - 1
+ accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], prod, p_filter[( 1 * L2 + i )] ); // Qx - 1
+ accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], prod, p_filter[( 2 * L2 + i )] ); // Qx - 1
+ accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], prod, p_filter[( 3 * L2 + i )] ); // Qx - 1
+ accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], prod, p_filter[( 4 * L2 + i )] ); // Qx - 1
+
+ synthesisBuffer_fx[i] = accu0;
+ move32();
+ synthesisBuffer_fx[1 * L2 + i] = accu1;
+ move32();
+ synthesisBuffer_fx[2 * L2 + i] = accu2;
+ move32();
+ synthesisBuffer_fx[3 * L2 + i] = accu3;
+ move32();
+ synthesisBuffer_fx[4 * L2 + i] = accu4;
+ move32();
+ }
}
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( i = 0; i < M1; i++ )
{
diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c
index d74b9b64671902f550e2b560d4b3a3992a05ee3e..c28a534d63b01c63d73249732fba395ba4311f79 100644
--- a/lib_com/cldfb_evs.c
+++ b/lib_com/cldfb_evs.c
@@ -338,7 +338,7 @@ static void calcModulationAndFolding( Word16 *rY,
}
-/* cldfbAnalysisFiltering
+/* cldfbAnalysis_fx
Parameters:
cldfbBank I/O: handle to analysis CLDFB filter struct
@@ -356,14 +356,15 @@ static void calcModulationAndFolding( Word16 *rY,
Returns:
void
*/
-void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank,
- Word32 **rAnalysis,
- Word32 **iAnalysis,
- CLDFB_SCALE_FACTOR *scaleFactor,
- const Word16 *timeIn, // Q(15-timeIn_e)
- const Word16 timeIn_e,
- const Word16 nTimeSlots,
- Word32 *pWorkBuffer // Qx
+void cldfbAnalysis_fx(
+ HANDLE_CLDFB_FILTER_BANK cldfbBank,
+ Word32 **rAnalysis,
+ Word32 **iAnalysis,
+ CLDFB_SCALE_FACTOR *scaleFactor,
+ const Word16 *timeIn, // Q(15-timeIn_e)
+ const Word16 timeIn_e,
+ const Word16 nTimeSlots,
+ Word32 *pWorkBuffer // Qx
)
{
@@ -610,7 +611,7 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank,
}
-/* cldfbSynthesisFiltering
+/* cldfbSynthesis_fx
Parameters:
cldfbBank I/O: handle to analysis CLDFB filter struct
@@ -629,14 +630,15 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank,
Returns:
void
*/
-void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank,
- Word32 **rAnalysis,
- Word32 **iAnalysis,
- const CLDFB_SCALE_FACTOR *scaleFactor,
- Word16 *timeOut, // Q(15-timeOut_e)
- const Word16 timeOut_e,
- const Word16 nTimeSlots,
- Word32 *pWorkBuffer // Qx
+void cldfbSynthesis_fx(
+ HANDLE_CLDFB_FILTER_BANK cldfbBank,
+ Word32 **rAnalysis,
+ Word32 **iAnalysis,
+ const CLDFB_SCALE_FACTOR *scaleFactor,
+ Word16 *timeOut, // Q(15-timeOut_e)
+ const Word16 timeOut_e,
+ const Word16 nTimeSlots,
+ Word32 *pWorkBuffer // Qx
)
{
Word16 i;
@@ -1186,20 +1188,13 @@ void analysisCldfbEncoder_fx(
}
/* perform analysis */
- cldfbAnalysisFiltering(
- st_fx->cldfbAnaEnc,
- ppBuf_Real,
- ppBuf_Imag,
- scale,
- timeIn,
- 0,
- CLDFB_NO_COL_MAX,
- workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, scale, timeIn, 0, CLDFB_NO_COL_MAX, workBuffer );
enerScale.lb_scale = negate( scale->lb_scale );
enerScale.lb_scale16 = negate( scale->lb_scale );
move16();
move16();
+
/* get 16bit respresentation */
AnalysisPostSpectrumScaling_Fx(
st_fx->cldfbAnaEnc,
diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c
index 4153afa322f6b2c51a39890128b80c94034c51bd..aa1ceea81f28f54461f025c6f652385f62e25fe1 100644
--- a/lib_com/cng_exc_fx.c
+++ b/lib_com/cng_exc_fx.c
@@ -295,10 +295,9 @@ IF( NE_16( Opt_AMR_WB, 1 ) )
/* calculate the spectrum of random excitation signal */
Copy( exc2, fft_io, L_frame );
- Word16 Q_new_inp, mem_decim_size; // TO be removed
IF( EQ_16( L_frame, L_FRAME16k ) )
{
- modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, exc_mem1, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, exc_mem1, 0 );
}
/* fft_rel(fft_io, L_FFT, LOG2_L_FFT); */
@@ -411,7 +410,7 @@ IF( NE_16( Opt_AMR_WB, 1 ) )
IF( EQ_16( L_frame, L_FRAME16k ) )
{
- modify_Fs_fx( fft_io, L_FFT, 12800, fft_io, 16000, exc_mem, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( fft_io, L_FFT, 12800, fft_io, 16000, exc_mem, 0 );
}
/* enr1 = dotp( fft_io, fft_io, L_frame ) / L_frame; */
diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h
index afbcff3890ec93eaf9e7e4302778070496721fb0..102918e0dd0c6c107a69c8c2498c48849c32ac0c 100644
--- a/lib_com/ivas_prot_fx.h
+++ b/lib_com/ivas_prot_fx.h
@@ -670,11 +670,6 @@ Word16 read_flag_EC_DFT(
Word16 *flag /* o : flag value */
);
-/*file : ivas_mc_param_dec_fx.c*/
-Word16 param_mc_get_num_cldfb_syntheses_ivas_fx(
- Decoder_Struct *st_ivas /* i : Parametric MC handle */
-);
-
void ivas_init_dec_get_num_cldfb_instances(
Decoder_Struct *st_ivas, /* i : IVAS decoder structure */
Word16 *numCldfbAnalyses, /* o : number of CLDFB analysis instances */
@@ -1975,6 +1970,7 @@ void ivas_DetectTonalComponents_fx(
const Word16 scaleFactors_exp[],
const Word16 scaleFactors_max_e,
const Word32 secondLastPowerSpectrum[],
+ const Word16 secondLastPowerSpectrum_e,
const Word16 nSamples,
const Word16 nSamplesCore,
Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */
@@ -2290,20 +2286,6 @@ ivas_error ivas_mct_dec_fx(
const Word16 output_frame, /* i : output frame length per channel */
const Word16 nb_bits_metadata /* i : number of metadata bits */
);
-void swb_tbe_reset_synth_ivas_fx(
- Word32 genSHBsynth_Hilbert_Mem[],
- Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[],
- Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] );
-
-void InitSWBdecBuffer_ivas_fx(
- Decoder_State *st_fx /* i/o: SHB decoder structure */
-);
-
-void td_bwe_dec_init_ivas_fx(
- Decoder_State *st_fx, /* i/o: SHB decoder structure */
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- const Word32 output_Fs /* i : output sampling rate */
-);
void ivas_dirac_dec_render_sf_fx(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
@@ -3036,7 +3018,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
Word16 non_staX, /* i : unbound non-stationarity for sp/mu clas */
Word16 *pitch_fr, /* i : fraction pitch values */
Word16 *voicing_fr, /* i : fractional voicing values */
- Word16 currFlatness, /* i : flatness */
+ Word32 currFlatness, /* i : flatness */
Word16 lsp_mid[M], /* i : LSPs at the middle of the frame */
Word16 stab_fac, /* i : LP filter stability */
Word32 *res_cod_SNR_M,
@@ -3153,7 +3135,7 @@ Word16 transient_analysis_ivas_fx(
void set_transient_stereo_fx(
CPE_ENC_HANDLE hCPE, /* i : CPE structure */
- Word16 currFlatness[] /* i/o: current flatness Q7*/
+ Word32 currFlatness[] /* i/o: current flatness Q21*/
);
void ivas_smc_mode_selection_fx(
@@ -3859,8 +3841,11 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx(
const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */
UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */
UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */
- Word32 *output_fx[], /* o : rendered time signal */
- Word16 out_len /*Store the length of values in each channel*/
+ Word32 *output_fx[] /* o : rendered time signal */
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len /*Store the length of values in each channel*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
);
ivas_error ivas_osba_ism_metadata_dec_fx(
@@ -5416,15 +5401,22 @@ ivas_error ivas_sba_dec_render_fx(
const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */
UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */
UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render */
- Word32 *output_fx[], /* o : rendered time signal Q11*/
- Word16 out_len /*Store the length of values in each channel*/
+ Word32 *output_fx[] /* o : rendered time signal Q11*/
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len /*Store the length of values in each channel*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
);
void ivas_spar_dec_upmixer_sf_fx(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
- Word32 *output_fx[], /* o : output audio channels */
- const Word16 nchan_internal, /* i : number of internal channels */
- Word16 out_len );
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ Word32 *output_fx[], /* o : output audio channels */
+ const Word16 nchan_internal /* i : number of internal channels */
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+);
ivas_error ivas_spar_md_enc_open_fx(
ivas_spar_md_enc_state_t **hMdEnc_in, /* i/o: SPAR MD encoder handle */
@@ -6052,7 +6044,7 @@ ivas_error pre_proc_front_ivas_fx(
Word16 *fft_buff_fx_q, /* o : FFT buffer */
const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/
const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/
- const Word16 currFlatness_fx, /* i : flatness parameter Q7*/
+ const Word32 currFlatness_fx, /* i : flatness parameter Q21*/
const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/
Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/
Word16 fr_bands_LR_fx_q[CPE_CHANNELS],
diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c
index 7ed3cb59b62389a3fa6166306cc6d632a9d44885..10e64a57deb9efbc548a2416db10d1ec550d66cf 100644
--- a/lib_com/modif_fs.c
+++ b/lib_com/modif_fs.c
@@ -43,7 +43,8 @@
#include "wmc_auto.h"
-void Interpolate_allpass_steep_32(
+/* IVAS 32-bit variant */
+void Interpolate_allpass_steep_fx32(
const Word32 *in_fx, /* i : input array of size N Qx */
Word32 *mem_fx, /* i/o: memory Qx */
const Word16 N, /* i : number of input samples */
@@ -101,6 +102,8 @@ void Interpolate_allpass_steep_32(
return;
}
+
+/* IVAS 32-bit variant */
void Decimate_allpass_steep_fx32(
const Word32 *in, /* i : input array of size N Qx */
Word32 *mem, /* i/o: memory Qx */
@@ -251,7 +254,9 @@ void Decimate_allpass_steep_fx32(
return;
}
-void interpolate_3_over_2_allpass_32(
+
+/* IVAS 32-bit variant */
+void interpolate_3_over_2_allpass_fx32(
const Word32 *input, /* i : input signal Qx*/
const Word16 len, /* i : number of input samples */
Word32 *out, /* o : output signal Qx*/
@@ -377,8 +382,8 @@ void interpolate_3_over_2_allpass_32(
return;
}
-
-void interpolate_3_over_1_allpass_32(
+/* IVAS 32-bit variant */
+void interpolate_3_over_1_allpass_fx32(
const Word32 *input, /* i : input signal Qx */
const Word16 len, /* i : number of input samples */
Word32 *out, /* o : output signal */
diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c
index 6079e5db5a5ef4c1a8b073b8a5c1ac8e450170ce..bcbff13d57bebe95c3159b1b75e34fdc517fad79 100644
--- a/lib_com/modif_fs_fx.c
+++ b/lib_com/modif_fs_fx.c
@@ -330,9 +330,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
Word16 sigOut_fx[], /* o : decimated signal Q0 */
const Word32 fout, /* i : frequency of output Q0 */
Word16 mem_fx[], /* i/o: filter memory Q0 */
- const Word16 nblp, /* i : flag indicating if NB low-pass is applied */
- Word16 *Q_new_inp, // TO be removed
- Word16 *mem_decim_size // TO be removed
+ const Word16 nblp /* i : flag indicating if NB low-pass is applied */
)
{
Word16 i;
@@ -364,17 +362,13 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
/*-------------------------------------------------------------------*
* Find the resampling configuration
*-------------------------------------------------------------------*/
- *Q_new_inp = 0;
- move16();
+
/* check if fin and fout are the same */
IF( EQ_32( fin, fout ) )
{
/* just copy the signal_fx and quit */
Copy( sigIn_fx, sigOut_fx, lg );
- *mem_decim_size = 0;
- *Q_new_inp = 0;
- move16();
- move16();
+
return lg;
}
ELSE
@@ -439,8 +433,6 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
}
mem_len = shl( filt_len, 1 );
- *mem_decim_size = mem_len;
- move16();
signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) );
signal_ana_fx = signal_fx;
mem_len_ana = mem_len;
@@ -508,7 +500,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
}
/* interpolation */
- datastep = shr( div_s( shl( fac_den, 7 ), shl( fac_num, 10 ) ), 12 );
+ datastep = shr( div_s( shl( fac_den, 8 ), shl( fac_num, 11 ) ), 12 );
/* equivalent to 'datastep = fac_den % fac_num' */
temp_n = i_mult2( datastep, fac_num ); /*Q0*/
fracstep = sub( fac_den, temp_n );
@@ -550,9 +542,6 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
FOR( i = 0; i < lg_out; i++ )
{
sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/
- *Q_new_inp = -1;
- move16();
- move16();
}
}
ELSE
@@ -562,16 +551,17 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
test();
if ( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) )
{
+#ifdef BASOP_NOGLOB_DECLARE_LOCAL
num_den = shl_o( num_den, 1, &Overflow );
- //*Q_new_inp = 2;
+#else
+ num_den = shl( num_den, 1 );
+#endif
}
FOR( i = 0; i < lg_out; i++ )
{
sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/
move16();
}
- *Q_new_inp = -1;
- move16();
}
}
ELSE
@@ -579,13 +569,10 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
IF( EQ_16( fac_num, 8 ) )
{
num_den = 26214;
- move16();
FOR( i = 0; i < lg_out; i++ )
{
sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/
move16();
- *Q_new_inp = -2;
- move16();
}
}
ELSE
@@ -594,9 +581,6 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
FOR( i = 0; i < lg_out; i++ )
{
sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/
- *Q_new_inp = -1;
- move16();
- move16();
}
}
}
@@ -607,8 +591,6 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */
{
sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 );
move16(); /*Q-1*/
- *Q_new_inp = -2;
- move16();
}
}
/* update the filter memory */
diff --git a/lib_com/options.h b/lib_com/options.h
index c74f0728ab173348c3cd7c30ae6fe07defc4a6e9..3b3adbf01a5d1bf76836e3c2788eb7af174a7276 100755
--- a/lib_com/options.h
+++ b/lib_com/options.h
@@ -171,6 +171,9 @@
#define DOT_PROD_CHOLESKY_64BIT /* FhG: Issue 1323, optimized 64 bit implementation of dot_product_cholesky() */
#define OPT_BASOP_ADD_v1 /* optimizations to avoid usage of BASOP_Util_Add_MantExp */
#define FIX_ISSUE_1327 /* Ittiam: Fix for issue 1327: Glitch when stereo is switching from TD to FD*/
+#define NONBE_FIX_1402_WAVEADJUST /* VA: BASOP iisue 1402: fix waveform adjustment decoder PLC */
+#define FIX_ISSUE_1376 /* VA: Fix for issue 1376 (issue with GSC excitation) */
+#define OPT_SBA_AVOID_SPAR_RESCALE /* Optimization made to spar decoder and IGF */
/* #################### Start BASOP porting switches ############################ */
@@ -189,5 +192,4 @@
/* #################### End BASOP porting switches ############################ */
-
#endif
diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h
index 450de2dc9ffd9765044f3adfa6372e1fc8658f2e..3fd3e4b3694eb950ff133f84fa90b64de6147064 100644
--- a/lib_com/prot_fx.h
+++ b/lib_com/prot_fx.h
@@ -1368,12 +1368,6 @@ Word16 BRATE2IDX16k_fx( Word32 brate );
Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc );
Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc );
-Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem */
- Decoder_State *st, /* i/o: decoder state structure */
- FILE *file, /* i : bitstream file */
- Word16 rew_flag /* i : rewind flag (rewind file after reading)*/
-);
-
void getPartialCopyInfo(
Decoder_State *st, /* i : decoder state structure */
Word16 *coder_type,
@@ -1405,19 +1399,6 @@ void get_NextCoderType_fx(
Word16 *next_coder_type /* o : next coder type */
);
-void read_indices_from_djb_fx(
- Decoder_State *st, /* i/o: decoder state structure */
- UWord8 *pt_stream, /* i : bitstream file */
- Word16 nbits /* i : number of bits */
- ,
- Word16 isAMRWB_IOmode,
- Word16 core_mode,
- Word16 qbit,
- Word16 partialframe /* i : partial frame information */
- ,
- Word16 next_coder_type /* i : next coder type information */
-);
-
void evs_dec_previewFrame(
UWord8 *bitstream, /* i : bitstream pointer */
Word16 bitstreamSize, /* i : bitstream size */
@@ -2611,14 +2592,12 @@ Word16 modify_Fs_ivas_fx( /* o : length of output Q
// modif_fs_fx.c
Word16 modify_Fs_fx( /* o : length of output Q0 */
const Word16 sigIn_fx[], /* i : signal to decimate Q0 */
- Word16 lg, /* i : length of input Q0 */
- const Word32 fin, /* i : frequency of input Q0 */
+ Word16 lg, /* i : length of i Q0 */
+ const Word32 fin, /* i : frequency of i Q0 */
Word16 sigOut_fx[], /* o : decimated signal Q0 */
const Word32 fout, /* i : frequency of output Q0 */
Word16 mem_fx[], /* i/o: filter memory Q0 */
- const Word16 nblp, /* i : flag indicating if NB low-pass is applied */
- Word16 *Q_new_inp, // TO be removed
- Word16 *mem_decim_size // TO be removed
+ const Word16 nblp /* i : flag indicating if NB low-pass is applied */
);
Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */
@@ -2632,49 +2611,70 @@ Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output
void Decimate_allpass_steep_fx(
const Word16 *in_fx,
- Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
- Word16 N, /* number of input samples */
- Word16 out_fx[] );
+ Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
+ Word16 N, /* number of input samples */
+ Word16 out_fx[] /* o : output array of size N/2 */
+);
+
+void Decimate_allpass_steep_fx32(
+ const Word32 *in, /* i : input array of size N */
+ Word32 *mem, /* i/o: memory */
+ const Word16 N, /* i : number of input samples */
+ Word32 *out /* o : output array of size N/2 */
+);
void Interpolate_allpass_steep_fx(
const Word16 *in_fx,
- Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
- Word16 N, /* number of input samples */
- Word16 out_fx[] );
+ Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
+ Word16 N, /* number of input samples */
+ Word16 out_fx[] /* o : output array of size 2*N */
+);
+
+void Interpolate_allpass_steep_fx32(
+ const Word32 *in_fx, /* i : input array of size N */
+ Word32 *mem_fx, /* i/o: memory */
+ const int16_t N, /* i : number of input samples */
+ Word32 *out_fx /* o : output array of size 2*N */
+);
void interpolate_3_over_2_allpass_fx(
- const Word16 *input_fx,
- /* i : input signal */ /* Q_input */
- const Word16 len, /* i : number of input samples */
- Word16 *out_fx,
- /* o : output signal */ /* Q_input */
- Word16 *mem_fx,
- /* i/o: memory */ /* Q_input */
- const Word16 *filt_coeff_fx /* i : filter coefficients */ /* Q15*/
+ const Word16 *input_fx, /* i : input signal Q_input */
+ const Word16 len, /* i : number of input samples */
+ Word16 *out_fx, /* o : output signal Q_input */
+ Word16 *mem_fx, /* i/o: memory Q_input */
+ const Word16 *filt_coeff_fx /* i : filter coefficients Q15*/
+);
+
+void interpolate_3_over_2_allpass_fx32(
+ const Word32 *input, /* i : input signal Qx */
+ const int16_t len, /* i : number of input samples */
+ Word32 *out, /* o : output signal */
+ Word32 *mem /* i/o: memory */
);
void interpolate_3_over_1_allpass_fx(
- const Word16 *input_fx,
- /* i : input signal */ /* Q_input */
- const Word16 len, /* i : number of input samples */
- Word16 *out_fx,
- /* o : output signal */ /* Q_input */
- Word16 *mem_fx /* i/o: memory */ /* Q_input */
+ const Word16 *input_fx, /* i : input signal Q_input */
+ const Word16 len, /* i : number of input samples */
+ Word16 *out_fx, /* o : output signal Q_input */
+ Word16 *mem_fx /* i/o: memory Q_input */
+);
+
+void interpolate_3_over_1_allpass_fx32(
+ const Word32 *input, /* i : input signal Qx */
+ const Word16 len, /* i : number of input samples */
+ Word32 *out, /* o : output signal */
+ Word32 *mem /* i/o: memory */
);
void decimate_2_over_3_allpass_fx(
- const Word16 *input,
- /* i : input signal */ /* Q_input */
- const Word16 len, /* i : number of input samples */
- Word16 *out_fx,
- /* o : output signal */ /* Q_input */
- Word16 *mem_fx,
- /* i/o: memory */ /* Q_input */
- const Word16 *filt_coeff_fx,
- /* i : filter coefficients */ /* Q15*/
- const Word16 *lp_num_fx, /* i : Num Coefficients : Q15 */
- const Word16 *lp_den_fx, /* o : Den Coefficients : Q15 */
- Word16 *lp_mem_fx /* o : Filter memories : Q_input */
+ const Word16 *input, /* i : input signal Q_input */
+ const Word16 len, /* i : number of input samples */
+ Word16 *out_fx, /* o : output signal Q_input */
+ Word16 *mem_fx, /* i/o: memory Q_input */
+ const Word16 *filt_coeff_fx, /* i : filter coefficients Q15 */
+ const Word16 *lp_num_fx, /* i : Num Coefficients : Q15 */
+ const Word16 *lp_den_fx, /* o : Den Coefficients : Q15 */
+ Word16 *lp_mem_fx /* o : Filter memories : Q_input */
);
void retro_interp4_5_fx(
@@ -2907,7 +2907,8 @@ void swb_tbe_reset_fx(
void swb_tbe_reset_synth_fx(
Word32 genSHBsynth_Hilbert_Mem[],
- Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[] );
+ Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[],
+ Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] );
void fb_tbe_reset_synth_fx(
Word32 fbbwe_hpf_mem_fx[][4],
@@ -3171,7 +3172,7 @@ void GenSHBSynth_fx(
const Word16 L_frame, /* i : ACELP Frame length */
Word16 *syn_dm_phase );
-void GenSHBSynth_fx_32(
+void GenSHBSynth_fx32(
const Word32 *input_synspeech, /* i : input synthesized speech */
Word32 *shb_syn_speech_32k, /* o : output highband component */
Word32 Hilbert_Mem[], /* i/o: memory */
@@ -3192,7 +3193,7 @@ void ScaleShapedSHB_fx(
Word16 n_mem3,
Word16 prev_Q_bwe_syn2 );
-void ScaleShapedSHB_32(
+void ScaleShapedSHB_fx32(
const Word16 length, /* i : SHB overlap length */
Word32 *synSHB_fx, /* i/o: synthesized shb signal Qx */
Word32 *overlap_fx, /* i/o: buffer for overlap-add Qx */
@@ -4478,14 +4479,15 @@ void calcGainTemp_TBE_Fx(
Word16 *pGainTemp_e,
const Word16 code );
-Word16 procTecTfa_TBE_Fx( Word16 *hb_synth_Fx,
- Word16 hb_synth_fx_exp,
- Word16 *gain_m,
- Word16 *gain_e,
- Word16 flat_flag,
- Word16 last_core,
- Word16 l_subfr,
- Word16 code );
+Word16 procTecTfa_TBE_Fx(
+ Word16 *hb_synth_Fx,
+ Word16 hb_synth_fx_exp,
+ Word16 *gain_m,
+ Word16 *gain_e,
+ Word16 flat_flag,
+ Word16 last_core,
+ Word16 l_subfr,
+ Word16 code );
void calcHiEnvLoBuff_Fix(
const Word16 noCols,
@@ -4756,24 +4758,26 @@ void r_fft_fx_lc(
);
// cldfb_evs
-void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK anaCldfb, /*!< Handle of Cldfb Analysis Bank */
- Word32 **cldfbReal, /*!< Pointer to real subband slots */
- Word32 **cldfbImag, /*!< Pointer to imag subband slots */
- CLDFB_SCALE_FACTOR *scaleFactor, /*!< Scale factors of CLDFB data */
- const Word16 *timeIn, /*!< Time signal */
- const Word16 timeIn_e, /*!< Time signal */
- const Word16 nTimeSlots, /*!< Time slots to be processed */
- Word32 *pWorkBuffer /*!< pointer to temporal working buffer */
-);
-
-void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK synCldfb, /*!< Handle of Cldfb Synthesis Bank */
- Word32 **CldfbBufferReal, /*!< Pointer to 32 bit real subband slots */
- Word32 **CldfbBufferImag, /*!< Pointer to 32 bit imag subband slots */
- const CLDFB_SCALE_FACTOR *scaleFactor, /*!< Scale factors of CLDFB data */
- Word16 *timeOut, /*!< Time signal */
- const Word16 timeOut_e, /*!< Target exponent for output signal */
- const Word16 nTimeSlots, /*!< number of time slots to be processed */
- Word32 *pWorkBuffer /*!< pointer to temporal working buffer */
+void cldfbAnalysis_fx(
+ HANDLE_CLDFB_FILTER_BANK anaCldfb, /*!< Handle of Cldfb Analysis Bank */
+ Word32 **cldfbReal, /*!< Pointer to real subband slots */
+ Word32 **cldfbImag, /*!< Pointer to imag subband slots */
+ CLDFB_SCALE_FACTOR *scaleFactor, /*!< Scale factors of CLDFB data */
+ const Word16 *timeIn, /*!< Time signal */
+ const Word16 timeIn_e, /*!< Time signal */
+ const Word16 nTimeSlots, /*!< Time slots to be processed */
+ Word32 *pWorkBuffer /*!< pointer to temporal working buffer */
+);
+
+void cldfbSynthesis_fx(
+ HANDLE_CLDFB_FILTER_BANK synCldfb, /*!< Handle of Cldfb Synthesis Bank */
+ Word32 **CldfbBufferReal, /*!< Pointer to 32 bit real subband slots */
+ Word32 **CldfbBufferImag, /*!< Pointer to 32 bit imag subband slots */
+ const CLDFB_SCALE_FACTOR *scaleFactor, /*!< Scale factors of CLDFB data */
+ Word16 *timeOut, /*!< Time signal */
+ const Word16 timeOut_e, /*!< Target exponent for output signal */
+ const Word16 nTimeSlots, /*!< number of time slots to be processed */
+ Word32 *pWorkBuffer /*!< pointer to temporal working buffer */
);
void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< CLDFB Handle */
@@ -5811,7 +5815,7 @@ Word16 tcx_ltp_decode_params(
const Word16 pitres /* Q0 */
);
-void tcx_ltp_post(
+void tcx_ltp_post_fx(
Decoder_State *st,
TCX_LTP_DEC_HANDLE hTcxLtpDec,
Word16 core, /* Q0 */
@@ -5821,7 +5825,7 @@ void tcx_ltp_post(
Word16 *tcx_buf /* Qx */
);
-void tcx_ltp_post32(
+void tcx_ltp_post_fx32(
Decoder_State *st,
TCX_LTP_DEC_HANDLE hTcxLtpDec,
Word16 core, /* Q0 */
@@ -5998,13 +6002,9 @@ Word32 calc_gain_inov( /* returns innovation gain
/* Lib_dec */
//////////////////////////////////
// swb_tbe_dec.c
-
-void InitSWBdecBuffer_fx(
- Decoder_State *swb_dnc_fx /* i/o: SHB decoder structure */
-);
-
void ResetSHBbuffer_Dec_fx(
- Decoder_State *st_fx /* i/o: decoder state structure */
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ const Word16 extl /* i : BWE extension layer */
);
void wb_tbe_dec_fx(
Decoder_State *st_fx, /* i/o: decoder state structure */
@@ -6063,41 +6063,39 @@ void tbe_read_bitstream_fx(
);
void GenTransition_fx(
- const Word16 *i, /* i : gain shape overlap buffer */
- const Word16 *old_hb_synth, /* i : synthesized HB from previous frame */
- Word16 length, /* i : targeted length of transition signal */
- Word16 *output, /* o : synthesized transitions signal */
- Word32 Hilbert_Mem[], /* i/o: memory */
- Word16 state_lsyn_filt_shb_local[], /* i/o: memory */
- Word16 mem_resamp_HB_32k[], /* i/o: memory */
- Word16 *syn_dm_phase,
- Word32 output_Fs,
- Word16 *up_mem,
- Word16 rf_flag,
- Word32 bitrate );
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word16 *output_HB, /* o : synthesized HB transitions signal st_fx->prev_Q_bwe_syn2 */
+ const Word32 output_Fs, /* i : output sampling rate */
+ Word16 rf_flag, /* i : RF flag */
+ Word32 total_bitrate /* i : total bitrate */
+);
+
+void GenTransition_fx32(
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
+ const Word32 output_Fs, /* i : output sampling rate : Q0 */
+ const Word16 L_frame, /* i : ACELP frame length : Q0 */
+ const Word16 prev_Qx );
void GenTransition_WB_fx(
- const Word16 *i, /* i : gain shape overlap buffer */
- const Word16 *old_hb_synth, /* i : synthesized HB from previous frame */
- const Word16 prev_Qx, /* i : scaling of old_hb_synth */
- Word16 length, /* i : targeted length of transition signal */
- Word16 *output, /* o : synthesized transitions signal */
- Word16 state_lsyn_filt_shb1[],
- Word16 state_lsyn_filt_shb2[],
- Word32 output_Fs,
- Word16 *up_mem );
-void TBEreset_dec_ivas_fx(
- Decoder_State *st /* i/o: decoder state structure */
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word16 *output, /* o : synthesized transitions signal */
+ const Word32 output_Fs /* i : output sampling rate */
+);
+
+void GenTransition_WB_fx32(
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
+ const Word32 output_Fs /* i : output sampling rate */
);
void TBEreset_dec_fx(
- Decoder_State *st_fx, /* i/o: decoder state structure */
- Word16 bandwidth /* i : bandwidth mode */
+ Decoder_State *st_fx /* i/o: decoder state structure */
);
void td_bwe_dec_init_fx(
- Decoder_State *st_fx, /* i/o: SHB decoder structure */
TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ const Word16 extl, /* i : BWE extension layer */
const Word32 output_Fs /* i : output sampling rate */
);
@@ -6311,82 +6309,136 @@ void td_cng_dec_init_fx(
DEC_CORE_HANDLE st /* i/o: decoder state structure */
);
-void td_cng_dec_init_ivas_fx(
- DEC_CORE_HANDLE st /* i/o: decoder state structure */
-);
-
// wavadjust_fec_dec_fx.c
-void set_state( Word16 *state, Word16 num, Word16 N );
-void concealment_init_x( Word16 N, void *_plcInfo );
-void concealment_init_ivas_fx(
+void set_state(
+ Word16 *state,
+ Word16 num,
+ Word16 N );
+
+void concealment_init_x(
const Word16 L_frameTCX,
T_PLCInfo_HANDLE hPlcInfo );
-void concealment_update_x( Word16 bfi, Word16 curr_mode, Word16 harmonic, Word32 *invkoef, Word16 *invkoef_scale, void *_plcInfo );
-Word16 Sqrt_x_fast( Word32 value );
-
-Word32 dot_w32_accuracy_x( Word16 *s1, Word16 *s2, Word16 nbits, Word16 N );
-
-Word16 int_div_s_x( Word16 a, Word16 b );
-
-Word16 GetW32Norm_x( Word32 *s, Word16 N );
-Word16 harmo_x( Word32 *X, Word16 Framesize, Word16 pitch );
-
-void LpFilter2_x( Word16 *x, Word16 *y, Word16 N );
-
-void sig_tilt_x( Word16 *s, Word16 FrameSize, Word32 *enr1, Word32 *enr2 );
-
-void get_maxConv_and_pitch_x( Word16 *s_LP, Word16 s, Word16 e, Word16 N, Word32 *maxConv, Word16 *maxConv_bits, Word16 *pitch );
+void concealment_init_ivas_fx(
+ const Word16 L_frameTCX,
+ T_PLCInfo_HANDLE hPlcInfo );
-Word16 get_voicing_x( Word16 *s_LP, Word16 pitch, Word32 covMax, Word16 maxConv_bits, Word16 Framesize );
+void concealment_update_x(
+ const Word16 bfi,
+ const Word16 core,
+ const Word16 tonality,
+ Word32 *invkoef /*Qinvkoef_scale*/,
+ Word16 *invkoef_scale,
+ T_PLCInfo_HANDLE hPlcInfo );
-void pitch_modify_x( Word16 *s_LP, Word16 *voicing, Word16 *pitch, Word16 FrameSize );
+Word16 Sqrt_x_fast(
+ Word32 value );
-Word16 Is_Periodic_x( Word32 *mdct_data, Word16 cov_max, Word16 zp, Word32 ener, Word32 ener_mean, Word16 pitch, Word16 Framesize );
+Word32 dot_w32_accuracy_x(
+ Word16 *s1,
+ Word16 *s2,
+ Word16 nbits,
+ Word16 N );
-Word16 get_conv_relation_x( Word16 *s_LP, Word16 shift, Word16 N );
+Word16 int_div_s_x(
+ Word16 a,
+ Word16 b );
-void concealment_decode_fix( Word16 curr_mode, Word32 *invkoef, Word16 *invkoef_scale, void *_plcInfo );
+Word16 GetW32Norm_x(
+ Word32 *s,
+ Word16 N );
+
+Word16 harmo_x(
+ Word32 *X,
+ Word16 Framesize,
+ Word16 pitch );
+
+void LpFilter2_x(
+ Word16 *x,
+ Word16 *y,
+ Word16 N );
+
+void sig_tilt_x(
+ Word16 *s,
+ Word16 FrameSize,
+ Word32 *enr1,
+ Word32 *enr2 );
+
+void get_maxConv_and_pitch_x(
+ Word16 *s_LP,
+ Word16 s,
+ Word16 e,
+ Word16 N,
+ Word32 *maxConv,
+ Word16 *maxConv_bits,
+ Word16 *pitch );
+
+Word16 get_voicing_x(
+ Word16 *s_LP,
+ Word16 pitch,
+ Word32 covMax,
+ Word16 maxConv_bits,
+ Word16 Framesize );
+
+void pitch_modify_x(
+ Word16 *s_LP,
+ Word16 *voicing,
+ Word16 *pitch,
+ Word16 FrameSize );
+
+Word16 Is_Periodic_x(
+ Word32 *mdct_data,
+ Word16 cov_max,
+ Word16 zp,
+ Word32 ener,
+ Word32 ener_mean,
+ Word16 pitch,
+ Word16 Framesize );
+
+Word16 get_conv_relation_x(
+ Word16 *s_LP,
+ Word16 shift,
+ Word16 N );
+
+void concealment_decode_fix(
+ Word16 curr_mode,
+ Word32 *invkoef,
+ Word16 *invkoef_scale,
+ T_PLCInfo_HANDLE hPlcInfo );
-Word32 Spl_Energy_x( const Word16 *vector, const Word16 vector_length, Word16 *scale_factor );
+Word32 Spl_Energy_x(
+ const Word16 *vector,
+ const Word16 vector_length,
+ Word16 *scale_factor );
-void Log10OfEnergy_x( const Word16 *s, Word32 *enerlogval, const Word16 len );
+void Log10OfEnergy_x(
+ const Word16 *s,
+ Word32 *enerlogval,
+ const Word16 len );
-void concealment_update2_x( const Word16 *outx_new, void *_plcInfo, const Word16 FrameSize );
+void concealment_update2_x(
+ const Word16 *outx_new,
+ T_PLCInfo_HANDLE hPlcInfo,
+ const Word16 FrameSize );
-Word16 ffr_getSfWord16( Word16 *vector, /*!< Pointer to i vector */
- Word16 len );
+Word16 ffr_getSfWord16(
+ Word16 *vector, /*!< Pointer to i vector */
+ Word16 len );
-void waveform_adj2_fix( Word16 *overlapbuf,
- Word16 *outx_new,
- Word16 *data_noise,
- Word16 *outx_new_n1,
- Word16 *nsapp_gain,
- Word16 *nsapp_gain_n,
- Word16 *recovery_gain,
- Word16 step_concealgain,
- Word16 pitch,
- Word16 Framesize,
- Word16 delay,
- Word16 bfi_cnt,
- Word16 bfi );
+void waveform_adj2_fix(
+ T_PLCInfo_HANDLE hPlcInfo,
+ Word16 *overlapbuf,
+ Word16 *outx_new,
+ const Word16 delay,
+ const Word16 bfi_cnt,
+ const Word16 bfi );
-void concealment_signal_tuning_fx( Word16 bfi,
- Word16 curr_mode,
- Word16 *outx_new_fx,
- void *_plcInfo,
- Word16 nbLostCmpt,
- Word16 pre_bfi,
- Word16 *OverlapBuf_fx,
- Word16 past_core_mode,
- Word16 *outdata2_fx,
- Decoder_State *st );
+void concealment_signal_tuning_fx(
+ Decoder_State *st,
+ const Word16 bfi,
+ Word16 *outx_new_fx /*Qoutx_new_fx*/,
+ const Word16 past_core );
-// TonalComponentDetect.c
-/* Detect tonal components in the lastMDCTSpectrum, use
- * secondLastPowerSpectrum for the precise location of the peaks and
- * store them in indexOfTonalPeak. Updates lowerIndex, upperIndex,
- * pNumIndexes accordingly. */
void DetectTonalComponents(
Word16 indexOfTonalPeak[],
Word16 lowerIndex[],
@@ -6410,12 +6462,6 @@ void DetectTonalComponents(
#endif
);
-/* When called, the tonal components are already stored in
- * indexOfTonalPeak. Detect tonal components in the lastMDCTSpectrum,
- * use secondLastPowerSpectrum for the precise location of the peaks and
- * then keep in indexOfTonalPeak only the tonal components that are
- * again detected Updates indexOfTonalPeak, lowerIndex, upperIndex,
- * phaseDiff, phases, pNumIndexes accordingly. */
void RefineTonalComponents(
Word16 indexOfTonalPeak[],
Word16 lowerIndex[],
@@ -6456,6 +6502,7 @@ void ivas_RefineTonalComponents_fx(
const Word16 scaleFactors_exp[],
const Word16 scaleFactors_max_e,
const Word32 secondLastPowerSpectrum[],
+ const Word16 secondLastPowerSpectrum_e,
const Word16 nSamples,
const Word16 nSamplesCore,
const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */
@@ -6513,26 +6560,13 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx(
const Word16 gain_tcx_exp,
const Word16 infoIGFStartLine );
-/* The call to TonalMDCTConceal_UpdateState() should be called after TonalMDCTConceal_Apply. */
-TONALMDCTCONCEAL_ERROR TonalMDCTConceal_UpdateState( TonalMDCTConcealPtr self,
- Word16 nNewSamples,
- Word32 pitchLag,
- Word16 badBlock,
- Word8 tonalConcealmentActive );
-
-/* The call to TonalMDCTConceal_SaveTimeSignal() should be at the
- * place where the TD signal corresponds to the FD signal stored with TonalMDCTConceal_SaveFreqSignal. */
-void TonalMDCTConceal_SaveTimeSignal(
- TonalMDCTConcealPtr hTonalMDCTConc,
- Word16 *timeSignal,
- Word16 nNewSamples );
+void TonalMDCTConceal_UpdateState(
+ TonalMDCTConcealPtr self,
+ Word16 nNewSamples,
+ Word32 pitchLag,
+ Word16 badBlock,
+ Word8 tonalConcealmentActive );
-/* Calculates MDST, power spectrum and performs peak detection.
- * Uses the TD signal in pastTimeSignal; if pastTimeSignal is NULL, uses the
- * TD signal stored using TonalMDCTConceal_SaveTimeSignal. If the
- * second last frame was also lost, it is expected that pastTimeSignal
- * could hold a signal somewhat different from the one stored in
- * TonalMDCTConceal_SaveTimeSignal (e.g. including fade-out).*/
void TonalMDCTConceal_Detect(
const TonalMDCTConcealPtr self, /*IN */
const Word32 pitchLag, /*IN */
@@ -6544,9 +6578,6 @@ void TonalMDCTConceal_Detect(
#endif
);
-/* Conceals the lost frame using the FD signal previously stored using
- * TonalMDCTConceal_SaveFreqSignal. Stores the concealed harmonic part of
- * the signal in mdctSpectrum, the rest of the spectrum is unchanged. */
void TonalMDCTConceal_Apply(
const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
Word32* mdctSpectrum, /*IN/OUT*/
@@ -6562,9 +6593,6 @@ void TonalMDCTConceal_Apply_ivas_fx(
Word16 mdctSpectrum_exp[L_FRAME48k], /*IN */
const PsychoacousticParameters *psychParamsCurrent );
-/* Conceals the lost frame using the FD signal previously stored using
- * TonalMDCTConceal_SaveFreqSignal. Stores the concealed noise part of
- * the signal in mdctSpectrum, the rest of the spectrum is unchanged. */
void TonalMDCTConceal_InsertNoise_ivas_fx(
const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
Word32 *mdctSpectrum,
@@ -6579,10 +6607,6 @@ void TonalMDCTConceal_InsertNoise_ivas_fx(
const Word16 cngLevelBackgroundTrace_e,
const Word16 crossOverFreq );
-
-/* Conceals the lost frame using the FD signal previously stored using
- * TonalMDCTConceal_SaveFreqSignal. Stores the concealed noise part of
- * the signal in mdctSpectrum, the rest of the spectrum is unchanged. */
void TonalMDCTConceal_InsertNoise(
const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
Word32 *mdctSpectrum, /*OUT*/
@@ -6595,24 +6619,12 @@ void TonalMDCTConceal_InsertNoise(
const Word16concealment_noise[L_FRAME48k],
#endif
const Word16 crossOverFreq );
-/* Conceals the lost frame using the FD signal previously stored using
- * TonalMDCTConceal_SaveFreqSignal. Stores the concealed harmonic part of
- * the signal in mdctSpectrum, the rest of the spectrum is unchanged. */
-void TonalMDCTConceal_Apply(
- const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
- Word32* mdctSpectrum, /*IN/OUT*/
- Word16* mdctSpectrum_exp /*IN */
-#ifdef IVAS_CODE_MDCT_GSHAPE
- , const PsychoacousticParameters* psychParamsCurrent)
-#endif
- );
-/* The call to TonalMDCTConceal_SaveTimeSignal() should be at the
- * place where the TD signal corresponds to the FD signal stored with TonalMDCTConceal_SaveFreqSignal. */
void TonalMDCTConceal_SaveTimeSignal(
TonalMDCTConcealPtr hTonalMDCTConc,
Word16 *timeSignal,
Word16 nNewSamples );
+
void TonalMDCTConceal_SaveTimeSignal_ivas_fx(
TonalMDCTConcealPtr hTonalMDCTConc,
Word16 *timeSignal,
@@ -6644,12 +6656,7 @@ void hf_synth_fx(
Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/
Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/
const Word16 Q_exc, /* i : excitation scaling */
- const Word16 Q_syn2, /* i : synthesis scaling */
- Word16 *delay_syn_hf, /*i/o: HF synthesis memory Q_syn2*/
- Word16 *memExp1, /* o : HF excitation exponent */
- Word16 *mem_hp_interp, /* i/o: interpol. memory Qx*/
- const Word16 extl, /* i : flag indicating BWE Q0*/
- const Word16 CNG_mode /* i : CNG_mode Q0*/
+ const Word16 Q_syn2 /* i : synthesis scaling */
);
void hf_synth_amr_wb_init_fx(
@@ -8048,7 +8055,6 @@ ivas_error core_switching_post_dec_ivas_fx(
Word16 *synth, /* i/o: output synthesis Qsynth*/
Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/
Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/
- const IVAS_FORMAT ivas_format, /* i : IVAS format */
const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo Q0*/
const Word16 output_frame, /* i : frame length Q0*/
const Word16 core_switching_flag, /* i : ACELP->HQ switching flag Q0*/
@@ -9591,9 +9597,9 @@ ivas_error acelp_core_dec_fx(
// evs_dec_fx.c
ivas_error evs_dec_fx(
- Decoder_State *st_fx, /* i/o : Decoder state structure */
- Word16 output_sp[], /* o : output synthesis signal */
- frameMode_fx frameMode /* i : Decoder frame mode */
+ Decoder_State *st_fx, /* i/o : Decoder state structure */
+ Word16 output_sp[], /* o : output synthesis signal */
+ FRAME_MODE frameMode /* i : Decoder frame mode */
);
void fft_cldfb_fx(
@@ -9620,13 +9626,6 @@ void set32_fx(
const Word16 N /* i : Lenght of the vector */
);
-void delay_signal_fx(
- Word32 x[], /* i/o: signal to be delayed */
- const Word16 len, /* i : length of the input signal */
- Word32 mem[], /* i/o: synchronization memory */
- const Word16 delay /* i : delay in samples */
-);
-
void delay_signal_q_adj_fx(
Word32 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
@@ -9749,10 +9748,13 @@ void cldfbAnalysis_ivas_fx(
);
void cldfbSynthesis_ivas_fx(
- Word32 **realBuffer_fx, /* i : real values Qx*/
- Word32 **imagBuffer_fx, /* i : imag values Qx*/
- Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/
- const Word16 samplesToProcess, /* i : number of processed samples */
+ Word32 **realBuffer_fx, /* i : real values Qx*/
+ Word32 **imagBuffer_fx, /* i : imag values Qx*/
+ Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/
+ const Word16 samplesToProcess, /* i : number of processed samples */
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ const Word16 shift, /* i : scale for state buffer */
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */
);
@@ -9764,20 +9766,24 @@ void addBassPostFilter_ivas_fx(
Word32 **iAnalysis_fx,
HANDLE_CLDFB_FILTER_BANK cldfb );
-Word32 ism_dequant_meta_fx( /* o : Q22*/
- const Word16 idx, /* i : quantizer index */
- const Word32 borders_fx[], /* i : level borders Q22*/
- const Word32 q_step_fx, /* i : quantization step Q22 */
- const Word32 q_step_border_fx, /* i : quantization step at the border Q22*/
- const Word16 cbsize /* i : codebook size */
+/* o : Q22*/
+Word32 ism_dequant_meta_fx(
+ const Word16 idx, /* i : quantizer index */
+ const Word32 borders_fx[], /* i : level borders Q22*/
+ const Word32 q_step_fx, /* i : quantization step Q22 */
+ const Word32 q_step_border_fx, /* i : quantization step at the border Q22*/
+ const Word16 cbsize /* i : codebook size */
);
void save_synthesis_hq_fec_fx(
Decoder_State *st, /* i/o: decoder state structure */
+ const Word16 synth_fx[], /* i : decoded synthesis (EVS) */
const Word32 output_fx[], /* i : decoded synthesis */
const Word16 output_frame, /* i : decoded synthesis */
+ const Word16 Qpostd, /* i : Q value of delayed signal */
CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */
);
+
void calculate_nbits_meta_fx(
const Word16 nchan_ism,
Word32 q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], // Q30
@@ -9822,33 +9828,6 @@ void generate_masking_noise_dirac_ivas_fx(
Word16 *q_cldfb );
// modif_fs/c
-void interpolate_3_over_2_allpass_32(
- const Word32 *input, /* i : input signal Qx */
- const int16_t len, /* i : number of input samples */
- Word32 *out, /* o : output signal */
- Word32 *mem /* i/o: memory */
-);
-
-void interpolate_3_over_1_allpass_32(
- const Word32 *input, /* i : input signal */
- const int16_t len, /* i : number of input samples */
- Word32 *out, /* o : output signal */
- Word32 *mem /* i/o: memory */
-);
-void Decimate_allpass_steep_fx32(
- const Word32 *in, /* i : input array of size N */
- Word32 *mem, /* i/o: memory */
- const Word16 N, /* i : number of input samples */
- Word32 *out /* o : output array of size N/2 */
-);
-
-void Interpolate_allpass_steep_32(
- const Word32 *in_fx, /* i : input array of size N */
- Word32 *mem_fx, /* i/o: memory */
- const int16_t N, /* i : number of input samples */
- Word32 *out_fx /* o : output array of size 2*N */
-);
-
void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_TDAC, Word16 *xn_buf, const Word16 *tcx_aldo_window_1, const PWord16 *tcx_aldo_window_1_trunc, const PWord16 *tcx_aldo_window_2, const PWord16 *tcx_mdct_window_half, const PWord16 *tcx_mdct_window_minimum, const PWord16 *tcx_mdct_window_trans, Word16 tcx_mdct_window_half_length, Word16 tcx_mdct_window_min_length, Word16 index, Word16 left_rect, Word16 tcx_offset, Word16 overlap, Word16 L_frame, Word16 L_frameTCX, Word16 L_spec_TCX5, Word16 L_frame_glob, Word16 frame_cnt, Word16 bfi, Word16 *old_out, Word16 *Q_old_wtda, Decoder_State *st, Word16 fullbandScale, Word16 *acelp_zir );
void IMDCT_ivas_fx(
@@ -10542,15 +10521,15 @@ void floating_point_add(
const Word32 my, /* i: mantissa of the adder Q31 */
const Word16 ey /* i: exponent of the adder Q0 */
);
-/*delay_signal_fx is also present*/
-void delay_signal(
+
+void delay_signal_fx(
Word16 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
Word16 mem[], /* i/o: synchronization memory */
const Word16 delay /* i : delay in samples */
);
-void delay_signal32(
+void delay_signal32_fx(
Word32 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
Word32 mem[], /* i/o: synchronization memory */
@@ -11565,7 +11544,7 @@ Decoder_State **reset_elements(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
);
-void mdct_switching_dec_ivas_fx(
+void mdct_switching_dec_fx(
Decoder_State *st /* i/o: decoder state structure */
);
@@ -11674,7 +11653,7 @@ ivas_error acelp_core_enc_ivas_fx(
Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel X2.56*/
Word16 Q_new );
-void flip_and_downmix_generic_fx_32(
+void flip_and_downmix_generic_fx32(
Word32 input[], /* i : input spectrum Qx*/
Word32 output[], /* o : output spectrum Qx*/
const Word16 length, /* i : length of spectra */
@@ -11684,22 +11663,6 @@ void flip_and_downmix_generic_fx_32(
Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */
);
-void GenTransition_fixed(
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
- const Word32 output_Fs, /* i : output sampling rate : Q0 */
- const Word16 element_mode, /* i : element mode : Q0 */
- const Word16 L_frame, /* i : ACELP frame length : Q0 */
- const Word16 rf_flag, /* i : RF flag : Q0 */
- const Word32 total_brate, /* i : total bitrate : Q0 */
- const Word16 prev_Qx );
-
-void GenTransition_WB_fixed(
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
- const Word32 output_Fs /* i : output sampling rate */
-);
-
Word16 quant_2p_2N1_fx( /* o: return (2*N)+1 bits */
const Word16 pos1, /* i: position of the pulse 1 */
const Word16 pos2, /* i: position of the pulse 2 */
diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c
index 172dadf82da9d517192d902c04d101cc1f3c6453..87b323d0a98edcd61b34d804e630c3980db98088 100644
--- a/lib_com/rom_com.c
+++ b/lib_com/rom_com.c
@@ -1769,35 +1769,35 @@ static const Word16 filter_LP30_300K_fx[LFE_PLC_FDEL + 1] =
const Resampling_cfg resampling_cfg_tbl[] =
{
/* fin fout up.fact. den.fac. len.out filter coefs. filter length/2 filter mem./2 flags */
- { 8000, 8000, 12800, 12800, 8, 8, 5, 256, /*filter5_39s320_120,*/ filter5_39s320_120_fx, 15, 15, RS_INV_FAC, RS_INV_FAC },
- { 12800, 12800, 8000, 8000, 5, 5, 8, 160, /*filter5_39s320_120,*/ filter5_39s320_120_fx, L_FILT_UP8k, L_FILT_UP8k, RS_INV_FAC, RS_INV_FAC },
- { 16000, 16000, 8000, 8000, 6, 6, 12, 160, /*filter_LP12_180H,*/ filter_LP12_180H_fx, 180 / 6, 180 / 6, 0, 0 },
- { 12800, 12800, 16000, 16000, 15, 15, 12, 320, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP16k, L_FILT_UP16k, 0, 0 },
- { 12800, 12800, 32000, 32000, 15, 15, 6, 640, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP32k, L_FILT_UP32k, 0, 0 },
- { 12800, 12800, 48000, 48000, 15, 15, 4, 960, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP48k, L_FILT_UP48k, 0, 0 },
+ { 8000, 12800, 8, 5, 256, /*filter5_39s320_120,*/ filter5_39s320_120_fx, 15, RS_INV_FAC },
+ { 12800, 8000, 5, 8, 160, /*filter5_39s320_120,*/ filter5_39s320_120_fx, L_FILT_UP8k, RS_INV_FAC },
+ { 16000, 8000, 6, 12, 160, /*filter_LP12_180H,*/ filter_LP12_180H_fx, 180 / 6, 0 },
+ { 12800, 16000, 15, 12, 320, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP16k, 0 },
+ { 12800, 32000, 15, 6, 640, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP32k, 0 },
+ { 12800, 48000, 15, 4, 960, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT_UP48k, 0 },
- { 16000, 16000, 12800, 12800, 12, 12, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT16k, L_FILT16k, 0, 0 },
- { 16000, 16000, 32000, 32000, 12, 12, 6, 640, /*filter_LP12_180H, */ filter_LP12_180H_fx, L_FILT16k, L_FILT16k, 0, 0 },
- { 16000, 16000, 48000, 48000, 12, 12, 4, 960, /*filter_LP12_180H,*/ filter_LP12_180H_fx, L_FILT16k, L_FILT16k, 0, 0 },
-
- { 32000, 32000, 12800, 12800, 6, 6, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT32k, L_FILT32k, 0, 0 },
- { 32000, 32000, 16000, 16000, 6, 6, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT32k, L_FILT32k, 0, 0 },
- { 32000, 32000, 25600, 25600, 12, 12, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT32k, L_FILT32k, 0, 0 },
- { 32000, 32000, 48000, 48000, 3, 3, 2, 960, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT32k, L_FILT32k, 0, 0 },
-
- { 48000, 48000, 12800, 12800, 4, 4, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT48k, L_FILT48k, 0, 0 },
- { 48000, 48000, 16000, 16000, 4, 4, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT48k, L_FILT48k, 0, 0 },
- { 48000, 48000, 25600, 25600, 8, 8, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT48k, L_FILT48k, 0, 0 },
- { 48000, 48000, 32000, 32000, 2, 2, 3, 640, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT48k, L_FILT48k, 0, 0 },
+ { 16000, 12800, 12, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_fx, L_FILT16k, 0, },
+ { 16000, 32000, 12, 6, 640, /*filter_LP12_180H, */ filter_LP12_180H_fx, L_FILT16k, 0, },
+ { 16000, 48000, 12, 4, 960, /*filter_LP12_180H,*/ filter_LP12_180H_fx, L_FILT16k, 0, },
+
+ { 32000, 12800, 6, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT32k, 0, },
+ { 32000, 16000, 6, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT32k, 0, },
+ { 32000, 25600, 12, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT32k, 0, },
+ { 32000, 48000, 3, 2, 960, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT32k, 0, },
+
+ { 48000, 12800, 4, 15, 256, /*filter_LP15_180H,*/ filter_LP15_180H_13b_fx, L_FILT48k, 0, },
+ { 48000, 16000, 4, 12, 320, /*filter_LP12_180H,*/ filter_LP12_180H_13b_fx, L_FILT48k, 0, },
+ { 48000, 25600, 8, 15, 512, /*filter_LP15_360H,*/ filter_LP15_360H_13b_fx, L_FILT48k, 0, },
+ { 48000, 32000, 2, 3, 640, /*filter_LP3_90H,*/ filter_LP3_90H_fx, L_FILT48k, 0, },
/* configs with NB 4kHz low-pass */
- { 16000, 16000, 12800, 12800, 12, 12, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_fx, L_FILT16k, L_FILT16k, 0, 0 },
- { 32000, 32000, 12800, 12800, 6, 6, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT32k, L_FILT32k, 0, 0 },
- { 48000, 48000, 12800, 12800, 4, 4, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT48k, L_FILT48k, 0, 0 },
+ { 16000, 12800, 12, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_fx, L_FILT16k, 0, },
+ { 32000, 12800, 6, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT32k, 0, },
+ { 48000, 12800, 4, 15, 256, /*filter_LP24_90H,*/ filter_LP24_90H_13b_fx, L_FILT48k, 0, },
/* entry for LFE PLC */
- { 1600, 1600, 48000, 48000, 30, 30, 1, 960, /*filter_LP30_300K,*/ filter_LP30_300K_fx, LFE_PLC_FDEL/30,LFE_PLC_FDEL / 30, 0, 0 },
- { 0, 0, 0, 0, 0, 0, 0, 0, /* 0, */ 0, 0, 0, 0, 0 } /* trailing entry (just to calculate the length of this table) */
+ { 1600, 48000, 30, 1, 960, /*filter_LP30_300K,*/ filter_LP30_300K_fx, LFE_PLC_FDEL / 30, 0, },
+ { 0, 0, 0, 0, 0, /* 0, */ 0, 0, 0, } /* trailing entry (just to calculate the length of this table) */
};
//den fac value for last entry is calculated as den.fac = (num.fac*fin)/fout
diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h
index 33661fb581a9db3b345637c5505c79c3b1c7d62d..10bce5bb2af3fc6903d463624d8cd1d533049d60 100644
--- a/lib_com/rom_com.h
+++ b/lib_com/rom_com.h
@@ -49,13 +49,8 @@
#define INTERP_EXP 0
typedef struct
{
- Word32 fin; /* input frequency */
- Word32 fin_fx; /* input frequency Q0 */
-
- Word32 fout; /* output frequency */
- Word32 fout_fx; /* output frequency Q0 */
-
- Word16 fac_num; /* numerator of resampling factor */
+ Word32 fin_fx; /* input frequency Q0 */
+ Word32 fout_fx; /* output frequency Q0 */
Word16 fac_num_fx; /* numerator of resampling factor Q0 */
Word16 fac_den_fx; /* denominator of resampling factor Q0 */
@@ -63,12 +58,9 @@ typedef struct
const Word16 *filter_fx; /* resampling filter coefficients Q14 */
- Word16 filt_len; /* number of filter coeff. */
Word16 filt_len_fx; /* number of filter coeff. Q0 */
-
- UWord16 flags; /* flags from config. table */
- UWord16 flags_fx; /* flags from config. table Q0 */
- // UNS_Word16 flags_fx; /* flags from config. table Q0 */
+ UWord16 flags_fx; /* flags from config. table Q0 */
+ // UNS_Word16 flags_fx; /* flags from config. table Q0 */
} Resampling_cfg;
diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h
index c96dcc88479af40b7cff82494dd4069a4dde2ebf..f99d498027a98db71cfbed521e46712659506917 100644
--- a/lib_com/stat_com.h
+++ b/lib_com/stat_com.h
@@ -693,21 +693,6 @@ typedef enum
/*---------------------------------------------------------------*
* IGF *
*---------------------------------------------------------------*/
-/*----------------------------------------------------------------------------------*
- * NB postfilter / formant postfilter static variables
- *----------------------------------------------------------------------------------*/
-typedef struct pfstat_structure
-{
- Word16 on; /* On/off flag */
- Word16 reset; /* reset flag */
- Word16 mem_pf_in[L_SUBFR]; /* Input memory Qqmem_pf_in */
- Word16 mem_stp[L_SUBFR]; /* 1/A(gamma1) memory Qqmem_stp*/
- Word16 mem_res2[DECMEM_RES2]; /* A(gamma2) residual Q_syn*/
- Word16 mem_zero[M]; /* null memory to compute i.r. of A(gamma2)/A(gamma1) Q_qmem_zero*/
- Word16 gain_prec; /*Q14*/ /* for gain adjustment */
-
-} PFSTAT, *PFSTAT_HANDLE;
-
typedef struct
{
diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c
deleted file mode 100644
index 7905c7145b985c6cf56ef687f1c2d7600d03f363..0000000000000000000000000000000000000000
--- a/lib_com/swb_tbe_com.c
+++ /dev/null
@@ -1,296 +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_fx.h"
-#include "rom_com.h"
-#include "wmc_auto.h"
-#include
-
-
-/*-----------------------------------------------------------------*
- * Local function prototypes
- *-----------------------------------------------------------------*/
-
-
-/*-------------------------------------------------------------------*
- * flip_spectrum_and_decimby4()
- *
- *
- *-------------------------------------------------------------------*/
-
-
-void GenSHBSynth_fx_32(
- const Word32 *input_synspeech, /* i : input synthesized speech Qx*/
- Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/
- Word32 Hilbert_Mem[], /* i/o: memory Qx*/
- Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/
- const Word16 L_frame, /* i : ACELP frame length */
- Word16 *syn_dm_phase )
-{
- Word32 speech_buf_32k[L_FRAME32k];
- Word16 i;
-
-#ifdef FIX_881_HILBERT_FILTER
- Word16 shift = 0;
- Word32 maxm32, input_synspeech_temp[L_FRAME16k];
- move16();
-
- /* find the maximum value and derive the shift to improve precision of the Hilber filter */
- maxm32 = L_deposit_l( 0 );
- FOR( i = 0; i < L_FRAME16k; i++ )
- {
- maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
- }
-
- FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
- {
- maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
- }
-
- FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
- {
- maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
- }
-
- IF( maxm32 != 0 )
- {
- shift = sub( norm_l( maxm32 ), 3 );
-
- Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
- Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
- Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
- }
- ELSE
- {
- Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
- }
-
- Interpolate_allpass_steep_32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
-#else
- Interpolate_allpass_steep_32( input_synspeech, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
-#endif
-
- IF( EQ_16( L_frame, L_FRAME ) )
- {
- flip_and_downmix_generic_fx_32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase );
- }
- ELSE
- {
- FOR( i = 0; i < L_FRAME32k; i++ )
- {
- // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
- IF( i % 2 == 0 )
- {
- shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
- }
- ELSE
- {
- shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
- }
- move32();
- }
- }
-
-#ifdef FIX_881_HILBERT_FILTER
- IF( maxm32 != 0 )
- {
- Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
- Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
- Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
- }
-#endif
-
- return;
-}
-void ScaleShapedSHB_32(
- const Word16 length, /* i : SHB overlap length */
- Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */
- Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */
- const Word16 *subgain_fx, /* i : subframe gain Q15 */
- const Word32 frame_gain_fx, /* i : frame gain Q18*/
- const Word16 *win_fx, /* i : window Q15 */
- const Word16 *subwin_fx, /* i : subframes window Q15 */
- Word16 *Q_inp,
- Word16 *Q_new )
-{
- const Word16 *skip;
- Word16 i, j, k, l_shb_lahead, l_frame;
- Word16 join_length, num_join;
- Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
- Word16 sum_gain_fx;
-
- /* initilaization */
- l_frame = L_FRAME16k;
- l_shb_lahead = L_SHB_LAHEAD;
- move16();
- move16();
- skip = skip_bands_SWB_TBE;
-
- IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
- {
- skip = skip_bands_WB_TBE;
- l_frame = L_FRAME16k / 4;
- l_shb_lahead = L_SHB_LAHEAD / 4;
- move16();
- move16();
- }
-
- /* apply gain for each subframe, and store noise output signal using overlap-add */
- set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
-
- IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
- {
- sum_gain_fx = 0;
- move16();
- FOR( k = 0; k < shr( length, 1 ); k++ )
- {
- sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
- mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
- move32(); // Qx
- mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
- move32();
- }
- FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
- {
- FOR( k = 0; k < length; k++ )
- {
- L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
- sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
- mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
- move32();
- }
- }
- FOR( k = 0; k < shr( length, 1 ); k++ )
- {
- sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
- mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
- move32();
- }
- }
- ELSE
- {
- num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
- join_length = i_mult( num_join, length );
- j = 0;
- move16();
- move16();
- FOR( k = 0; k < length; k++ )
- {
- mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
- move32();
- j = add( j, 1 );
- }
- FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
- {
- FOR( k = 0; k < join_length - length; k++ )
- {
- mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
- move32();
- j = add( j, 1 );
- }
-
- FOR( k = 0; k < length; k++ )
- {
- L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
- mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx
- move32();
- j = add( j, 1 );
- }
- }
- FOR( k = 0; k < join_length - length; k++ )
- {
- mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
- move32();
- j = add( j, 1 );
- }
- FOR( k = 0; k < length; k++ )
- {
- mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx
- move32();
- j = add( j, 1 );
- }
- }
-
- Word16 norm_shift = norm_l( frame_gain_fx );
- if ( frame_gain_fx == 0 )
- {
- norm_shift = 31;
- move16();
- }
-
- norm_shift = s_min( norm_shift, 14 );
- norm_shift = sub( norm_shift, 1 );
-
- *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
- move16();
- FOR( i = 0; i < L_SHB_LAHEAD; i++ )
- {
- overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
- move32();
- }
-
- FOR( i = 0; i < l_shb_lahead; i++ )
- {
- synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new
- synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
- synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
- move32();
- move32();
- move32();
- }
-
- FOR( ; i < l_frame; i++ )
- {
- synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
- move32();
- }
-
- FOR( ; i < l_frame + l_shb_lahead; i++ )
- {
- synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
- overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new
- move32();
- move32();
- }
-
- *Q_inp = *Q_new;
- move16();
- return;
-}
diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c
index 7e9471c45b04a77a33f67679e751f60168fc5a05..238478b1aa6a7b3875be079d3a96dbf15b9dc929 100644
--- a/lib_com/swb_tbe_com_fx.c
+++ b/lib_com/swb_tbe_com_fx.c
@@ -72,7 +72,7 @@ void swb_tbe_reset_fx(
* Reset the extra parameters needed for synthesis of the SWB TBE output
*-------------------------------------------------------------------*/
-void swb_tbe_reset_synth_ivas_fx(
+void swb_tbe_reset_synth_fx(
Word32 genSHBsynth_Hilbert_Mem[],
Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[],
Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] )
@@ -80,17 +80,11 @@ void swb_tbe_reset_synth_ivas_fx(
set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE );
set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP );
- set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP );
- return;
-}
-void swb_tbe_reset_synth_fx(
- Word32 genSHBsynth_Hilbert_Mem[],
- Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[] )
-{
-
- set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE );
- set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP );
+ if ( genSHBsynth_state_lsyn_filt_shb_local_fx_32 != NULL )
+ {
+ set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP );
+ }
return;
}
@@ -486,10 +480,12 @@ void flip_and_downmix_generic_fx(
*phase_state = j;
move16();
+
return;
}
-void flip_and_downmix_generic_fx_32(
+
+void flip_and_downmix_generic_fx32(
Word32 input[], /* i : input spectrum Qx*/
Word32 output[], /* o : output spectrum Qx*/
const Word16 length, /* i : length of spectra */
@@ -934,7 +930,7 @@ static void Calc_st_filt_tbe_ivas_enc_fx(
{
L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
}
- g0 = extract_h( L_shl( L_g0, 14 ) );
+ g0 = extract_h( L_shl_sat( L_g0, 14 ) );
/* Scale signal i of 1/A(gamma1) */
IF( GT_16( g0, 1024 ) )
@@ -5079,6 +5075,92 @@ void GenSHBSynth_fx(
}
+/* IVAS 32-bit variant */
+void GenSHBSynth_fx32(
+ const Word32 *input_synspeech, /* i : input synthesized speech Qx*/
+ Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/
+ Word32 Hilbert_Mem[], /* i/o: memory Qx*/
+ Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/
+ const Word16 L_frame, /* i : ACELP frame length */
+ Word16 *syn_dm_phase )
+{
+ Word32 speech_buf_32k[L_FRAME32k];
+ Word16 i;
+
+#ifdef FIX_881_HILBERT_FILTER
+ Word16 shift = 0;
+ Word32 maxm32, input_synspeech_temp[L_FRAME16k];
+ move16();
+
+ /* find the maximum value and derive the shift to improve precision of the Hilber filter */
+ maxm32 = L_deposit_l( 0 );
+ FOR( i = 0; i < L_FRAME16k; i++ )
+ {
+ maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
+ }
+
+ FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
+ {
+ maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
+ }
+
+ FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
+ {
+ maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
+ }
+
+ IF( maxm32 != 0 )
+ {
+ shift = sub( norm_l( maxm32 ), 3 );
+
+ Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
+ Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
+ Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
+ }
+ ELSE
+ {
+ Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
+ }
+
+ Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
+#else
+ Interpolate_allpass_steep_fx32( input_synspeech, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
+#endif
+
+ IF( EQ_16( L_frame, L_FRAME ) )
+ {
+ flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase );
+ }
+ ELSE
+ {
+ FOR( i = 0; i < L_FRAME32k; i++ )
+ {
+ // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
+ IF( i % 2 == 0 )
+ {
+ shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
+ }
+ ELSE
+ {
+ shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
+ }
+ move32();
+ }
+ }
+
+#ifdef FIX_881_HILBERT_FILTER
+ IF( maxm32 != 0 )
+ {
+ Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
+ Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
+ Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
+ }
+#endif
+
+ return;
+}
+
+
/*==============================================================================*/
/* FUNCTION : void ScaleShapedSHB_fx() */
/*------------------------------------------------------------------------------*/
@@ -5300,6 +5382,165 @@ void ScaleShapedSHB_fx(
return;
}
+
+/* IVAS 32-bit variant */
+void ScaleShapedSHB_fx32(
+ const Word16 length, /* i : SHB overlap length */
+ Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */
+ Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */
+ const Word16 *subgain_fx, /* i : subframe gain Q15 */
+ const Word32 frame_gain_fx, /* i : frame gain Q18*/
+ const Word16 *win_fx, /* i : window Q15 */
+ const Word16 *subwin_fx, /* i : subframes window Q15 */
+ Word16 *Q_inp,
+ Word16 *Q_new )
+{
+ const Word16 *skip;
+ Word16 i, j, k, l_shb_lahead, l_frame;
+ Word16 join_length, num_join;
+ Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
+ Word16 sum_gain_fx;
+
+ /* initilaization */
+ l_frame = L_FRAME16k;
+ l_shb_lahead = L_SHB_LAHEAD;
+ move16();
+ move16();
+ skip = skip_bands_SWB_TBE;
+
+ IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
+ {
+ skip = skip_bands_WB_TBE;
+ l_frame = L_FRAME16k / 4;
+ l_shb_lahead = L_SHB_LAHEAD / 4;
+ move16();
+ move16();
+ }
+
+ /* apply gain for each subframe, and store noise output signal using overlap-add */
+ set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
+
+ IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
+ {
+ sum_gain_fx = 0;
+ move16();
+ FOR( k = 0; k < shr( length, 1 ); k++ )
+ {
+ sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
+ mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
+ move32(); // Qx
+ mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
+ move32();
+ }
+ FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
+ {
+ FOR( k = 0; k < length; k++ )
+ {
+ L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
+ sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
+ mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
+ move32();
+ }
+ }
+ FOR( k = 0; k < shr( length, 1 ); k++ )
+ {
+ sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
+ mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
+ move32();
+ }
+ }
+ ELSE
+ {
+ num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
+ join_length = i_mult( num_join, length );
+ j = 0;
+ move16();
+ move16();
+ FOR( k = 0; k < length; k++ )
+ {
+ mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
+ move32();
+ j = add( j, 1 );
+ }
+ FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
+ {
+ FOR( k = 0; k < join_length - length; k++ )
+ {
+ mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
+ move32();
+ j = add( j, 1 );
+ }
+
+ FOR( k = 0; k < length; k++ )
+ {
+ L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
+ mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx
+ move32();
+ j = add( j, 1 );
+ }
+ }
+ FOR( k = 0; k < join_length - length; k++ )
+ {
+ mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
+ move32();
+ j = add( j, 1 );
+ }
+ FOR( k = 0; k < length; k++ )
+ {
+ mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx
+ move32();
+ j = add( j, 1 );
+ }
+ }
+
+ Word16 norm_shift = norm_l( frame_gain_fx );
+ if ( frame_gain_fx == 0 )
+ {
+ norm_shift = 31;
+ move16();
+ }
+
+ norm_shift = s_min( norm_shift, 14 );
+ norm_shift = sub( norm_shift, 1 );
+
+ *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
+ move16();
+ FOR( i = 0; i < L_SHB_LAHEAD; i++ )
+ {
+ overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
+ move32();
+ }
+
+ FOR( i = 0; i < l_shb_lahead; i++ )
+ {
+ synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new
+ synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
+ synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
+ move32();
+ move32();
+ move32();
+ }
+
+ FOR( ; i < l_frame; i++ )
+ {
+ synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
+ move32();
+ }
+
+ FOR( ; i < l_frame + l_shb_lahead; i++ )
+ {
+ synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
+ overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new
+ move32();
+ move32();
+ }
+
+ *Q_inp = *Q_new;
+ move16();
+ return;
+}
+
+
/*-------------------------------------------------------------------*
* ScaleShapedWB()
*
@@ -5315,15 +5556,11 @@ void ScaleShapedWB_fx(
const Word16 *win, /* i : window Q15*/
const Word16 *subwin, /* i : subframes window Q15*/
const Word16 Q_bwe_exc,
- Word16 L_frame /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
- ,
- Word16 dynQ /* i : indicate whether output is dynamic Q, or Q0 */
- ,
- Word16 *Qx /* o : newly computed Q factor for synSHB */
- ,
- Word16 prev_Qx /* i : prev_Qx for memory scaling */
- ,
- Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */
+ Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
+ Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */
+ Word16 *Qx, /* o : newly computed Q factor for synSHB */
+ Word16 prev_Qx, /* i : prev_Qx for memory scaling */
+ Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */
)
{
const Word16 *skip;
diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c
index 968cc8359120850e8eb2596ae92a9464a0694200..ada0d243ea88b7c08fdb6ac8bd5d8720f9eb7f8f 100644
--- a/lib_com/syn_filt_fx.c
+++ b/lib_com/syn_filt_fx.c
@@ -213,14 +213,14 @@ void syn_filt_fx(
FOR( i = 0; i < l; i++ )
{
- s = L_mult( a0, x[i] );
+ s = L_mult( a0, x[i] ); // Qx + Qa - shift + 1
FOR( j = 1; j <= m; j++ )
{
- s = L_msu_sat( s, shr( a[j], shift ), yy[i - j] );
+ s = L_msu_sat( s, a[j], yy[i - j] ); // Qa + Qx - shift + 1
}
- s = L_shl_sat( s, q );
- yy[i] = extract_h( s );
+ s = L_shl_sat( s, q ); // Qx + (Qa + q)Q15 - shift + 1 = Qx - shift + Q16
+ yy[i] = extract_h( s ); // Qx - shift
move16();
y[i] = extract_h( s );
move16();
diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c
index 9d7cb9254a7f93061a7183406fb65853e8559889..322549a6f0841e9d147075092d263ad85526b9da 100644
--- a/lib_com/tcx_ltp_fx.c
+++ b/lib_com/tcx_ltp_fx.c
@@ -1252,7 +1252,7 @@ Word16 tcx_ltp_decode_params(
return 0;
}
-void tcx_ltp_post(
+void tcx_ltp_post_fx(
Decoder_State *st,
TCX_LTP_DEC_HANDLE hTcxLtpDec,
Word16 core, /* Q0 */
@@ -1616,7 +1616,8 @@ void tcx_ltp_post(
}
-void tcx_ltp_post32(
+/* IVAS 32-bit variant */
+void tcx_ltp_post_fx32(
Decoder_State *st,
TCX_LTP_DEC_HANDLE hTcxLtpDec,
Word16 core, /* Q0 */
diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c
index 6f46fdfa3c3ecce8ba76d364ee0eb226a49c2b90..8a4322f8d275b58272b49f7b524021f7a423ac81 100644
--- a/lib_com/tools_fx.c
+++ b/lib_com/tools_fx.c
@@ -3984,13 +3984,14 @@ void floating_point_add(
move16();
return;
}
+
/*-------------------------------------------------------------------*
- * delay_signal()
+ * delay_signal_fx()
*
* Delay buffer by defined number of samples
*-------------------------------------------------------------------*/
-void delay_signal(
+void delay_signal_fx(
Word16 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
Word16 mem[], /* i/o: synchronization memory */
@@ -4007,14 +4008,13 @@ void delay_signal(
return;
}
-void delay_signal_fx(
+void delay_signal32_fx(
Word32 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
Word32 mem[], /* i/o: synchronization memory */
const Word16 delay /* i : delay in samples */
)
{
-
Word32 tmp_buffer[L_FRAME48k];
Copy32( mem, tmp_buffer, delay );
@@ -4024,6 +4024,7 @@ void delay_signal_fx(
return;
}
+
void delay_signal_q_adj_fx(
Word32 x[], /* i/o: signal to be delayed */
const Word16 len, /* i : length of the input signal */
@@ -4116,30 +4117,6 @@ void v_shr_16(
return;
}
-/*-------------------------------------------------------------------*
- * delay_signal()
- *
- * Delay buffer by defined number of samples
- *-------------------------------------------------------------------*/
-
-void delay_signal32(
- Word32 x[], /* i/o: signal to be delayed */
- const Word16 len, /* i : length of the input signal */
- Word32 mem[], /* i/o: synchronization memory */
- const Word16 delay /* i : delay in samples */
-)
-{
- Word32 tmp_buffer[L_FRAME48k];
-
- Copy32( mem, tmp_buffer, delay );
- Copy32( x + sub( len, delay ), mem, delay );
- Copy32( x, x + delay, sub( len, delay ) );
- Copy32( tmp_buffer, x, delay );
-
- return;
-}
-
-
/*---------------------------------------------------------------------*
* lin_interp_fx()
*
diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c
index 09bc652be8b7cfbb370f18938ca0ac32632bcb56..cc03dcf525f424e500118ee9f8d2362c74ebedd3 100644
--- a/lib_dec/FEC_HQ_core_fx.c
+++ b/lib_dec/FEC_HQ_core_fx.c
@@ -725,10 +725,9 @@ void HQ_FEC_Mem_update_fx(
move32();
#endif
move32(); // tmp_energy_fx
-#ifdef ADD_IVAS_HQ_CODE_FEC
+
IF( EQ_16( output_frame, L_FRAME8k ) )
{
-#endif
IF( is_transient )
{
@@ -759,226 +758,222 @@ void HQ_FEC_Mem_update_fx(
}
}
}
-#ifndef ADD_IVAS_HQ_CODE_FEC
- IF( EQ_16( output_frame, L_FRAME8k ) )
- {
-#endif
- /* if LR MDCT core is used, recalculate norms from decoded MDCT spectrum (using code from hq_hr_enc_fx()) */
- test();
- IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) )
- {
- /* First group */
- logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
- j = ynrm[0];
- move16();
- offset = WID_G1;
- move16();
- FOR( i = 1; i < SFM_G1; i++ )
- {
- logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
- offset = add( offset, WID_G1 );
- }
+ /* if LR MDCT core is used, recalculate norms from decoded MDCT spectrum (using code from hq_hr_enc_fx()) */
+ test();
+ IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) )
+ {
+ /* First group */
+ logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
+ j = ynrm[0];
+ move16();
+ offset = WID_G1;
+ move16();
- /* Second group */
- FOR( i = SFM_G1; i < SFM_G1 + 2; i++ )
- {
- logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
- offset = add( offset, WID_G2 );
- }
+ FOR( i = 1; i < SFM_G1; i++ )
+ {
+ logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
+ offset = add( offset, WID_G1 );
}
- /* Memory update for the LGF log2 Norm */
- FOR( i = 0; i < nb_sfm; i++ )
+ /* Second group */
+ FOR( i = SFM_G1; i < SFM_G1 + 2; i++ )
{
- normq_fx[i] = dicn_fx[ynrm[i]];
- move32();
+ logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) );
+ offset = add( offset, WID_G2 );
}
- k = 0;
- move16();
- FOR( i = 0; i < num_Sb; i++ )
- {
- norm_values_fx = &hHQ_nbfec->ynrm_values_fx[i][0];
- Copy32( norm_values_fx, &norm_values_fx[1], MAX_PGF - 1 );
+ }
- L_tmp = L_deposit_l( 0 );
- FOR( j = 0; j < Num_bands_p[i]; j++ )
- {
- L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/
- k = add( k, 1 );
- }
- tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/
- norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/
- move32();
- tmp_energy_fx = L_add( tmp_energy_fx, L_shr( L_tmp, 3 ) ); /*8*/
+ /* Memory update for the LGF log2 Norm */
+ FOR( i = 0; i < nb_sfm; i++ )
+ {
+ normq_fx[i] = dicn_fx[ynrm[i]];
+ move32();
+ }
+ k = 0;
+ move16();
+ FOR( i = 0; i < num_Sb; i++ )
+ {
+ norm_values_fx = &hHQ_nbfec->ynrm_values_fx[i][0];
+ Copy32( norm_values_fx, &norm_values_fx[1], MAX_PGF - 1 );
+
+ L_tmp = L_deposit_l( 0 );
+ FOR( j = 0; j < Num_bands_p[i]; j++ )
+ {
+ L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/
+ k = add( k, 1 );
}
- test();
- test();
- IF( ( c_switching_flag ) || ( ( st_fx->last_core == ACELP_CORE ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) )
+ tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/
+ norm_values_fx[0] = Mult_32_16( L_tmp, tmp_fx ); /*11 + 16 - 15*/
+ move32();
+ tmp_energy_fx = L_add( tmp_energy_fx, L_shr( L_tmp, 3 ) ); /*8*/
+ }
+ test();
+ test();
+ IF( ( c_switching_flag ) || ( ( st_fx->last_core == ACELP_CORE ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) )
+ {
+ FOR( i = 0; i < MAX_SB_NB; i++ )
{
- FOR( i = 0; i < MAX_SB_NB; i++ )
+ FOR( j = 1; j < MAX_PGF; j++ )
{
- FOR( j = 1; j < MAX_PGF; j++ )
- {
- hHQ_nbfec->ynrm_values_fx[i][j] = hHQ_nbfec->ynrm_values_fx[i][0];
- move32();
- }
+ hHQ_nbfec->ynrm_values_fx[i][j] = hHQ_nbfec->ynrm_values_fx[i][0];
+ move32();
}
}
- set16_fx( hHQ_nbfec->Norm_gain_fx, 32767, SFM_N_NB ); /*15*/
- /* st->energy_MA_Curr[1]=Energy of the current frame */
- tmp_fx = inv_tbl_fx[nb_sfm];
- move16(); /*15*/
- L_tmp = Mult_32_16( tmp_energy_fx, tmp_fx ); /*8 + 15 - 15*/
+ }
+ set16_fx( hHQ_nbfec->Norm_gain_fx, 32767, SFM_N_NB ); /*15*/
+ /* st->energy_MA_Curr[1]=Energy of the current frame */
+ tmp_fx = inv_tbl_fx[nb_sfm];
+ move16(); /*15*/
+ L_tmp = Mult_32_16( tmp_energy_fx, tmp_fx ); /*8 + 15 - 15*/
- hHQ_nbfec->energy_MA_Curr_fx[1] = extract_h( L_shl_sat( L_tmp, 16 - 8 ) );
- move16();
- /* Moving Average */
- hHQ_nbfec->energy_MA_Curr_fx[0] = s_max( 1, add( mult_r( 26214, hHQ_nbfec->energy_MA_Curr_fx[0] ), mult_r( 6554, hHQ_nbfec->energy_MA_Curr_fx[1] ) ) );
- move16();
+ hHQ_nbfec->energy_MA_Curr_fx[1] = extract_h( L_shl_sat( L_tmp, 16 - 8 ) );
+ move16();
+ /* Moving Average */
+ hHQ_nbfec->energy_MA_Curr_fx[0] = s_max( 1, add( mult_r( 26214, hHQ_nbfec->energy_MA_Curr_fx[0] ), mult_r( 6554, hHQ_nbfec->energy_MA_Curr_fx[1] ) ) );
+ move16();
+
+ /*st->diff_energy = (float)fabs((st->energy_MA_Curr[1] - st->energy_MA_Curr[0])/st->energy_MA_Curr[0]); */
+ hHQ_nbfec->diff_energy_fx = abs_s( sub( hHQ_nbfec->energy_MA_Curr_fx[1], hHQ_nbfec->energy_MA_Curr_fx[0] ) );
+ move16();
+ exp1 = sub( norm_l( hHQ_nbfec->diff_energy_fx ), 1 );
+ exp2 = norm_l( hHQ_nbfec->energy_MA_Curr_fx[0] );
+ hHQ_nbfec->diff_energy_fx = div_s( extract_h( L_shl( hHQ_nbfec->diff_energy_fx, exp1 ) ), extract_h( L_shl( hHQ_nbfec->energy_MA_Curr_fx[0], exp2 ) ) );
+ move16();
+ exp = add( 15, sub( exp1, exp2 ) );
+ hHQ_nbfec->diff_energy_fx = shl( hHQ_nbfec->diff_energy_fx, sub( 11, exp ) ); /*11*/
+ move16();
- /*st->diff_energy = (float)fabs((st->energy_MA_Curr[1] - st->energy_MA_Curr[0])/st->energy_MA_Curr[0]); */
- hHQ_nbfec->diff_energy_fx = abs_s( sub( hHQ_nbfec->energy_MA_Curr_fx[1], hHQ_nbfec->energy_MA_Curr_fx[0] ) );
+ /* Classify the stationary mode : 12% */
+ IF( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_12P_fx ) )
+ {
+ stat_mode_curr = 1;
move16();
- exp1 = sub( norm_l( hHQ_nbfec->diff_energy_fx ), 1 );
- exp2 = norm_l( hHQ_nbfec->energy_MA_Curr_fx[0] );
- hHQ_nbfec->diff_energy_fx = div_s( extract_h( L_shl( hHQ_nbfec->diff_energy_fx, exp1 ) ), extract_h( L_shl( hHQ_nbfec->energy_MA_Curr_fx[0], exp2 ) ) );
+ }
+ ELSE
+ {
+ stat_mode_curr = 0;
move16();
- exp = add( 15, sub( exp1, exp2 ) );
- hHQ_nbfec->diff_energy_fx = shl( hHQ_nbfec->diff_energy_fx, sub( 11, exp ) ); /*11*/
+ }
+
+ /* Apply Hysteresis to prevent frequent mode changing */
+ if ( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) )
+ {
+ hHQ_nbfec->stat_mode_out = stat_mode_curr;
move16();
+ }
- /* Classify the stationary mode : 12% */
- IF( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_12P_fx ) )
- {
- stat_mode_curr = 1;
- move16();
- }
- ELSE
- {
- stat_mode_curr = 0;
- move16();
- }
+ hHQ_nbfec->stat_mode_old = stat_mode_curr;
+ move16();
- /* Apply Hysteresis to prevent frequent mode changing */
- if ( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) )
+ /* Find max. band index (Minimum value means maximum energy) */
+ Min_ind = 0;
+ move16();
+ Min_value = L_deposit_l( 100 );
+ FOR( i = 0; i < num_Sb; i++ )
+ {
+ IF( GT_32( Min_value, ynrm[i] ) )
{
- hHQ_nbfec->stat_mode_out = stat_mode_curr;
+ Min_value = ynrm[i];
+ move16();
+ Min_ind = i;
move16();
}
+ }
- hHQ_nbfec->stat_mode_old = stat_mode_curr;
- move16();
-
- /* Find max. band index (Minimum value means maximum energy) */
- Min_ind = 0;
- move16();
- Min_value = L_deposit_l( 100 );
- FOR( i = 0; i < num_Sb; i++ )
+ /* Find max. coeff in band 0 */
+ Max_ind = 0;
+ move16();
+ IF( Min_ind == 0 )
+ {
+ Max_coeff_fx = L_deposit_l( 0 );
+ FOR( i = 0; i < 8; i++ )
{
- IF( GT_32( Min_value, ynrm[i] ) )
+ L_tmp = L_abs( t_audio_q_fx[i] );
+ IF( LT_32( Max_coeff_fx, L_tmp ) )
{
- Min_value = ynrm[i];
- move16();
- Min_ind = i;
+ Max_coeff_fx = L_add( L_tmp, 0 );
+ Max_ind = i;
move16();
}
}
+ }
- /* Find max. coeff in band 0 */
- Max_ind = 0;
- move16();
- IF( Min_ind == 0 )
- {
- Max_coeff_fx = L_deposit_l( 0 );
- FOR( i = 0; i < 8; i++ )
- {
- L_tmp = L_abs( t_audio_q_fx[i] );
- IF( LT_32( Max_coeff_fx, L_tmp ) )
- {
- Max_coeff_fx = L_add( L_tmp, 0 );
- Max_ind = i;
- move16();
- }
- }
- }
+ /* Find energy difference from band 16 */
+ k = 1;
+ move16();
- /* Find energy difference from band 16 */
- k = 1;
+ FOR( i = k; i < num_Sb; i++ )
+ {
+ en_high_fx[i] = L_deposit_l( 0 );
move16();
-
- FOR( i = k; i < num_Sb; i++ )
+ FOR( j = 0; j < 2; j++ )
{
- en_high_fx[i] = L_deposit_l( 0 );
- move16();
- FOR( j = 0; j < 2; j++ )
- {
- /*en_high[i] += 0.5f*st->ynrm_values[i][j+1];*/
- en_high_fx[i] = L_add( en_high_fx[i], L_shr( hHQ_nbfec->ynrm_values_fx[i][j + 1], 1 ) ); /*Q12*/
- move32();
- }
+ /*en_high[i] += 0.5f*st->ynrm_values[i][j+1];*/
+ en_high_fx[i] = L_add( en_high_fx[i], L_shr( hHQ_nbfec->ynrm_values_fx[i][j + 1], 1 ) ); /*Q12*/
+ move32();
}
+ }
- *mean_en_high_fx = 0;
- move16();
- FOR( i = k; i < num_Sb; i++ )
- {
- /* *mean_en_high += (float)(en_high[i]/st->ynrm_values[i][0]);*/
- exp1 = sub( norm_l( en_high_fx[i] ), 1 );
- exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] );
- tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) );
- exp = add( 15, sub( exp1, exp2 ) );
- *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow );
- move16();
- }
- *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] );
+ *mean_en_high_fx = 0;
+ move16();
+ FOR( i = k; i < num_Sb; i++ )
+ {
+ /* *mean_en_high += (float)(en_high[i]/st->ynrm_values[i][0]);*/
+ exp1 = sub( norm_l( en_high_fx[i] ), 1 );
+ exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] );
+ tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) );
+ exp = add( 15, sub( exp1, exp2 ) );
+ *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow );
move16();
+ }
+ *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] );
+ move16();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( ( LT_16( Min_ind, 5 ) ) && ( LT_16( abs_s( sub( Min_ind, hHQ_nbfec->old_Min_ind ) ), 2 ) ) && ( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_90P_fx ) ) && ( !st_fx->bfi ) && ( !st_fx->prev_bfi ) && ( !st_fx->prev_old_bfi ) && ( !is_transient ) && ( !hHQ_core->old_is_transient[1] ) && EQ_16( hHQ_nbfec->prev_last_core, HQ_CORE ) && EQ_16( st_fx->last_core, HQ_CORE ) )
+ {
+ hHQ_nbfec->phase_mat_flag = 1;
+ move16();
test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- test();
- IF( ( LT_16( Min_ind, 5 ) ) && ( LT_16( abs_s( sub( Min_ind, hHQ_nbfec->old_Min_ind ) ), 2 ) ) && ( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_90P_fx ) ) && ( !st_fx->bfi ) && ( !st_fx->prev_bfi ) && ( !st_fx->prev_old_bfi ) && ( !is_transient ) && ( !hHQ_core->old_is_transient[1] ) && EQ_16( hHQ_nbfec->prev_last_core, HQ_CORE ) && EQ_16( st_fx->last_core, HQ_CORE ) )
- {
- hHQ_nbfec->phase_mat_flag = 1;
- move16();
- test();
- if ( Min_ind == 0 && ( LT_16( Max_ind, 3 ) ) )
- {
- hHQ_nbfec->phase_mat_flag = 0;
- move16();
- }
- }
- ELSE
+ if ( Min_ind == 0 && ( LT_16( Max_ind, 3 ) ) )
{
hHQ_nbfec->phase_mat_flag = 0;
move16();
}
-
- hHQ_nbfec->old_Min_ind = Min_ind;
+ }
+ ELSE
+ {
+ hHQ_nbfec->phase_mat_flag = 0;
move16();
}
+ hHQ_nbfec->old_Min_ind = Min_ind;
+ move16();
+
+
FOR( i = 0; i < L_FRAME8k; i++ )
{
hHQ_nbfec->old_coeffs_fx[i] = t_audio_q_fx[i];
move32();
}
-
- hHQ_core->old_is_transient[2] = hHQ_core->old_is_transient[1];
- move16();
- hHQ_core->old_is_transient[1] = hHQ_core->old_is_transient[0];
- move16();
- hHQ_core->old_is_transient[0] = is_transient;
- move16();
-#ifdef ADD_IVAS_HQ_CODE_FEC
}
-#endif
+
+ hHQ_core->old_is_transient[2] = hHQ_core->old_is_transient[1];
+ move16();
+ hHQ_core->old_is_transient[1] = hHQ_core->old_is_transient[0];
+ move16();
+ hHQ_core->old_is_transient[0] = is_transient;
+ move16();
+
return;
}
@@ -1961,11 +1956,18 @@ static void Next_good_after_burst_erasures_fx(
return;
}
+/*--------------------------------------------------------------------------
+ * save_synthesis_hq_fec_fx()
+ *
+ * Save synthesis for HQ FEC
+ *-------------------------------------------------------------------------*/
void save_synthesis_hq_fec_fx(
Decoder_State *st, /* i/o: decoder state structure */
+ const Word16 synth_fx[], /* i : decoded synthesis (EVS) */
const Word32 output_fx[], /* i : decoded synthesis */
const Word16 output_frame, /* i : decoded synthesis */
+ const Word16 Qpostd, /* i : Q value of delayed signal */
CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */
)
{
@@ -2004,138 +2006,55 @@ void save_synthesis_hq_fec_fx(
test();
IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( ( st->core == ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) )
{
- Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ) );
- FOR( Word16 i = 0; i < output_frame; i++ )
- {
- st->hTcxDec->old_synthFB_fx[( ( i + output_frame ) - post_hq_delay )] = extract_h( L_shl_sat( output_fx[i], 16 ) ); // Q16
- move16();
- }
-
IF( st->element_mode == EVS_MONO )
{
+ Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ) ); /*hTcxDec->q_synth_history_fx*/
+ Copy_Scale_sig( synth_fx, st->hTcxDec->old_synthFB_fx + sub( output_frame, post_hq_delay ), output_frame, negate( Qpostd ) ); /* output_sp not initialized yet */
/* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill
this buffer are not available for all cases, the impact on the output is limited */
-
set16_fx( st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), 0, post_hq_delay );
+
IF( GE_16( output_frame, L_FRAME16k ) )
{
- Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) );
+ Copy_Scale_sig( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), negate( st->Qprev_synth_buffer_fx ) ); /*Q0*/
}
- ELSE
+ /* IVAS Floating point code has the commented-out else branch below, but it does not appear to be necessary. To be verified
+ else
{
- Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
+ mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
}
+ */
IF( st->core != ACELP_CORE )
{
IF( GE_16( output_frame, L_FRAME16k ) )
{
- Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ) );
- Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
+ Copy_Scale_sig( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( Qpostd ) ); /*Q0*/
+ Copy_Scale_sig( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ), negate( st->hHQ_core->Q_old_wtda ) ); /*Q0*/
}
ELSE
{
- Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ) );
- Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
+
+ Copy_Scale_sig( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( Qpostd ) ); /*Q0*/
+ Copy_Scale_sig( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ), negate( st->hHQ_core->Q_old_wtda ) ); /*Q0*/
}
}
}
ELSE
{
- IF( st->core != ACELP_CORE )
- {
- Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), post_hq_delay );
- Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
- }
- }
- }
- return;
-}
-
-
-#ifdef ADD_IVAS_HQ_CODE_FEC
-/*--------------------------------------------------------------------------
- * save_synthesis_hq_fec()
- *
- * Save synthesis for HQ FEC
- *-------------------------------------------------------------------------*/
-
-void save_synthesis_hq_fec(
- Decoder_State *st, /* i/o: decoder state structure */
- const float *output, /* i : decoded synthesis */
- const int16_t output_frame, /* i : decoded synthesis */
- CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */
-)
-{
- int16_t post_hq_delay;
-
- switch ( st->element_mode )
- {
- case EVS_MONO:
- post_hq_delay = NS2SA( st->output_Fs, POST_HQ_DELAY_NS );
- break;
- case IVAS_SCE:
- post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS );
- break;
- case IVAS_CPE_DFT:
- if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
- {
- post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS );
- }
- else
- {
- post_hq_delay = 0;
- }
- break;
- default:
- post_hq_delay = 0;
- break;
- }
-
-
- if ( ( st->codec_mode == MODE1 && st->hTcxDec != NULL ) && ( ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) ) || st->core == HQ_CORE ) )
- {
- mvr2r( st->hTcxDec->synth_history + output_frame, st->hTcxDec->synth_history, output_frame - post_hq_delay + NS2SA( st->output_Fs, PH_ECU_MEM_NS ) );
- mvr2r( output, st->hTcxDec->old_synthFB + output_frame - post_hq_delay, output_frame );
-
- if ( st->element_mode == EVS_MONO )
- {
- /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill
- this buffer are not available for all cases, the impact on the output is limited */
- set_f( st->hTcxDec->old_synthFB + 2 * output_frame - post_hq_delay, 0.f, post_hq_delay );
- if ( output_frame >= L_FRAME16k )
+ Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ) );
+ FOR( Word16 i = 0; i < output_frame; i++ )
{
- mvr2r( st->prev_synth_buffer, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) );
- }
- else
- {
- mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
+ st->hTcxDec->old_synthFB_fx[( ( i + output_frame ) - post_hq_delay )] = extract_h( L_shl_sat( output_fx[i], 16 ) ); // Q16
+ move16();
}
- if ( st->core != ACELP_CORE )
- {
- if ( output_frame >= L_FRAME16k )
- {
- mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_CLDFB_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) );
- mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
- }
- else
- {
- mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) );
- mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
- }
- }
- }
- else
- {
- if ( st->core != ACELP_CORE )
+ IF( st->core != ACELP_CORE )
{
- mvr2r( st->delay_buf_out, st->hTcxDec->old_synthFB + 2 * output_frame - post_hq_delay, post_hq_delay );
- mvr2r( st->hHQ_core->old_out + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
+ Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), post_hq_delay );
+ Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) );
}
}
}
-
return;
}
-#endif
diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c
index ca7bec1408a10c55203b4a1990f6a7cc95bb71c8..e50abddd6e25c43a74c5daa081dff5c2292dd242 100644
--- a/lib_dec/TonalComponentDetection_fx.c
+++ b/lib_dec/TonalComponentDetection_fx.c
@@ -30,6 +30,7 @@ static void modifyThresholds( Word16 F0, Word16 origF0, Word16 *thresholdModific
static void RefineThresholdsUsingPitch( const Word16 nSamples, const Word16 nSamplesCore, const Word32 powerSpectrum[], const Word32 lastPitchLag, const Word32 currentPitchLag, Word16 *pF0, Word16 *thresholdModification );
static void ivas_RefineThresholdsUsingPitch_fx( const Word16 nSamples, const Word16 nSamplesCore, const Word32 powerSpectrum[], const Word32 lastPitchLag, const Word32 currentPitchLag, Word16 *pF0, Word16 *thresholdModification );
static void findTonalComponents( Word16 *indexOfTonalPeak, Word16 *lowerIndex, Word16 *upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 *powerSpectrum, Word16 F0, Word16 *thresholdModification, Word16 element_mode );
+static void ivas_findTonalComponents_fx( Word16 *indexOfTonalPeak, Word16 *lowerIndex, Word16 *upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 *powerSpectrum, const Word16 powerSpectrum_e, Word16 F0, Word16 *thresholdModification, Word16 element_mode );
/*-------------------------------------------------------------------*
* DetectTonalComponents()
@@ -52,7 +53,8 @@ void ivas_DetectTonalComponents_fx(
const Word16 scaleFactors[],
const Word16 scaleFactors_exp[],
const Word16 scaleFactors_max_e,
- const Word32 secondLastPowerSpectrum[], /*Qx*/
+ const Word32 secondLastPowerSpectrum[], /*Q31-secondLastPowerSpectrum_e*/
+ const Word16 secondLastPowerSpectrum_e,
const Word16 nSamples,
const Word16 nSamplesCore,
Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/
@@ -127,7 +129,7 @@ void ivas_DetectTonalComponents_fx(
ivas_RefineThresholdsUsingPitch_fx( nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, thresholdModification );
/* Find peaks in the second last frame */
- findTonalComponents( indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, F0, thresholdModification, element_mode );
+ ivas_findTonalComponents_fx( indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, secondLastPowerSpectrum_e, F0, thresholdModification, element_mode );
}
void DetectTonalComponents(
@@ -306,7 +308,8 @@ void ivas_RefineTonalComponents_fx(
const Word16 scaleFactors[],
const Word16 scaleFactors_exp[],
const Word16 scaleFactors_max_e,
- const Word32 secondLastPowerSpectrum[], /*Qx*/
+ const Word32 secondLastPowerSpectrum[], /*Q31-secondLastPowerSpectrum_e*/
+ const Word16 secondLastPowerSpectrum_e,
const Word16 nSamples,
const Word16 nSamplesCore,
const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/
@@ -322,7 +325,7 @@ void ivas_RefineTonalComponents_fx(
ivas_DetectTonalComponents_fx( newIndexOfTonalPeak, newLowerIndex, newUpperIndex, &newNumIndexes, lastPitchLag, currentPitchLag, lastMDCTSpectrum,
- lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum,
+ lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, secondLastPowerSpectrum_e, nSamples, nSamplesCore, floorPowerSpectrum,
psychParamsCurrent, element_mode );
nPreservedPeaks = 0;
@@ -1280,6 +1283,171 @@ static void RefineThresholdsUsingPitch(
return;
}
+static void ivas_findTonalComponents_fx(
+ Word16 *indexOfTonalPeak, /* OUT Q0*/
+ Word16 *lowerIndex, /* OUT Q0*/
+ Word16 *upperIndex, /* OUT Q0*/
+ Word16 *numIndexes, /* OUT Q0*/
+ Word16 nSamples, /* IN */
+ const Word32 *powerSpectrum, /* IN Q31-powerSpectrum_e*/
+ const Word16 powerSpectrum_e,
+ Word16 F0, /* IN */
+ Word16 *thresholdModification, /* IN Q10*/
+ Word16 element_mode ) /* IN */
+{
+ Word32 envelope[L_FRAME_MAX]; /*powerSpec_exp + LEVEL_EXP*/
+ Word32 smoothedSpectrum[L_FRAME_MAX]; /*powerSpec_exp + LEVEL_EXP*/
+ Word16 nrOfFIS;
+ Word16 upperIdx, lowerIdx, lowerBound;
+ Word16 k, j, m;
+ Word32 biggerNeighbor;
+ Word16 tmp_loop1, tmp_loop2, tmp_loop3;
+
+ getEnvelope( nSamples, powerSpectrum, F0, envelope, smoothedSpectrum );
+
+
+ nrOfFIS = 0;
+ move16();
+ lowerBound = 0;
+ move16();
+
+ k = GROUP_LENGTH / 2;
+ move16();
+ tmp_loop1 = sub( nSamples, ( GROUP_LENGTH - GROUP_LENGTH / 2 ) );
+ tmp_loop2 = sub( nSamples, 1 );
+ WHILE( LE_16( k, tmp_loop1 ) )
+ {
+ Word64 mult_64 = W_mult_32_16( envelope[k], thresholdModification[k] ); // (Q31-(powerSpectrum_e+LEVEL_EXP))+1+10
+ Word16 lshift = W_norm( mult_64 );
+ Word32 mult_32 = W_extract_h( W_shl( mult_64, lshift ) ); //(Q31-(powerSpectrum_e+LEVEL_EXP) + lshift )+11 -32
+ Word16 mult_exp = sub( Q31, sub( add( sub( Q31, add( powerSpectrum_e, LEVEL_EXP ) ), add( 10, lshift ) ), 31 ) );
+ Word16 flag = BASOP_Util_Cmp_Mant32Exp( smoothedSpectrum[k], ( powerSpectrum_e + LEVEL_EXP ), mult_32, mult_exp );
+ /* There is 3 bits headroom in envelope and max of thresholdModification is 16384, so shifting left for 4 would produce overflow only when the result is anyhow close to 1 */
+ IF( EQ_16( flag, 1 ) )
+ {
+ /* The check that bin at k is bigger than bins at k-1 and k+1 is needed to avoid deadlocks when the thresholds are low. */
+ /* It removes some true peaks, especially if non weighted sum is used for the smoothed spectrum. */
+ biggerNeighbor = L_max( powerSpectrum[k - 1], powerSpectrum[k + 1] ); /*Qx*/
+
+ IF( GE_32( powerSpectrum[k], biggerNeighbor ) )
+ {
+ /* Find the right foot */
+ upperIdx = add( k, 1 );
+ WHILE( LT_16( upperIdx, tmp_loop2 ) )
+ {
+ IF( LT_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx + 1] ) )
+ {
+ /* Side lobes may increase for certain amount */
+ IF( LT_32( L_shl( Mpy_32_16_1( powerSpectrum[upperIdx], ALLOWED_SIDE_LOBE_FLUCTUATION ), ALLOWED_SIDE_LOBE_FLUCTUATION_EXP ), powerSpectrum[upperIdx + 1] ) )
+ {
+ BREAK;
+ }
+ /* Check for further decrease after a side lobe increase */
+ FOR( j = add( upperIdx, 1 ); j < tmp_loop2; j++ )
+ {
+ IF( LT_32( powerSpectrum[j], L_shl( Mpy_32_16_1( powerSpectrum[j + 1], ALLOWED_SIDE_LOBE_FLUCTUATION ), ALLOWED_SIDE_LOBE_FLUCTUATION_EXP ) ) )
+ {
+ BREAK;
+ }
+ }
+ /* Side lobe increase must be 2 times smaller than the decrease to the foot */
+ /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */
+ test();
+ test();
+ test();
+ IF( ( EQ_16( element_mode, EVS_MONO ) && GT_32( Mpy_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), Mpy_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) ||
+ ( NE_16( element_mode, EVS_MONO ) && ( GT_64( W_mult_32_32( L_shl( powerSpectrum[upperIdx + 1], 1 ), powerSpectrum[j] ), W_mult_32_32( powerSpectrum[upperIdx], powerSpectrum[upperIdx] ) ) ) ) )
+ {
+ BREAK;
+ }
+ upperIdx = sub( j, 1 );
+ }
+ upperIdx = add( upperIdx, 1 );
+ }
+ /* left foot */
+ lowerIdx = sub( k, 1 );
+ WHILE( GT_16( lowerIdx, lowerBound ) )
+ {
+ IF( LT_32( powerSpectrum[lowerIdx], powerSpectrum[lowerIdx - 1] ) )
+ {
+ /* Side lobes may increase for certain amount */
+ IF( LT_32( L_shl( Mpy_32_16_1( powerSpectrum[lowerIdx], ALLOWED_SIDE_LOBE_FLUCTUATION ), ALLOWED_SIDE_LOBE_FLUCTUATION_EXP ), powerSpectrum[lowerIdx - 1] ) )
+ {
+ BREAK;
+ }
+ /* Check for further decrease after a side lobe increase */
+ FOR( j = sub( lowerIdx, 1 ); j > 0; j-- )
+ {
+ IF( LT_32( powerSpectrum[j], L_shl( Mpy_32_16_1( powerSpectrum[j - 1], ALLOWED_SIDE_LOBE_FLUCTUATION ), ALLOWED_SIDE_LOBE_FLUCTUATION_EXP ) ) )
+ {
+ BREAK;
+ }
+ }
+ /* Side lobe increase must be 2 times smaller than the decrease to the foot */
+ /* Eq. to 2.0f*powerSpectrum[lowerIdx-1]/powerSpectrum[lowerIdx] > powerSpectrum[lowerIdx]/powerSpectrum[j] */
+ IF( GT_32( Mpy_32_32( L_shl( powerSpectrum[lowerIdx - 1], 1 ), powerSpectrum[j] ), Mpy_32_32( powerSpectrum[lowerIdx], powerSpectrum[lowerIdx] ) ) )
+ {
+ BREAK;
+ }
+ lowerIdx = add( j, 1 );
+ }
+ lowerIdx = sub( lowerIdx, 1 );
+ }
+
+ lowerBound = upperIdx;
+ move16();
+
+ /* Check if there is a bigger peak up to the next peak foot */
+ tmp_loop3 = s_min( upperIdx, tmp_loop1 );
+ FOR( j = s_max( GROUP_LENGTH / 2, lowerIdx ); j <= tmp_loop3; j++ )
+ {
+ if ( GT_32( powerSpectrum[j], powerSpectrum[k] ) )
+ {
+
+ k = j;
+ move16();
+ }
+ }
+
+ assert( ( nrOfFIS == 0 ) || ( indexOfTonalPeak[nrOfFIS - 1] < k ) );
+
+ lowerIndex[nrOfFIS] = sub( k, GROUP_LENGTH / 2 );
+ move16();
+
+ upperIndex[nrOfFIS] = add( k, ( GROUP_LENGTH - GROUP_LENGTH / 2 - 1 ) );
+ move16();
+
+ test();
+ IF( ( nrOfFIS > 0 ) && ( LE_16( lowerIndex[nrOfFIS], upperIndex[nrOfFIS - 1] ) ) )
+ {
+ m = shr( add( k, indexOfTonalPeak[nrOfFIS - 1] ), 1 );
+ upperIndex[nrOfFIS - 1] = m;
+ move16();
+ lowerIndex[nrOfFIS] = add( m, 1 );
+ move16();
+ }
+
+ indexOfTonalPeak[nrOfFIS++] = k;
+ move16();
+
+ IF( EQ_16( nrOfFIS, MAX_NUMBER_OF_IDX ) )
+ {
+ BREAK;
+ }
+ /* Jump to the next foot of the peak. */
+ k = upperIdx;
+ move16();
+ }
+ }
+ k = add( k, 1 );
+ }
+
+ *numIndexes = nrOfFIS;
+ move16();
+ return;
+}
+
+
static void ivas_RefineThresholdsUsingPitch_fx(
const Word16 nSamples,
const Word16 nSamplesCore,
diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c
index daec97ba8206f454b6049a03a05d68d9bf2b9949..b9170f5705dd904c515ef813888f406a10cae6ca 100644
--- a/lib_dec/acelp_core_dec_fx.c
+++ b/lib_dec/acelp_core_dec_fx.c
@@ -554,7 +554,7 @@ ivas_error acelp_core_dec_fx(
IF( st_fx->cng_type == LP_CNG )
{
- CNG_dec_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env );
+ CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env );
/* comfort noise generation */
CNG_exc_fx( st_fx->core_brate, st_fx->L_frame, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate,
@@ -1386,7 +1386,7 @@ ivas_error acelp_core_dec_fx(
IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft )
{
/* analysis of the synthesis at internal sampling rate */
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer );
scaleFactor.hb_scale = scaleFactor.lb_scale;
move16();
@@ -1446,7 +1446,7 @@ ivas_error acelp_core_dec_fx(
st_fx->Q_syn2 = st_fx->Q_syn;
move16();
{
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer );
}
/* Bring CLDFB output to Q0 */
Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) );
@@ -1472,8 +1472,7 @@ ivas_error acelp_core_dec_fx(
IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) &&
( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) )
{
- hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc,
- st_fx->Q_syn2, st_fx->hBWE_zero->delay_syn_hf_fx, &st_fx->hBWE_zero->memExp1, st_fx->hBWE_zero->mem_hp_interp_fx, st_fx->extl, st_fx->CNG_mode );
+ hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 );
}
ELSE
{
diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c
index 7826546236b7c3baffb643a9adb11e38181509d0..2ca524bb0f94e076b37665ba671474a2a87ab0a9 100644
--- a/lib_dec/acelp_core_dec_ivas_fx.c
+++ b/lib_dec/acelp_core_dec_ivas_fx.c
@@ -1476,6 +1476,7 @@ ivas_error acelp_core_dec_ivas_fx(
IF( st->hTcxDec != NULL )
{
Copy_Scale_sig( psyn_fx + shr( st->L_frame, 1 ), st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/
+ st->hTcxDec->Q_old_syn_Overl = -1;
}
Copy_Scale_sig( psyn_fx + sub( st->L_frame, M + 1 ), st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/
@@ -1931,7 +1932,11 @@ ivas_error acelp_core_dec_ivas_fx(
}
}
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, 0, st->cldfbSynHB );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0
Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10
@@ -1951,7 +1956,11 @@ ivas_error acelp_core_dec_ivas_fx(
Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1
st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 );
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, 0, st->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0
Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10
st->cldfbSynHB->Q_cldfb_state = Q10;
@@ -1990,7 +1999,7 @@ ivas_error acelp_core_dec_ivas_fx(
#ifdef OPT_STEREO_32KBPS_V1
scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1)
#else /* OPT_STEREO_32KBPS_V1 */
- scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1)
+ scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1)
#endif /* OPT_STEREO_32KBPS_V1 */
st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 );
move16();
@@ -1998,7 +2007,11 @@ ivas_error acelp_core_dec_ivas_fx(
Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 );
#endif
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, st->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
#ifdef MSAN_FIX
scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0
#else
@@ -2107,7 +2120,11 @@ ivas_error acelp_core_dec_ivas_fx(
Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 );
#endif
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), 0, st->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
#ifdef MSAN_FIX
Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0
@@ -2161,9 +2178,7 @@ ivas_error acelp_core_dec_ivas_fx(
#else
Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 );
#endif
- hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx,
- psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1,
- st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode );
+ hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 );
#ifdef MSAN_FIX
Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 );
#else
diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c
index b2cc593b3d8f632ccaf1b29930f9abff5622399c..6a1e60b06dac404bef32af8e4fbf91f2f690fb9c 100644
--- a/lib_dec/acelp_core_switch_dec_fx.c
+++ b/lib_dec/acelp_core_switch_dec_fx.c
@@ -204,8 +204,7 @@ ivas_error acelp_core_switch_dec_fx(
{
return error;
}
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, synth_intFreq,
- negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, synth_intFreq, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH, workBuffer );
cldfb_restore_memory( st_fx->cldfbAna );
/* CLDFB synthesis of the combined signal */
@@ -236,7 +235,7 @@ ivas_error acelp_core_switch_dec_fx(
{
return error;
}
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_subfr_out, 0, CLDFB_NO_COL_MAX_SWITCH, workBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_subfr_out, 0, CLDFB_NO_COL_MAX_SWITCH, workBuffer );
cldfb_restore_memory( st_fx->cldfbSyn );
*Q_syn = 0;
move16();
@@ -578,8 +577,7 @@ ivas_error acelp_core_switch_dec_bfi_fx(
{
return error;
}
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn,
- negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );
cldfb_restore_memory( st_fx->cldfbAna );
scaleFactor.hb_scale = scaleFactor.lb_scale;
@@ -590,8 +588,8 @@ ivas_error acelp_core_switch_dec_bfi_fx(
{
return error;
}
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out,
- negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out,
+ negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );
/* output to Q0 */
Scale_sig( synth_out, L_FRAME48k, negate( st_fx->Q_syn ) ); // Q0
@@ -830,7 +828,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx(
{
return error;
}
- /*cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn,
+ /*cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn,
negate(st_fx->Q_syn), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer);*/
cldfbAnalysis_ivas_fx( syn32, realBuffer, imagBuffer, shr( st_fx->L_frame, 1 ), st_fx->cldfbAna );
cldfb_restore_memory_ivas_fx( st_fx->cldfbAna );
@@ -840,14 +838,18 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx(
{
return error;
}
- /*cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out,
+ /*cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out,
negate(st_fx->Q_syn), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );*/
Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, 1 ); // Q_cldfb_state+1
st_fx->cldfbSyn->Q_cldfb_state = add( st_fx->cldfbSyn->Q_cldfb_state, 1 );
move16();
Copy_Scale_sig_16_32_DEPREC( synth_out, synth32, L_FRAME48k, 5 ); /*11-5-1*/
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ), 0, st_fx->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ), st_fx->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, -1 ); // Q_cldfb_state-1
st_fx->cldfbSyn->Q_cldfb_state = sub( st_fx->cldfbSyn->Q_cldfb_state, 1 );
move16();
diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c
index d45655903fb6f8f427e3d28ea4f7e91cbd2be7a2..db4ad2bb021122533aba2ec98cb77b9455a90804 100644
--- a/lib_dec/amr_wb_dec_fx.c
+++ b/lib_dec/amr_wb_dec_fx.c
@@ -214,11 +214,10 @@ ivas_error amr_wb_dec_fx(
test();
IF( !st_fx->bfi && st_fx->prev_bfi && ( EQ_16( st_fx->last_codec_mode, MODE2 ) ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) )
{
- /* v_multc(st_fx->old_out_fx, st_fx->plcInfo.recovery_gain, */
- /* st_fx->old_out_fx, st_fx->L_frameTCX); */
+ /* v_multc(st_fx->old_out_fx, st_fx->hPlcInfo.recovery_gain, st_fx->old_out_fx, st_fx->L_frameTCX); */
FOR( i = 0; i < hTcxDec->L_frameTCX; i++ )
{
- hHQ_core->old_out_fx[i] = shl( mult_r( hHQ_core->old_out_fx[i], st_fx->plcInfo.recovery_gain ), 1 );
+ hHQ_core->old_out_fx[i] = shl( mult_r( hHQ_core->old_out_fx[i], st_fx->hPlcInfo->recovery_gain ), 1 );
move16();
}
}
@@ -756,6 +755,7 @@ ivas_error amr_wb_dec_fx(
/* TCX=Q-1, ACELP2 Q0 */
Copy_Scale_sig( syn_fx + L_FRAME / 2, hTcxDec->old_syn_Overl, L_FRAME / 2, sub( -1, st_fx->Q_syn ) );
+ hTcxDec->Q_old_syn_Overl = -1;
Copy_Scale_sig( syn_fx + L_FRAME - M - 1, st_fx->syn, M + 1, sub( 0, st_fx->Q_syn ) );
/*------------------------------------------------------------------*
@@ -872,8 +872,7 @@ ivas_error amr_wb_dec_fx(
bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, L_FRAME, pitch_buf_fx, st_fx->bpf_off, st_fx->stab_fac_fx,
&st_fx->stab_fac_smooth_fx, GENERIC, st_fx->Q_syn, bpf_error_signal );
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx,
- negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer );
scaleFactor.hb_scale = scaleFactor.lb_scale;
move16();
@@ -898,8 +897,9 @@ ivas_error amr_wb_dec_fx(
move16();
}
cldfb_synth_set_bandsToZero( st_fx, realBuffer, imagBuffer, CLDFB_NO_COL_MAX, scaleFactor );
+
/* CLDFB synthesis of the combined signal */
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out_fx, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out_fx, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer );
/* Bring CLDFB output to Q-1 */
Scale_sig( synth_out_fx, output_frame, negate( st_fx->Q_syn2 ) );
@@ -963,7 +963,7 @@ ivas_error amr_wb_dec_fx(
test();
test();
- IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) )
+ IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->hPlcInfo->concealment_method, TCX_NONTONAL ) && LT_32( st_fx->hPlcInfo->nbLostCmpt, 4 ) )
{
waveadj_rec = 1;
move16();
@@ -1062,7 +1062,7 @@ ivas_error amr_wb_dec_fx(
{
tmps = NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS );
Scale_sig( st_fx->prev_synth_buffer_fx, tmps, sub( st_fx->Q_syn2, st_fx->Qprev_synth_buffer_fx ) );
- delay_signal( synth_out_fx, output_frame, st_fx->prev_synth_buffer_fx, tmps );
+ delay_signal_fx( synth_out_fx, output_frame, st_fx->prev_synth_buffer_fx, tmps );
}
IF( waveadj_rec )
@@ -1075,9 +1075,7 @@ ivas_error amr_wb_dec_fx(
move16();
}
- waveform_adj2_fix( st_fx->tonalMDCTconceal.secondLastPcmOut, synth_out_fx + tmps, st_fx->plcInfo.data_noise, &st_fx->plcInfo.outx_new_n1_fx,
- &st_fx->plcInfo.nsapp_gain_fx, &st_fx->plcInfo.nsapp_gain_n_fx, &st_fx->plcInfo.recovery_gain, st_fx->plcInfo.step_concealgain_fx,
- st_fx->plcInfo.Pitch_fx, st_fx->plcInfo.FrameSize, tmps, add( extract_l( st_fx->plcInfo.nbLostCmpt ), 1 ), st_fx->bfi );
+ waveform_adj2_fix( st_fx->hPlcInfo, st_fx->hTonalMDCTConc->secondLastPcmOut, synth_out_fx + tmps, tmps, add( extract_l( st_fx->hPlcInfo->nbLostCmpt ), 1 ), st_fx->bfi );
}
/* HP filter */
@@ -1095,7 +1093,7 @@ ivas_error amr_wb_dec_fx(
move16();
Scale_sig( hTcxLtpDec->tcxltp_mem_in, delta, sub( st_fx->Q_syn2, st_fx->Qprev_synth_buffer_fx ) );
Scale_sig( hTcxLtpDec->tcxltp_mem_out, output_frame, sub( st_fx->Q_syn2, st_fx->Qprev_synth_buffer_fx ) );
- tcx_ltp_post( st_fx, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth_out_fx, NULL );
+ tcx_ltp_post_fx( st_fx, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth_out_fx, NULL );
}
/* final output of synthesis signal */
syn_output_fx( st_fx->codec_mode, synth_out_fx, output_frame, output_sp, st_fx->Q_syn2 );
diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c
index 75cabf160042c12159d477ea02f447c97ef37456..45cf7feed026f9c1ef1b419d1f21e5fb08b2691a 100644
--- a/lib_dec/bass_psfilter_fx.c
+++ b/lib_dec/bass_psfilter_fx.c
@@ -841,14 +841,7 @@ void addBassPostFilter_fx(
}
/* do the CLDFB anlysis of filtered signal */
- cldfbAnalysisFiltering( cldfbBank_bpf_Fx,
- tmp_R_Fx,
- tmp_I_Fx,
- &scale,
- harm_timeIn_Fx,
- timeIn_e,
- nTimeSlots,
- workBuffer );
+ cldfbAnalysis_fx( cldfbBank_bpf_Fx, tmp_R_Fx, tmp_I_Fx, &scale, harm_timeIn_Fx, timeIn_e, nTimeSlots, workBuffer );
/* now do the subtraction */
diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c
index ab349773ee6e3948dc03edf782479bb9e57ce3c5..945f0ca758ed89671ff73a19fe0ba7ff25ab0357 100644
--- a/lib_dec/cng_dec_fx.c
+++ b/lib_dec/cng_dec_fx.c
@@ -1377,9 +1377,8 @@ void swb_CNG_dec_fx(
Decoder_State *st_fx, /* i/o: State structure */
const Word16 *synth_fx, /* i : ACELP core synthesis at 32kHz Qsyn*/
Word16 *shb_synth_fx, /* o : high-band CNG synthesis Qx*/
- const Word16 sid_bw /* i : 0-NB/WB, 1-SWB SID Q0*/
- ,
- const Word16 Qsyn /* i : Q value of ACELP core synthesis */
+ const Word16 sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0*/
+ const Word16 Qsyn /* i : Q value of ACELP core synthesis */
)
{
test();
@@ -1393,18 +1392,18 @@ void swb_CNG_dec_fx(
}
st_fx->last_vad_fx = 0;
move16();
- st_fx->hTdCngDec->burst_cnt = 0;
+ st_fx->hTdCngDec->burst_cnt_fx = 0;
move16();
}
ELSE
{
st_fx->last_vad_fx = 1;
move16();
- st_fx->hTdCngDec->burst_cnt = add( st_fx->hTdCngDec->burst_cnt, 1 );
+ st_fx->hTdCngDec->burst_cnt_fx = add( st_fx->hTdCngDec->burst_cnt_fx, 1 );
move16();
- if ( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) )
+ if ( GT_16( st_fx->hTdCngDec->burst_cnt_fx, 10 ) )
{
- st_fx->hTdCngDec->burst_cnt = 0;
+ st_fx->hTdCngDec->burst_cnt_fx = 0;
move16();
}
}
@@ -1431,18 +1430,18 @@ void swb_CNG_dec_ivas_fx(
}
st_fx->last_vad_fx = 0;
move16();
- st_fx->hTdCngDec->burst_cnt = 0;
+ st_fx->hTdCngDec->burst_cnt_fx = 0;
move16();
}
ELSE
{
st_fx->last_vad_fx = 1;
move16();
- st_fx->hTdCngDec->burst_cnt = add_sat( st_fx->hTdCngDec->burst_cnt, 1 ); // saturation reached?
+ st_fx->hTdCngDec->burst_cnt_fx = add_sat( st_fx->hTdCngDec->burst_cnt_fx, 1 ); // saturation reached?
move16();
- if ( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) )
+ if ( GT_16( st_fx->hTdCngDec->burst_cnt_fx, 10 ) )
{
- st_fx->hTdCngDec->burst_cnt = 0;
+ st_fx->hTdCngDec->burst_cnt_fx = 0;
move16();
}
}
@@ -1466,6 +1465,7 @@ static void shb_CNG_decod_fx(
{
Word16 i;
Word16 idx_ener_fx;
+ TD_CNG_DEC_HANDLE hTdCngDec;
Word16 shb_lpcCNG_fx[LPC_SHB_ORDER + 1];
Word16 shb_lspCNG_fx[LPC_SHB_ORDER];
Word16 excTmp_fx[L_FRAME16k];
@@ -1489,7 +1489,9 @@ static void shb_CNG_decod_fx(
move16();
Word16 q;
TD_BWE_DEC_HANDLE hBWE_TD;
+
hBWE_TD = st_fx->hBWE_TD;
+ hTdCngDec = st_fx->hTdCngDec;
IF( st_fx->bfi == 0 )
{
@@ -1506,8 +1508,8 @@ static void shb_CNG_decod_fx(
IF( st_fx->element_mode == EVS_MONO )
{
/* de-quantization of SHB CNG parameters */
- L_tmp = L_mult( idx_ener_fx, 27400 ); /*Q14 */
- st_fx->last_shb_cng_ener_fx = extract_l( L_shr( L_sub( L_tmp, 295924 ), 6 ) ); /*Q8 */
+ L_tmp = L_mult( idx_ener_fx, 27400 ); /*Q14 */
+ hTdCngDec->last_shb_cng_ener_fx = extract_l( L_shr( L_sub( L_tmp, 295924 ), 6 ) ); /*Q8 */
move16();
}
ELSE
@@ -1519,21 +1521,21 @@ static void shb_CNG_decod_fx(
/* SHB spectrum estimation */
- interp_fx = s_min( st_fx->shb_dtx_count_fx, 32 );
+ interp_fx = s_min( hTdCngDec->shb_dtx_count_fx, 32 );
interp_fx = shl_sat( interp_fx, 10 ); /*Q15*/
FOR( i = 0; i < LPC_SHB_ORDER; i++ )
{
- tmp2 = mult( interp_fx, st_fx->lsp_shb_prev_fx[i] ); /*Q14*/
- tmp = mult( sub( 32767, interp_fx ), st_fx->lsp_shb_prev_prev_fx[i] ); /*Q14*/
+ tmp2 = mult( interp_fx, hTdCngDec->lsp_shb_prev_fx[i] ); /*Q14*/
+ tmp = mult( sub( 32767, interp_fx ), hTdCngDec->lsp_shb_prev_prev_fx[i] ); /*Q14*/
shb_lspCNG_fx[i] = add( tmp2, tmp );
move16(); /*Q14*/
}
IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) )
{
- if ( LT_16( st_fx->shb_dtx_count_fx, 1000 ) )
+ if ( LT_16( hTdCngDec->shb_dtx_count_fx, 1000 ) )
{
- st_fx->shb_dtx_count_fx = add( st_fx->shb_dtx_count_fx, 1 );
+ hTdCngDec->shb_dtx_count_fx = add( hTdCngDec->shb_dtx_count_fx, 1 );
move16();
}
}
@@ -1555,10 +1557,10 @@ static void shb_CNG_decod_fx(
wb_ener16_fx = round_fx( L_shl( wb_ener_fx, 10 ) ); /*wb_ener_fx in Q8 */
if ( !st_fx->first_CNG )
{
- st_fx->wb_cng_ener_fx = wb_ener16_fx;
+ hTdCngDec->wb_cng_ener_fx = wb_ener16_fx;
move16(); /*Q8 */
}
- if ( GT_16( abs_s( sub( wb_ener16_fx, st_fx->wb_cng_ener_fx ) ), 3072 ) )
+ if ( GT_16( abs_s( sub( wb_ener16_fx, hTdCngDec->wb_cng_ener_fx ) ), 3072 ) )
{
allow_cn_step_fx = 1;
move16();
@@ -1566,52 +1568,52 @@ static void shb_CNG_decod_fx(
IF( EQ_16( allow_cn_step_fx, 1 ) )
{
- st_fx->wb_cng_ener_fx = wb_ener16_fx;
+ hTdCngDec->wb_cng_ener_fx = wb_ener16_fx;
move16(); /*Q8 */
}
ELSE
{
- tmp = sub( wb_ener16_fx, st_fx->wb_cng_ener_fx ); /*Q8 */
- tmp = mult_r( tmp, 29491 ); /*Q8 */
- st_fx->wb_cng_ener_fx = add( st_fx->wb_cng_ener_fx, tmp ); /*Q8 */
+ tmp = sub( wb_ener16_fx, hTdCngDec->wb_cng_ener_fx ); /*Q8 */
+ tmp = mult_r( tmp, 29491 ); /*Q8 */
+ hTdCngDec->wb_cng_ener_fx = add( hTdCngDec->wb_cng_ener_fx, tmp ); /*Q8 */
move16();
}
test();
test();
IF( EQ_32( st_fx->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && ( st_fx->bfi == 0 ) )
{
- st_fx->last_wb_cng_ener_fx = st_fx->wb_cng_ener_fx;
+ hTdCngDec->last_wb_cng_ener_fx = hTdCngDec->wb_cng_ener_fx;
move16();
if ( !st_fx->first_CNG )
{
- st_fx->shb_cng_ener_fx = st_fx->last_shb_cng_ener_fx;
+ hTdCngDec->shb_cng_ener_fx = hTdCngDec->last_shb_cng_ener_fx;
move16();
}
}
- gain_fx = sub( st_fx->wb_cng_ener_fx, st_fx->last_wb_cng_ener_fx ); /* Q8 */
+ gain_fx = sub( hTdCngDec->wb_cng_ener_fx, hTdCngDec->last_wb_cng_ener_fx ); /* Q8 */
if ( GT_16( gain_fx, 15 ) )
{
gain_fx = 15;
move16();
}
- step_fx = sub( add( gain_fx, st_fx->last_shb_cng_ener_fx ), st_fx->shb_cng_ener_fx ); /*Q8 */
+ step_fx = sub( add( gain_fx, hTdCngDec->last_shb_cng_ener_fx ), hTdCngDec->shb_cng_ener_fx ); /*Q8 */
test();
IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st_fx->last_core_brate, SID_2k40 ) )
{
- st_fx->shb_cng_ener_fx = add( st_fx->shb_cng_ener_fx, step_fx ); /* Q8 */
+ hTdCngDec->shb_cng_ener_fx = add( hTdCngDec->shb_cng_ener_fx, step_fx ); /* Q8 */
move16();
}
ELSE
{
- st_fx->shb_cng_ener_fx = add( st_fx->shb_cng_ener_fx, mult( 8192, step_fx ) ); /*Q8 */
+ hTdCngDec->shb_cng_ener_fx = add( hTdCngDec->shb_cng_ener_fx, mult( 8192, step_fx ) ); /*Q8 */
move16();
}
/* generate white noise excitation */
FOR( i = 0; i < L_FRAME16k; i++ )
{
- excTmp_fx[i] = shr_r( Random( &st_fx->swb_cng_seed ), 8 );
+ excTmp_fx[i] = shr_r( Random( &hTdCngDec->swb_cng_seed ), 8 );
move16(); /*Q-8*/
}
@@ -1632,23 +1634,23 @@ static void shb_CNG_decod_fx(
ener_excSHB_fx = round_fx( L_tmp ); /*Qq */
IF( EQ_16( st_fx->last_vad_fx, 1 ) )
{
- st_fx->trans_cnt_fx = 0;
+ hTdCngDec->trans_cnt_fx = 0;
move16();
test();
- IF( GT_16( st_fx->hTdCngDec->burst_cnt, 3 ) && NE_16( st_fx->last_core, HQ_CORE ) )
+ IF( GT_16( hTdCngDec->burst_cnt_fx, 3 ) && NE_16( st_fx->last_core, HQ_CORE ) )
{
- st_fx->trans_cnt_fx = 5;
+ hTdCngDec->trans_cnt_fx = 5;
move16();
}
}
- ener_fx = st_fx->shb_cng_ener_fx;
+ ener_fx = hTdCngDec->shb_cng_ener_fx;
move16(); /*Q8 */
- IF( st_fx->trans_cnt_fx > 0 )
+ IF( hTdCngDec->trans_cnt_fx > 0 )
{
- i = extract_l( L_mult0( st_fx->trans_cnt_fx, 17 ) ); /*Q0 */
- ener_fx = add_sat( st_fx->shb_cng_ener_fx, mult( sin_table256_fx[i], sub_sat( st_fx->last_shb_ener_fx, st_fx->shb_cng_ener_fx ) ) ); /*Q8 */
- st_fx->trans_cnt_fx = sub( st_fx->trans_cnt_fx, 1 );
+ i = extract_l( L_mult0( hTdCngDec->trans_cnt_fx, 17 ) ); /*Q0 */
+ ener_fx = add_sat( hTdCngDec->shb_cng_ener_fx, mult( sin_table256_fx[i], sub_sat( hTdCngDec->last_shb_ener_fx, hTdCngDec->shb_cng_ener_fx ) ) ); /*Q8 */
+ hTdCngDec->trans_cnt_fx = sub( hTdCngDec->trans_cnt_fx, 1 );
move16();
}
@@ -1698,13 +1700,13 @@ static void shb_CNG_decod_fx(
/* rescale the Hilbert memories to Q0 */
FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
{
- hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i] = L_shr( hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i], st_fx->prev_Q_bwe_syn2 ); /* st_fx->prev_Q_bwe_syn2 */
+ hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i] = L_shr( hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i], hBWE_TD->prev_Q_bwe_syn2 ); /* hBWE_TD->prev_Q_bwe_syn2 */
move32();
}
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], st_fx->prev_Q_bwe_syn2 ); /* st_fx->prev_Q_bwe_syn2 */
+ hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], hBWE_TD->prev_Q_bwe_syn2 ); /* hBWE_TD->prev_Q_bwe_syn2 */
move16();
}
}
@@ -1712,10 +1714,10 @@ static void shb_CNG_decod_fx(
IF( EQ_32( st_fx->output_Fs, 48000 ) )
{
- interpolate_3_over_2_allpass_fx( shb_synth_fx, L_FRAME32k, shb_synth_fx, st_fx->interpol_3_2_cng_dec_fx, allpass_poles_3_ov_2 );
+ interpolate_3_over_2_allpass_fx( shb_synth_fx, L_FRAME32k, shb_synth_fx, hTdCngDec->interpol_3_2_cng_dec_fx, allpass_poles_3_ov_2 );
}
- ResetSHBbuffer_Dec_fx( st_fx );
+ ResetSHBbuffer_Dec_fx( st_fx->hBWE_TD, st_fx->extl );
return;
}
@@ -1729,6 +1731,7 @@ static void shb_CNG_decod_ivas_fx(
{
Word16 i;
Word16 idx_ener;
+ TD_CNG_DEC_HANDLE hTdCngDec;
Word16 shb_lpcCNG_fx[LPC_SHB_ORDER + 1];
Word16 shb_lspCNG_fx[LPC_SHB_ORDER];
Word16 excTmp_fx[L_FRAME16k];
@@ -1750,7 +1753,9 @@ static void shb_CNG_decod_ivas_fx(
Word16 allow_cn_step_fx;
Word16 q;
TD_BWE_DEC_HANDLE hBWE_TD;
+
hBWE_TD = st->hBWE_TD;
+ hTdCngDec = st->hTdCngDec;
allow_cn_step_fx = 0;
move16();
@@ -1770,37 +1775,37 @@ static void shb_CNG_decod_ivas_fx(
/* de-quantization of SHB CNG parameters */
IF( st->element_mode == EVS_MONO )
{
- st->hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 6850 ), 36991 ); // Q11
+ hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 6850 ), 36991 ); // Q11
move32();
}
ELSE
{
- st->hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 8807 ), 36991 ); // Q11
+ hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 8807 ), 36991 ); // Q11
move32();
}
}
}
/* SHB spectrum estimation */
- interp_fx = s_min( st->hTdCngDec->shb_dtx_count, 32 );
+ interp_fx = s_min( hTdCngDec->shb_dtx_count_fx, 32 );
interp_fx = shl_sat( interp_fx, 10 ); /*Q15*/
FOR( i = 0; i < LPC_SHB_ORDER; i++ )
{
- shb_lspCNG_fx[i] = add( mult_r( interp_fx, st->hTdCngDec->lsp_shb_prev_fx[i] ), mult_r( sub( 32767, interp_fx ), st->hTdCngDec->lsp_shb_prev_prev_fx[i] ) ); // Q14
+ shb_lspCNG_fx[i] = add( mult_r( interp_fx, hTdCngDec->lsp_shb_prev_fx[i] ), mult_r( sub( 32767, interp_fx ), hTdCngDec->lsp_shb_prev_prev_fx[i] ) ); // Q14
move16();
}
- IF( LE_16( st->hTdCngDec->shb_dtx_count, 1000 ) )
+ IF( LE_16( hTdCngDec->shb_dtx_count_fx, 1000 ) )
{
- st->hTdCngDec->shb_dtx_count = add( st->hTdCngDec->shb_dtx_count, 1 );
+ hTdCngDec->shb_dtx_count_fx = add( hTdCngDec->shb_dtx_count_fx, 1 );
move16();
}
E_LPC_lsf_lsp_conversion( shb_lspCNG_fx, tmp_lsp, LPC_SHB_ORDER ); /*Q14*/
E_LPC_f_lsp_a_conversion( tmp_lsp, shb_lpcCNG_fx, LPC_SHB_ORDER );
- Copy_Scale_sig( shb_lpcCNG_fx, st->hTdCngDec->shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), -1 ) ); /* Q15 */
+ Copy_Scale_sig( shb_lpcCNG_fx, hTdCngDec->shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), -1 ) ); /* Q15 */
Copy_Scale_sig( shb_lpcCNG_fx, shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), 2 ) ); /* Q12 */
@@ -1821,10 +1826,10 @@ static void shb_CNG_decod_ivas_fx(
Word32 wb_ener32_fx = L_shl( wb_ener16_fx, 3 ); /*wb_ener_fx in Q11 */
if ( EQ_16( st->first_CNG, 0 ) )
{
- st->hTdCngDec->wb_cng_ener_fx_32 = wb_ener32_fx;
+ hTdCngDec->wb_cng_ener_fx_32 = wb_ener32_fx;
move32(); /*Q11 */
}
- if ( GT_32( L_abs( L_sub( wb_ener32_fx, st->hTdCngDec->wb_cng_ener_fx_32 ) ), 24576 ) ) /* 12.0f in Q11 */
+ if ( GT_32( L_abs( L_sub( wb_ener32_fx, hTdCngDec->wb_cng_ener_fx_32 ) ), 24576 ) ) /* 12.0f in Q11 */
{
allow_cn_step_fx = 1;
move16();
@@ -1832,52 +1837,52 @@ static void shb_CNG_decod_ivas_fx(
IF( EQ_16( allow_cn_step_fx, 1 ) )
{
- st->hTdCngDec->wb_cng_ener_fx_32 = wb_ener32_fx;
+ hTdCngDec->wb_cng_ener_fx_32 = wb_ener32_fx;
move32(); /*Q11 */
}
ELSE
{
- tmp = L_sub( wb_ener32_fx, st->hTdCngDec->wb_cng_ener_fx_32 ); /*Q11 */
- tmp = Mpy_32_16_1( tmp, 29491 ); /*Q11 */
- st->hTdCngDec->wb_cng_ener_fx_32 = L_add( st->hTdCngDec->wb_cng_ener_fx_32, tmp ); /*Q11 */
+ tmp = L_sub( wb_ener32_fx, hTdCngDec->wb_cng_ener_fx_32 ); /*Q11 */
+ tmp = Mpy_32_16_1( tmp, 29491 ); /*Q11 */
+ hTdCngDec->wb_cng_ener_fx_32 = L_add( hTdCngDec->wb_cng_ener_fx_32, tmp ); /*Q11 */
move32();
}
test();
test();
IF( EQ_32( st->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && EQ_16( st->bfi, 0 ) )
{
- st->hTdCngDec->last_wb_cng_ener_fx_32 = st->hTdCngDec->wb_cng_ener_fx_32; /* Q11 */
+ hTdCngDec->last_wb_cng_ener_fx_32 = hTdCngDec->wb_cng_ener_fx_32; /* Q11 */
move32();
if ( !st->first_CNG )
{
- st->hTdCngDec->shb_cng_ener_fx_32 = st->hTdCngDec->last_shb_cng_ener_fx_32; /* Q11 */
+ hTdCngDec->shb_cng_ener_fx_32 = hTdCngDec->last_shb_cng_ener_fx_32; /* Q11 */
move32();
}
}
- gain_fx = L_sub( st->hTdCngDec->wb_cng_ener_fx_32, st->hTdCngDec->last_wb_cng_ener_fx_32 ); /*Q11 */
+ gain_fx = L_sub( hTdCngDec->wb_cng_ener_fx_32, hTdCngDec->last_wb_cng_ener_fx_32 ); /*Q11 */
if ( GT_32( gain_fx, 30720 ) )
{
gain_fx = 30720;
move32();
}
- step_fx = L_sub( L_add( gain_fx, st->hTdCngDec->last_shb_cng_ener_fx_32 ), st->hTdCngDec->shb_cng_ener_fx_32 ); /*Q11 */
+ step_fx = L_sub( L_add( gain_fx, hTdCngDec->last_shb_cng_ener_fx_32 ), hTdCngDec->shb_cng_ener_fx_32 ); /*Q11 */
test();
IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st->last_core_brate, SID_2k40 ) )
{
- st->hTdCngDec->shb_cng_ener_fx_32 = L_add( st->hTdCngDec->shb_cng_ener_fx_32, step_fx ); /* Q11 */
+ hTdCngDec->shb_cng_ener_fx_32 = L_add( hTdCngDec->shb_cng_ener_fx_32, step_fx ); /* Q11 */
move32();
}
ELSE
{
- st->hTdCngDec->shb_cng_ener_fx_32 = L_add( st->hTdCngDec->shb_cng_ener_fx_32, L_shr( step_fx, 2 ) ); /*Q11 */
+ hTdCngDec->shb_cng_ener_fx_32 = L_add( hTdCngDec->shb_cng_ener_fx_32, L_shr( step_fx, 2 ) ); /*Q11 */
move32();
}
/* generate white noise excitation */
FOR( i = 0; i < L_FRAME16k; i++ )
{
- excTmp_fx[i] = shr_r( Random( &st->hTdCngDec->swb_cng_seed ), 8 );
+ excTmp_fx[i] = shr_r( Random( &hTdCngDec->swb_cng_seed ), 8 );
move16(); /*Q-8*/
}
@@ -1896,29 +1901,26 @@ static void shb_CNG_decod_ivas_fx(
L_tmp = L_shl( L_tmp, q );
q = sub( q, 32 );
ener_excSHB_fx = round_fx( L_tmp ); /*Qq */
-#ifdef MSAN_FIX
+
IF( EQ_16( st->last_vad_fx, 1 ) )
-#else
- IF( EQ_16( st->last_vad, 1 ) )
-#endif
{
- st->hTdCngDec->trans_cnt = 0;
+ hTdCngDec->trans_cnt_fx = 0;
move16();
test();
- if ( GT_16( st->hTdCngDec->burst_cnt, 3 ) && NE_16( st->last_core, HQ_CORE ) )
+ if ( GT_16( hTdCngDec->burst_cnt_fx, 3 ) && NE_16( st->last_core, HQ_CORE ) )
{
- st->hTdCngDec->trans_cnt = 5;
+ hTdCngDec->trans_cnt_fx = 5;
move16();
}
}
- ener_fx = st->hTdCngDec->shb_cng_ener_fx_32;
+ ener_fx = hTdCngDec->shb_cng_ener_fx_32;
move32(); /*Q11 */
- IF( GT_16( st->hTdCngDec->trans_cnt, 0 ) )
+ IF( GT_16( st->hTdCngDec->trans_cnt_fx, 0 ) )
{
- i = extract_l( L_mult0( st->hTdCngDec->trans_cnt, 17 ) ); /*Q0 */
- ener_fx = L_add( st->hTdCngDec->shb_cng_ener_fx_32, Mpy_32_16_1( L_sub( st->hTdCngDec->last_shb_ener_fx, st->hTdCngDec->shb_cng_ener_fx_32 ), sin_table256_fx[i] ) ); /*Q11 */
- st->hTdCngDec->trans_cnt = sub( st->hTdCngDec->trans_cnt, 1 );
+ i = extract_l( L_mult0( hTdCngDec->trans_cnt_fx, 17 ) ); /*Q0 */
+ ener_fx = L_add( hTdCngDec->shb_cng_ener_fx_32, Mpy_32_16_1( L_sub( hTdCngDec->last_shb_ener_fx_32, hTdCngDec->shb_cng_ener_fx_32 ), sin_table256_fx[i] ) ); /*Q11 */
+ hTdCngDec->trans_cnt_fx = sub( hTdCngDec->trans_cnt_fx, 1 );
move16();
}
@@ -1960,7 +1962,7 @@ static void shb_CNG_decod_ivas_fx(
L_tmp = L_deposit_h( tmp_16 ); /*Q31 */
tmp_16 = sub( add( 5, exp ), add( q, exp1 ) );
L_gain_fx = Isqrt_lc( L_tmp, &tmp_16 ); /*Q31-Qtmp */
- st->hTdCngDec->shb_cng_gain_fx_32 = ener_fx;
+ hTdCngDec->shb_cng_gain_fx_32 = ener_fx;
move32();
FOR( i = 0; i < L_FRAME16k; i++ )
{
@@ -1974,13 +1976,13 @@ static void shb_CNG_decod_ivas_fx(
/* rescale the Hilbert memories to Q0 */
FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
{
- hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i] = L_shr( hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i], st->prev_Q_bwe_syn2 ); /* st_fx->prev_Q_bwe_syn2 */
+ hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i] = L_shr( hBWE_TD->genSHBsynth_Hilbert_Mem_fx[i], hBWE_TD->prev_Q_bwe_syn2 ); /* hBWE_TD->prev_Q_bwe_syn2 */
move32();
}
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], st->prev_Q_bwe_syn2 ); /* st_fx->prev_Q_bwe_syn2 */
+ hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], hBWE_TD->prev_Q_bwe_syn2 ); /* hBWE_TD->prev_Q_bwe_syn2 */
move16();
}
}
@@ -1988,11 +1990,13 @@ static void shb_CNG_decod_ivas_fx(
IF( EQ_32( st->output_Fs, 48000 ) )
{
- interpolate_3_over_2_allpass_fx( shb_synth_fx, L_FRAME32k, shb_synth_fx, st->interpol_3_2_cng_dec_fx, allpass_poles_3_ov_2 );
+ interpolate_3_over_2_allpass_fx( shb_synth_fx, L_FRAME32k, shb_synth_fx, hTdCngDec->interpol_3_2_cng_dec_fx, allpass_poles_3_ov_2 );
}
Scale_sig( shb_synth_fx, L_FRAME48k, -3 ); /* Qx - 3 */
- ResetSHBbuffer_Dec_fx( st );
+
+ ResetSHBbuffer_Dec_fx( st->hBWE_TD, st->extl );
+
return;
}
@@ -2005,62 +2009,6 @@ static void shb_CNG_decod_ivas_fx(
void td_cng_dec_init_fx(
DEC_CORE_HANDLE st /* i/o: decoder state structure */
)
-{
- TD_CNG_DEC_HANDLE hTdCngDec;
-
- hTdCngDec = st->hTdCngDec;
-
- hTdCngDec->cng_seed = RANDOM_INITSEED;
- move16();
- hTdCngDec->cng_ener_seed = RANDOM_INITSEED;
- move16();
- hTdCngDec->cng_ener_seed1 = RANDOM_INITSEED;
- move16();
- hTdCngDec->old_enr_index = -1;
- move16();
- hTdCngDec->Enew_fx = L_deposit_l( 0 ); /* Q6*/
- move16();
- hTdCngDec->last_allow_cn_step = 0;
- move16();
- hTdCngDec->ho_hist_ptr = -1;
- move16();
- hTdCngDec->ho_sid_bw = L_deposit_l( 0 );
- move16();
- set16_fx( hTdCngDec->ho_lsp_hist_fx, 0, HO_HIST_SIZE * M );
- set32_fx( hTdCngDec->ho_ener_hist_fx, 0, HO_HIST_SIZE );
- set32_fx( hTdCngDec->ho_env_hist_fx, 0, HO_HIST_SIZE * NUM_ENV_CNG );
- hTdCngDec->ho_hist_size = 0;
- move16();
- hTdCngDec->act_cnt = 0;
- move16();
- hTdCngDec->ho_circ_ptr = -1;
- move16();
- set16_fx( hTdCngDec->ho_lsp_circ_fx, 0, HO_HIST_SIZE * M );
- set32_fx( hTdCngDec->ho_ener_circ_fx, 0, HO_HIST_SIZE );
- set32_fx( hTdCngDec->ho_env_circ_fx, 0, HO_HIST_SIZE * NUM_ENV_CNG );
- hTdCngDec->ho_circ_size = 0;
- move16();
-
- set16_fx( hTdCngDec->ho_16k_lsp, 0, HO_HIST_SIZE );
- hTdCngDec->act_cnt2 = 0;
- move16();
- hTdCngDec->num_ho = 0;
- move16();
- hTdCngDec->last_cng_type_fx = -1;
- move16();
- set32_fx( hTdCngDec->lp_env_fx, 0, NUM_ENV_CNG );
- set16_fx( hTdCngDec->exc_mem_fx, 0, 24 );
- set16_fx( hTdCngDec->exc_mem1_fx, 0, 30 );
- set32_fx( hTdCngDec->old_env_fx, 0, NUM_ENV_CNG );
- hTdCngDec->burst_cnt = 0;
- move16();
-
- return;
-}
-
-void td_cng_dec_init_ivas_fx(
- DEC_CORE_HANDLE st /* i/o: decoder state structure */
-)
{
Word16 i;
TD_CNG_DEC_HANDLE hTdCngDec;
@@ -2080,6 +2028,8 @@ void td_cng_dec_init_ivas_fx(
Copy( st->lsp_old_fx, st->lspCNG_fx, M ); // Q(15)
hTdCngDec->last_allow_cn_step = 0;
move16();
+ hTdCngDec->shb_cng_ener_fx = -1541; // Q8
+ move16();
hTdCngDec->shb_cng_ener_fx_32 = -12329; // -6.02 in Q(11)
move32();
IF( st->element_mode != EVS_MONO )
@@ -2091,10 +2041,16 @@ void td_cng_dec_init_ivas_fx(
move32();
}
+ hTdCngDec->wb_cng_ener_fx = -1541; // Q8
+ move16();
hTdCngDec->wb_cng_ener_fx_32 = -12329; // Q(11)
move32();
+ hTdCngDec->last_wb_cng_ener_fx = -1541; // Q8
+ move16();
hTdCngDec->last_wb_cng_ener_fx_32 = -12329; // Q(11)
move32();
+ hTdCngDec->last_shb_cng_ener_fx = -1541; // Q8
+ move16();
hTdCngDec->last_shb_cng_ener_fx_32 = -12329; // Q(11)
move32();
hTdCngDec->swb_cng_seed = RANDOM_INITSEED;
@@ -2146,17 +2102,18 @@ void td_cng_dec_init_ivas_fx(
move16();
}
- hTdCngDec->shb_dtx_count = 0;
+ hTdCngDec->shb_dtx_count_fx = 0;
move16();
- hTdCngDec->trans_cnt = 0;
+ hTdCngDec->trans_cnt_fx = 0;
move16();
- hTdCngDec->burst_cnt = 0;
+ hTdCngDec->burst_cnt_fx = 0;
move16();
- hTdCngDec->last_shb_ener_fx = 2; // 0.001 in Q11
+ hTdCngDec->last_shb_ener_fx = 0; // Q8
+ move16();
+ hTdCngDec->last_shb_ener_fx_32 = 2; // 0.001 in Q11
move32();
-
set16_fx( hTdCngDec->interpol_3_2_cng_dec_fx, 0, INTERP_3_2_MEM_LEN );
return;
diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c
index dd268fe083ed61cdf5e23233a66d88a24d2148ae..967a93bfbb1a0f63da3846387ed0f3b0ccfb998e 100644
--- a/lib_dec/core_dec_init_fx.c
+++ b/lib_dec/core_dec_init_fx.c
@@ -836,7 +836,7 @@ void open_decoder_LPD_fx(
st->Mode2_lp_gainp = L_deposit_l( 0 ); /* 15Q16 */
move32();
- st->prev_widow_left_rect = 0;
+ st->hTcxDec->prev_widow_left_rect = 0;
move16();
if ( st->hTcxDec != NULL )
{
@@ -1029,33 +1029,29 @@ void open_decoder_LPD_fx(
test();
IF( EQ_16( st->ini_frame, 0 ) || LT_32( st->last_total_brate, HQ_48k ) || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset )
{
- concealment_init_x( hTcxDec->L_frameTCX, &st->plcInfo );
+ concealment_init_x( hTcxDec->L_frameTCX, st->hPlcInfo );
}
}
/* PLC: [TCX: Tonal Concealment] */
-#if 0
- PMT("handle to tonalMDCTconceal is missing")
-#endif
- //#ifdef ADD_IVAS_HTONALMDCTCONC
test();
test();
- IF( /*st->ADD_IVAS_HTONALMDCTCONC != NULL &&*/ !( st->element_mode > EVS_MONO && NE_16( st->ini_frame, 0 ) && EQ_16( st->tonalMDCTconceal.nSamples, st->hTcxDec->L_frameTCX ) ) )
+ IF( st->hTonalMDCTConc != NULL && !( st->element_mode > EVS_MONO && NE_16( st->ini_frame, 0 ) && EQ_16( st->hTonalMDCTConc->nSamples, st->hTcxDec->L_frameTCX ) ) )
{
- st->tonalMDCTconceal.nScaleFactors = 0;
+ st->hTonalMDCTConc->nScaleFactors = 0;
move16();
- st->tonalMDCTconceal.nSamples = 0;
+ st->hTonalMDCTConc->nSamples = 0;
move16();
- st->tonalMDCTconceal.lastPcmOut = 0x0;
+ st->hTonalMDCTConc->lastPcmOut = 0x0;
move16();
- st->tonalMDCTconceal.q_lastPcmOut = Q15;
+ st->hTonalMDCTConc->q_lastPcmOut = Q15;
move16();
- st->tonalMDCTconceal.lastBlockData.tonalConcealmentActive = 0;
+ st->hTonalMDCTConc->lastBlockData.tonalConcealmentActive = 0;
move16();
- st->tonalMDCTconceal.lastBlockData.nSamples = 0;
+ st->hTonalMDCTConc->lastBlockData.nSamples = 0;
move16();
- TonalMDCTConceal_Init( &st->tonalMDCTconceal, hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg );
+ TonalMDCTConceal_Init( st->hTonalMDCTConc, hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg );
}
st->last_tns_active = 0;
move16();
diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c
index 2fd3f1d2ec32c0b8b0308378c73062f344bbfe71..63c35f876e3da1d41836c8b99f588463a42c8502 100644
--- a/lib_dec/core_dec_switch_fx.c
+++ b/lib_dec/core_dec_switch_fx.c
@@ -197,11 +197,7 @@ void mode_switch_decoder_LPD_fx(
( EQ_16( st->bwidth, SWB ) && NE_16( st->last_extl, SWB_TBE ) ) ||
( EQ_16( st->bwidth, FB ) && NE_16( st->last_extl, FB_TBE ) ) )
{
-#ifdef IVAS_CODE
TBEreset_dec_fx( st );
-#else
- TBEreset_dec_fx( st, st->bwidth );
-#endif
}
ELSE
{
@@ -445,7 +441,7 @@ void mode_switch_decoder_LPD_ivas_fx(
( 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_dec_ivas_fx( st );
+ TBEreset_dec_fx( st );
}
ELSE
{
diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c
index 0f361e658628093c61be18cd92a839371e0d868b..1f6b0dd5178407824010789fac18653a76897de7 100644
--- a/lib_dec/core_switching_dec_fx.c
+++ b/lib_dec/core_switching_dec_fx.c
@@ -277,7 +277,7 @@ void bw_switching_pre_proc_fx(
{
st_fx->prev_ener_shb_fx = 0;
move16();
- set16_fx( st_fx->prev_SWB_fenv_fx, 0, SWB_FENV );
+ set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, 0, SWB_FENV );
}
ELSE IF( ( ( st_fx->core == ACELP_CORE && ( EQ_16( st_fx->last_core, HQ_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) || EQ_16( st_fx->last_core, TCX_20_CORE ) ) ) || ( EQ_16( st_fx->core, st_fx->last_core ) && NE_16( st_fx->extl, st_fx->last_extl ) ) ) && GE_16( st_fx->last_bwidth, SWB ) )
{
@@ -486,7 +486,7 @@ ivas_error core_switching_pre_dec_fx(
{
return error;
}
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, hTcxDec->syn_Overl, 0, no_col, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, hTcxDec->syn_Overl, 0, no_col, workBuffer );
cldfb_restore_memory( st_fx->cldfbAna );
scaleFactor.hb_scale = scaleFactor.lb_scale;
@@ -497,7 +497,7 @@ ivas_error core_switching_pre_dec_fx(
{
return error;
}
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, hHQ_core->fer_samples_fx, 0, no_col, workBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, hHQ_core->fer_samples_fx, 0, no_col, workBuffer );
cldfb_restore_memory( st_fx->cldfbSyn );
}
@@ -978,10 +978,7 @@ ivas_error core_switching_post_dec_fx(
Scale_sig( st_fx->delay_buf_out_fx, delay_comp, sub( Qtmp, hHQ_core->Q_old_postdec ) ); /* Qtmp */
hHQ_core->Q_old_postdec = Qtmp;
move16();
-
- Copy( synth, &synth[delay_comp], output_frame ); /* Qsynth */
- Copy( st_fx->delay_buf_out_fx, synth, delay_comp ); /* Q0 */
- Copy( &synth[output_frame], st_fx->delay_buf_out_fx, delay_comp ); /* Qsynth */
+ delay_signal_fx( synth, output_frame, st_fx->delay_buf_out_fx, delay_comp ); /* Qsynth, Q0 */
test();
test();
@@ -1153,7 +1150,7 @@ ivas_error core_switching_post_dec_fx(
move16();
hBWE_FD->prev_weight_fx = 6554;
move16(); /*0.2 in Q15*/
- st_fx->prev_fb_ener_adjust_fx = 0;
+ hBWE_FD->prev_fb_ener_adjust_fx = 0;
move16();
}
@@ -1205,8 +1202,8 @@ ivas_error core_switching_post_dec_fx(
swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
- set16_fx( st_fx->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 );
- swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
+ set16_fx( hBWE_TD->GainShape_Delay_fx, 0, NUM_SHB_SUBFR / 2 );
+ swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
IF( EQ_16( output_frame, L_FRAME16k ) )
{
@@ -1233,9 +1230,9 @@ ivas_error core_switching_post_dec_fx(
test();
test();
test();
- IF( EQ_32( st_fx->output_Fs, 48000 ) && ( ( GT_32( st_fx->last_core_brate, SID_2k40 ) ) && ( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) ) )
+ IF( st_fx->hTdCngDec != NULL && EQ_32( st_fx->output_Fs, 48000 ) && ( ( GT_32( st_fx->last_core_brate, SID_2k40 ) ) && ( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) ) )
{
- set16_fx( st_fx->interpol_3_2_cng_dec_fx, 0, INTERP_3_2_MEM_LEN );
+ set16_fx( st_fx->hTdCngDec->interpol_3_2_cng_dec_fx, 0, INTERP_3_2_MEM_LEN );
}
/* reset FB TBE buffers */
@@ -1269,7 +1266,6 @@ ivas_error core_switching_post_dec_ivas_fx(
Word16 *synth, /* i/o: output synthesis Qsynth*/
Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/
Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/
- const IVAS_FORMAT ivas_format, /* i : IVAS format */
const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo Q0*/
const Word16 output_frame, /* i : frame length Q0*/
const Word16 core_switching_flag, /* i : ACELP->HQ switching flag Q0*/
@@ -1410,13 +1406,7 @@ ivas_error core_switching_post_dec_ivas_fx(
Scale_sig( st_fx->delay_buf_out_fx, delay_comp, sub( Qtmp, hHQ_core->Q_old_postdec ) ); /* Qtmp */
hHQ_core->Q_old_postdec = Qtmp;
move16();
- Word16 temp_buffer[L_FRAME48k];
-
- Copy( st_fx->delay_buf_out_fx, temp_buffer, delay_comp ); /* Q0 */
- Copy( synth + sub( output_frame, delay_comp ), st_fx->delay_buf_out_fx, delay_comp ); /* Qsynth */
- move16();
- Copy( synth, synth + delay_comp, sub( output_frame, delay_comp ) ); /* Qsynth */
- Copy( temp_buffer, synth, delay_comp ); /* Q0 */
+ delay_signal_fx( synth, output_frame, st_fx->delay_buf_out_fx, delay_comp ); /* Qsynth, Q0 */
test();
test();
@@ -1523,11 +1513,12 @@ ivas_error core_switching_post_dec_ivas_fx(
test();
test();
test();
- IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( ivas_format, ISM_FORMAT ) && EQ_16( st_fx->core, TCX_20_CORE ) /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && LE_32( st_fx->last_core_brate, SID_2k40 ) && GT_32( st_fx->core_brate, SID_2k40 ) )
+ IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || ( st_fx->is_ism_format && EQ_16( st_fx->core, TCX_20_CORE ) /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && LE_32( st_fx->last_core_brate, SID_2k40 ) && GT_32( st_fx->core_brate, SID_2k40 ) )
{
/* smooth transitions to avoid pops in car noise items */
smoothTransitionDtxToTcx_fx( synth, output_frame, delay_comp );
}
+
/* Reset memories of CLDFBs */
IF( st_fx->cldfbAna != NULL )
{
@@ -1791,7 +1782,7 @@ ivas_error core_switching_post_dec_ivas_fx(
move16();
hBWE_FD->prev_weight_fx = 6554;
move16(); /*0.2 in Q15*/
- st_fx->prev_fb_ener_adjust_fx = 0;
+ hBWE_FD->prev_fb_ener_adjust_fx = 0;
move16();
}
@@ -1852,12 +1843,11 @@ ivas_error core_switching_post_dec_ivas_fx(
swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
- set16_fx( st_fx->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 );
- // swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
- swb_tbe_reset_synth_ivas_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
+ set16_fx( hBWE_TD->GainShape_Delay_fx, 0, NUM_SHB_SUBFR / 2 );
+ swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
- st_fx->hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /* Q0 1.f */
- st_fx->hBWE_TD->prev_mix_factor_fx = 32767; /* Q15 1.f */
+ hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /* Q0 1.f */
+ hBWE_TD->prev_mix_factor_fx = 32767; /* Q15 1.f */
move16();
move16();
@@ -1881,7 +1871,7 @@ ivas_error core_switching_post_dec_ivas_fx(
}
ELSE IF( st_fx->hBWE_TD != NULL && ( EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) ) )
{
- TBEreset_dec_ivas_fx( st_fx );
+ TBEreset_dec_fx( st_fx );
}
/* reset FB TBE buffers */
@@ -1913,9 +1903,9 @@ ivas_error core_switching_post_dec_ivas_fx(
test();
test();
test();
- IF( EQ_32( st_fx->output_Fs, 48000 ) && ( ( GT_32( st_fx->last_core_brate, SID_2k40 ) ) && ( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) ) )
+ IF( st_fx->hTdCngDec != NULL && EQ_32( st_fx->output_Fs, 48000 ) && ( ( GT_32( st_fx->last_core_brate, SID_2k40 ) ) && ( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) ) )
{
- set16_fx( st_fx->interpol_3_2_cng_dec_fx, 0, INTERP_3_2_MEM_LEN );
+ set16_fx( st_fx->hTdCngDec->interpol_3_2_cng_dec_fx, 0, INTERP_3_2_MEM_LEN );
}
return error;
@@ -2068,7 +2058,11 @@ static void core_switch_lb_upsamp_fx(
}
/* synthesis of the combined signal */
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), 0, st->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), st->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
/*rescaling whole buffer to a common Q*/
no_col = st->cldfbSyn->no_col;
@@ -2325,7 +2319,7 @@ ivas_error core_switching_pre_dec_ivas_fx(
st->hHQ_core->last_max_pos_pulse = 0;
move16();
- set16_fx( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
+ set16_fx( st->hHQ_core->prev_SWB_peak_pos_fx, 0, SPT_SHORTEN_SBNUM );
st->hHQ_core->prev_frm_hfe2 = 0;
st->hHQ_core->prev_stab_hfe2 = 0;
move16();
@@ -2385,7 +2379,11 @@ ivas_error core_switching_pre_dec_ivas_fx(
return error;
}
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, 0, st->cldfbSyn );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, st->cldfbSyn );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfb_restore_memory_ivas_fx( st->cldfbSyn );
Copy_Scale_sig_32_16( syn_Overl_fx, st->hTcxDec->syn_Overl, 320, 15 );
Copy_Scale_sig_32_16( fer_samples_fx, st->hHQ_core->fer_samples_fx, 960, 9 );
@@ -2691,7 +2689,7 @@ ivas_error core_switching_pre_dec_ivas_fx(
st->hHQ_core->last_max_pos_pulse = 0;
move16();
- set16_fx( st->hHQ_core->prev_SWB_peak_pos, 0, SPT_SHORTEN_SBNUM );
+ set16_fx( st->hHQ_core->prev_SWB_peak_pos_fx, 0, SPT_SHORTEN_SBNUM );
st->hHQ_core->prev_frm_hfe2 = 0;
st->hHQ_core->prev_stab_hfe2 = 0;
move16();
@@ -2712,7 +2710,7 @@ ivas_error core_switching_pre_dec_ivas_fx(
IF( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) )
{
set16_fx( st->hHQ_core->old_out_fx, 0, output_frame );
- set32_fx( st->hHQ_core->old_outLB_fx, 0, L_FRAME16k );
+ set32_fx( st->hHQ_core->old_out_LB_fx32, 0, L_FRAME16k );
set16_fx( st->hHQ_core->old_out_LB_fx, 0, L_FRAME16k );
}
@@ -2734,7 +2732,7 @@ ivas_error core_switching_pre_dec_ivas_fx(
ELSE
{
set16_fx( st->hHQ_core->old_out_fx, 0, output_frame );
- set32_fx( st->hHQ_core->old_outLB_fx, 0, L_FRAME16k );
+ set32_fx( st->hHQ_core->old_out_LB_fx32, 0, L_FRAME16k );
}
}
@@ -3156,12 +3154,11 @@ void ivas_bw_switching_pre_proc_fx(
test();
IF( EQ_16( st->last_bwidth, 0 ) && LE_16( st->extl, SWB_CNG ) )
{
-
st->prev_ener_shb_fx = 0;
move16();
IF( st->hBWE_FD != NULL )
{
- set16_fx( st->prev_SWB_fenv_fx, 0, SWB_FENV );
+ set16_fx( st->hBWE_FD->prev_SWB_fenv_fx, 0, SWB_FENV );
}
}
ELSE IF( ( ( ( st->core == ACELP_CORE ) && ( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) || ( EQ_16( st->core, st->last_core ) && NE_16( st->extl, st->last_extl ) ) ) && GE_16( st->last_bwidth, SWB ) )
diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c
index f3443349a1a542e0ff66f85b2ba1650107e1c2f8..d5294eb7a0a9eed009f3475c4f24be9270a76377 100644
--- a/lib_dec/dec_LPD_fx.c
+++ b/lib_dec/dec_LPD_fx.c
@@ -455,7 +455,7 @@ void decoder_LPD_fx(
}
if ( bfi )
{
- st->plcInfo.nbLostCmpt = add( st->plcInfo.nbLostCmpt, 1 );
+ st->hPlcInfo->nbLostCmpt = add( st->hPlcInfo->nbLostCmpt, 1 );
move16();
}
}
@@ -634,7 +634,7 @@ void decoder_LPD_fx(
/* PLC: [TCX: Tonal Concealment] */
/* Signal that this frame is not TCX */
- TonalMDCTConceal_UpdateState( &st->tonalMDCTconceal, 0, 0, 0, 0 );
+ TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, 0, 0, 0, 0 );
IF( bfi == 0 )
{
@@ -752,21 +752,18 @@ void decoder_LPD_fx(
EQ_16( st->last_codec_mode, MODE2 ) ) )
{
/* waveform adjustment */
+ concealment_signal_tuning_fx( st, bfi, synthFB, past_core_mode );
- concealment_signal_tuning_fx( bfi, st->core,
- synthFB, &st->plcInfo, st->nbLostCmpt, st->prev_bfi,
- st->tonalMDCTconceal.secondLastPcmOut,
- past_core_mode, st->tonalMDCTconceal.lastPcmOut, st );
test();
test();
test();
- IF( ( bfi || st->prev_bfi ) && st->plcInfo.Pitch_fx && ( ( st->plcInfo.concealment_method == TCX_NONTONAL ) ) )
+ IF( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch_fx && ( ( st->hPlcInfo->concealment_method == TCX_NONTONAL ) ) )
{
lerp( synthFB, synth, L_frame, L_frameTCX );
test();
if ( !bfi && st->prev_bfi )
{
- st->plcInfo.Pitch_fx = 0;
+ st->hPlcInfo->Pitch_fx = 0;
move16();
}
}
@@ -774,7 +771,7 @@ void decoder_LPD_fx(
IF( !bfi )
{
- TonalMDCTConceal_SaveTimeSignal( &st->tonalMDCTconceal, synthFB, L_frameTCX );
+ TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, L_frameTCX );
}
#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT
decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi, 0 );
@@ -977,13 +974,13 @@ void decoder_LPD_fx(
{
if ( !bfi )
{
- st->plcInfo.nbLostCmpt = 0;
+ st->hPlcInfo->nbLostCmpt = 0;
move16();
}
IF( st->core == 0 )
{
- set_state( st->plcInfo.Transient, st->core, MAX_POST_LEN );
+ set_state( st->hPlcInfo->Transient, st->core, MAX_POST_LEN );
}
}
diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c
index d1ed7ad8c90fcdc38719cf2e07f0c5ba0fad4cef..8ff50f8a521a84f1561dcd9fd3ed0d64be9eadae 100644
--- a/lib_dec/dec_tcx_fx.c
+++ b/lib_dec/dec_tcx_fx.c
@@ -153,7 +153,7 @@ void decoder_tcx_fx(
L_frameTCX = st->L_frameTCX_past;
move16();
- left_rect = st->prev_widow_left_rect;
+ left_rect = hTcxDec->prev_widow_left_rect;
move16();
IF( left_rect != 0 )
@@ -190,7 +190,7 @@ void decoder_tcx_fx(
move16();
left_rect = 1;
move16();
- st->prev_widow_left_rect = 1;
+ hTcxDec->prev_widow_left_rect = 1;
move16();
}
ELSE
@@ -202,7 +202,7 @@ void decoder_tcx_fx(
move16();
left_rect = 0;
move16();
- st->prev_widow_left_rect = 0;
+ hTcxDec->prev_widow_left_rect = 0;
move16();
}
@@ -763,42 +763,42 @@ void decoder_tcx_fx(
{
IF( EQ_16( st->nbLostCmpt, 1 ) )
{
- st->plcInfo.concealment_method = TCX_NONTONAL;
+ st->hPlcInfo->concealment_method = TCX_NONTONAL;
move16();
/* tonal/non-tonal decision */
test();
test();
- IF( EQ_16( st->plcInfo.Transient[0], 1 ) && EQ_16( st->plcInfo.Transient[1], 1 ) && EQ_16( st->plcInfo.Transient[2], 1 ) )
+ IF( EQ_16( st->hPlcInfo->Transient[0], 1 ) && EQ_16( st->hPlcInfo->Transient[1], 1 ) && EQ_16( st->hPlcInfo->Transient[2], 1 ) )
{
Word16 sum_word16 = 0;
move16();
FOR( i = 9; i >= 0; i-- )
{
- sum_word16 = add( sum_word16, st->plcInfo.TCX_Tonality[i] );
+ sum_word16 = add( sum_word16, st->hPlcInfo->TCX_Tonality[i] );
}
if ( GE_16( sum_word16, 6 ) )
{
- st->plcInfo.concealment_method = TCX_TONAL;
+ st->hPlcInfo->concealment_method = TCX_TONAL;
move16();
}
}
if ( st->tonal_mdct_plc_active )
{
- st->plcInfo.concealment_method = TCX_TONAL;
+ st->hPlcInfo->concealment_method = TCX_TONAL;
move16();
}
}
if ( GT_16( L_frameTCX, hTcxDec->L_frameTCX ) )
{
- st->plcInfo.concealment_method = TCX_TONAL;
+ st->hPlcInfo->concealment_method = TCX_TONAL;
move16();
}
- temp_concealment_method = st->plcInfo.concealment_method;
+ temp_concealment_method = st->hPlcInfo->concealment_method;
move16();
if ( EQ_16( st->core, TCX_10_CORE ) )
@@ -810,7 +810,7 @@ void decoder_tcx_fx(
/* get the starting location of the subframe in the frame */
IF( EQ_16( st->core, TCX_10_CORE ) )
{
- st->plcInfo.subframe_fx = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) );
+ st->hPlcInfo->subframe_fx = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) );
move16();
}
}
@@ -821,8 +821,7 @@ void decoder_tcx_fx(
IF( bfi == 0 )
{
- TonalMDCTConceal_SaveFreqSignal( &st->tonalMDCTconceal, x, x_e, L_frameTCX,
- L_frame, gainlpc2, gainlpc2_e, gain_tcx_e );
+ TonalMDCTConceal_SaveFreqSignal( st->hTonalMDCTConc, x, x_e, L_frameTCX, L_frame, gainlpc2, gainlpc2_e, gain_tcx_e );
}
ELSE
{
@@ -852,8 +851,8 @@ void decoder_tcx_fx(
Word16 exp1, exp2;
Word32 E_2ndlast, E_last;
- E_2ndlast = CalculateAbsEnergy_fx( 1, &( st->tonalMDCTconceal.lastBlockData.spectralData[0] ), infoIGFStartLine, &exp2 );
- E_last = CalculateAbsEnergy_fx( 1, &( st->tonalMDCTconceal.lastBlockData.spectralData[1] ), infoIGFStartLine, &exp1 );
+ E_2ndlast = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[0] ), infoIGFStartLine, &exp2 );
+ E_last = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[1] ), infoIGFStartLine, &exp1 );
BASOP_Util_Divide_MantExp( extract_h( E_2ndlast ), exp2, extract_h( E_last ), exp1, &tmp1, &tmp2 );
@@ -865,7 +864,7 @@ void decoder_tcx_fx(
FOR( i = 0; i < infoIGFStartLine; i += 2 )
{
move32();
- st->tonalMDCTconceal.lastBlockData.spectralData[i] = st->tonalMDCTconceal.lastBlockData.spectralData[i + 1];
+ st->hTonalMDCTConc->lastBlockData.spectralData[i] = st->hTonalMDCTConc->lastBlockData.spectralData[i + 1];
}
}
ELSE IF( LT_16( tmp1, 4096 /*0.5 in Q13*/ ) )
@@ -873,7 +872,7 @@ void decoder_tcx_fx(
FOR( i = 0; i < infoIGFStartLine; i += 2 )
{
move32();
- st->tonalMDCTconceal.lastBlockData.spectralData[i + 1] = st->tonalMDCTconceal.lastBlockData.spectralData[i];
+ st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] = st->hTonalMDCTConc->lastBlockData.spectralData[i];
}
}
}
@@ -892,7 +891,7 @@ void decoder_tcx_fx(
tcxGetNoiseFillingTilt( A, M, L_frame, tmp, &noiseTiltFactor );
- TonalMDCTConceal_InsertNoise( &st->tonalMDCTconceal, x, &x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc,
+ TonalMDCTConceal_InsertNoise( st->hTonalMDCTConc, x, &x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc,
noiseTiltFactor, f,
#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT
concealment_noise,
@@ -980,7 +979,7 @@ void decoder_tcx_fx(
test();
IF( bfi && st->tonal_mdct_plc_active )
{
- TonalMDCTConceal_Apply( &st->tonalMDCTconceal, x, &x_e );
+ TonalMDCTConceal_Apply( st->hTonalMDCTConc, x, &x_e );
}
tmp32 = L_deposit_h( 0 );
@@ -996,11 +995,8 @@ void decoder_tcx_fx(
tmp8 = 1;
move16();
}
- TonalMDCTConceal_UpdateState( &st->tonalMDCTconceal,
- L_frameTCX,
- tmp32,
- bfi,
- tmp8 );
+
+ TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX, tmp32, bfi, tmp8 );
IF( st->enablePlcWaveadjust )
{
@@ -1011,10 +1007,11 @@ void decoder_tcx_fx(
IF( bfi && ( EQ_16( temp_concealment_method, TCX_NONTONAL ) ) )
{
/* x_e =31-x_scale; */
- concealment_decode_fix( core, x, &x_e, &st->plcInfo );
+ concealment_decode_fix( core, x, &x_e, st->hPlcInfo );
}
+
/* update spectrum buffer, tonality flag, etc. */
- concealment_update_x( bfi, core, st->tonality_flag, x, &x_e, &st->plcInfo );
+ concealment_update_x( bfi, core, st->tonality_flag, x, &x_e, st->hPlcInfo );
}
/*-----------------------------------------------------------*
@@ -1305,7 +1302,7 @@ void decoder_tcx_post_fx( Decoder_State *st_fx,
{
test();
/* run lpc gain compensation not for waveform adjustment */
- IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->plcInfo.concealment_method, TCX_TONAL ) )
+ IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) )
{
UWord32 dmy;
tmp32_1 /*gainHelperFB*/ = L_shl_r( L_deposit_h( hTcxDec->gainHelper ), sub( hTcxDec->gainHelper_e, 31 - 28 ) ); /*Q28*/
@@ -1475,20 +1472,19 @@ void decoder_tcx_post_fx( Decoder_State *st_fx,
move16();
/* run lpc gain compensation not for waveform adjustment */
test();
- IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->plcInfo.concealment_method, TCX_TONAL ) )
+ IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) )
{
- st_fx->plcInfo.recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB,
- st_fx->last_concealed_gain_syn_deemph ),
- st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/
+ st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB,
+ st_fx->last_concealed_gain_syn_deemph ),
+ st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/
move16();
}
ELSE
{
- st_fx->plcInfo.recovery_gain = extract_h( conceal_eof_gainFB ); /*Q14*/
+ st_fx->hPlcInfo->recovery_gain = extract_h( conceal_eof_gainFB ); /*Q14*/
move16();
}
- st_fx->plcInfo.step_concealgain_fx =
- round_fx_sat( L_shl_sat( L_mult0( round_fx_sat( step ), round_fx_sat( L_shl_sat( L_mult0( st_fx->L_frame, getInvFrameLen( hTcxDec->L_frameTCX ) ), 8 ) ) ), 3 ) ); /*Q15*/
+ st_fx->hPlcInfo->step_concealgain_fx = round_fx_sat( L_shl_sat( L_mult0( round_fx_sat( step ), round_fx_sat( L_shl_sat( L_mult0( st_fx->L_frame, getInvFrameLen( hTcxDec->L_frameTCX ) ), 8 ) ) ), 3 ) ); /*Q15*/
move16();
}
@@ -1585,7 +1581,7 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx,
test();
test();
/* run lpc gain compensation not for waveform adjustment */
- IF( 0 == st_fx->enablePlcWaveadjust || ( st_fx->hPlcInfo != NULL && EQ_16( st_fx->plcInfo.concealment_method, TCX_TONAL ) ) )
+ IF( 0 == st_fx->enablePlcWaveadjust || ( st_fx->hPlcInfo != NULL && EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) ) )
{
UWord32 dmy;
tmp32_1 /*gainHelperFB*/ = L_shl_r( L_deposit_h( hTcxDec->gainHelper ), sub( hTcxDec->gainHelper_e, 31 - 28 ) ); /*Q28*/
@@ -1804,22 +1800,22 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx,
}
/* run lpc gain compensation not for waveform adjustment */
- test();
- IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->plcInfo.concealment_method, TCX_TONAL ) )
- {
- st_fx->plcInfo.recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB,
- st_fx->last_concealed_gain_syn_deemph ),
- st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/
- move16();
- }
- ELSE
+ IF( st_fx->hPlcInfo != NULL )
{
- st_fx->plcInfo.recovery_gain = extract_h( conceal_eof_gainFB ); /*Q14*/
+ test();
+ IF( 0 == st_fx->enablePlcWaveadjust || EQ_16( st_fx->hPlcInfo->concealment_method, TCX_TONAL ) )
+ {
+ st_fx->hPlcInfo->recovery_gain = extract_h( L_shl_o( Mpy_32_16_1( conceal_eof_gainFB, st_fx->last_concealed_gain_syn_deemph ), st_fx->last_concealed_gain_syn_deemph_e, &Overflow ) ); /*Q30->Q14*/
+ move16();
+ }
+ ELSE
+ {
+ st_fx->hPlcInfo->recovery_gain = extract_h( conceal_eof_gainFB ); /*Q14*/
+ move16();
+ }
+ st_fx->hPlcInfo->step_concealgain_fx = round_fx_sat( L_shl_sat( L_mult0( round_fx_sat( L_shr_sat( step, sub( 1, step_e ) ) ), round_fx_sat( L_shl_sat( L_mult0( st_fx->L_frame, getInvFrameLen( hTcxDec->L_frameTCX ) ), 8 ) ) ), 4 ) ); /*Q15*/
move16();
}
- st_fx->plcInfo.step_concealgain_fx =
- round_fx_sat( L_shl_sat( L_mult0( round_fx_sat( L_shr_sat( step, sub( 1, step_e ) ) ), round_fx_sat( L_shl_sat( L_mult0( st_fx->L_frame, getInvFrameLen( hTcxDec->L_frameTCX ) ), 8 ) ) ), 4 ) ); /*Q15*/
- move16();
}
/*-----------------------------------------------------------*
@@ -2686,7 +2682,11 @@ void IMDCT_ivas_fx(
}
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ set16_fx( win_fx, 0, ( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) >> 1 );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
set16_fx( win_fx, 0, shr( add( L_FRAME_PLUS, L_MDCT_OVLP_MAX ), 1 ) );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Word16 tcx_offset_tmp = add( tcx_offset, shr( L_ola, 1 ) );
set16_fx( xn_buf_fx, 0, tcx_offset_tmp ); /* zero left end of buffer */
@@ -2865,9 +2865,16 @@ void IMDCT_ivas_fx(
q_tmp_fx_32 = q_xn_buf_fx_32;
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word16 diff = sub( q_tmp_fx_32, q_win );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( Word16 ind = 0; ind < L_frame; ind++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
old_out_fx_32[ind] = L_shl( old_out_fx[ind], sub( q_tmp_fx_32, q_win ) );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
move32();
}
@@ -2875,8 +2882,13 @@ void IMDCT_ivas_fx(
FOR( Word16 ind = 0; ind < L_frame; ind++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) );
+ xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
old_out_fx[ind] = (Word16) L_shr( old_out_fx_32[ind], sub( q_tmp_fx_32, q_win ) );
xn_buf_fx[ind] = (Word16) L_shr( xn_buf_fx_32[ind], sub( q_tmp_fx_32, q_win ) );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
move16();
move16();
}
@@ -2900,20 +2912,39 @@ void IMDCT_ivas_fx(
q_tmp_fx_32 = sub( q_xn_buf_fx_32, res_e );
// v_multc_fixed( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word16 q_diff = sub( q_xn_buf_fx_32, q_win );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( Word16 ind = 0; ind < L_frame; ind++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ xn_buf_fx[( ind + ( overlap / 2 ) ) + nz] = extract_l( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
xn_buf_fx[( ind + ( overlap / 2 ) ) + nz] = (Word16) L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], sub( q_xn_buf_fx_32, q_win ) );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
move16();
}
window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, &q_old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ q_diff = sub( q_old_out, q_win );
+
+ Word16 diff = sub( q_tmp_fx_32, q_win );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( Word16 ind = 0; ind < L_frame; ind++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff );
+ move16();
+ xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], diff );
+ move16();
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
old_out_fx[ind] = shr_sat( old_out_fx[ind], sub( q_old_out, q_win ) );
move16();
xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], sub( q_tmp_fx_32, q_win ) );
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
}
aldo = 1;
@@ -3608,7 +3639,8 @@ void decoder_tcx_ivas_fx(
st->hHQ_core->Q_old_wtda_LB = 0;
move16();
- Scale_sig( st->hTcxDec->old_syn_Overl, 320, 1 ); // Scaling to Q_syn
+ Scale_sig( st->hTcxDec->old_syn_Overl, 320, st->Q_syn - st->hTcxDec->Q_old_syn_Overl ); // Scaling to Q_syn
+ st->hTcxDec->Q_old_syn_Overl = st->Q_syn;
Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) );
Scale_sig( synth_fx, L_frame_glob, st->Q_syn ); // Scaling to Q_syn
@@ -3625,7 +3657,8 @@ void decoder_tcx_ivas_fx(
// Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) );
st->hHQ_core->Q_old_wtda_LB = st->Q_syn;
// Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) );
- Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 + st->Q_syn ) ); // Scaling to Q-2
+ Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2
+ st->hTcxDec->Q_old_syn_Overl = -2;
}
/*-------------------------------------------------------------------*
@@ -4408,7 +4441,11 @@ void decoder_tcx_noisefilling_fx(
/* get the starting location of the subframe in the frame */
IF( EQ_16( st->core, TCX_10_CORE ) )
{
+#ifdef NONBE_FIX_1402_WAVEADJUST
+ st->hPlcInfo->subframe_fx = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) );
+#else
st->hPlcInfo->subframe = extract_l( L_mult0( frame_cnt, L_frameTCX_glob ) );
+#endif
move16();
}
}
@@ -4799,11 +4836,11 @@ void decoder_tcx_noiseshaping_igf_fx(
/* spectrum concealment */
IF( bfi && EQ_16( *temp_concealment_method, TCX_NONTONAL ) )
{
- concealment_decode_fix( st->core, x_fx, x_e, &st->hPlcInfo );
+ concealment_decode_fix( st->core, x_fx, x_e, st->hPlcInfo );
}
/* update spectrum buffer, tonality flag, etc. */
- concealment_update_x( bfi, st->core, st->tonality_flag, x_fx, x_e, &st->hPlcInfo );
+ concealment_update_x( bfi, st->core, st->tonality_flag, x_fx, x_e, st->hPlcInfo );
*x_len = s_max( *x_len, st->hPlcInfo->L_frameTCX );
move16();
diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c
index 5cc06dabf285301cae74d550d27f09128f1954d1..e804d200927334135725f05bc7294f3e4da06dce 100644
--- a/lib_dec/er_dec_tcx_fx.c
+++ b/lib_dec/er_dec_tcx_fx.c
@@ -2036,6 +2036,7 @@ void con_tcx_ivas_fx(
st->Q_syn = Q_syn;
move16();
Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/
+ st->hTcxDec->Q_old_syn_Overl = -1;
lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB;
diff --git a/lib_dec/er_util_fx.c b/lib_dec/er_util_fx.c
index 8c94ecf987e1152e94d8c19b63da37c8bdaee5cf..9735129ec14bc56a1aed50c894ac3cf27a087b6a 100644
--- a/lib_dec/er_util_fx.c
+++ b/lib_dec/er_util_fx.c
@@ -439,8 +439,6 @@ Word16 GetPLCModeDecision_ivas_fx(
test();
test();
test();
- // PMT("handle to tonalMDCTconceal is missing")
- //#ifdef ADD_IVAS_HTONALMDCTCONC
IF( ( st->hTonalMDCTConc != NULL && EQ_16( st->last_core, TCX_20_CORE ) ) && ( EQ_16( st->second_last_core, TCX_20_CORE ) ) && ( ( LE_32( st->old_fpitch, L_deposit_h( shr( st->L_frame, 1 ) ) ) ) || ( LE_16( hTcxDec->tcxltp_last_gain_unmodified, 13107 /*0.4f Q15*/ ) ) )
/* it is fine to call the detection even if no ltp information
is available, meaning that st->old_fpitch ==
@@ -454,12 +452,8 @@ Word16 GetPLCModeDecision_ivas_fx(
{
pitch = L_add( st->old_fpitch, 0 ); /*Q16*/
}
- // TonalMDCTConceal_Detect_ivas_fx(&st->tonalMDCTconceal, pitch, &numIndices
- // , (st->element_mode == IVAS_CPE_MDCT ? &(st->hTcxCfg->psychParamsTCX20) : st->hTcxCfg->psychParamsCurrent)
- //);
- TonalMDCTConceal_Detect_ivas_fx( st->hTonalMDCTConc, pitch, &numIndices, ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ),
- st->element_mode );
+ TonalMDCTConceal_Detect_ivas_fx( st->hTonalMDCTConc, pitch, &numIndices, ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ), st->element_mode );
test();
test();
@@ -554,6 +548,7 @@ Word16 GetPLCModeDecision_fx(
core = st->last_core_bfi;
move16();
}
+
IF( EQ_16( st->nbLostCmpt, 1 ) )
{
st->tonal_mdct_plc_active = 0;
@@ -569,9 +564,7 @@ Word16 GetPLCModeDecision_fx(
test();
test();
test();
- // PMT("handle to tonalMDCTconceal is missing")
- //#ifdef ADD_IVAS_HTONALMDCTCONC
- IF( ( /*st->ADD_IVAS_HTONALMDCTCONC != NULL &&*/ EQ_16( st->last_core, TCX_20_CORE ) ) && ( EQ_16( st->second_last_core, TCX_20_CORE ) ) && ( ( LE_32( st->old_fpitch, L_deposit_h( shr( st->L_frame, 1 ) ) ) ) || ( LE_16( hTcxDec->tcxltp_last_gain_unmodified, 13107 /*0.4f Q15*/ ) ) )
+ IF( ( st->hTonalMDCTConc != NULL && EQ_16( st->last_core, TCX_20_CORE ) ) && ( EQ_16( st->second_last_core, TCX_20_CORE ) ) && ( ( LE_32( st->old_fpitch, L_deposit_h( shr( st->L_frame, 1 ) ) ) ) || ( LE_16( hTcxDec->tcxltp_last_gain_unmodified, 13107 /*0.4f Q15*/ ) ) )
/* it is fine to call the detection even if no ltp information
is available, meaning that st->old_fpitch ==
st->tcxltp_second_last_pitch == st->L_frame */
@@ -585,24 +578,13 @@ Word16 GetPLCModeDecision_fx(
{
pitch = L_add( st->old_fpitch, 0 ); /*Q16*/
}
- IF( st->element_mode == EVS_MONO )
- {
- TonalMDCTConceal_Detect( &st->tonalMDCTconceal, pitch, &numIndices, st->element_mode
-#ifdef ADD_IVAS_HTONALMDCTCONC
- ,
- ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent )
-#endif
- );
- }
- ELSE
- {
- TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode
-#ifdef ADD_IVAS_HTONALMDCTCONC
- ,
- ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent )
+
+ TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode
+#ifdef IVAS_CODE_MDCT_GSHAPE
+ ,
+ ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent )
#endif
- );
- }
+ );
test();
test();
diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c
index f20ff77f30367e0dc15e2f7936f0d46892a4a014..74340b530f6fe9cc1c2733664b854cc317f057cf 100644
--- a/lib_dec/evs_dec_fx.c
+++ b/lib_dec/evs_dec_fx.c
@@ -16,9 +16,9 @@
*--------------------------------------------------------------------------*/
ivas_error evs_dec_fx(
- Decoder_State *st_fx, /* i/o : Decoder state structure */
- Word16 output_sp[], /* o : output synthesis signal Q0*/
- frameMode_fx frameMode /* i : Decoder frame mode */
+ Decoder_State *st_fx, /* i/o : Decoder state structure */
+ Word16 output_sp[], /* o : output synthesis signal Q0*/
+ FRAME_MODE frameMode /* i : Decoder frame mode */
)
{
Word16 i, j, output_frame;
@@ -27,7 +27,6 @@ ivas_error evs_dec_fx(
Word16 core_switching_flag;
Word16 unbits;
Word16 hq_core_type;
- Word16 post_hq_delay;
Word32 bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET];
Word16 voice_factors_fx[NB_SUBFR16k];
Word16 hb_synth_fx[L_FRAME48k];
@@ -36,7 +35,7 @@ ivas_error evs_dec_fx(
Word16 exp, fra;
Word16 tmp_buffer_fx[L_FRAME48k];
Word16 tmp16, tmp16_2;
- Word16 synth_fx[L_FRAME48k + HQ_DELTA_MAX * HQ_DELAY_COMP];
+ Word16 synth_fx[L_FRAME48k];
Word16 fb_exc_fx[L_FRAME16k];
Word16 pitch_buf_fx[NB_SUBFR16k] = { 0 };
Word16 Q_fb_exc;
@@ -54,8 +53,6 @@ ivas_error evs_dec_fx(
Word16 Q_synth;
Word16 Qpostd_prev;
- Word32 *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX];
- Word32 realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
Word16 timeIn_e;
TD_BWE_DEC_HANDLE hBWE_TD;
HQ_DEC_HANDLE hHQ_core;
@@ -98,15 +95,6 @@ ivas_error evs_dec_fx(
move32();
st_fx->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st_fx->total_brate, 0, 0, -1, -1 );
- FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
- {
- set32_fx( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX );
- set32_fx( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX );
- realBuffer[i] = realBufferTmp[i];
- move32();
- imagBuffer[i] = imagBufferTmp[i];
- move32();
- }
if ( st_fx->bfi == 0 )
{
st_fx->extl = -1;
@@ -155,16 +143,15 @@ ivas_error evs_dec_fx(
test();
IF( !st_fx->bfi && st_fx->prev_bfi && ( EQ_16( st_fx->last_codec_mode, MODE2 ) ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) )
{
- /* v_multc(st_fx->old_out_fx, st_fx->plcInfo.recovery_gain, */
- /* st_fx->old_out_fx, st_fx->L_frameTCX); */
+ /* v_multc(st_fx->old_out_fx, st_fx->hPlcInfo.recovery_gain, st_fx->old_out_fx, st_fx->L_frameTCX); */
FOR( i = 0; i < hTcxDec->L_frameTCX; i++ )
{
- hHQ_core->old_out_fx[i] = shl_sat( mult_r( hHQ_core->old_out_fx[i], st_fx->plcInfo.recovery_gain ), 1 ); /*hHQ_core->exp_old_out*/
+ hHQ_core->old_out_fx[i] = shl_sat( mult_r( hHQ_core->old_out_fx[i], st_fx->hPlcInfo->recovery_gain ), 1 ); /*hHQ_core->exp_old_out*/
move16();
}
FOR( i = 0; i < st_fx->L_frame; i++ )
{
- hHQ_core->old_out_LB_fx[i] = shl_sat( mult_r( hHQ_core->old_out_LB_fx[i], st_fx->plcInfo.recovery_gain ), 1 ); /*hHQ_core->exp_old_out*/
+ hHQ_core->old_out_LB_fx[i] = shl_sat( mult_r( hHQ_core->old_out_LB_fx[i], st_fx->hPlcInfo->recovery_gain ), 1 ); /*hHQ_core->exp_old_out*/
move16();
}
/* attenuate PLC buffers, if no aldo window
@@ -279,6 +266,7 @@ ivas_error evs_dec_fx(
/*------------------------------------------------------------------*
* Decoding
*-----------------------------------------------------------------*/
+
IF( EQ_16( st_fx->codec_mode, MODE1 ) )
{
/*------------------------------------------------------------------*
@@ -302,6 +290,7 @@ ivas_error evs_dec_fx(
}
}
}
+
IF( EQ_16( st_fx->codec_mode, MODE1 ) )
{
/*------------------------------------------------------------------*
@@ -339,6 +328,7 @@ ivas_error evs_dec_fx(
* ACELP core decoding
* HQ core decoding
*---------------------------------------------------------------------*/
+
IF( EQ_16( st_fx->core, ACELP_CORE ) )
{
/* ACELP core decoder */
@@ -360,10 +350,11 @@ ivas_error evs_dec_fx(
* Postprocessing for ACELP/HQ core switching
*---------------------------------------------------------------------*/
- if ( ( error = core_switching_post_dec_fx( st_fx, synth_fx, output_frame, core_switching_flag, st_fx->last_element_mode, &Qpostd ) ) != IVAS_ERR_OK )
+ if ( ( error = core_switching_post_dec_fx( st_fx, synth_fx, output_frame, core_switching_flag, EVS_MONO, &Qpostd ) ) != IVAS_ERR_OK )
{
return error;
}
+
/*---------------------------------------------------------------------*
* Pre-processing for bandwidth switching
*---------------------------------------------------------------------*/
@@ -413,9 +404,11 @@ ivas_error evs_dec_fx(
test();
IF( EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) || ( NE_16( st_fx->coder_type, AUDIO ) && NE_16( st_fx->coder_type, INACTIVE ) && GT_32( st_fx->core_brate, SID_2k40 ) && EQ_16( st_fx->core, ACELP_CORE ) && GE_32( st_fx->output_Fs, 32000 ) && GT_16( st_fx->bwidth, NB ) && st_fx->bws_cnt > 0 && !st_fx->ppp_mode_dec && !( EQ_16( st_fx->nelp_mode_dec, 1 ) && EQ_16( st_fx->bfi, 1 ) ) ) )
{
+ /* SWB TBE decoder */
swb_tbe_dec_fx( st_fx, st_fx->coder_type, bwe_exc_extended_fx, st_fx->Q_exc, voice_factors_fx,
old_syn_12k8_16k_fx, fb_exc_fx, &Q_fb_exc, hb_synth_fx, &hb_synth_fx_exp, pitch_buf_fx );
- /* FB TBE decoder/synthesis */
+
+ /* FB TBE decoder */
test();
IF( EQ_16( output_frame, L_FRAME48k ) && EQ_16( st_fx->extl, FB_TBE ) )
{
@@ -464,6 +457,7 @@ ivas_error evs_dec_fx(
/*---------------------------------------------------------------------*
* SWB CNG
*---------------------------------------------------------------------*/
+
IF( GE_16( output_frame, L_FRAME32k ) )
{
/* SHB CNG decoder */
@@ -492,10 +486,7 @@ ivas_error evs_dec_fx(
Scale_sig( st_fx->prev_synth_buffer_fx, tmps, sub( exp, st_fx->Qprev_synth_buffer_fx ) ); /*exp*/
st_fx->Qprev_synth_buffer_fx = exp;
move16();
- Copy( synth_fx, tmp_buffer_fx, output_frame ); /*exp*/
- Copy( st_fx->prev_synth_buffer_fx, synth_fx, tmps ); /*st_fx->Qprev_synth_buffer_fx*/
- Copy( tmp_buffer_fx, synth_fx + tmps, output_frame - tmps ); /*exp*/
- Copy( tmp_buffer_fx + output_frame - tmps, st_fx->prev_synth_buffer_fx, tmps ); /*exp*/
+ delay_signal_fx( synth_fx, output_frame, st_fx->prev_synth_buffer_fx, tmps ); /*exp, t_fx->Qprev_synth_buffer_fx*/
}
ELSE
{
@@ -515,7 +506,7 @@ ivas_error evs_dec_fx(
test();
test();
test();
- IF( EQ_16( st_fx->core, ACELP_CORE ) && !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) )
+ IF( EQ_16( st_fx->core, ACELP_CORE ) && !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->hPlcInfo->concealment_method, TCX_NONTONAL ) && LT_32( st_fx->hPlcInfo->nbLostCmpt, 4 ) )
{
tmps = 0;
move16();
@@ -524,20 +515,8 @@ ivas_error evs_dec_fx(
tmps = NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS ); /*Q0*/
}
- waveform_adj2_fix( st_fx->tonalMDCTconceal.secondLastPcmOut,
- synth_fx + tmps,
- st_fx->plcInfo.data_noise,
- &st_fx->plcInfo.outx_new_n1_fx,
- &st_fx->plcInfo.nsapp_gain_fx,
- &st_fx->plcInfo.nsapp_gain_n_fx,
- &st_fx->plcInfo.recovery_gain,
- st_fx->plcInfo.step_concealgain_fx,
- st_fx->plcInfo.Pitch_fx,
- st_fx->plcInfo.FrameSize,
- tmps,
- add( extract_l( st_fx->plcInfo.nbLostCmpt ), 1 ),
- st_fx->bfi );
- st_fx->plcInfo.Pitch_fx = 0;
+ waveform_adj2_fix( st_fx->hPlcInfo, st_fx->hTonalMDCTConc->secondLastPcmOut, synth_fx + tmps, tmps, add( extract_l( st_fx->hPlcInfo->nbLostCmpt ), 1 ), st_fx->bfi );
+ st_fx->hPlcInfo->Pitch_fx = 0;
move16();
}
@@ -634,16 +613,14 @@ ivas_error evs_dec_fx(
Copy( tmp_buffer_fx, st_fx->hb_prev_synth_buffer_fx, tmps ); /*Q15 - hBWE_TD->prev_hb_synth_fx_exp*/
}
+
/* Delay hb_synth */
tmp16 = sub( hb_synth_fx_exp, hBWE_TD->prev_hb_synth_fx_exp );
IF( tmp16 != 0 )
{
Scale_sig( st_fx->hb_prev_synth_buffer_fx, tmps, tmp16 ); /*Q15 - hb_synth_fx_exp*/
}
- Copy( hb_synth_fx, tmp_buffer_fx, output_frame ); /*Q15 - hb_synth_fx_exp*/
- Copy( st_fx->hb_prev_synth_buffer_fx, hb_synth_fx, tmps ); /*Q15 - hb_synth_fx_exp*/
- Copy( tmp_buffer_fx, hb_synth_fx + tmps, sub( output_frame, tmps ) ); /*Q15 - hb_synth_fx_exp*/
- Copy( tmp_buffer_fx + sub( output_frame, tmps ), st_fx->hb_prev_synth_buffer_fx, tmps ); /*Q15 - hb_synth_fx_exp*/
+ delay_signal_fx( hb_synth_fx, output_frame, st_fx->hb_prev_synth_buffer_fx, tmps ); /*Q15 - hb_synth_fx_exp, Q15 - hb_synth_fx_exp*/
st_fx->old_bwe_delay = tmps;
move16();
@@ -706,7 +683,7 @@ ivas_error evs_dec_fx(
fra = Log2_norm_lc( L_shl( L_tmp, exp ) );
exp = sub( sub( 30, shl( hb_synth_fx_exp, 1 ) ), exp );
L_tmp = Mpy_32_16( exp, fra, LG10 );
- st_fx->last_shb_ener_fx = round_fx_sat( L_shl_sat( L_tmp, 10 ) ); /*Q8*/
+ st_fx->hTdCngDec->last_shb_ener_fx = round_fx_sat( L_shl_sat( L_tmp, 10 ) ); /*Q8*/
}
}
hBWE_TD->prev_hb_synth_fx_exp = hb_synth_fx_exp;
@@ -716,17 +693,16 @@ ivas_error evs_dec_fx(
delta = NS2SA_FX2( st_fx->output_Fs, TCXLTP_DELAY_NS ); /*Q0*/
Scale_sig( hTcxLtpDec->tcxltp_mem_in, delta, sub( Qpostd, Qpostd_prev ) ); /*Qpostd*/
Scale_sig( hTcxLtpDec->tcxltp_mem_out, output_frame, sub( Qpostd, Qpostd_prev ) ); /*Qpostd*/
- tcx_ltp_post( st_fx, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth_fx, NULL );
-
+ tcx_ltp_post_fx( st_fx, hTcxLtpDec, ACELP_CORE, output_frame, 0, synth_fx, NULL );
/* final output of synthesis signal */
Copy( synth_fx, output_sp, output_frame ); /*Qpostd*/
}
- ELSE /* MODE2 PART */
+ ELSE /* Mode 2 */
{
/* -------------------------------------------------------------- */
- /* CONCEALMENT */
+ /* Mode 2 concealment */
/* -------------------------------------------------------------- */
concealWholeFrame = 0;
@@ -766,11 +742,10 @@ ivas_error evs_dec_fx(
/* -------------------------------------------------------------- */
- /* DECODE CORE */
+ /* Decode core */
/* -------------------------------------------------------------- */
- dec_acelp_tcx_frame_fx( st_fx, &concealWholeFrame, output_sp,
- st_fx->p_bpf_noise_buf, pcmbufFB, bwe_exc_extended_fx, voice_factors_fx, pitch_buf_fx );
+ dec_acelp_tcx_frame_fx( st_fx, &concealWholeFrame, output_sp, st_fx->p_bpf_noise_buf, pcmbufFB, bwe_exc_extended_fx, voice_factors_fx, pitch_buf_fx );
concealWholeFrameTmp = concealWholeFrame; /*Q0*/
move16();
@@ -779,10 +754,10 @@ ivas_error evs_dec_fx(
frameMode = FRAMEMODE_MISSING;
move32();
}
+
IF( st_fx->igf )
{
-
- /* TBE interface */
+ /* TBE for Mode 2 interface */
test();
test();
IF( ( st_fx->bfi == 0 || st_fx->last_core == ACELP_CORE ) && st_fx->core == ACELP_CORE )
@@ -888,29 +863,26 @@ ivas_error evs_dec_fx(
IF( ( EQ_16( st_fx->bwidth, SWB ) || EQ_16( st_fx->bwidth, FB ) ) &&
( ( EQ_16( st_fx->last_extl, SWB_TBE ) || EQ_16( st_fx->last_extl, FB_TBE ) ) && EQ_16( st_fx->last_codec_mode, MODE2 ) ) )
{
- GenTransition_fx( hBWE_TD->syn_overlap_fx, hBWE_TD->old_tbe_synth_fx, shl( NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS ), 1 ), hb_synth_fx,
- hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx,
- hBWE_TD->mem_resamp_HB_32k_fx,
- &( hBWE_TD->syn_dm_phase ), st_fx->output_Fs, hBWE_TD->int_3_over_2_tbemem_dec_fx, st_fx->rf_flag, st_fx->total_brate );
+ GenTransition_fx( hBWE_TD, hb_synth_fx, st_fx->output_Fs, st_fx->rf_flag, st_fx->total_brate );
- hb_synth_fx_exp = st_fx->prev_Q_bwe_syn2;
+ hb_synth_fx_exp = hBWE_TD->prev_Q_bwe_syn2;
move16();
}
ELSE IF( EQ_16( st_fx->bwidth, WB ) && EQ_16( st_fx->last_extl, WB_TBE ) )
{
- GenTransition_WB_fx( hBWE_TD->syn_overlap_fx, hBWE_TD->old_tbe_synth_fx, st_fx->prev_Qx, shl( NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS ), 1 ), hb_synth_fx,
- hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx, st_fx->output_Fs, hBWE_TD->mem_resamp_HB_fx );
+ GenTransition_WB_fx( hBWE_TD, hb_synth_fx, st_fx->output_Fs );
- hb_synth_fx_exp = st_fx->prev_Qx;
+ hb_synth_fx_exp = hBWE_TD->prev_Qx;
move16();
}
- TBEreset_dec_fx( st_fx, st_fx->bwidth );
+ TBEreset_dec_fx( st_fx );
}
ELSE IF( EQ_16( st_fx->last_codec_mode, MODE1 ) )
{
swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
+
IF( EQ_16( st_fx->extl, FB_TBE ) )
{
set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
@@ -918,7 +890,8 @@ ivas_error evs_dec_fx(
move16();
fb_tbe_reset_synth_fx( hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, &hBWE_TD->prev_fbbwe_ratio_fx );
}
- swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
+
+ swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
}
}
}
@@ -932,10 +905,23 @@ ivas_error evs_dec_fx(
}
/* -------------------------------------------------------------- */
- /* APPLY POSTPROC */
+ /* Postprocessing */
/* -------------------------------------------------------------- */
{
+ Word32 *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX];
+ Word32 realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
+
+ FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
+ {
+ set32_fx( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX );
+ set32_fx( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX );
+ realBuffer[i] = realBufferTmp[i];
+ move32();
+ imagBuffer[i] = imagBufferTmp[i];
+ move32();
+ }
+
nab = s_min( st_fx->cldfbAna->no_channels, st_fx->cldfbSyn->no_channels ); /*Q0*/
st_fx->cldfbSyn->lsb = s_min( st_fx->cldfbAna->no_channels, st_fx->cldfbSyn->no_channels ); /*Q0*/
st_fx->cldfbSyn->usb = st_fx->cldfbSyn->no_channels; /*Q0*/
@@ -951,11 +937,12 @@ ivas_error evs_dec_fx(
test();
IF( st_fx->hFdCngDec != NULL && ( EQ_32( st_fx->sr_core, 8000 ) || EQ_32( st_fx->sr_core, INT_FS_12k8 ) || EQ_32( st_fx->sr_core, INT_FS_16k ) ) && LE_32( st_fx->total_brate, ACELP_32k ) )
{
- /***************************************
- In CLDFB domain:
- - perform noise estimation during active frames
- - do CNG during inactive frames
- ****************************************/
+ /* -------------------------------------------------------------- *
+ * In CLDFB domain:
+ * - perform noise estimation during active frames
+ * - do CNG during inactive frames
+ * -------------------------------------------------------------- */
+
HANDLE_FD_CNG_DEC hFdCngDec = st_fx->hFdCngDec;
noisy_speech_detection_fx( st_fx->hFdCngDec, st_fx->VAD && EQ_16( st_fx->m_frame_type, ACTIVE_FRAME ), output_sp, 0 );
@@ -1003,7 +990,7 @@ ivas_error evs_dec_fx(
}
Scale_sig( output_sp, st_fx->L_frame, timeIn_e ); /*timeIn_e*/
timeIn_e = negate( timeIn_e );
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &st_fx->scaleFactor, output_sp, timeIn_e, CLDFB_NO_COL_MAX, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &st_fx->scaleFactor, output_sp, timeIn_e, CLDFB_NO_COL_MAX, workBuffer );
st_fx->scaleFactor.hb_scale = st_fx->scaleFactor.lb_scale;
move16();
}
@@ -1016,6 +1003,7 @@ ivas_error evs_dec_fx(
Copy( st_fx->hFdCngDec->hFdCngCom->A_cng, A, M + 1 ); /*Q12*/
update_decoder_LPD_cng( st_fx, st_fx->coder_type, timeDomainBuffer, A, st_fx->p_bpf_noise_buf );
+
/* Generate additional comfort noise to mask potential coding artefacts */
test();
test();
@@ -1034,6 +1022,7 @@ ivas_error evs_dec_fx(
move16();
}
}
+
/* check if the CLDFB works on the right sample rate */
IF( NE_16( i_mult( st_fx->cldfbAna->no_channels, st_fx->cldfbAna->no_col ), st_fx->L_frame ) )
{
@@ -1064,7 +1053,7 @@ ivas_error evs_dec_fx(
}
timeIn_e = negate( timeIn_e );
- cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &st_fx->scaleFactor, timeDomainBuffer, timeIn_e, CLDFB_NO_COL_MAX, workBuffer );
+ cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &st_fx->scaleFactor, timeDomainBuffer, timeIn_e, CLDFB_NO_COL_MAX, workBuffer );
}
IF( st_fx->flag_cna == 0 )
@@ -1114,8 +1103,7 @@ ivas_error evs_dec_fx(
}
timeIn_e = s_min( 0, add( timeIn_e, 2 ) );
- cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &st_fx->scaleFactor, output_sp, timeIn_e, CLDFB_NO_COL_MAX, workBuffer );
- /*CLDFB output always in timeIn_e*/
+ cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &st_fx->scaleFactor, output_sp, timeIn_e, CLDFB_NO_COL_MAX, workBuffer ); /*CLDFB output always in timeIn_e*/
/* MODE1 MDCT to ACELP 2 transition */
delay_comp = NS2SA_FX2( st_fx->output_Fs, DELAY_CLDFB_NS );
@@ -1203,10 +1191,9 @@ ivas_error evs_dec_fx(
/* Delay compensation for TD-BWE*/
IF( GE_16( output_frame, L_FRAME16k ) )
{
- Copy( output_sp, tmp_buffer_fx, output_frame ); /*timeIn_e*/
- Copy_Scale_sig( st_fx->prev_synth_buffer_fx, output_sp, delay_tdbwe, negate( timeIn_e ) ); /*st_fx->q_prev_synth_buffer_fx*/
- Copy( tmp_buffer_fx, output_sp + delay_tdbwe, sub( output_frame, delay_tdbwe ) ); /*timeIn_e*/
- Copy_Scale_sig( tmp_buffer_fx + sub( output_frame, delay_tdbwe ), st_fx->prev_synth_buffer_fx, delay_tdbwe, timeIn_e ); /*timeIn_e*/
+ Scale_sig( st_fx->prev_synth_buffer_fx, delay_tdbwe, negate( timeIn_e ) );
+ delay_signal_fx( output_sp, output_frame, st_fx->prev_synth_buffer_fx, delay_tdbwe ); /*timeIn_e, st_fx->q_prev_synth_buffer_fx*/
+ Scale_sig( st_fx->prev_synth_buffer_fx, delay_tdbwe, timeIn_e );
}
test();
@@ -1240,11 +1227,11 @@ ivas_error evs_dec_fx(
( ( EQ_16( st_fx->last_core, ACELP_CORE ) ) && ( NE_16( st_fx->bwidth, NB ) && EQ_16( st_fx->last_codec_mode, MODE2 ) ) ) ) &&
( GT_32( st_fx->output_Fs, 8000 ) ) )
{
+ /* Add the delayed hb_synth component to the delayed core synthesis */
add_vec_fx( output_sp, negate( timeIn_e ), hb_synth_fx, hb_synth_fx_exp, output_sp, negate( timeIn_e ), output_frame );
}
}
-
IF( EQ_32( st_fx->output_Fs, 8000 ) )
{
tmps = NS2SA_FX2( st_fx->output_Fs, DELAY_CLDFB_NS ); /*Q0*/
@@ -1258,19 +1245,23 @@ ivas_error evs_dec_fx(
test();
test();
test();
+ /* TCX/ACELP/HQ-CORE->TCX */
IF( ( st_fx->bfi && GT_16( st_fx->last_core, ACELP_CORE ) ) || GT_16( st_fx->core, ACELP_CORE ) )
{
test();
test();
test();
test();
+ /* TCX / HQ-CORE / TD-TCX-PLC -> TCX / TD-TCX-PLC */
IF( GT_16( st_fx->last_core_bfi, ACELP_CORE ) || ( st_fx->bfi && st_fx->last_core > ACELP_CORE ) || ( st_fx->prev_bfi && st_fx->last_con_tcx ) )
{
Copy_Scale_sig( hTcxDec->FBTCXdelayBuf, output_sp, tmps, negate( timeIn_e ) ); /*Q0*/
Copy_Scale_sig( pcmbufFB, output_sp + tmps, sub( hTcxDec->L_frameTCX, tmps ), negate( timeIn_e ) ); /*Q0*/
}
+ /* ACELP -> TCX */
ELSE
{
+ /*cross-fading between LB-TCX and FB-TCX over 2.3125ms*/
Word16 step, alpha;
i = 15;
@@ -1305,6 +1296,7 @@ ivas_error evs_dec_fx(
}
}
}
+ /* TCX/TD TCX PLC->ACELP */
ELSE IF( ( EQ_16( st_fx->last_codec_mode, MODE2 ) ) && ( GT_16( st_fx->last_core, ACELP_CORE ) ) )
{
Word16 step, alpha;
@@ -1331,46 +1323,18 @@ ivas_error evs_dec_fx(
Scale_sig( output_sp, output_frame, timeIn_e ); /*timeIn_e*/
- tcx_ltp_post( st_fx, hTcxLtpDec, st_fx->core, output_frame /*hTcxDec->L_frameTCX*/, add( NS2SA_FX2( st_fx->output_Fs, ACELP_LOOK_NS ), tmps ),
- output_sp, hTcxDec->FBTCXdelayBuf );
+ tcx_ltp_post_fx( st_fx, hTcxLtpDec, st_fx->core, output_frame /*hTcxDec->L_frameTCX*/, add( NS2SA_FX2( st_fx->output_Fs, ACELP_LOOK_NS ), tmps ), output_sp, hTcxDec->FBTCXdelayBuf );
Copy( output_sp, synth_fx, output_frame ); /*timeIn_e*/
- } /* end of MODE2 */
+ } /* end of Mode 2 */
/*----------------------------------------------------------------*
* Save synthesis for HQ FEC
*----------------------------------------------------------------*/
- post_hq_delay = NS2SA_FX2( st_fx->output_Fs, POST_HQ_DELAY_NS );
- IF( EQ_16( st_fx->codec_mode, MODE1 ) )
- {
-
- Copy( hTcxDec->synth_history_fx + output_frame, hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA_FX2( st_fx->output_Fs, PH_ECU_MEM_NS ) ) ); /*hTcxDec->q_synth_history_fx*/
- Copy_Scale_sig( synth_fx, hTcxDec->old_synthFB_fx + sub( output_frame, post_hq_delay ), output_frame, negate( Qpostd ) ); /* output_sp not initialized yet */
- /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill
- this buffer are not available for all cases, the impact on the output is limited */
- set16_fx( hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), 0, post_hq_delay );
-
- IF( GE_16( output_frame, L_FRAME16k ) )
- {
- Copy_Scale_sig( st_fx->prev_synth_buffer_fx, hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), negate( st_fx->Qprev_synth_buffer_fx ) ); /*Q0*/
- }
- IF( NE_16( st_fx->core, ACELP_CORE ) )
- {
- IF( GE_16( output_frame, L_FRAME16k ) )
- {
- Copy_Scale_sig( synth_fx + output_frame, hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st_fx->output_Fs, DELAY_CLDFB_NS ) ), NS2SA_FX2( st_fx->output_Fs, DELAY_CLDFB_NS ), negate( Qpostd ) ); /*Q0*/
- Copy_Scale_sig( hHQ_core->old_out_fx + NS2SA_FX2( st_fx->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA_FX2( st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS ), negate( hHQ_core->Q_old_wtda ) ); /*Q0*/
- }
- ELSE
- {
+ save_synthesis_hq_fec_fx( st_fx, synth_fx, NULL, output_frame, Qpostd, NULL );
- Copy_Scale_sig( synth_fx + output_frame, hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA_FX2( st_fx->output_Fs, DELAY_CLDFB_NS ), negate( Qpostd ) ); /*Q0*/
- Copy_Scale_sig( hHQ_core->old_out_fx + NS2SA_FX2( st_fx->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA_FX2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA_FX2( st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS ), negate( hHQ_core->Q_old_wtda ) ); /*Q0*/
- }
- }
- }
/*----------------------------------------------------------------*
* HP filtering
*----------------------------------------------------------------*/
diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c
index ee7a7eca61bb4ef92182e732a772ae6b5c787f0f..94c7d4c6282edf47fa8278add6362ece82625d00 100644
--- a/lib_dec/hf_synth_fx.c
+++ b/lib_dec/hf_synth_fx.c
@@ -20,7 +20,7 @@
*---------------------------------------------------------------------*/
static void filt_6k_7k_scale_fx( Word16 signal[], Word16 lg, Word16 mem[], Word16 fact, Word16 exp );
-static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn, Word16 *delay_syn_hf, Word16 *memExp1, Word16 *mem_hp_interp, const Word16 extl, const Word16 CNG_mode );
+static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn );
static void hf_synthesis_amr_wb_fx( const Word32 core_brate, const Word16 output_subfr, const Word16 Ap[], Word16 exc16k[], Word16 synth_out[], Word16 *mem_syn_hf, Word16 *delay_syn_hf, Word16 *mem_hp_interp, Word16 p_r, Word16 HF_corr_gain, Word16 til, Word16 voice_factors, const Word16 exc[], const Word16 Q_exc, const Word16 Q_out, Word16 qhf );
static void envelope_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const Word32 core_brate, const Word16 Aq[], Word16 Ap[], Word16 *r, Word16 tilt0, Word16 tilt, Word16 voice_factor );
static void AdaptiveStartBand_fx( Word16 *start_band, const Word32 rate, const Word16 *lsf, const Word16 voicing_fac, const Word16 clas, Word16 *voicing_flag, Word16 *start_band_old, Word32 *OptCrit_old );
@@ -86,12 +86,7 @@ void hf_synth_fx(
Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/
Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/
const Word16 Q_exc, /* i : excitation scaling */
- const Word16 Q_syn2, /* i : synthesis scaling */
- Word16 *delay_syn_hf, /*i/o: HF synthesis memory Q_syn2*/
- Word16 *memExp1, /* o : HF excitation exponent */
- Word16 *mem_hp_interp, /* i/o: interpol. memory Qx*/
- const Word16 extl, /* i : flag indicating BWE Q0*/
- const Word16 CNG_mode /* i : CNG_mode Q0*/
+ const Word16 Q_syn2 /* i : synthesis scaling */
)
{
const Word16 *p_Aq;
@@ -103,8 +98,7 @@ void hf_synth_fx(
p_Aq = Aq; /* Q12 */
FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR )
{
- hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216( (Word32) i_subfr, output_subfr ) / L_SUBFR],
- Q_syn2, delay_syn_hf, memExp1, mem_hp_interp, extl, CNG_mode );
+ hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216( (Word32) i_subfr, output_subfr ) / L_SUBFR], Q_syn2 );
p_Aq += ( M + 1 ); /* Q12 */
}
@@ -132,27 +126,19 @@ static void hf_synthesis_fx(
const Word16 Q_exc, /* i : excitation scaling */
Word16 synth[], /* i : 12.8kHz synthesis signal Q_syn*/
Word16 synth16k[], /* i/o: 16kHz synthesis signal Q_syn*/
- const Word16 Q_syn, /* i : synthesis scaling */
- Word16 *delay_syn_hf, /* i/o: HF synthesis memory Q_syn*/
- Word16 *memExp1, /* o : HF excitation scaling exponent */
- Word16 *mem_hp_interp, /* i/o: interpol. memory Qx*/
- const Word16 extl, /* i : flag indicating BWE Q0*/
- const Word16 CNG_mode /* i : CNG_mode Q0*/
+ const Word16 Q_syn /* i : synthesis scaling */
)
{
- Word16 i;
+ Word16 i, s;
Word16 HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR];
Word16 HF_exc[L_SUBFR16k];
- Word16 temp_buffer[NS2SA( 16000, DELAY_CLDFB_NS ) - L_FILT16k];
- Word16 tmp, ener, exp1, exp2, scale, delay;
+ Word16 tmp, ener, exp1, exp2, scale;
Word32 L_tmp;
Word16 Ap[M16k + 1];
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
Flag Overflow = 0;
move32();
#endif
- (void) extl;
- (void) CNG_mode;
/*-----------------------------------------------------------------*
* generate white noise vector
@@ -188,8 +174,8 @@ static void hf_synthesis_fx(
L_tmp = Isqrt_lc( L_tmp, &exp1 );
scale = round_fx( L_tmp ); /* Q18 when Q_exc=-1, HF_exc in Q-3 */
- exp2 = sub( *memExp1, exp1 );
- *memExp1 = exp1;
+ exp2 = sub( hBWE_zero->memExp1, exp1 );
+ hBWE_zero->memExp1 = exp1;
move16();
/*-----------------------------------------------------------------*
@@ -279,41 +265,31 @@ static void hf_synthesis_fx(
*-----------------------------------------------------------------*/
/* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */
- delay = NS2SA_FX2( 16000, DELAY_CLDFB_NS ) - 15;
- Copy( HF_syn + sub( L_SUBFR16k, delay ), temp_buffer, delay ); /* Q_syn+exp1 */
- Copy( HF_syn, HF_syn + delay, sub( L_SUBFR16k, delay ) ); /* Q_syn+exp1 */
- Copy( delay_syn_hf, HF_syn, delay ); /* Q_syn */
- Copy( temp_buffer, delay_syn_hf, delay ); /* Q_syn */
+ delay_signal_fx( HF_syn, L_SUBFR16k, hBWE_zero->delay_syn_hf_fx, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) - 15 );
/* interpolate the HF synthesis */
IF( EQ_16( output_subfr, L_SUBFR48k ) ) /* 48kHz sampled output */
{
- {
- Word16 s;
- s = s_max( s_min( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( mem_hp_interp, INTERP_3_1_MEM_LEN - 3 ) ), 3 ),
- sub( Find_Max_Norm16( mem_hp_interp + INTERP_3_1_MEM_LEN - 3, 3 ), 1 ) ),
- 0 );
- Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */
- Scale_sig( mem_hp_interp, INTERP_3_1_MEM_LEN, s ); /* Qx + s */
- interpolate_3_over_1_allpass_fx( HF_syn, L_SUBFR16k, upsampled_HF_syn, mem_hp_interp );
- Scale_sig( upsampled_HF_syn, 3 * L_SUBFR16k, -s ); /* Q_syn + exp1 + s */
- Scale_sig( mem_hp_interp, INTERP_3_1_MEM_LEN, -s ); /* Qx */
- Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */
- }
+ s = s_max( s_min( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN - 3 ) ), 3 ),
+ sub( Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx + INTERP_3_1_MEM_LEN - 3, 3 ), 1 ) ),
+ 0 );
+ Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */
+ Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, s ); /* Qx + s */
+ interpolate_3_over_1_allpass_fx( HF_syn, L_SUBFR16k, upsampled_HF_syn, hBWE_zero->mem_hp_interp_fx );
+ Scale_sig( upsampled_HF_syn, 3 * L_SUBFR16k, -s ); /* Q_syn + exp1 + s */
+ Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, -s ); /* Qx */
+ Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */
Scale_sig( upsampled_HF_syn, L_SUBFR48k, -1 );
}
ELSE IF( EQ_16( output_subfr, L_SUBFR32k ) ) /* 32kHz sampled output */
{
- {
- Word16 s;
- s = s_max( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( mem_hp_interp, 2 * ALLPASSSECTIONS_STEEP ) ), 2 ), 0 );
- Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */
- Scale_sig( mem_hp_interp, 2 * ALLPASSSECTIONS_STEEP, s ); /* Qx + s */
- Interpolate_allpass_steep_fx( HF_syn, mem_hp_interp, L_SUBFR16k, upsampled_HF_syn );
- Scale_sig( upsampled_HF_syn, 2 * L_SUBFR16k, -s ); /* Q_syn + exp1 */
- Scale_sig( mem_hp_interp, 2 * ALLPASSSECTIONS_STEEP, -s ); /* Qx */
- Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */
- }
+ s = s_max( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP ) ), 2 ), 0 );
+ Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */
+ Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, s ); /* Qx + s */
+ Interpolate_allpass_steep_fx( HF_syn, hBWE_zero->mem_hp_interp_fx, L_SUBFR16k, upsampled_HF_syn );
+ Scale_sig( upsampled_HF_syn, 2 * L_SUBFR16k, -s ); /* Q_syn + exp1 */
+ Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, -s ); /* Qx */
+ Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */
}
ELSE /* 16kHz sampled output */
{
@@ -1150,7 +1126,8 @@ static void hf_synthesis_amr_wb_fx(
* Synchronize LB and HB components (delay componsation)
* Add synthesised high band to speech synthesis
*-----------------------------------------------------------------*/
- delay_signal( HF_syn, L_SUBFR16k, delay_syn_hf, NS2SA( 16000, DELAY_CLDFB_NS ) );
+
+ delay_signal_fx( HF_syn, L_SUBFR16k, delay_syn_hf, NS2SA( 16000, DELAY_CLDFB_NS ) );
IF( EQ_16( output_subfr, L_SUBFR48k ) ) /* 48kHz sampled output */
{
diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c
index 86cf9784aa1eb3346aa7c52a16d78f7e2808f40e..714245514e4e3987f3e51f53e8e8aa2a4ca99834 100644
--- a/lib_dec/hq_core_dec_fx.c
+++ b/lib_dec/hq_core_dec_fx.c
@@ -490,30 +490,18 @@ void hq_core_dec_fx(
test();
test();
test();
- IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && st_fx->plcInfo.concealment_method == TCX_NONTONAL && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) )
+ IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && st_fx->hPlcInfo->concealment_method == TCX_NONTONAL && LT_32( st_fx->hPlcInfo->nbLostCmpt, 4 ) )
{
- st_fx->plcInfo.recovery_gain = shl_sat( st_fx->plcInfo.recovery_gain, *Q_synth ); /* Q14 + Q_synth */
+ st_fx->hPlcInfo->recovery_gain = shl_sat( st_fx->hPlcInfo->recovery_gain, *Q_synth ); /* Q14 + Q_synth */
move16();
- IF( st_fx->tonalMDCTconceal.q_lastPcmOut != 0 )
+ IF( st_fx->hTonalMDCTConc->q_lastPcmOut != 0 )
{
- Scale_sig( st_fx->tonalMDCTconceal.secondLastPcmOut, shr( st_fx->plcInfo.FrameSize, 1 ), negate( st_fx->tonalMDCTconceal.q_lastPcmOut ) );
- Scale_sig( st_fx->tonalMDCTconceal.lastPcmOut, st_fx->plcInfo.FrameSize, negate( st_fx->tonalMDCTconceal.q_lastPcmOut ) );
- st_fx->tonalMDCTconceal.q_lastPcmOut = 0;
+ Scale_sig( st_fx->hTonalMDCTConc->secondLastPcmOut, shr( st_fx->hPlcInfo->L_frameTCX, 1 ), negate( st_fx->hTonalMDCTConc->q_lastPcmOut ) );
+ Scale_sig( st_fx->hTonalMDCTConc->lastPcmOut, st_fx->hPlcInfo->L_frameTCX, negate( st_fx->hTonalMDCTConc->q_lastPcmOut ) );
+ st_fx->hTonalMDCTConc->q_lastPcmOut = 0;
move16();
}
- waveform_adj2_fix( st_fx->tonalMDCTconceal.secondLastPcmOut,
- synth,
- st_fx->plcInfo.data_noise,
- &st_fx->plcInfo.outx_new_n1_fx,
- &st_fx->plcInfo.nsapp_gain_fx,
- &st_fx->plcInfo.nsapp_gain_n_fx,
- &st_fx->plcInfo.recovery_gain,
- st_fx->plcInfo.step_concealgain_fx,
- st_fx->plcInfo.Pitch_fx,
- st_fx->plcInfo.FrameSize,
- 0,
- add( extract_l( st_fx->plcInfo.nbLostCmpt ), 1 ),
- st_fx->bfi );
+ waveform_adj2_fix( st_fx->hPlcInfo, st_fx->hTonalMDCTConc->secondLastPcmOut, synth, 0, add( extract_l( st_fx->hPlcInfo->nbLostCmpt ), 1 ), st_fx->bfi );
}
IF( GE_16( output_frame, L_FRAME16k ) )
@@ -1122,30 +1110,18 @@ void ivas_hq_core_dec_fx(
test();
test();
test();
- IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) )
+ IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->hPlcInfo->concealment_method, TCX_NONTONAL ) && LT_32( st_fx->hPlcInfo->nbLostCmpt, 4 ) )
{
- st_fx->plcInfo.recovery_gain = shl_sat( st_fx->plcInfo.recovery_gain, *Q_synth ); /* Q15 */
+ st_fx->hPlcInfo->recovery_gain = shl_sat( st_fx->hPlcInfo->recovery_gain, *Q_synth ); /* Q15 */
move16();
- IF( st_fx->tonalMDCTconceal.q_lastPcmOut != 0 )
+ IF( st_fx->hTonalMDCTConc->q_lastPcmOut != 0 )
{
- Scale_sig( st_fx->tonalMDCTconceal.secondLastPcmOut, shr( st_fx->plcInfo.FrameSize, 1 ), negate( st_fx->tonalMDCTconceal.q_lastPcmOut ) );
- Scale_sig( st_fx->tonalMDCTconceal.lastPcmOut, st_fx->plcInfo.FrameSize, negate( st_fx->tonalMDCTconceal.q_lastPcmOut ) );
- st_fx->tonalMDCTconceal.q_lastPcmOut = 0;
+ Scale_sig( st_fx->hTonalMDCTConc->secondLastPcmOut, shr( st_fx->hPlcInfo->L_frameTCX, 1 ), negate( st_fx->hTonalMDCTConc->q_lastPcmOut ) );
+ Scale_sig( st_fx->hTonalMDCTConc->lastPcmOut, st_fx->hPlcInfo->L_frameTCX, negate( st_fx->hTonalMDCTConc->q_lastPcmOut ) );
+ st_fx->hTonalMDCTConc->q_lastPcmOut = 0;
move16();
}
- waveform_adj2_fix( st_fx->tonalMDCTconceal.secondLastPcmOut,
- synth,
- st_fx->plcInfo.data_noise,
- &st_fx->plcInfo.outx_new_n1_fx,
- &st_fx->plcInfo.nsapp_gain_fx,
- &st_fx->plcInfo.nsapp_gain_n_fx,
- &st_fx->plcInfo.recovery_gain,
- st_fx->plcInfo.step_concealgain_fx,
- st_fx->plcInfo.Pitch_fx,
- st_fx->plcInfo.FrameSize,
- 0,
- add( extract_l( st_fx->plcInfo.nbLostCmpt ), 1 ),
- st_fx->bfi );
+ waveform_adj2_fix( st_fx->hPlcInfo, st_fx->hTonalMDCTConc->secondLastPcmOut, synth, 0, add( extract_l( st_fx->hPlcInfo->nbLostCmpt ), 1 ), st_fx->bfi );
}
IF( GE_16( output_frame, L_FRAME16k ) )
@@ -1225,17 +1201,15 @@ void HQ_core_dec_init_fx(
)
{
set16_fx( hHQ_core->old_out_fx, 0, L_FRAME48k );
+ set32_fx( hHQ_core->old_out_fx32, 0, L_FRAME48k );
set16_fx( hHQ_core->old_out_LB_fx, 0, L_FRAME32k );
- set32_fx( hHQ_core->oldOut_fx, 0, L_FRAME48k );
- set32_fx( hHQ_core->old_outLB_fx, 0, L_FRAME32k );
+ set32_fx( hHQ_core->old_out_LB_fx32, 0, L_FRAME32k );
hHQ_core->Q_old_wtda = 15;
hHQ_core->Q_old_postdec = 0;
hHQ_core->Q_old_wtda_LB = 0;
move16();
move16();
move16();
- move16();
- move16();
hHQ_core->last_hq_core_type = -1; /* Q0 */
move16();
diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c
index f96b8f59787008b5a1eb5bee0f584f417e4563c6..d72f0ec452223ac8c1d4ae9b65ea060f164b043a 100644
--- a/lib_dec/hq_hr_dec_fx.c
+++ b/lib_dec/hq_hr_dec_fx.c
@@ -61,7 +61,7 @@ void ivas_hq_pred_hb_bws_fx(
IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) && st_fx->hBWE_FD != NULL )
{
- set16_fx( st_fx->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
+ set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
}
return;
@@ -125,7 +125,7 @@ void hq_pred_hb_bws_fx(
IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) )
{
- set16_fx( st_fx->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
+ set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
}
return;
diff --git a/lib_dec/hq_lr_dec_fx.c b/lib_dec/hq_lr_dec_fx.c
index 61c1d0938eef3222ee6e0366fbdcb2f284aa9f85..7d5d6a34b907255f65e9d83ee0e0224c686ba7aa 100644
--- a/lib_dec/hq_lr_dec_fx.c
+++ b/lib_dec/hq_lr_dec_fx.c
@@ -893,7 +893,7 @@ void hq_lr_dec_fx(
test();
IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) && st_fx->hBWE_FD != NULL )
{
- set16_fx( st_fx->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
+ set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
}
updat_prev_frm_fx( L_y2, L_yout, L_bwe_br, length_fx, inner_frame, bands_fx, st_fx->bwidth, *is_transient_fx, hqswb_clas_fx, &hHQ_core->prev_hqswb_clas,
diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c
index c1b0ce93ab4157604fb5bcec23e3bd22ae2fc463..5bfa7476a76b4d3f951d270290412d12d6a2eccf 100644
--- a/lib_dec/igf_dec_fx.c
+++ b/lib_dec/igf_dec_fx.c
@@ -2883,7 +2883,9 @@ static void IGF_getWhiteSpectralData_ivas(
Word16 j;
Word32 ak;
Word16 ak_e;
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Word16 tmp_16;
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Word16 tmp_e;
Word16 out_e_arr[IGF_START_MX + MAX_IGF_SFB_LEN];
Word16 max_out_e;
@@ -2902,12 +2904,38 @@ static void IGF_getWhiteSpectralData_ivas(
Word16 guard_bits = add( find_guarded_bits_fx( add( i_mult( 2, level ), 1 ) ), 1 ) / 2;
s_l = sub( s_l, guard_bits );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word16 shift = sub( shl( s_l, 1 ), 32 );
+ Word16 eff_e = sub( shl( sub( in_e, s_l ), 1 ), 15 );
+ Word16 diff = add( 21, in_e );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+
Word16 quo = BASOP_Util_Divide3216_Scale( ONE_IN_Q30, add( shl( level, 1 ), 1 ), &tmp_e );
tmp_e = add( tmp_e, 1 );
ak_e = add( tmp_e, sub( shl( sub( in_e, s_l ), 1 ), 15 ) ); // tmp_e + 2 * (in_e - s_l) - 15
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ ak_e = sub( ak_e, 1 );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+
FOR( i = start; i < stop - level; i++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word64 temp = 0;
+ move64();
+ FOR( j = i - level; j < i + level + 1; j++ )
+ {
+ temp = W_mac_32_32( temp, in[j], in[j] );
+ }
+ ak = Mult_32_16( W_shl_sat_l( temp, shift ), quo ); // add( shl( level, 1 ), 1 ), &tmp_e ) );
+
+
+ n = sub( ak_e, norm_l( ak ) );
+ n = shr( n, 1 );
+
+ out_e_arr[i] = sub( diff, n );
+ move16();
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
ak = 0;
move32();
move32();
@@ -2924,11 +2952,29 @@ static void IGF_getWhiteSpectralData_ivas(
out_e_arr[i] = add( sub( 21, n ), in_e );
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
max_out_e = s_max( max_out_e, out_e_arr[i] );
}
FOR( ; i < stop; i++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word64 temp = 0;
+ move64();
+
+ FOR( j = i - level; j < stop; j++ )
+ {
+ temp = W_mac_32_32( temp, in[j], in[j] );
+ }
+
+ ak = L_deposit_h( BASOP_Util_Divide3216_Scale( W_shl_sat_l( temp, shift ), sub( stop, sub( i, level ) ), &tmp_e ) );
+ ak_e = add( tmp_e, eff_e ); // tmp_e + 2 * (in_e - s_l) - 15
+ n = sub( ak_e, add( norm_l( ak ), 1 ) );
+ n = shr( n, 1 );
+
+ out_e_arr[i] = sub( diff, n );
+ move16();
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
ak = 0;
move32();
@@ -2945,6 +2991,7 @@ static void IGF_getWhiteSpectralData_ivas(
out_e_arr[i] = add( sub( 21, n ), in_e );
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
max_out_e = s_max( max_out_e, out_e_arr[i] );
}
diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c
index bd8a2cbd3095c210f6ffa49344a60f66b826c58c..934433132a702fb29af374d0d171bda50ca6c123 100644
--- a/lib_dec/init_dec_fx.c
+++ b/lib_dec/init_dec_fx.c
@@ -126,7 +126,7 @@ ivas_error init_decoder_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) );
}
- fd_bwe_dec_init( st_fx, st_fx->hBWE_FD );
+ fd_bwe_dec_init_fx( st_fx->hBWE_FD );
}
ELSE
{
@@ -193,7 +193,6 @@ ivas_error init_decoder_fx(
st_fx->last_voice_factor_fx = 0; // Q6
move16();
- set16_fx( st_fx->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB );
test();
test();
@@ -358,23 +357,9 @@ ivas_error init_decoder_fx(
}
st_fx->cng_type = -1;
move16();
- st_fx->CNG_fx = 0;
- move16(); /* RTXDTX handler CNG=1 nonCNG= 0,*/
- st_fx->prev_ft_speech_fx = 1;
- move16(); /* RXDTX handeler previous frametype flag for G.192 format AMRWB SID_FIRST detection */
st_fx->first_CNG = 0;
move16();
Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); // Q15
- st_fx->shb_cng_ener_fx = -1541; // Q8
- move16();
- st_fx->wb_cng_ener_fx = -1541; // Q8
- move16();
- st_fx->last_wb_cng_ener_fx = -1541; // Q8
- move16();
- st_fx->last_shb_cng_ener_fx = -1541; // Q8
- move16();
- st_fx->swb_cng_seed = RANDOM_INITSEED;
- move16();
st_fx->CNG_mode = -1;
move16();
@@ -383,22 +368,9 @@ ivas_error init_decoder_fx(
st_fx->last_CNG_L_frame = L_FRAME;
move16();
- FOR( i = 0; i < LPC_SHB_ORDER; i++ )
- {
- st_fx->lsp_shb_prev_fx[i] = lsp_shb_prev_tbl_fx[i]; // Q15
- move16();
- st_fx->lsp_shb_prev_prev_fx[i] = st_fx->lsp_shb_prev_fx[i]; // Q15
- move16();
- }
- st_fx->shb_dtx_count_fx = 0;
- move16();
st_fx->last_vad_fx = 0;
move16();
- st_fx->trans_cnt_fx = 0;
- move16();
- st_fx->last_shb_ener_fx = 0; // Q8
- move16();
/* HF (6-7kHz) BWE */
move16();
@@ -507,6 +479,14 @@ ivas_error init_decoder_fx(
{
st_fx->hTcxCfg = NULL;
}
+
+ /* Tonal MDCT concealment data structure */
+
+ if ( ( st_fx->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TonalMDCTConcealment\n" ) );
+ }
+
st_fx->prev_coder_type = GENERIC;
move16();
@@ -531,12 +511,10 @@ ivas_error init_decoder_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
}
- td_bwe_dec_init_fx( st_fx, st_fx->hBWE_TD, st_fx->output_Fs );
+ td_bwe_dec_init_fx( st_fx->hBWE_TD, st_fx->extl, st_fx->output_Fs );
-#ifdef MSAN_FIX
- st_fx->hBWE_TD->prev_hb_synth_fx_exp = 31;
+ st_fx->prev_Q_bwe_exc = 31;
move16();
-#endif
}
ELSE
{
@@ -748,6 +726,14 @@ ivas_error init_decoder_fx(
st_fx->last_vbr_hw_BWE_disable_dec = 0;
move16();
+ /*-----------------------------------------------------------------*
+ * Mode 2 initialization
+ *-----------------------------------------------------------------*/
+
+ IF( ( st_fx->hPlcInfo = (T_PLCInfo_HANDLE) malloc( sizeof( T_PLCInfo ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PLC handle\n" ) );
+ }
st_fx->enablePlcWaveadjust = 0;
move16();
@@ -827,8 +813,6 @@ ivas_error init_decoder_fx(
move16();
st_fx->element_mode = EVS_MONO; /* element mode */
move16();
- st_fx->last_element_mode = st_fx->element_mode; /* element mode */
- move16();
st_fx->element_brate = -1; /* element bitrate */
move16();
st_fx->low_rate_mode = 0; /* low-rate mode flag */
@@ -1210,7 +1194,7 @@ ivas_error init_decoder_ivas_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) );
}
- td_cng_dec_init_ivas_fx( st_fx );
+ td_cng_dec_init_fx( st_fx );
}
ELSE
{
@@ -1286,11 +1270,10 @@ ivas_error init_decoder_ivas_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
}
- td_bwe_dec_init_ivas_fx( st_fx, st_fx->hBWE_TD, st_fx->output_Fs );
-#ifdef MSAN_FIX
- st_fx->hBWE_TD->prev_hb_synth_fx_exp = 31;
+ td_bwe_dec_init_fx( st_fx->hBWE_TD, st_fx->extl, st_fx->output_Fs );
+
+ st_fx->prev_Q_bwe_exc = 31;
move16();
-#endif
}
ELSE
{
@@ -1312,7 +1295,7 @@ ivas_error init_decoder_ivas_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FD BWE\n" ) );
}
- fd_bwe_dec_init( st_fx, st_fx->hBWE_FD );
+ fd_bwe_dec_init_fx( st_fx->hBWE_FD );
}
ELSE
{
diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c
index 7b4e5f267f708713deb5f978ae2764fb9592097d..37c32a8b1b48043bd560da49d386c2a3321ff54f 100644
--- a/lib_dec/ivas_core_dec_fx.c
+++ b/lib_dec/ivas_core_dec_fx.c
@@ -48,6 +48,7 @@
*
* Principal IVAS core decoder routine, where number of core channels is 1 or 2
*-------------------------------------------------------------------*/
+
ivas_error ivas_core_dec_fx(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */
@@ -64,15 +65,13 @@ ivas_error ivas_core_dec_fx(
Decoder_State **sts, *st;
STEREO_ICBWE_DEC_HANDLE hStereoICBWE;
STEREO_TD_DEC_DATA_HANDLE hStereoTD;
+ STEREO_CNG_DEC_HANDLE hStereoCng;
+ TD_BWE_DEC_HANDLE hBWE_TD;
+ FD_BWE_DEC_HANDLE hBWE_FD;
Word16 sharpFlag[CPE_CHANNELS];
Word16 tmp_buffer_fx[L_FRAME48k];
- set16_fx( tmp_buffer_fx, 0, L_FRAME48k );
Word16 tmp16, tmp16_2, j;
- tmp16 = 0;
- move16();
Word16 Q_white_exc;
- Q_white_exc = 0;
- move16();
Word16 tmps, incr;
Word32 bwe_exc_extended_fx[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET];
@@ -109,15 +108,8 @@ ivas_error ivas_core_dec_fx(
move16();
move16();
- FOR( i = 0; i < CPE_CHANNELS; i++ )
- {
- set16_fx( pitch_buf_fx[i], 0, NB_SUBFR16k );
- set16_fx( output_16_fx[i], 0, L_FRAME48k );
- }
-
Word16 tdm_lsfQ_PCh_fx[M], tdm_lspQ_PCh_fx[M];
Word32 conceal_eof_gain32;
-
Flag Overflow;
error = IVAS_ERR_OK;
@@ -146,9 +138,11 @@ ivas_error ivas_core_dec_fx(
last_element_mode = IVAS_SCE;
move16();
hStereoTD = NULL;
+ hStereoCng = NULL;
p_output_mem_fx = NULL;
nchan_out = 1;
move16();
+
test();
IF( st_ivas != NULL && EQ_32( st_ivas->ivas_format, ISM_FORMAT ) )
{
@@ -170,8 +164,8 @@ ivas_error ivas_core_dec_fx(
move16();
hStereoICBWE = hCPE->hStereoICBWE;
hStereoTD = hCPE->hStereoTD;
+ hStereoCng = hCPE->hStereoCng;
p_output_mem_fx = hCPE->output_mem_fx[1];
-
nchan_out = hCPE->nchan_out;
move16();
@@ -181,19 +175,12 @@ ivas_error ivas_core_dec_fx(
move16();
}
- IF( EQ_16( sts[0]->element_mode, IVAS_CPE_DFT ) )
+ test();
+ test();
+ IF( EQ_16( sts[0]->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
{
- test();
- IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
- {
- use_cldfb_for_dft = 1;
- move16();
- }
- ELSE
- {
- use_cldfb_for_dft = 0;
- move16();
- }
+ use_cldfb_for_dft = 1;
+ move16();
}
}
@@ -283,10 +270,8 @@ ivas_error ivas_core_dec_fx(
IF( !st->bfi && st->prev_bfi && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL )
#endif
{
-
conceal_eof_gain32 = L_shr_sat( st->hTcxDec->conceal_eof_gain32, sub( 16, st->hTcxDec->conceal_eof_gain_e ) ); // e = 31 - Q , 16 - e => 16 - (31 - Q) => Q - 15,
// shr(16 -e ) = shr(Q -15) => 15 - Q ==> Q15
-
FOR( i = 0; i < st->hTcxDec->L_frameTCX; i++ )
{
L_tmp = Mpy_32_16_1( conceal_eof_gain32, st->hHQ_core->old_out_fx[i] ); // Q0 (15+1+0 - (15 + 1)
@@ -309,6 +294,7 @@ ivas_error ivas_core_dec_fx(
set16_fx( voice_factors_fx[n], 0, NB_SUBFR16k );
set32_fx( hb_synth_32_fx[n], 0, L_FRAME48k );
set16_fx( hb_synth_16_fx[n], 0, L_FRAME48k );
+
/*------------------------------------------------------------------*
* Decision matrix (selection of technologies)
*-----------------------------------------------------------------*/
@@ -345,19 +331,18 @@ ivas_error ivas_core_dec_fx(
/* MDCT stereo -> DFT stereo switching */
test();
- test();
- IF( hCPE != NULL && EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
+ IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) && EQ_16( sts[0]->element_mode, IVAS_CPE_DFT ) )
{
Word16 ovl, fade_len;
IF( NE_16( sts[0]->L_frame, sts[0]->last_L_frame ) )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
#endif
- L_lerp_fx_q11( sts[0]->hHQ_core->old_outLB_fx, sts[0]->hHQ_core->old_outLB_fx, sts[0]->L_frame, sts[0]->last_L_frame );
- Copy_Scale_sig_32_16( sts[0]->hHQ_core->old_outLB_fx, sts[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( sts[0]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB
+ L_lerp_fx_q11( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->L_frame, sts[0]->last_L_frame );
+ Copy_Scale_sig_32_16( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( sts[0]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB
}
IF( NE_16( sts[0]->L_frame, L_FRAME16k ) )
{
@@ -370,9 +355,9 @@ ivas_error ivas_core_dec_fx(
}
test();
- if ( hCPE != NULL && hCPE->hStereoCng != NULL )
+ if ( hStereoCng != NULL )
{
- hCPE->hStereoCng->flag_cna_fade = 0;
+ hStereoCng->flag_cna_fade = 0;
move16();
}
@@ -413,7 +398,7 @@ ivas_error ivas_core_dec_fx(
test();
IF( hCPE != NULL && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->brate_surplus > 0 )
{
- ivas_combined_format_brate_sanity_fx( hCPE->element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps );
+ ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps );
}
/*------------------------------------------------------------------*
@@ -467,6 +452,7 @@ ivas_error ivas_core_dec_fx(
/*---------------------------------------------------------------------*
* Preprocessing (preparing) for ACELP/HQ core switching
*---------------------------------------------------------------------*/
+
Word16 Q_olapBufferSynth, Q_olapBufferSynth2;
Q_olapBufferSynth = Q15; /*Initializing with max values to avoid warnings*/
@@ -495,12 +481,14 @@ ivas_error ivas_core_dec_fx(
* HQ core decoding
*---------------------------------------------------------------------*/
+ set16_fx( output_16_fx[n], 0, L_FRAME48k ); /* this is needed for instances like L_norm_arr( p_output_fx[i], L_FRAME48k ) */
+
IF( st->core == ACELP_CORE )
{
/* ACELP core decoder */
Word16 old_syn_12k8_16k_fx_16[L_FRAME16k];
- set16_fx( output_16_fx[n], 0, L_FRAME48k );
Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx;
+
IF( save_hb_synth_32_fx )
{
save_hb_synth_16_fx = save_hb_synth_fx_arr;
@@ -534,24 +522,15 @@ ivas_error ivas_core_dec_fx(
Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, add( M, 1 ), sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 3 ) ); // Qx
}
- IF( hCPE == NULL )
+ IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) )
{
- IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, NULL, read_sid_info ) ), IVAS_ERR_OK ) )
- {
- return error;
- }
- }
- ELSE
- {
- IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE->hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) )
- {
- return error;
- }
+ return error;
}
+
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, st->Q_syn2 ) ); // Q_syn2->Q11
#else
- Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, st->Q_syn2 ) ); // Q_syn2->Q11
+ Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, st->Q_syn2 ) ); // Q_syn2->Q11
#endif
Scale_sig( output_16_fx[n], L_FRAME48k, negate( st->Q_syn2 ) ); // Q0
IF( st->cldfbAna )
@@ -594,7 +573,6 @@ ivas_error ivas_core_dec_fx(
IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) )
{
Word16 Qsyn_temp;
- STEREO_CNG_DEC_HANDLE hStereoCng;
IVAS_FORMAT ivas_format;
Qsyn_temp = st->Q_syn;
@@ -620,14 +598,6 @@ ivas_error ivas_core_dec_fx(
st->hHQ_core->Q_old_wtda = 0;
move16();
- IF( hCPE == NULL )
- {
- hStereoCng = NULL;
- }
- ELSE
- {
- hStereoCng = hCPE->hStereoCng;
- }
IF( st_ivas == NULL )
{
ivas_format = 0;
@@ -638,7 +608,9 @@ ivas_error ivas_core_dec_fx(
ivas_format = st_ivas->ivas_format;
move32();
}
+
stereo_tcx_core_dec_fx( st, frameMode[n], output_16_fx[n], synth_16_fx[n], pitch_buf_fx[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hStereoCng, nchan_out, ivas_format );
+
st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda;
move16();
Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 ); // Q11
@@ -738,6 +710,7 @@ ivas_error ivas_core_dec_fx(
move16();
move16();
sts = hCPE->hCoreCoder;
+
FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
@@ -781,19 +754,21 @@ ivas_error ivas_core_dec_fx(
ELSE IF( EQ_16( hCPE->nchan_out, 1 ) )
{
Word16 shift1, shift2;
+
sts[0] = hCPE->hCoreCoder[0];
sts[1] = hCPE->hCoreCoder[1];
- IF( LE_32( hCPE->last_element_brate, IVAS_SID_5k2 ) )
+ IF( LE_32( last_element_brate, IVAS_SID_5k2 ) )
{
sts[0]->hHQ_core->exp_old_out = sub( 15, sts[0]->hHQ_core->Q_old_wtda );
move16();
sts[1]->hHQ_core->exp_old_out = sub( 15, sts[1]->hHQ_core->Q_old_wtda );
move16();
}
+
updateBuffersForDmxMdctStereo_fx( hCPE, output_frame, output_32_fx[0], output_32_fx[1], synth_16_fx );
- IF( LE_32( hCPE->last_element_brate, IVAS_SID_5k2 ) )
+ IF( LE_32( last_element_brate, IVAS_SID_5k2 ) )
{
sts[0]->hHQ_core->Q_old_wtda = sub( 15, sts[0]->hHQ_core->exp_old_out );
move16();
@@ -836,7 +811,7 @@ ivas_error ivas_core_dec_fx(
*---------------------------------------------------------------------*/
test();
- IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hCPE->hStereoCng != NULL )
+ IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL )
{
/* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */
Word16 Q_c_PS_LT, Q_output;
@@ -846,13 +821,13 @@ ivas_error ivas_core_dec_fx(
move16();
Q_output = 11;
move16();
- c_PS_LT_fx = L_deposit_h( hCPE->hStereoCng->c_PS_LT_fx );
+ c_PS_LT_fx = L_deposit_h( hStereoCng->c_PS_LT_fx );
Q_c_PS_LT = Q31;
move16();
stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame );
- hCPE->hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx );
+ hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx );
}
/*---------------------------------------------------------------------*
@@ -862,6 +837,8 @@ ivas_error ivas_core_dec_fx(
FOR( n = 0; n < n_channels; n++ )
{
st = sts[n];
+ hBWE_TD = st->hBWE_TD;
+ hBWE_FD = st->hBWE_FD;
/*---------------------------------------------------------------------*
* TD-BWE for ACELP to TCX transitions
@@ -907,7 +884,7 @@ ivas_error ivas_core_dec_fx(
test();
test();
test();
- IF( ( st->last_core == ACELP_CORE ) && ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) ) && st->hBWE_TD != NULL )
+ IF( ( st->last_core == ACELP_CORE ) && ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) ) && hBWE_TD != NULL )
{
test();
test();
@@ -915,39 +892,40 @@ ivas_error ivas_core_dec_fx(
test();
IF( ( EQ_16( st->bwidth, SWB ) || EQ_16( st->bwidth, FB ) ) && ( EQ_16( st->last_extl, SWB_TBE ) || EQ_16( st->last_extl, FB_TBE ) ) )
{
- GenTransition_fixed( st->hBWE_TD, hb_synth_32_fx[n], output_Fs, st->element_mode, st->L_frame, st->rf_flag, st->total_brate, st->prev_Qx );
+ GenTransition_fx32( hBWE_TD, hb_synth_32_fx[n], output_Fs, st->L_frame, hBWE_TD->prev_Qx );
}
ELSE IF( EQ_16( st->bwidth, WB ) && EQ_16( st->last_extl, WB_TBE ) )
{
- GenTransition_WB_fixed( st->hBWE_TD, hb_synth_32_fx[n], output_Fs );
+ GenTransition_WB_fx32( hBWE_TD, hb_synth_32_fx[n], output_Fs );
}
/* Memories Scaling */
- Copy_Scale_sig_32_16( st->hBWE_TD->syn_overlap_fx_32, st->hBWE_TD->syn_overlap_fx, L_SHB_LAHEAD, sub( st->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bwe_syn2
- Copy_Scale_sig_32_16( st->hBWE_TD->old_tbe_synth_fx_32, st->hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( st->prev_Qx, Q11 ) ); // prev_Qx
- Copy_Scale_sig_32_16( st->hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, st->hBWE_TD->state_lsyn_filt_dwn_shb_fx, ALLPASSSECTIONS_STEEP * 2, sub( st->prev_Qx, Q11 ) ); // prev_Qx
- Copy_Scale_sig_32_16( st->hBWE_TD->state_lsyn_filt_shb_fx_32, st->hBWE_TD->state_lsyn_filt_shb_fx, ALLPASSSECTIONS_STEEP * 2, sub( st->prev_Qx, Q11 ) ); // prev_Qx
- Copy_Scale_sig_32_16( st->hBWE_TD->mem_resamp_HB_fx_32, st->hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( st->prev_Qx, Q11 ) ); // prev_Qx
+ Copy_Scale_sig_32_16( hBWE_TD->syn_overlap_fx_32, hBWE_TD->syn_overlap_fx, L_SHB_LAHEAD, sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bwe_syn2
+ Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx
+ Copy_Scale_sig_32_16( hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, hBWE_TD->state_lsyn_filt_dwn_shb_fx, ALLPASSSECTIONS_STEEP * 2, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx
+ Copy_Scale_sig_32_16( hBWE_TD->state_lsyn_filt_shb_fx_32, hBWE_TD->state_lsyn_filt_shb_fx, ALLPASSSECTIONS_STEEP * 2, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx
+ Copy_Scale_sig_32_16( hBWE_TD->mem_resamp_HB_fx_32, hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx
}
/* Memories Re-Scaling */
- IF( st->hBWE_TD != NULL )
+ IF( hBWE_TD != NULL )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->syn_overlap_fx, st->hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, st->prev_Q_bwe_syn2 ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_tbe_synth_fx, st->hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->state_lsyn_filt_dwn_shb_fx, st->hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->state_lsyn_filt_shb_fx, st->hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->mem_resamp_HB_fx, st->hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->syn_overlap_fx, st->hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, st->prev_Q_bwe_syn2 ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_tbe_synth_fx, st->hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->state_lsyn_filt_dwn_shb_fx, st->hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->state_lsyn_filt_shb_fx, st->hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->mem_resamp_HB_fx, st->hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, st->prev_Q_bwe_syn2 ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_shb_fx_32, ALLPASSSECTIONS_STEEP * 2, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, st->prev_Qx ) ); // Q11
#endif
- Copy( st->hBWE_TD->mem_resamp_HB_fx, st->hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) );
+ Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) );
}
+
/*---------------------------------------------------------------------*
* Postprocessing for ACELP/MDCT core switching
*---------------------------------------------------------------------*/
@@ -961,32 +939,11 @@ ivas_error ivas_core_dec_fx(
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
#else
- Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
+ Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
#endif
}
- IVAS_FORMAT ivas_format;
- IF( st_ivas != NULL )
- {
- ivas_format = st_ivas->ivas_format;
- move32();
- }
- ELSE
- {
- ivas_format = UNDEFINED_FORMAT;
- move32();
- }
- IF( hCPE != NULL )
- {
- last_element_mode = hCPE->last_element_mode;
- move16();
- }
- ELSE
- {
- last_element_mode = IVAS_SCE;
- move16();
- }
- IF( NE_32( ( error = core_switching_post_dec_ivas_fx( st, synth_16_fx[n], output_32_fx[n], p_output_mem_16, ivas_format, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, last_element_mode, &Q_synth ) ), IVAS_ERR_OK ) )
+ IF( NE_32( ( error = core_switching_post_dec_ivas_fx( st, synth_16_fx[n], output_32_fx[n], p_output_mem_16, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, last_element_mode, &Q_synth ) ), IVAS_ERR_OK ) )
{
return error;
}
@@ -1000,7 +957,7 @@ ivas_error ivas_core_dec_fx(
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
#else
- Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
+ Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], hSCE->save_synth_fx, output_frame, sub( hSCE->q_save_synth_fx, Q_synth ) ); // q_save_synth_fx
#endif
}
@@ -1011,10 +968,11 @@ ivas_error ivas_core_dec_fx(
test();
test();
test();
- IF( n == 0 && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->last_core == ACELP_CORE && st->core != ACELP_CORE && ( EQ_16( nchan_out, 1 ) || ( hCPE != NULL && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) ) )
+ IF( n == 0 && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->last_core == ACELP_CORE && st->core != ACELP_CORE && ( EQ_16( nchan_out, 1 ) || EQ_16( last_element_mode, IVAS_CPE_DFT ) ) )
{
Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX );
}
+
/*---------------------------------------------------------------------*
* Pre-processing for bandwidth switching
*---------------------------------------------------------------------*/
@@ -1030,7 +988,7 @@ ivas_error ivas_core_dec_fx(
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( st->delay_buf_out_fx, st->delay_buf_out32_fx, ( HQ_DELTA_MAX * HQ_DELAY_COMP ), sub( Q11, st->hHQ_core->Q_old_postdec ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( st->delay_buf_out_fx, st->delay_buf_out32_fx, ( HQ_DELTA_MAX * HQ_DELAY_COMP ), sub( Q11, st->hHQ_core->Q_old_postdec ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( st->delay_buf_out_fx, st->delay_buf_out32_fx, ( HQ_DELTA_MAX * HQ_DELAY_COMP ), sub( Q11, st->hHQ_core->Q_old_postdec ) ); // Q11
#endif
}
@@ -1060,17 +1018,17 @@ ivas_error ivas_core_dec_fx(
test();
test();
- IF( NE_16( st->last_extl, WB_BWE ) && EQ_16( st->extl, WB_BWE ) && st->hBWE_FD != NULL )
+ IF( NE_16( st->last_extl, WB_BWE ) && EQ_16( st->extl, WB_BWE ) && hBWE_FD != NULL )
{
test();
if ( NE_16( st->last_extl, SWB_BWE ) && NE_16( st->last_extl, FB_BWE ) )
{
- st->hBWE_FD->prev_mode = st->hBWE_FD->prev_mode;
+ hBWE_FD->prev_mode = hBWE_FD->prev_mode;
move16();
}
- st->hBWE_FD->prev_L_swb_norm = st->hBWE_FD->prev_L_swb_norm;
+ hBWE_FD->prev_L_swb_norm = hBWE_FD->prev_L_swb_norm;
move16();
- st->hBWE_FD->prev_flag = st->hBWE_FD->prev_flag;
+ hBWE_FD->prev_flag = hBWE_FD->prev_flag;
move16();
}
@@ -1095,9 +1053,6 @@ ivas_error ivas_core_dec_fx(
Q_synth_fx = Q_synth;
move16();
- FD_BWE_DEC_HANDLE hBWE_FD;
- hBWE_FD = st->hBWE_FD;
-
Copy_Scale_sig_32_16( output_32_fx[n], output_16_fx[n], L_FRAME48k, sub( Q_input, Q11 ) ); // Q_input
Copy_Scale_sig_32_16( hb_synth_32_fx[n], hb_synth_16_fx[n], L_FRAME48k, -( Q11 ) ); // Q0
test();
@@ -1128,9 +1083,9 @@ ivas_error ivas_core_dec_fx(
Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11 // Q_input can get value <= -5
Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11
#endif
IF( hBWE_FD != NULL )
@@ -1138,15 +1093,15 @@ ivas_error ivas_core_dec_fx(
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( hBWE_FD->L_old_wtda_swb_fx, hBWE_FD->L_old_wtda_swb_fx32, L_FRAME48k, sub( Q11, hBWE_FD->old_wtda_swb_fx_exp ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( hBWE_FD->L_old_wtda_swb_fx, hBWE_FD->L_old_wtda_swb_fx32, L_FRAME48k, sub( Q11, hBWE_FD->old_wtda_swb_fx_exp ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_FD->L_old_wtda_swb_fx, hBWE_FD->L_old_wtda_swb_fx32, L_FRAME48k, sub( Q11, hBWE_FD->old_wtda_swb_fx_exp ) ); // Q11
#endif
}
- IF( st->hBWE_TD != NULL )
+ IF( hBWE_TD != NULL )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_tbe_synth_fx, st->hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_tbe_synth_fx, st->hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, st->prev_Qx ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hBWE_TD->old_tbe_synth_fx, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11
#endif
}
@@ -1154,6 +1109,10 @@ ivas_error ivas_core_dec_fx(
* SWB(FB) TBE decoding
* SWB(FB) BWE decoding
*---------------------------------------------------------------------*/
+
+ Q_white_exc = 0;
+ move16();
+
test();
test();
test();
@@ -1174,12 +1133,10 @@ ivas_error ivas_core_dec_fx(
IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) )
{
/* SWB TBE decoder */
- Q_white_exc = 0;
- move16();
-
ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc );
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->syn_overlap_fx, st->hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, st->prev_Q_bwe_syn2 ) ); // Q11
- Copy_Scale_sig_32_16( st->hBWE_TD->old_tbe_synth_fx_32, st->hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( st->prev_Qx, Q11 ) ); // prev_Qx
+
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11
+ Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx
IF( GT_16( Q_white_exc, 31 ) )
{
@@ -1201,7 +1158,7 @@ ivas_error ivas_core_dec_fx(
Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11
- Copy_Scale_sig_32_16( st->hBWE_FD->L_old_wtda_swb_fx32, st->hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp
+ Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp
}
/*---------------------------------------------------------------------*
@@ -1253,8 +1210,8 @@ ivas_error ivas_core_dec_fx(
#else
Copy_Scale_sig_32_16( synth_32_fx[n], synth_fxl, L_FRAME48k, negate( add( Q11, q ) ) );
#endif
- Scale_sig( st->hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, sub( Q8, st->prev_Q_bwe_syn ) ); // Q8
- Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, ( 2 * ALLPASSSECTIONS_STEEP ), sub( st->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bew_syn2
+ Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ); // Q8
+ Copy_Scale_sig_32_16( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, ( 2 * ALLPASSSECTIONS_STEEP ), sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bew_syn2
swb_CNG_dec_ivas_fx( st, synth_fxl, hb_synth_16_fx[n], sid_bw[n], negate( q ) );
@@ -1264,13 +1221,14 @@ ivas_error ivas_core_dec_fx(
Copy_Scale_sig_16_32_DEPREC( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, ( Q11 ) ); // Q11
}
- Scale_sig( st->hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, st->prev_Q_bwe_syn ) ) ); // Q0
- Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( st->prev_Q_bwe_syn2, Q11 ) ) );
+ Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0
+ Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) );
}
/*-------------------------------------------------------------------*
* Inter-channel BWE decoding
*-------------------------------------------------------------------*/
+
test();
IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) )
{
@@ -1319,18 +1277,20 @@ ivas_error ivas_core_dec_fx(
IF( EQ_16( st->core, ACELP_CORE ) && !st->bfi && st->prev_bfi && GE_32( st->last_total_brate, HQ_48k ) && EQ_16( st->last_codec_mode, MODE2 ) && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) && LT_16( st->hPlcInfo->nbLostCmpt, 4 ) )
{
tmps = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS );
- IF( st->tonalMDCTconceal.q_lastPcmOut != 0 )
+ IF( st->hTonalMDCTConc->q_lastPcmOut != 0 )
{
- Scale_sig( st->tonalMDCTconceal.secondLastPcmOut, shr( st->plcInfo.FrameSize, 1 ), negate( st->tonalMDCTconceal.q_lastPcmOut ) );
- Scale_sig( st->tonalMDCTconceal.lastPcmOut, st->plcInfo.FrameSize, negate( st->tonalMDCTconceal.q_lastPcmOut ) );
- st->tonalMDCTconceal.q_lastPcmOut = 0;
+ Scale_sig( st->hTonalMDCTConc->secondLastPcmOut, shr( st->hPlcInfo->L_frameTCX, 1 ), negate( st->hTonalMDCTConc->q_lastPcmOut ) );
+ Scale_sig( st->hTonalMDCTConc->lastPcmOut, st->hPlcInfo->L_frameTCX, negate( st->hTonalMDCTConc->q_lastPcmOut ) );
+ st->hTonalMDCTConc->q_lastPcmOut = 0;
move16();
}
- waveform_adj2_fix( st->hTonalMDCTConc->secondLastPcmOut, synth_16_fx[n] + tmps, st->plcInfo.data_noise, &st->plcInfo.outx_new_n1_fx,
- &st->plcInfo.nsapp_gain_fx, &st->plcInfo.nsapp_gain_n_fx, &st->plcInfo.recovery_gain, st->plcInfo.step_concealgain_fx,
- st->plcInfo.Pitch_fx, st->plcInfo.FrameSize, tmps, add( st->hPlcInfo->nbLostCmpt, 1 ), st->bfi );
+ waveform_adj2_fix( st->hPlcInfo, st->hTonalMDCTConc->secondLastPcmOut, synth_16_fx[n] + tmps, tmps, add( st->hPlcInfo->nbLostCmpt, 1 ), st->bfi );
+#ifdef NONBE_FIX_1402_WAVEADJUST
+ st->hPlcInfo->Pitch_fx = 0;
+#else
st->hPlcInfo->Pitch = 0;
+#endif
move16();
}
}
@@ -1448,7 +1408,7 @@ ivas_error ivas_core_dec_fx(
Word32 hb_prev_synth_buffer_fx_32[111];
Copy_Scale_sig_16_32_DEPREC( st->hb_prev_synth_buffer_fx, hb_prev_synth_buffer_fx_32, 111, 11 ); // Q11
- delay_signal_fx( hb_synth_32_fx[n], output_frame, hb_prev_synth_buffer_fx_32, tmps );
+ delay_signal32_fx( hb_synth_32_fx[n], output_frame, hb_prev_synth_buffer_fx_32, tmps );
Copy_Scale_sig_32_16( hb_prev_synth_buffer_fx_32, st->hb_prev_synth_buffer_fx, 111, -( 11 ) ); // Q0
}
ELSE
@@ -1467,24 +1427,13 @@ ivas_error ivas_core_dec_fx(
{
Word16 exp;
Word32 fra;
- SWITCH( output_frame )
+
+ tmp16 = 34; /*ouput_frame == L_FRAME 48k: Q15*/
+ move16();
+ if ( EQ_16( output_frame, L_FRAME32k ) )
{
- case L_FRAME8k:
- tmp16 = 205;
- move16();
- BREAK; /*Q15*/
- case L_FRAME16k:
- tmp16 = 102;
- move16();
- BREAK; /*Q15*/
- case L_FRAME32k:
- tmp16 = 51;
- move16();
- BREAK; /*Q15*/
- case L_FRAME48k:
- tmp16 = 34;
- move16();
- BREAK; /*Q15*/
+ tmp16 = 51; /*Q15*/
+ move16();
}
L_tmp = L_deposit_l( 2 ); /*0.001 in Q11*/
@@ -1504,9 +1453,9 @@ ivas_error ivas_core_dec_fx(
L_tmp = BASOP_Util_Add_Mant32Exp( fra, 6, L_tmp, exp, &exp );
L_tmp = Mpy_32_16_1( L_tmp, 24660 );
exp = add( exp, 2 );
- st->last_shb_ener_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 7 ) ) ); /*Q8*/
+ st->hTdCngDec->last_shb_ener_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 7 ) ) ); /*Q8*/
move16();
- st->hTdCngDec->last_shb_ener_fx = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/
+ st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/
move32();
}
}
@@ -1524,48 +1473,18 @@ ivas_error ivas_core_dec_fx(
* - core switching in DFT stereo
* - updates for potential TD->DFT stereo switching
*----------------------------------------------------------------*/
- IF( hCPE != NULL )
- {
- FOR( Word32 ch_ind = 0; ch_ind < n_channels; ch_ind++ )
- {
- IF( hCPE->hCoreCoder[ch_ind] != NULL )
- {
- IF( hCPE->hCoreCoder[ch_ind]->hHQ_core != NULL )
- {
-#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ch_ind]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ch_ind]->hHQ_core->Q_old_wtda_LB ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ch_ind]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ch_ind]->hHQ_core->Q_old_wtda ) ); // Q11
-#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ch_ind]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ch_ind]->hHQ_core->Q_old_wtda_LB ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ch_ind]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ch_ind]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ch_ind]->hHQ_core->Q_old_wtda ) ); // Q11
-#endif
- }
- }
- }
- }
- IF( hSCE != NULL )
+ IF( st->hHQ_core != NULL )
{
- IF( hSCE->hCoreCoder[0] != NULL )
- {
- IF( hSCE->hCoreCoder[0]->hHQ_core != NULL )
- {
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hSCE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hSCE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hSCE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( hSCE->hCoreCoder[0]->hHQ_core->old_out_fx, hSCE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hSCE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, st->hHQ_core->Q_old_wtda ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( hSCE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hSCE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hSCE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( hSCE->hCoreCoder[0]->hHQ_core->old_out_fx, hSCE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hSCE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, st->hHQ_core->Q_old_wtda ) ); // Q11
#endif
- }
- }
}
- Word16 exp_max;
- Word32 output_fx_loc[L_FRAME48k];
-
- exp_max = 0;
- move16();
IF( NE_16( st->element_mode, IVAS_CPE_DFT ) )
{
test();
@@ -1588,7 +1507,7 @@ ivas_error ivas_core_dec_fx(
Word16 q;
q = 11;
move16();
- IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
+ IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) )
{
stereo_mdct2dft_update_fx( hCPE, output_32_fx[0], synth_32_fx[0] );
}
@@ -1621,8 +1540,13 @@ ivas_error ivas_core_dec_fx(
* Common updates
*--------------------------------------------------------*/
- /*Scale Memories*/
+ Word16 exp_max;
+ Word32 output_fx_loc[L_FRAME48k];
+ exp_max = 0;
+ move16();
+
+ /*Scale Memories*/
test();
test();
test();
@@ -1664,11 +1588,11 @@ ivas_error ivas_core_dec_fx(
st->q_prev_synth_buffer_fx = sub( exp_max, st->q_prev_synth_buffer_fx );
move16();
}
+
/* Save synthesis for HQ FEC */
- save_synthesis_hq_fec_fx( st, output_fx_loc, output_frame, hCPE );
+ save_synthesis_hq_fec_fx( st, NULL, output_fx_loc, output_frame, 0, hCPE );
/* Updates */
-
ivas_updt_dec_common_fx( st, NORMAL_HQ_CORE, -1, output_32_fx[n], Q11 );
Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0
diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c
index 9e934cc888f116b241496c89510ac9ef449123d1..05fec7736b263716311dfd87dec696ec4fa5aae0 100644
--- a/lib_dec/ivas_cpe_dec_fx.c
+++ b/lib_dec/ivas_cpe_dec_fx.c
@@ -125,9 +125,9 @@ ivas_error ivas_cpe_dec_fx(
IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda ) ); // Q11
#endif
}
}
@@ -136,9 +136,9 @@ ivas_error ivas_cpe_dec_fx(
IF( hCPE->hCoreCoder[ind1]->hHQ_core )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11
#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11
#endif
hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = Q11;
move16();
@@ -155,7 +155,7 @@ ivas_error ivas_cpe_dec_fx(
test();
IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core )
{
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda, Q11 ) ); // Q_old_wtda
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda, Q11 ) ); // Q_old_wtda
}
}
FOR( Word16 ind1 = 0; ind1 < 2; ind1++ )
@@ -163,7 +163,7 @@ ivas_error ivas_cpe_dec_fx(
test();
IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core )
{
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda
}
}
@@ -729,8 +729,8 @@ ivas_error ivas_cpe_dec_fx(
hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft;
move16();
stereo_dft_unify_dmx_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata );
- scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
- hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
+ scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
+ hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
move16();
}
ELSE
@@ -754,8 +754,8 @@ ivas_error ivas_cpe_dec_fx(
move16();
}
stereo_dft_dec_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
- scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
- hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
+ scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
+ hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
move16();
}
@@ -1097,8 +1097,6 @@ ivas_error create_cpe_dec(
move32();
st->is_ism_format = 0;
move16();
- st->ivas_format = st_ivas->ivas_format;
- move32();
IF( NE_32( ( error = init_decoder_ivas_fx( st, n, st_ivas->mc_mode ) ), IVAS_ERR_OK ) )
{
diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c
index 70271c725da18c44befb55a5fd57a5276ad46b43..effff230f004099a59f70118e1088794b74635ef 100644
--- a/lib_dec/ivas_dirac_dec_fx.c
+++ b/lib_dec/ivas_dirac_dec_fx.c
@@ -3867,7 +3867,11 @@ void ivas_dirac_dec_render_sf_fx(
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = ( Q6 - 1 );
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Word16 no_col = st_ivas->cldfbSynDec[ch]->no_col;
move16();
@@ -3970,7 +3974,11 @@ void ivas_dirac_dec_render_sf_fx(
ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i];
move32();
}
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, 0, st_ivas->cldfbSynDec[idx_in] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( !st_ivas->hLsSetupCustom->separate_ch_found )
{
@@ -4010,7 +4018,11 @@ void ivas_dirac_dec_render_sf_fx(
scale_sig32( st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state ) ); // Q6-1
st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state = ( Q6 - 1 );
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[cldfbSynIdx] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[cldfbSynIdx] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
// Calculating length of output
Word16 no_col = st_ivas->cldfbSynDec[cldfbSynIdx]->no_col;
@@ -4079,7 +4091,11 @@ void ivas_dirac_dec_render_sf_fx(
st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = ( Q6 - 1 );
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[idx_in] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, st_ivas->cldfbSynDec[idx_in] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
// Scaling output from Q6-1 to Q11
Scale_sig32( p_out, out_len, ( Q11 - ( Q6 - 1 ) ) );
diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c
index 47b17aa966f20831df65941e63265300acfcccb8..dac7d0da670a406e6151a14afebf2ed923038300 100644
--- a/lib_dec/ivas_init_dec_fx.c
+++ b/lib_dec/ivas_init_dec_fx.c
@@ -132,7 +132,7 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx(
}
ELSE
{
- *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_ivas_fx( st_ivas );
+ *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas );
move16();
}
BREAK;
@@ -214,7 +214,7 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx(
case RENDERER_SBA_LINEAR_ENC:
IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) )
{
- *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_ivas_fx( st_ivas );
+ *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas );
move16();
}
ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) )
diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c
index 9ef1c192cb09c5ce14212e137f68b91d3459d91f..8a2b977eb95ed8b68eb54a1ee5586312735bffc3 100644
--- a/lib_dec/ivas_ism_param_dec_fx.c
+++ b/lib_dec/ivas_ism_param_dec_fx.c
@@ -1548,7 +1548,11 @@ static void ivas_ism_param_dec_render_sf_fx(
Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( sub( Q_real, 1 ), Q11 ) ); // Q_real-1
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = sub( Q_real, 1 );
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( Q11, sub( Q_real, 1 ) ) ); // Q11
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11;
move16();
diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c
index 2535eb6ee7e6349606f9e415bdbdbfc1c6bb668f..888bfb060e9d3fe31c04eb5fcdf26b910bbd8007 100644
--- a/lib_dec/ivas_ism_renderer_fx.c
+++ b/lib_dec/ivas_ism_renderer_fx.c
@@ -564,7 +564,7 @@ void ivas_omasa_separate_object_render_jbm_fx(
Word16 tcBufferSize;
tcBufferSize = i_mult( hSpatParamRendCom->num_slots, hSpatParamRendCom->slot_size );
- delay_signal_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size );
+ delay_signal32_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size );
}
offsetSamples = 0;
move16();
diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c
index 5b75f8e7e128296a3812b051e0cdca677720d9ff..e62ff3fdde88cd5f4a27b5d46f3fe412c83f3a88 100644
--- a/lib_dec/ivas_jbm_dec_fx.c
+++ b/lib_dec/ivas_jbm_dec_fx.c
@@ -409,7 +409,7 @@ ivas_error ivas_jbm_dec_tc_fx(
move16();
FOR( i = 0; i < 2; i++ )
{
- s = s_min( s, L_norm_arr( p_output_fx[i], L_FRAME48k ) - 11 ) /* Guard bits */;
+ s = s_min( s, L_norm_arr( p_output_fx[i], L_FRAME48k ) - 11 ) /* Guard bits */; // L_frame should be used instead of L_FRAME48k */
}
FOR( i = 0; i < 2; i++ )
{
@@ -435,11 +435,11 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
#endif
hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q;
move16();
@@ -550,8 +550,8 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB - q ); // Q_old_wtda_LB
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda - q ); // Q_old_wtda_LB
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB - q ); // Q_old_wtda_LB
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda - q ); // Q_old_wtda_LB
}
IF( hCPE->hStereoDft != NULL )
{
@@ -604,7 +604,7 @@ ivas_error ivas_jbm_dec_tc_fx(
}
}
#else
- scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11
+ scale_sig32( hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ), sub( Q11, hCPE->hStereoDft->q_dft ) ); // Q11
#endif
scale_sig32( hCPE->hStereoDft->ap_delay_mem_fx, NS2SA_FX2( 16000, DELAY_BWE_TOTAL_NS ), sub( Q11, hCPE->hStereoDft->q_ap_fade_mem_fx ) ); // Q11
hCPE->hStereoDft->q_ap_fade_mem_fx = Q11;
@@ -972,11 +972,11 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q
#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q
#endif
hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q;
move16();
@@ -1033,8 +1033,8 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda
}
IF( hCPE->hStereoDft != NULL )
{
@@ -1361,7 +1361,7 @@ ivas_error ivas_jbm_dec_tc_fx(
ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.num_lfe == 0 )
{
/* Delay the separated channel to sync with the DirAC rendering */
- delay_signal_fx( p_output_fx[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_fx, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size );
+ delay_signal32_fx( p_output_fx[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_fx, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size );
}
}
ELSE
@@ -1432,11 +1432,11 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
#ifdef FIX_ISSUE_1237
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
#else
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q
#endif
hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q;
move16();
@@ -1496,8 +1496,8 @@ ivas_error ivas_jbm_dec_tc_fx(
IF( hCPE->hCoreCoder[0] != NULL )
{
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB
- Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB
+ Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda
}
IF( hCPE->hStereoDft != NULL )
{
@@ -1720,7 +1720,7 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx(
{
FOR( n = 0; n < st_ivas->nchan_ism; n++ )
{
- delay_signal_fx( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer_fx[n], st_ivas->hSbaIsmData->delayBuffer_size );
+ delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer_fx[n], st_ivas->hSbaIsmData->delayBuffer_size );
}
}
@@ -2191,7 +2191,11 @@ ivas_error ivas_jbm_dec_render_fx(
}
ELSE
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -2239,7 +2243,11 @@ ivas_error ivas_jbm_dec_render_fx(
hSpar->hMdDec->Q_mixer_mat = 30;
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -2277,7 +2285,11 @@ ivas_error ivas_jbm_dec_render_fx(
}
ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) /*EXT output = individual objects + HOA3*/
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism] ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output_fx[st_ivas->nchan_ism], 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -2289,7 +2301,11 @@ ivas_error ivas_jbm_dec_render_fx(
}
ELSE
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -2301,7 +2317,11 @@ ivas_error ivas_jbm_dec_render_fx(
}
ELSE
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx, 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -2981,7 +3001,11 @@ ivas_error ivas_jbm_dec_flush_renderer_fx(
set16_fx( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available );
/* render the last subframe */
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_osba_dirac_td_binaural_jbm_fx( st_ivas, (UWord16) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output_fx, L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
diff --git a/lib_dec/ivas_lfe_dec_fx.c b/lib_dec/ivas_lfe_dec_fx.c
index 672d3fbe67ca2a80b1518e99a30d2e3bca85c9a4..d73030d56af4fa7ac8ba9213c879092c6bdc7ec4 100644
--- a/lib_dec/ivas_lfe_dec_fx.c
+++ b/lib_dec/ivas_lfe_dec_fx.c
@@ -392,7 +392,7 @@ void ivas_lfe_dec_fx(
/* add delay to make overall max(block_offset, 11.5) */
IF( hLFE->lfe_addl_delay > 0 )
{
- delay_signal_fx( output_lfe_ch, output_frame, hLFE->lfe_delay_buf_fx, hLFE->lfe_addl_delay );
+ delay_signal32_fx( output_lfe_ch, output_frame, hLFE->lfe_delay_buf_fx, hLFE->lfe_addl_delay );
}
return;
diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c
index a065a0b029d6b04ca7f77d89308fb1d79ff09f6f..37423885fcee45262efae92d504c34b1be3b55b7 100644
--- a/lib_dec/ivas_mc_param_dec_fx.c
+++ b/lib_dec/ivas_mc_param_dec_fx.c
@@ -2305,8 +2305,13 @@ void ivas_param_mc_dec_render_fx(
Word16 len = add( imult1616( slot_idx_start_cldfb_synth, hParamMC->num_freq_bands ), imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ) );
scale_sig32( output_f_fx[ch], len, 5 - 11 );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ),
+ imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ),
imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), st_ivas->cldfbSynDec[ch] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
scale_sig32( output_f_fx[ch], len, 11 - 5 ); // Q11
}
@@ -3854,36 +3859,3 @@ static void ivas_param_mc_bs_decode_parameter_values_fx(
return;
}
-
-Word16 param_mc_get_num_cldfb_syntheses_ivas_fx(
- Decoder_Struct *st_ivas /* i : Parametric MC handle */
-)
-{
- Word16 num_cldfb_syntheses;
-
- num_cldfb_syntheses = 0;
- move16();
-
- /* sanity check*/
- IF( st_ivas->hParamMC == NULL )
- {
- assert( 0 && "ParamMC handle does not exist!\n" );
- }
-
- test();
- IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) )
- {
- num_cldfb_syntheses = 2;
- move16();
- }
- ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) )
- {
- num_cldfb_syntheses = add( st_ivas->hTransSetup.nchan_out_woLFE, st_ivas->hTransSetup.num_lfe );
- }
- ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) )
- {
- num_cldfb_syntheses = add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe );
- }
-
- return num_cldfb_syntheses;
-}
diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c
index 3b7bfd3e2864e04ebd9e8a9170733e07fd1a27fa..e70908f5eddf22a94468c5680f1124c7bc6b260e 100644
--- a/lib_dec/ivas_mc_paramupmix_dec_fx.c
+++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c
@@ -499,7 +499,7 @@ static void paramupmix_td_decorr_process_jbm_fx(
FOR( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ )
{
Copy32( pcm_in[k], pp_out_pcm[k], output_frame );
- delay_signal_fx( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset );
+ delay_signal32_fx( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset );
/* In ducking gains */
IF( hTdDecorr[k]->ducking_flag )
@@ -941,15 +941,19 @@ static void ivas_mc_paramupmix_dec_sf(
RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx]; // Q6
ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx]; // Q6
#else
- RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; // Q6
- ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6
+ RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; // Q6
+ ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6
#endif
}
scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q5 - Q11 ); // Q11 -> Q5
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q5;
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q5
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q5
- scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q11 - Q5 ); // Q5 -> Q11
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+ scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q11 - Q5 ); // Q5 -> Q11
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11;
move16();
}
@@ -983,8 +987,13 @@ static void ivas_mc_paramupmix_dec_sf(
ptr_re_fx[0] = Cldfb_RealBuffer_fx[ch][slot_idx]; // Q6
ptr_im_fx[0] = Cldfb_ImagBuffer_fx[ch][slot_idx]; // Q6
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ),
+ hMCParamUpmix->num_freq_bands, 0, st_ivas->cldfbSynDec[ch] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ),
hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); // Q6 -> Q11
st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11;
diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c
index 31fbdadd86663c61f0529cbb1cfed7716bd5288d..bf21753bfd982b3bfb671feaa7517c85dac3ea2a 100644
--- a/lib_dec/ivas_mct_dec_fx.c
+++ b/lib_dec/ivas_mct_dec_fx.c
@@ -411,10 +411,10 @@ ivas_error ivas_mct_dec_fx(
{
#ifdef FIX_ISSUE_1237
Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11
- Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->oldOut_fx, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) );
+ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) );
#else
Copy_Scale_sig_16_32_DEPREC( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11
- Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->oldOut_fx, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) );
+ Copy_Scale_sig_16_32_DEPREC( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) );
#endif
ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1, Q11 );
#ifdef MSAN_FIX
@@ -448,7 +448,7 @@ ivas_error ivas_mct_dec_fx(
{
dirac_stereo_flag = 0;
}
- IF( NE_32( ( error = core_switching_post_dec_ivas_fx( sts[n], synth_fx[n], output_fx[( cpe_id * CPE_CHANNELS ) + n], output_mem_fx, st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, dirac_stereo_flag, -1, hCPE->last_element_mode, &Q_synth ) ), IVAS_ERR_OK ) )
+ IF( NE_32( ( error = core_switching_post_dec_ivas_fx( sts[n], synth_fx[n], output_fx[( cpe_id * CPE_CHANNELS ) + n], output_mem_fx, 0, output_frame, 0 /*core_switching_flag*/, dirac_stereo_flag, -1, hCPE->last_element_mode, &Q_synth ) ), IVAS_ERR_OK ) )
{
return error;
}
@@ -465,7 +465,7 @@ ivas_error ivas_mct_dec_fx(
sts[n]->q_prev_synth_buffer_fx = 0;
move16();
- save_synthesis_hq_fec_fx( sts[n], output_fx_, output_frame, hCPE );
+ save_synthesis_hq_fec_fx( sts[n], NULL, output_fx_, output_frame, 0, hCPE );
/* CoreCoder common updates */
ivas_updt_dec_common_fx( hCPE->hCoreCoder[n], NORMAL_HQ_CORE, -1, output_fx[( cpe_id * CPE_CHANNELS ) + n], 11 );
diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c
index 151ba7d1eafa6fc83452492bcae937152ed6127e..1899c8bea485a504c671ac909b1840d61025bd77 100644
--- a/lib_dec/ivas_mdct_core_dec_fx.c
+++ b/lib_dec/ivas_mdct_core_dec_fx.c
@@ -1187,11 +1187,12 @@ void ivas_mdct_core_reconstruct_fx(
{
Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win
Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win
- Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, sub( -1, st->Q_syn ) ) ); // Q(-1 - st->Q_syn) -> q_win
- Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win
- Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win
- Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win
- Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win
+ Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win
+ st->hTcxDec->Q_old_syn_Overl = q_win;
+ Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win
+ Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win
+ Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win
+ Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win
#ifdef MSAN_FIX
Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win
Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win
@@ -1260,7 +1261,8 @@ void ivas_mdct_core_reconstruct_fx(
Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); // q_win -> Q(-1 - st->Q_syn)
st->hTcxDec->Q_syn_Overl_TDAC = sub( -1, st->Q_syn );
move16();
- Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); // q_win -> Q(-1 - st->Q_syn)
+ Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn)
+ st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn );
#ifdef MSAN_FIX
Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn
Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn
@@ -1307,6 +1309,7 @@ void ivas_mdct_core_reconstruct_fx(
move16();
st->Q_syn = q_syn;
move16();
+ st->hTcxDec->Q_old_syn_Overl = add( st->hTcxDec->Q_old_syn_Overl, q_syn );
IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) )
{
diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c
index 2393ea51d096ff0da5db9e567d1307f426a1afb0..2c0707b667e7f77d8b257f6aa41cfb257f31ae20 100644
--- a/lib_dec/ivas_omasa_dec_fx.c
+++ b/lib_dec/ivas_omasa_dec_fx.c
@@ -790,7 +790,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx(
tc_local_fx[n] = st_ivas->hTcBuffer->tc_fx[n + 2]; // Q11
v_multc_fixed_16( tc_local_fx[n], gain_fx, tc_local_fx[n], tcBufferSize );
- delay_signal_fx( tc_local_fx[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size );
+ delay_signal32_fx( tc_local_fx[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size );
}
}
diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c
index f2d096caf30f958830e0f4cefecea8efda91fcdb..0cc55e8c327ec8268eb192f70ca08d970d241df1 100644
--- a/lib_dec/ivas_osba_dec_fx.c
+++ b/lib_dec/ivas_osba_dec_fx.c
@@ -129,8 +129,11 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx(
const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */
UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */
UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */
- Word32 *output_fx[], /* o : rendered time signal Q11*/
- Word16 out_len /*Store the length of values in each channel*/
+ Word32 *output_fx[] /* o : rendered time signal Q11*/
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len /*Store the length of values in each channel*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
)
{
Word16 n;
@@ -153,7 +156,11 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx(
channel_offset = st_ivas->nchan_ism;
move16();
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset] ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset], out_len ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
@@ -298,7 +305,11 @@ ivas_error ivas_osba_render_sf_fx(
v_shr( p_output[n], Q11 - Q11, output_ism[n], nSamplesAsked ); // Q11
}
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output ) ), IVAS_ERR_OK ) )
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output, 960 ) ), IVAS_ERR_OK ) )
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
{
return error;
}
diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c
index 9357394a5741ee2b152504f8db29d408374c4801..03fe4063ad13e3f19610201a8f66e306556a9622 100644
--- a/lib_dec/ivas_post_proc_fx.c
+++ b/lib_dec/ivas_post_proc_fx.c
@@ -92,7 +92,7 @@ void ivas_post_proc_fx(
IF( NE_16( sts[n]->core, TCX_20_CORE ) && NE_16( sts[n]->core, TCX_10_CORE ) )
{
/* TCX-LTP Postfilter: used in Mode 1 to update memories and to avoid discontinuities when the past frame was TCX */
- tcx_ltp_post32( sts[n], hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL, output_q );
+ tcx_ltp_post_fx32( sts[n], hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL, output_q );
}
ELSE
{
@@ -112,10 +112,10 @@ void ivas_post_proc_fx(
{
Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/
move16();
- Copy32( sts[n]->hHQ_core->oldOut_fx + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
+ Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
}
- tcx_ltp_post32( sts[n], hTcxLtpDec, sts[n]->core, output_frame, add( NS2SA_FX2( output_Fs, ACELP_LOOK_NS ), delay_comp ), synth, sts[n]->hTcxDec->FBTCXdelayBuf_32, output_q );
+ tcx_ltp_post_fx32( sts[n], hTcxLtpDec, sts[n]->core, output_frame, add( NS2SA_FX2( output_Fs, ACELP_LOOK_NS ), delay_comp ), synth, sts[n]->hTcxDec->FBTCXdelayBuf_32, output_q );
}
}
}
@@ -152,12 +152,12 @@ void ivas_post_proc_fx(
IF( NE_16( sts[0]->core, TCX_20_CORE ) && NE_16( sts[0]->core, TCX_10_CORE ) )
{
/* update memories and to avoid discontinuities when the past frame was TCX */
- tcx_ltp_post32( sts[0], hTcxLtpDec, ACELP_CORE, output_frame, 0, output[k], NULL, output_q );
+ tcx_ltp_post_fx32( sts[0], hTcxLtpDec, ACELP_CORE, output_frame, 0, output[k], NULL, output_q );
}
ELSE
{
/*Use channel 0 side info.*/
- tcx_ltp_post32( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem_fx[k], output_q );
+ tcx_ltp_post_fx32( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem_fx[k], output_q );
}
}
}
@@ -416,8 +416,8 @@ void stereo_dft_dec_core_switching_fx(
delay_comp = NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ); /*Q0*/
move16();
- Copy32( &st->hHQ_core->oldOut_fx[nZeros - ( delay_comp + NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) )], hCPE->input_mem_fx[0], NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*Q11*/
- Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
+ Copy32( &st->hHQ_core->old_out_fx32[nZeros - ( delay_comp + NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) )], hCPE->input_mem_fx[0], NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*Q11*/
+ Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
Word16 mem_len;
mem_len = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/
@@ -605,7 +605,7 @@ void stereo_dft_dec_core_switching_fx(
Word16 numZeros = (Word16) ( NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS ) ); /*Q0*/
Word32 tmp_fade_fx[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )];
- Copy32( st->hHQ_core->old_outLB_fx + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/
+ Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/
hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->q_old_outLB_fx;
move16();
diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c
index 2d96ce81ac502883998637832a96744ff270be1c..d48192bce8f55108228f6548dae2f2ab12b96390 100644
--- a/lib_dec/ivas_sba_dec_fx.c
+++ b/lib_dec/ivas_sba_dec_fx.c
@@ -907,8 +907,11 @@ ivas_error ivas_sba_dec_render_fx(
const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested Q0*/
UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered Q0*/
UWord16 *nSamplesAvailableNext, /* o : number of CLDFB slots still to render Q0*/
- Word32 *output_fx[], /* o : rendered time signal Q11*/
- Word16 out_len /*Store the length of values in each channel*/
+ Word32 *output_fx[] /* o : rendered time signal Q11*/
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len /*Store the length of values in each channel*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
)
{
Word16 slots_to_render, first_sf, last_sf, subframe_idx;
@@ -917,11 +920,15 @@ ivas_error ivas_sba_dec_render_fx(
SPAR_DEC_HANDLE hSpar;
SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
Word32 *output_f_local_fx[MAX_OUTPUT_CHANNELS];
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Word16 output_f_local_len;
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
ivas_error error;
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
output_f_local_len = out_len;
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
hSpar = st_ivas->hSpar;
hSpatParamRendCom = st_ivas->hSpatParamRendCom;
nchan_internal = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate );
@@ -953,13 +960,18 @@ ivas_error ivas_sba_dec_render_fx(
{
Word16 n_samples_sf = imult1616( slot_size, hSpar->subframe_nbslots[subframe_idx] ); /*Q0*/
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local_fx, nchan_internal );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
ivas_spar_dec_upmixer_sf_fx( st_ivas, output_f_local_fx, nchan_internal, output_f_local_len );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( ch = 0; ch < nchan_out; ch++ )
{
output_f_local_fx[ch] = output_f_local_fx[ch] + n_samples_sf; /*Q11*/
}
-
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
output_f_local_len = sub( output_f_local_len, n_samples_sf );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
/* update combined orientation access index */
ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf );
}
diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c
index 12549f49df29761496430c1f1416ec92f1023225..6e1893015fec3992e084426df2874572579b5d15 100644
--- a/lib_dec/ivas_sce_dec_fx.c
+++ b/lib_dec/ivas_sce_dec_fx.c
@@ -318,13 +318,13 @@ ivas_error ivas_sce_dec_fx(
* LB synthesis synchronization between IVAS formats
*----------------------------------------------------------------*/
- delay_signal_fx( output[0], output_frame, st->prev_synth_buffer32_fx, NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ) );
+ delay_signal32_fx( output[0], output_frame, st->prev_synth_buffer32_fx, NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ) );
/*----------------------------------------------------------------*
* HB synthesis synchronization between IVAS formats
*----------------------------------------------------------------*/
- delay_signal_fx( outputHB[0], output_frame, hSCE->prev_hb_synth_fx, NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
+ delay_signal32_fx( outputHB[0], output_frame, hSCE->prev_hb_synth_fx, NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
/*----------------------------------------------------------------*
* output LB and HB mix
@@ -408,8 +408,6 @@ ivas_error create_sce_dec(
move16();
st->is_ism_format = 0;
move16();
- st->ivas_format = st_ivas->ivas_format;
- move16();
test();
if ( EQ_16( (Word16) st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( (Word16) st_ivas->ivas_format, MASA_ISM_FORMAT ) )
@@ -456,7 +454,7 @@ ivas_error create_sce_dec(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) );
}
- td_cng_dec_init_ivas_fx( st );
+ td_cng_dec_init_fx( st );
}
/*-----------------------------------------------------------------*
diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c
index 172251104e9e07d286f144c2d185d8c3bef64da1..6c4d7a9ac9c830818877e0731d1d8abedc87275e 100644
--- a/lib_dec/ivas_spar_decoder_fx.c
+++ b/lib_dec/ivas_spar_decoder_fx.c
@@ -787,8 +787,11 @@ void ivas_spar_get_cldfb_gains_fx(
cldfbAnalysis_ts_fx_fixed_q( ts_inout_fx, ts_re_fx, ts_im_fx, num_cldfb_bands, cldfbAnaDec0, &q_cldfb );
cldfb_reset_memory_fx( cldfbSynDec0 );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, 0, cldfbSynDec0 );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, cldfbSynDec0 );
-
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( sample = 0; sample < stride; sample++ )
{
T_fx[( ( slot * stride ) + sample )][slot] = ts_inout_fx[sample]; /*Q21*/
@@ -1683,10 +1686,14 @@ void ivas_spar_dec_digest_tc_fx(
*-------------------------------------------------------------------*/
void ivas_spar_dec_upmixer_sf_fx(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
- Word32 *output_fx[], /* o : output audio channels Q11*/
- const Word16 nchan_internal, /* i : number of internal channels Q0*/
- Word16 out_len )
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ Word32 *output_fx[], /* o : output audio channels Q11*/
+ const Word16 nchan_internal /* i : number of internal channels Q0*/
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
+ ,
+ Word16 out_len
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+)
{
Word16 cldfb_band, num_cldfb_bands, numch_in, numch_out;
Word32 *cldfb_in_ts_re_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX];
@@ -1882,11 +1889,18 @@ void ivas_spar_dec_upmixer_sf_fx(
{
FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ Word16 diff = sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( out_ch = 0; out_ch < numch_out; out_ch++ )
{
FOR( in_ch = 0; in_ch < numch_in; in_ch++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ mixer_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], diff ), hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ); /*q1*/
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
mixer_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ) ), hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ); /*q1*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
move32();
hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band] = mixer_mat_fx[out_ch][in_ch][spar_band]; /*q1*/
move32();
@@ -2066,10 +2080,12 @@ void ivas_spar_dec_upmixer_sf_fx(
}
IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) )
{
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Copy32( hSpar->hMdDec->mixer_mat_prev_fx[1][0][0], hSpar->hMdDec->mixer_mat_prev_fx[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/
Copy32( hSpar->hMdDec->mixer_mat_prev_fx[2][0][0], hSpar->hMdDec->mixer_mat_prev_fx[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/
Copy32( hSpar->hMdDec->mixer_mat_prev_fx[3][0][0], hSpar->hMdDec->mixer_mat_prev_fx[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/
Copy32( hSpar->hMdDec->mixer_mat_prev_fx[4][0][0], hSpar->hMdDec->mixer_mat_prev_fx[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); /*hSpar->hMdDec->Q_mixer_mat*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( out_ch = 0; out_ch < numch_out; out_ch++ )
{
@@ -2077,6 +2093,17 @@ void ivas_spar_dec_upmixer_sf_fx(
{
FOR( b = 0; b < num_spar_bands; b++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ hSpar->hMdDec->mixer_mat_prev_fx[0][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[1][out_ch][in_ch][b];
+ hSpar->hMdDec->mixer_mat_prev_fx[1][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[2][out_ch][in_ch][b];
+ hSpar->hMdDec->mixer_mat_prev_fx[2][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[3][out_ch][in_ch][b];
+ hSpar->hMdDec->mixer_mat_prev_fx[3][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_prev_fx[4][out_ch][in_ch][b];
+ move32();
+ move32();
+ move32();
+ move32();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
+
hSpar->hMdDec->mixer_mat_prev_fx[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][( b + ( md_sf * IVAS_MAX_NUM_BANDS ) )]; /*hSpar->hMdDec->Q_mixer_mat*/
move32();
}
@@ -2134,18 +2161,26 @@ void ivas_spar_dec_upmixer_sf_fx(
!( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) )
#endif
{
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, -6 ); /*st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state-6*/
st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 );
move16();
Scale_sig32( output_fx[ch], out_len, -6 ); /*Q5*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[idx_in] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Scale_sig32( output_fx[ch], out_len, 6 ); /*Q11*/
Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, 6 ); /*st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state+6*/
st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = add( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 );
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
idx_in = add( idx_in, 1 );
@@ -2157,18 +2192,26 @@ void ivas_spar_dec_upmixer_sf_fx(
/* CLDFB to time synthesis (overwrite mixer output) */
FOR( out_ch = 0; out_ch < numch_out_dirac; out_ch++ )
{
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, -6 ); /*st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state-6*/
st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 );
move16();
Scale_sig32( output_fx[out_ch], out_len, -6 ); /*Q5*/
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
{
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[out_ch] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
+#ifndef OPT_SBA_AVOID_SPAR_RESCALE
Scale_sig32( output_fx[out_ch], out_len, 6 ); /*Q11*/
Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, 6 ); /*st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state+6*/
st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = add( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 );
move16();
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
}
}
diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c
index 3d9e58ad1adda592d13fac5b3dc29d89aaa45fab..9c1b488cb7e16ef342cd149ab9fba129ffb0b3e1 100644
--- a/lib_dec/ivas_stereo_dft_dec_fx.c
+++ b/lib_dec/ivas_stereo_dft_dec_fx.c
@@ -146,7 +146,7 @@ void stereo_dft_dec_reset_fx(
set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
- hStereoDft->q_res_cod_mem_fx = Q16;
+ hStereoDft->q_res_cod_mem_fx = Q15;
move16();
hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
@@ -1357,7 +1357,7 @@ void stereo_dft_dec_res_fx(
IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
{
set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
- hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
+ hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
move16();
set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
@@ -1370,7 +1370,7 @@ void stereo_dft_dec_res_fx(
scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );
- Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 );
+ Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
IF( !prev_bfi )
{
/*OLA*/
@@ -1378,9 +1378,9 @@ void stereo_dft_dec_res_fx(
FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
{
- win[i] = extract_h( L_add( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
+ win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
move16();
- hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* -1 +15 +1 +1 */
+ hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
move32();
}
@@ -1396,11 +1396,11 @@ void stereo_dft_dec_res_fx(
move16();
FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
{
- win[i] = extract_h( Madd_32_16( Mpy_32_16_1( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), sub( MAX_16, mult( fac, fac ) ) ),
+ win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
move16();
- hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* Q16 */
+ hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
move32();
fac = add( fac, step );
}
@@ -1411,7 +1411,7 @@ void stereo_dft_dec_res_fx(
v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
}
- hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
+ hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */
diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c
index 3b32072f300c229e5c36211909bff0bb84024d22..04aeccbb525f0af2ccf95974b6d878db3f3c4332 100644
--- a/lib_dec/ivas_stereo_icbwe_dec_fx.c
+++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c
@@ -630,7 +630,7 @@ void stereo_icBWE_dec_fx(
Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); /* tmp */
Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, sub( tmp, hStereoICBWE->prev_Q_syn_shb_ola_nonref ) ); /* tmp */
- ScaleShapedSHB_32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 /* 0.9 in Q15 */ ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx );
+ ScaleShapedSHB_fx32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 /* 0.9 in Q15 */ ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx );
hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp;
move16();
@@ -664,7 +664,7 @@ void stereo_icBWE_dec_fx(
Q_syn_shb = tmp;
move16();
- GenSHBSynth_fx_32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) );
+ GenSHBSynth_fx32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) );
}
ELSE
{
@@ -797,7 +797,7 @@ void stereo_icBWE_dec_fx(
Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); /* tmp */
Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
- interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx );
+ interpolate_3_over_2_allpass_fx32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx );
hStereoICBWE->prev_Q_fsout = tmp;
move16();
}
@@ -1312,9 +1312,13 @@ void stereo_icBWE_decproc_fx(
move32();
}
}
+
/* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */
- td_bwe_dec_init_ivas_fx( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_TD, output_Fs );
- fd_bwe_dec_init( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_FD );
+ td_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs );
+ fd_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_FD );
+
+ hCPE->hCoreCoder[0]->prev_Q_bwe_exc = 31;
+ move16();
}
test();
diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c
index c70e606ac7c54298dc672c03b3e7b91dedadc02b..6c2ad055c02f74fed3a8bf773bc70983246c9915 100644
--- a/lib_dec/ivas_stereo_switching_dec_fx.c
+++ b/lib_dec/ivas_stereo_switching_dec_fx.c
@@ -420,11 +420,11 @@ ivas_error stereo_memory_dec_fx(
test();
IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
{
- v_add_32( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[1]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */
- v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */
+ v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */
+ v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */
- v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[1]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k ); /* q_old_outLB_fx */
- v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k ); /* exp(exp_old_out) */
+ v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k ); /* q_old_outLB_fx */
+ v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k ); /* exp(exp_old_out) */
}
/*--------------------------------------------------------------*
@@ -501,7 +501,7 @@ ivas_error stereo_memory_dec_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX/TD CNG\n" ) );
}
- td_cng_dec_init_ivas_fx( st );
+ td_cng_dec_init_fx( st );
}
}
@@ -576,7 +576,7 @@ ivas_error stereo_memory_dec_fx(
move16();
len = NS2SA_FX2( st->output_Fs, 3000000 ); /* Q0 */
move16();
- Copy32( st->hHQ_core->oldOut_fx + nZeros, hCPE->output_mem_fx[1], len ); /* exp(exp_old_out) */
+ Copy32( st->hHQ_core->old_out_fx32 + nZeros, hCPE->output_mem_fx[1], len ); /* exp(exp_old_out) */
}
/* deallocated HQ-core for second channel */
@@ -626,16 +626,10 @@ ivas_error stereo_memory_dec_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
}
- td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs );
+ td_bwe_dec_init_fx( st->hBWE_TD, -1, st->output_Fs );
st->prev_Q_bwe_exc = 31;
move16();
- st->prev_Qx = 0;
- move16();
- st->prev_ener_fx_Q = 31;
- move16();
- st->prev_frame_pow_exp = 0;
- move16();
IF( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL )
{
@@ -643,19 +637,6 @@ ivas_error stereo_memory_dec_fx(
}
fd_bwe_dec_init_fx( st->hBWE_FD );
- set16_fx( st->prev_SWB_fenv_fx, 0, SWB_FENV );
- st->last_wb_bwe_ener_fx = 0;
- move16();
- st->prev_fb_ener_adjust_fx = 0;
- move16();
-
- fd_bwe_dec_init( st, st->hBWE_FD );
- st->hBWE_FD->old_wtda_swb_fx_exp = 0;
- move16();
- st->hBWE_FD->mem_imdct_exp_fx = 0;
- move16();
- st->prev_Q_synth = 0;
- move16();
}
/* Allocated FD_CNG instance for primary channel*/
@@ -804,6 +785,7 @@ ivas_error stereo_memory_dec_fx(
{
Copy32( tmpF_buff, st->hTcxDec->old_syn_Overl_32, L_FRAME16k / 2 ); /* Q11 */
Copy_Scale_sig32_16( st->hTcxDec->old_syn_Overl_32, st->hTcxDec->old_syn_Overl, L_FRAME16k / 2, add( st->Q_syn, 5 ) ); //(st->Qsyn - (11 - 16))
+ st->hTcxDec->Q_old_syn_Overl = st->Q_syn;
}
st->hTcxDec->q_old_synth = st->Q_syn;
move16();
@@ -872,16 +854,10 @@ ivas_error stereo_memory_dec_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) );
}
- td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs );
+ td_bwe_dec_init_fx( st->hBWE_TD, -1, st->output_Fs );
st->prev_Q_bwe_exc = 31;
move16();
- st->prev_Qx = 0;
- move16();
- st->prev_ener_fx_Q = 31;
- move16();
- st->prev_frame_pow_exp = 0;
- move16();
IF( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL )
{
@@ -889,19 +865,6 @@ ivas_error stereo_memory_dec_fx(
}
fd_bwe_dec_init_fx( st->hBWE_FD );
- set16_fx( st->prev_SWB_fenv_fx, 0, SWB_FENV );
- st->last_wb_bwe_ener_fx = 0;
- move16();
- st->prev_fb_ener_adjust_fx = 0;
- move16();
-
- fd_bwe_dec_init( st, st->hBWE_FD );
- st->hBWE_FD->old_wtda_swb_fx_exp = 0;
- move16();
- st->hBWE_FD->mem_imdct_exp_fx = 0;
- move16();
- st->prev_Q_synth = 0;
- move16();
}
}
ELSE /* tdm_LRTD_flag == 0 */
@@ -1263,7 +1226,7 @@ void synchro_synthesis_fx(
{
/* delay CLDFB-based mono output (<= 24.4 kbps) to be aligned with DFT-based mono output (32 kbps), needed to avoid discontinuities with TCX-LTP. */
Copy32( sts[0]->prev_synth_buffer32_fx + delay_comp_DFT, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); /* Q11 */
- delay_signal_fx( output_fx[0], output_frame, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32, delay_diff );
+ delay_signal32_fx( output_fx[0], output_frame, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32, delay_diff );
}
IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
@@ -1280,7 +1243,7 @@ void synchro_synthesis_fx(
}
ELSE
{
- delay_signal_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_DFT );
+ delay_signal32_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_DFT );
}
}
if ( sba_dirac_stereo_flag )
@@ -1601,15 +1564,15 @@ void synchro_synthesis_fx(
IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
{
Copy32( sts[n]->prev_synth_buffer32_fx + delay_comp_DFT, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); /* Q11 */
- delay_signal_fx( output_fx[n], output_frame, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); /* Q11 */
+ delay_signal32_fx( output_fx[n], output_frame, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); /* Q11 */
ivas_post_proc_fx( NULL, hCPE, n, output_fx[n], output_fx, output_frame, 0, output_fx_q );
- delay_signal_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_DFT );
+ delay_signal32_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_DFT );
Copy32( hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, sts[n]->prev_synth_buffer32_fx + delay_comp_DFT, delay_diff ); /* Q11 */
}
ELSE
{
- delay_signal_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_TD );
+ delay_signal32_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_TD );
}
}
@@ -1878,7 +1841,7 @@ void stereo_switching_dec(
/* reset residual coding / ESF (secondary channel) */
set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
- hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
+ hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
move16();
set32_fx( hCPE->input_mem_fx[1], 0, NS2SA_FX2( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) );
@@ -1984,19 +1947,29 @@ void stereo_switching_dec(
move16();
Copy( sts[0]->Q_subfr, sts[1]->Q_subfr, L_Q_MEM );
- sts[1]->prev_Q_bwe_syn = sts[0]->prev_Q_bwe_syn;
- move16();
- sts[1]->prev_Q_bwe_syn2 = sts[0]->prev_Q_bwe_syn2;
- move16();
+ test();
+ IF( sts[0]->hBWE_TD != NULL && sts[1]->hBWE_TD != NULL )
+ {
+ sts[1]->hBWE_TD->prev_Q_bwe_syn = sts[0]->hBWE_TD->prev_Q_bwe_syn;
+ move16();
+ sts[1]->hBWE_TD->prev_Q_bwe_syn2 = sts[0]->hBWE_TD->prev_Q_bwe_syn2;
+ move16();
+
+ sts[1]->hBWE_TD->prev_Q_bwe_exc_fb = sts[0]->hBWE_TD->prev_Q_bwe_exc_fb;
+ move16();
+ sts[1]->hBWE_TD->prev_Qx = sts[0]->hBWE_TD->prev_Qx;
+ move16();
+ }
+
+ test();
+ IF( sts[0]->hBWE_FD != NULL && sts[1]->hBWE_FD != NULL )
+ {
+ sts[1]->hBWE_FD->prev_Q_synth = sts[0]->hBWE_FD->prev_Q_synth;
+ move16();
+ }
- sts[1]->prev_Q_bwe_exc_fb = sts[0]->prev_Q_bwe_exc_fb;
- move16();
- sts[1]->prev_Qx = sts[0]->prev_Qx;
- move16();
sts[1]->prev_Q_bwe_exc = sts[0]->prev_Q_bwe_exc;
move16();
- sts[1]->prev_Q_synth = sts[0]->prev_Q_synth;
- move16();
sts[1]->Q_syn = sts[0]->Q_syn;
move16();
sts[1]->Q_syn2 = sts[0]->Q_syn2;
@@ -2017,7 +1990,7 @@ void stereo_switching_dec(
// 32bit buffer
- Copy32( sts[0]->hHQ_core->oldOut_fx, sts[1]->hHQ_core->oldOut_fx, L_FRAME48k ); /* exp(exp_old_out) */
+ Copy32( sts[0]->hHQ_core->old_out_fx32, sts[1]->hHQ_core->old_out_fx32, L_FRAME48k ); /* exp(exp_old_out) */
Copy32( sts[0]->delay_buf_out32_fx, sts[1]->delay_buf_out32_fx, HQ_DELTA_MAX * HQ_DELAY_COMP ); /* Q11 */
Copy32( sts[0]->hTcxDec->old_syn_Overl_32, sts[1]->hTcxDec->old_syn_Overl_32, 256 ); /* Q_old_syn_Overl*/
// 16 bit buffer
@@ -2027,6 +2000,7 @@ void stereo_switching_dec(
move16();
Copy( sts[0]->delay_buf_out_fx, sts[1]->delay_buf_out_fx, HQ_DELTA_MAX * HQ_DELAY_COMP ); /* Q0 */
Copy( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 ); /* Q_old_syn_Overl*/
+ sts[1]->hTcxDec->Q_old_syn_Overl = sts[0]->hTcxDec->Q_old_syn_Overl;
}
}
ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
@@ -2177,7 +2151,7 @@ void stereo_td2dft_update_fx(
move16();
/* update buffers used for fading when switching to DFT Stereo */
- v_add_fx( sts[0]->hHQ_core->old_outLB_fx + nsLB, sts[1]->hHQ_core->old_outLB_fx + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len );
+ v_add_fx( sts[0]->hHQ_core->old_out_LB_fx32 + nsLB, sts[1]->hHQ_core->old_out_LB_fx32 + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len );
L_lerp_fx_q11( hCPE->old_outLB_mdct_fx, hCPE->old_outLB_mdct_fx, STEREO_MDCT2DFT_FADE_LEN_48k, old_outLB_len );
#ifndef MSAN_FIX
for ( i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ )
@@ -2188,7 +2162,7 @@ void stereo_td2dft_update_fx(
hCPE->old_outLB_mdct_fx[i] = L_shr( hCPE->old_outLB_mdct_fx[i], 1 ); /* Q11 */
move32();
}
- v_add_fx( sts[0]->hHQ_core->oldOut_fx + ns, sts[1]->hHQ_core->oldOut_fx + ns, hCPE->old_out_mdct_fx, old_out_len ); /* exp(exp_old_out) */
+ v_add_fx( sts[0]->hHQ_core->old_out_fx32 + ns, sts[1]->hHQ_core->old_out_fx32 + ns, hCPE->old_out_mdct_fx, old_out_len ); /* exp(exp_old_out) */
#ifndef MSAN_FIX
for ( int i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ )
#else
diff --git a/lib_dec/ivas_tcx_core_dec_fx.c b/lib_dec/ivas_tcx_core_dec_fx.c
index 07eba9e6420b1fb940e78273467317b8d61ae136..c187c351c462fe7ff3b8dcc5b1e91044a659c34d 100644
--- a/lib_dec/ivas_tcx_core_dec_fx.c
+++ b/lib_dec/ivas_tcx_core_dec_fx.c
@@ -639,18 +639,26 @@ void stereo_tcx_core_dec_fx(
move16();
}
/* waveform adjustment */
- concealment_signal_tuning_fx( bfi, st->core, synthFB_fx, &st->plcInfo, st->nbLostCmpt, st->prev_bfi, st->hTonalMDCTConc->secondLastPcmOut, st->last_core_bfi, st->hTonalMDCTConc->lastPcmOut, st );
+ concealment_signal_tuning_fx( st, bfi, synthFB_fx, st->last_core_bfi );
test();
test();
test();
+#ifdef NONBE_FIX_1402_WAVEADJUST
+ IF( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch_fx && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) )
+#else
IF( ( bfi || st->prev_bfi ) && st->hPlcInfo->Pitch && EQ_16( st->hPlcInfo->concealment_method, TCX_NONTONAL ) )
+#endif
{
lerp( synthFB_fx, synth_fx, st->L_frame, hTcxDec->L_frameTCX );
if ( !bfi && st->prev_bfi )
{
+#ifdef NONBE_FIX_1402_WAVEADJUST
+ st->hPlcInfo->Pitch_fx = 0;
+#else
st->hPlcInfo->Pitch = 0;
+#endif
move16();
}
}
diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c
index 9470cba02f00fbf698eaad955f6931bafabddcaa..b4a27bf1a9d70f99f76c76dbc5e558eac9a4bed9 100644
--- a/lib_dec/lib_dec_fx.c
+++ b/lib_dec/lib_dec_fx.c
@@ -3874,7 +3874,7 @@ static ivas_error evs_dec_main_fx(
move32();
hCoreCoder[0]->output_frame_fx = extract_l( Mult_32_16( hCoreCoder[0]->output_Fs, 0x0290 /*Q0*/ ) ); // Q0
move16();
- mdct_switching_dec_ivas_fx( hCoreCoder[0] );
+ mdct_switching_dec_fx( hCoreCoder[0] );
FOR( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ )
{
diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h
index 530cd41d0fed9de98c364a56729a24119db8dc23..712ead8f460687baf4d0335122614e075e08e681 100644
--- a/lib_dec/stat_dec.h
+++ b/lib_dec/stat_dec.h
@@ -58,21 +58,7 @@ typedef enum
FRAMEMODE_NORMAL = 0x0, /* frame available */
FRAMEMODE_MISSING = 0x1, /* frame missing => conceal */
FRAMEMODE_FUTURE = 0x2
-} FRAME_MODE,
- frameMode_fx;
-
-typedef enum
-{
- TONALMDCTCONCEAL_OK = 0,
-
- __error_codes_start = -100,
-
- TONALMDCTCONCEAL_NSAMPLES_LARGER_THAN_MAXBLOCKSIZE,
- TONALMDCTCONCEAL_INVALIDPOINTER,
- TONALMDCTCONCEAL_UNEXPECTED_ERROR,
-
- __error_codes_end
-} TONALMDCTCONCEAL_ERROR;
+} FRAME_MODE;
/*---------------------------------------------------------------*
@@ -174,12 +160,14 @@ typedef struct
typedef struct
{
Word16 L_frameTCX;
- Word16 FrameSize;
+#ifndef NONBE_FIX_1402_WAVEADJUST
Word16 Pitch;
+#endif
Word16 Pitch_fx;
-
+#ifndef NONBE_FIX_1402_WAVEADJUST
Word16 T_bfi;
+#endif
Word8 T_bfi_fx;
Word16 Transient[MAX_POST_LEN];
@@ -194,18 +182,16 @@ typedef struct
Word32 ener_mean_fx;
Word32 ener_fx;
- Word16 zp;
Word16 zp_fx;
Word16 recovery_gain; /*outside waveformadjustment: Q14 - insinde waveformadjustment: Q15*/
Word16 step_concealgain_fx;
Word16 concealment_method;
-
+#ifndef NONBE_FIX_1402_WAVEADJUST
Word16 subframe;
+#endif
Word16 subframe_fx;
-
Word16 nbLostCmpt;
-
Word16 seed;
} T_PLCInfo, *T_PLCInfo_HANDLE;
@@ -219,17 +205,12 @@ typedef struct
{
UWord16 nSamples;
UWord16 nSamplesCore;
-
- Float32 *spectralData_float;
Word16 *spectralData;
-
Word16 spectralData_exp;
Word16 *scaleFactors;
-
Word16 *scaleFactors_exp;
Word16 scaleFactors_max_e;
Word16 gain_tcx_exp;
-
Word16 blockIsValid;
Word16 blockIsConcealed;
Word16 tonalConcealmentActive;
@@ -241,9 +222,7 @@ typedef struct
UWord16 indexOfTonalPeak[MAX_NUMBER_OF_IDX];
UWord16 lowerIndex[MAX_NUMBER_OF_IDX];
UWord16 upperIndex[MAX_NUMBER_OF_IDX];
-
- Word16 phaseDiff[MAX_NUMBER_OF_IDX]; // Q12 /* This one can be stored with 16 bits in range 0..2*PI */
-
+ Word16 phaseDiff[MAX_NUMBER_OF_IDX]; // Q12 /* This one can be stored with 16 bits in range 0..2*PI */
Word16 phase_currentFramePredicted[MAX_NUMBER_OF_IDX * GROUP_LENGTH]; // Q13 /* This one can be stored with 16 bits in range [-pi;pi] 2Q13, but the code has to be adapted to use moduo(2*PI) after adding */
} TonalComponentsInfo;
@@ -262,21 +241,13 @@ typedef struct tonalmdctconceal
blockData secondLastBlockData;
Word16 scaleFactorsBuffers[2][FDNS_NPTS]; /* Contains also global gain. */
-
Word16 scaleFactorsBuffers_exp[2][FDNS_NPTS];
-
- Word16 spectralDataBuffers[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */
-
+ Word16 spectralDataBuffers[2][L_FRAME_MAX]; /* 16 bits is enough, because it is stored before applying scale factors. Take care that power spectrum is also stored here. */
Word16 timeDataBuffer[( 3 * L_FRAME_MAX ) / 2]; /* 16 bits are enough for the TD signal */
-
Word16 *lastPcmOut;
-
Word16 *secondLastPcmOut;
-
Word16 q_lastPcmOut;
-
Word16 *secondLastPowerSpectrum;
-
Word16 secondLastPowerSpectrum_exp;
Word32 scaleFactorsBackground_fx[FDNS_NPTS];
@@ -292,6 +263,7 @@ typedef struct tonalmdctconceal
Word16 faded_signal_nrg_exp;
Word16 nFramesLost;
TonalComponentsInfo *pTCI;
+
} TonalMDCTConceal_INSTANCE, *TonalMDCTConcealPtr;
@@ -396,8 +368,6 @@ typedef struct igfdec_instance_struct
typedef struct tec_dec_structure
{
-
- // fixed variable
Word16 pGainTemp_m[CLDFB_NO_COL_MAX];
Word16 pGainTemp_e[CLDFB_NO_COL_MAX];
Word16 loBuffer[CLDFB_NO_COL_MAX + MAX_TEC_SMOOTHING_DEG];
@@ -426,12 +396,9 @@ typedef struct tcx_ltp_dec_structure
Word32 tcxltp_mem_out_32[L_FRAME48k];
Word16 exp_tcxltp_mem_out;
-
Word16 tcxltp_pitch_int_post_prev;
Word16 tcxltp_pitch_fr_post_prev;
-
Word16 tcxltp_gain_post_prev;
-
Word16 tcxltp_filt_idx_prev;
} TCX_LTP_DEC_DATA, *TCX_LTP_DEC_HANDLE;
@@ -483,7 +450,6 @@ typedef struct tcx_dec_structure
Word16 FBTCXdelayBuf[111]; /* 2.3125ms at 48kHz -> 111 samples */
Word32 FBTCXdelayBuf_32[111]; /* 2.3125ms at 48kHz -> 111 samples */
-
/*TCX resisual Q*/
Word16 resQBits[NB_DIV]; /* number of bits read for the residual Quantization in TCX*/
@@ -519,7 +485,6 @@ typedef struct tcx_dec_structure
Word16 tcxConceal_recalc_exc;
Word16 cummulative_damping_tcx; // Q15
-
} TCX_DEC_DATA, *TCX_DEC_HANDLE;
@@ -557,39 +522,43 @@ typedef struct WI_dec_structure
/*----------------------------------------------------------------------------------*
- * LD music post-filter
+ * NB postfilter / formant postfilter static variables
*----------------------------------------------------------------------------------*/
-typedef struct ld_music_postfilt_structure
+typedef struct pfstat_structure
{
- Word16 LDm_mem_etot_fx; /* LD music post-filter - total energy memory */
+ Word16 on; /* On/off flag */
+ Word16 reset; /* reset flag */
+ Word16 mem_pf_in[L_SUBFR]; /* Input memory Qqmem_pf_in */
+ Word16 mem_stp[L_SUBFR]; /* 1/A(gamma1) memory Qqmem_stp*/
+ Word16 mem_res2[DECMEM_RES2]; /* A(gamma2) residual Q_syn*/
+ Word16 mem_zero[M]; /* null memory to compute i.r. of A(gamma2)/A(gamma1) Q_qmem_zero*/
+ Word16 gain_prec; /*Q14*/ /* for gain adjustment */
- Word16 LDm_last_music_flag; /* LD music post-filter - last music flag */
+} PFSTAT, *PFSTAT_HANDLE;
- Word16 LDm_nb_thr_1; /* LD music post-filter - number of consecutive frames of level 1 */
- Word16 LDm_nb_thr_3;
+/*----------------------------------------------------------------------------------*
+ * LD music post-filter
+ *----------------------------------------------------------------------------------*/
+typedef struct ld_music_postfilt_structure
+{
+ Word16 LDm_mem_etot_fx; /* LD music post-filter - total energy memory */
+ Word16 LDm_last_music_flag; /* LD music post-filter - last music flag */
+ Word16 LDm_nb_thr_1; /* LD music post-filter - number of consecutive frames of level 1 */
+ Word16 LDm_nb_thr_3;
Word16 dct_post_old_exc_fx[DCT_L_POST - OFFSET2];
-
- Word16 LDm_thres_fx[4]; /* LD music post-filter - Classification threshold */
-
- Word16 LDm_lt_diff_etot_fx[MAX_LT]; /* LD music post-filter - long-term total energy variation */
-
+ Word16 LDm_thres_fx[4]; /* LD music post-filter - Classification threshold */
+ Word16 LDm_lt_diff_etot_fx[MAX_LT]; /* LD music post-filter - long-term total energy variation */
Word16 LDm_enh_lp_gbin_fx[VOIC_BINS_HR]; /* LD music post-filter - smoothed suppression gain, per bin FFT */
-
- Word32 LDm_enh_lf_EO_fx[VOIC_BINS_HR]; /* LD music post-filter - old per bin E for previous half frame */
-
- Word16 LDm_enh_min_ns_gain_fx; /* LD music post-filter - minimum suppression gain */
-
- Word32 LDm_bckr_noise_fx[MBANDS_GN_LD]; /* LD music post-filter - background noise estimation per critical band */
+ Word32 LDm_enh_lf_EO_fx[VOIC_BINS_HR]; /* LD music post-filter - old per bin E for previous half frame */
+ Word16 LDm_enh_min_ns_gain_fx; /* LD music post-filter - minimum suppression gain */
+ Word32 LDm_bckr_noise_fx[MBANDS_GN_LD]; /* LD music post-filter - background noise estimation per critical band */
Word16 filt_lfE_fx[DCT_L_POST];
-
Word16 last_nonfull_music;
-
Word16 Old_ener_Q; /* Old energy scaling factor */
-
} MUSIC_POSTFILT_DATA, *MUSIC_POSTFILT_HANDLE;
/*----------------------------------------------------------------------------------*
@@ -600,18 +569,13 @@ typedef struct bass_postfilt_structure
{
Word16 pst_old_syn_fx[NBPSF_PIT_MAX]; /* Bass post-filter - old synthesis buffer 1 Q_syn2-1*/
Word16 q_pst_old_syn;
- Word16 pst_mem_deemp_err_fx; /* Bass post-filter - filter memory of noise LP filter Q_syn2-1*/
-
- Word16 pst_lp_ener_fx; /* Bass post-filter - long-term energy Q8*/
-
- Word16 Track_on_hist[L_TRACK_HIST]; /* Bass post-filter - History of half frame usage */
-
+ Word16 pst_mem_deemp_err_fx; /* Bass post-filter - filter memory of noise LP filter Q_syn2-1*/
+ Word16 pst_lp_ener_fx; /* Bass post-filter - long-term energy Q8*/
+ Word16 Track_on_hist[L_TRACK_HIST]; /* Bass post-filter - History of half frame usage */
Word16 vibrato_hist[L_TRACK_HIST]; /* Bass post-filter - History of frames declared as vibrato */
- // Word16 vibrato_hist[L_TRACK_HIST]; /* Bass post-filter - History of frames declared as vibrato */
Word16 psf_att_fx; /* Bass post-filter - post filter attenuation factor */
Word16 mem_mean_pit_fx[L_TRACK_HIST]; /* Bass post-filter - average pitch memory */
-
} BPF_DEC_DATA, *BPF_DEC_HANDLE;
/*------------------------------------------------------------------------------------------*
@@ -620,75 +584,54 @@ typedef struct bass_postfilt_structure
typedef struct td_cng_dec_structure
{
- Word16 cng_seed; /* DTX/CNG - seed for white noise random generator */
- // Word16 cng_seed; /*CNG and DTX - seed for white noise random generator*/
- Word32 Enew_fx; /* CNG and DTX - decoded residual energy Q6*/
-
+ Word16 cng_seed; /* DTX/CNG - seed for white noise random generator */
+ Word32 Enew_fx; /* CNG and DTX - decoded residual energy Q6*/
Word16 old_enr_index; /* DTX/CNG - index of last encoded CNG energy */
-
Word16 cng_ener_seed; /* DTX/CNG - seed for random generator for variation of excitation energy */
-
Word16 cng_ener_seed1;
-
Word16 last_allow_cn_step;
-
- Word16 ho_hist_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */
-
- Word16 ho_hist_ptr; /* DTX/CNG - pointer for averaging buffers */
-
+ Word16 ho_hist_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */
+ Word16 ho_hist_ptr; /* DTX/CNG - pointer for averaging buffers */
Word32 ho_sid_bw; /* DTX/CNG - SID bandwidth flags */
- // Word32 ho_sid_bw; /* CNG and DTX - SID bandwidth flags */
Word16 ho_lsp_hist_fx[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */
Word32 ho_ener_hist_fx[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ /*Q6 */
Word32 ho_env_hist_fx[HO_HIST_SIZE * NUM_ENV_CNG];
-
-
- Word16 act_cnt; /* DTX/CNG - counter of active frames */
-
- Word16 ho_circ_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */
-
- Word16 ho_circ_ptr; /* DTX/CNG - pointer for averaging buffers */
- // Word16 ho_circ_ptr; /* CNG and DTX - pointer for averaging buffers */
-
+ Word16 act_cnt; /* DTX/CNG - counter of active frames */
+ Word16 ho_circ_size; /* DTX/CNG - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */
+ Word16 ho_circ_ptr; /* DTX/CNG - pointer for averaging buffers */
Word16 ho_lsp_circ_fx[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */
Word32 ho_ener_circ_fx[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ /* Q6 */
Word32 ho_env_circ_fx[HO_HIST_SIZE * NUM_ENV_CNG];
-
-
- Word16 num_ho; /* DTX/CNG - number of selected hangover frames */
-
+ Word16 num_ho; /* DTX/CNG - number of selected hangover frames */
Word16 ho_16k_lsp[HO_HIST_SIZE]; /* DTX/CNG - 16k LSPs flags */
- // Word16 ho_16k_lsp[HO_HIST_SIZE]; /* DTX/CNG - 16k LSPs flags */
-
-
- Word16 act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */
- // Word16 act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */
+ Word16 act_cnt2; /* DTX/CNG - counter of active frames for CNG_mode switching */
Word32 old_env_fx[20];
Word32 lp_env_fx[20];
Word16 exc_mem_fx[24];
Word16 exc_mem1_fx[30];
+ Word16 interpol_3_2_cng_dec_fx[INTERP_3_2_MEM_LEN];
+
+ /* SWB DTX/CNG parameters */
+ Word16 shb_cng_ener_fx;
+ Word32 shb_cng_ener_fx_32; // Q(11)
Word16 shb_lpcCNG_fx[LPC_SHB_ORDER + 1]; /* Assumed in Q12 */
Word16 shb_cng_gain_fx; /* Assumed in Q8 */
+ Word32 shb_cng_gain_fx_32; // Q(11)
+ Word16 wb_cng_ener_fx;
+ Word32 wb_cng_ener_fx_32; // Q(11)
+ Word16 last_wb_cng_ener_fx;
+ Word32 last_wb_cng_ener_fx_32; // Q(11)
+ Word16 last_shb_cng_ener_fx;
+ Word32 last_shb_cng_ener_fx_32; // Q(11)
Word16 swb_cng_seed;
- Word16 shb_dtx_count;
- Word16 trans_cnt;
-
- Word16 interpol_3_2_cng_dec_fx[INTERP_3_2_MEM_LEN];
-
- Word32 shb_cng_ener_fx_32; // Q(11)
- Word32 shb_cng_gain_fx_32; // Q(11)
- Word32 wb_cng_ener_fx_32; // Q(11)
- Word32 last_wb_cng_ener_fx_32; // Q(11)
- Word32 last_shb_cng_ener_fx_32; // Q(11)
Word16 lsp_shb_prev_fx[LPC_SHB_ORDER]; // Q(14)
Word16 lsp_shb_prev_prev_fx[LPC_SHB_ORDER]; // Q(14)
-
- Word16 burst_cnt;
- Word32 last_shb_ener_fx; // Q(11)
-
- Word16 last_cng_type_fx; /* DTX/CNG - flag indicating last frame LP or CLDFB based SID/CNG */
-
+ Word16 shb_dtx_count_fx;
+ Word16 trans_cnt_fx;
+ Word16 burst_cnt_fx;
+ Word16 last_shb_ener_fx;
+ Word32 last_shb_ener_fx_32; // Q(11)
} TD_CNG_DEC_DATA, *TD_CNG_DEC_HANDLE;
@@ -704,36 +647,27 @@ typedef struct sc_vbr_dec_structure
/* DTFS variables */
Word16 dtfs_dec_a_fx[MAXLAG_WI]; /*Variable Q format in dtfs_dec_Q*/
Word16 dtfs_dec_b_fx[MAXLAG_WI]; /*Variable Q format in dtfs_dec_Q*/
-
Word16 dtfs_dec_lag;
-
Word16 dtfs_dec_nH;
-
Word16 dtfs_dec_nH_4kHz;
-
Word16 dtfs_dec_upper_cut_off_freq_of_interest_fx; /*Q0*/
Word16 dtfs_dec_upper_cut_off_freq_fx; /*Q0*/
Word16 ph_offset_D_fx; /* normalized by 2Pi Q15*/
Word16 lastLgainD_fx; /* previous gain value for the low band Q11*/
Word16 lastHgainD_fx; /* previous gain value for the high band Q11 */
Word16 lasterbD_fx[NUM_ERB_WB]; /* previous amplitude spectrum (ERB) Q13*/
-
- Word16 dtfs_dec_Q; /*Q0*/
+ Word16 dtfs_dec_Q; /*Q0*/
/* NELP decoder variables */
Word32 bp1_filt_mem_nb_dec_fx[14]; /* qfm currently Q0*/
Word16 bp1_filt_mem_wb_dec_fx[8]; /* qfm currently Q0*/
Word16 shape1_filt_mem_dec_fx[10]; /* qfm currently Q0*/
Word16 shape2_filt_mem_dec_fx[10]; /* qfm currently Q0*/
-
Word16 shape3_filt_mem_dec_fx[10]; /* qfm currently Q0*/
-
Word16 nelp_dec_seed;
-
Word16 FadeScale_fx; /*Q15*/
-
} SC_VBR_DEC_DATA, *SC_VBR_DEC_HANDLE;
/*----------------------------------------------------------------------------------*
@@ -743,46 +677,24 @@ typedef struct sc_vbr_dec_structure
typedef struct hq_nbfec_structure
{
Word16 prev_last_core; /* !!! note: the parameter is identical to last_core in IVAS */
- // Word16 prev_last_core; /* !!! note: the parameter is identical to last_core in IVAS */
Word16 diff_energy_fx;
-
Word16 stat_mode_out;
-
Word16 stat_mode_old;
-
-
Word16 phase_mat_flag;
-
Word16 phase_mat_next;
-
Word16 old_Min_ind;
-
Word16 old_auOut_2fr_fx[L_FRAME8k * 2];
-
Word16 old_out_pha_fx[2][N_LEAD_NB]; /* FEC for HQ Core, 0-phase matching old_out, 1-overlapping original old_out and phase matching old_out*/
-
Word32 ynrm_values_fx[MAX_SB_NB][MAX_PGF];
-
Word32 r_p_values_fx[MAX_SB_NB][MAX_ROW];
-
Word16 Norm_gain_fx[SFM_N_NB];
-
- /*Word16 old_hqswb_clas;*/ /* only used in inactive code, where it might probably be replaced by old_hqswb_clas_fx */
-
-
Word16 HQ_FEC_seed;
-
Word16 energy_MA_Curr_fx[2];
-
Word16 prev_sign_switch[HQ_FEC_SIGN_SFM];
-
Word16 prev_sign_switch_2[HQ_FEC_SIGN_SFM];
-
Word32 old_coeffs_fx[L_FRAME8k]; /* HQ core - old coefficients (for FEC) */
-
Word32 oldIMDCTout_fx[L_FRAME8k / 2];
-
Word16 prev_oldauOut_fx[L_FRAME8k];
@@ -794,86 +706,52 @@ typedef struct hq_nbfec_structure
typedef struct hq_dec_structure
{
-
- Word32 oldOut_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA */
- Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA */
+ Word32 old_out_fx32[L_FRAME48k]; /* HQ core - previous synthesis for OLA */
+ Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA */
Word16 exp_old_out;
-
Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */
- Word32 old_outLB_fx[L_FRAME32k];
+ Word32 old_out_LB_fx32[L_FRAME32k];
Word16 q_old_outLB_fx;
-
Word16 Q_old_wtda_LB;
Word16 Q_old_wtda;
Word16 Q_old_postdec; /*scaling of the output of core_switching_post_dec_fx() */
-
Word16 last_hq_core_type;
-
Word16 old_is_transient[3]; /* HQ core - previous transient flag (for FEC) */
Word16 mem_norm[SFM_N_ENV_STAB]; /* Q0 */
-
- Word16 mem_env_delta; /* Q11 */
-
- Word16 no_att_hangover; /* Q0 */
-
- Word32 energy_lt_fx; /* Q13 */
-
+ Word16 mem_env_delta; /* Q11 */
+ Word16 no_att_hangover; /* Q0 */
+ Word32 energy_lt_fx; /* Q13 */
Word16 hq_generic_seed;
-
Word16 prev_noise_level_fx[2]; /* Q15 */
-
Word16 prev_hqswb_clas;
-
- Word16 prev_R; /* the table of bit allocation of last frame */
-
- Word16 prev_SWB_peak_pos[SPT_SHORTEN_SBNUM];
-
+ Word16 prev_R; /* the table of bit allocation of last frame */
Word32 prev_coeff_out_fx[L_HQ_WB_BWE]; /* Q12 */ /* the coefficients of last frame */
Word16 prev_SWB_peak_pos_fx[SPT_SHORTEN_SBNUM];
-
Word16 HqVoicing;
Word16 fer_samples_fx[L_FRAME48k];
Word16 Q_fer_samples;
Word32 prev_normq_fx[SFM_N_WB]; /* Q14 */ /* previous norms */
-
-
- Word32 prev_env_fx[SFM_N_WB]; /* previous noise envelopes */
-
+ Word32 prev_env_fx[SFM_N_WB]; /* previous noise envelopes */
Word16 prev_env_Q[SFM_N_WB];
-
Word32 last_ni_gain_fx[BANDS_MAX];
-
Word16 last_env_fx[BANDS_MAX];
-
Word16 last_max_pos_pulse;
/* pre-echo reduction */
- Word16 memfilt_lb_fx; /* Q0 */
-
+ Word16 memfilt_lb_fx; /* Q0 */
Word32 mean_prev_hb_fx; /* Q0 */
-
- Word16 smoothmem_fx; /* Q15 */
-
- Word32 mean_prev_fx; /* Q0 */
-
+ Word16 smoothmem_fx; /* Q15 */
+ Word32 mean_prev_fx; /* Q0 */
Word32 mean_prev_nc_fx; /* Q0 */
-
- Word16 wmold_hb_fx; /* Q15 */
-
+ Word16 wmold_hb_fx; /* Q15 */
Word16 prevflag;
-
Word16 pastpre;
-
-
Word16 prev_frm_hfe2;
-
Word16 prev_stab_hfe2;
-
- Word16 prev_ni_ratio_fx; /* 15 */
-
+ Word16 prev_ni_ratio_fx; /* 15 */
Word16 prev_En_sb_fx[NB_SWB_SUBBANDS]; /* QsEn(4) */
/*----------------------------------------------------------------------------------*
@@ -882,50 +760,30 @@ typedef struct hq_dec_structure
/* HQ PHASE ECU internal state */
Word16 time_offs;
-
Word16 X_sav_fx[PH_ECU_SPEC_SIZE];
-
Word16 Q_X_sav;
-
Word16 num_p;
-
Word16 plocs[MAX_PLOCS];
-
Word32 plocsi_fx[MAX_PLOCS];
-
Word16 env_stab_fx;
-
Word16 mem_norm_hqfec[SFM_N_ENV_STAB];
-
Word16 mem_env_delta_hqfec;
-
Word16 env_stab_plc_fx;
-
Word16 env_stab_state_p_fx[NUM_ENV_STAB_PLC_STATES];
-
Word16 envstabplc_hocnt;
Word16 mag_chg_1st_fx[LGW_MAX]; /* i/o: per band magnitude modifier for transients*/
-
- Word16 Xavg_fx[LGW_MAX]; /* Frequency group average gain to fade to */
-
- Word16 beta_mute_fx; /* Factor for long-term mute */
+ Word16 Xavg_fx[LGW_MAX]; /* Frequency group average gain to fade to */
+ Word16 beta_mute_fx; /* Factor for long-term mute */
Word16 last_fec;
-
Word16 ph_ecu_HqVoicing;
-
Word16 oldHqVoicing;
-
Word16 oldgapsynth_fx[L_FRAME48k];
-
Word16 ph_ecu_active; /* Set if Phase ECU was used in last bad frame */
-
Word16 ni_seed_forfec;
-
Word16 ber_occured_in_pvq; /* flag for BER detection from PVQ routines */
-
} HQ_DEC_DATA, *HQ_DEC_HANDLE;
@@ -935,20 +793,15 @@ typedef struct hq_dec_structure
typedef struct zero_bwe_dec_structure
{
- Word16 seed2; /* HF (6-7kHz) BWE - seed for random signal generator */
-
-
- Word16 mem_hp400_fx[6]; /* HF (6-7kHz) BWE - hp400 filter memory */
- Word16 q_mem_hp400_fx;
-
- Word16 mem_hf_fx[2 * L_FILT16k]; /* HF (6-7kHz) BWE - band-pass filter memory Q(-2-memExp1)*/
-
- Word16 mem_syn_hf_fx[M]; /* HF (6-7kHz) BWE - synthesis filter memory Q0*/
-
+ Word16 seed2; /* HF (6-7kHz) BWE - seed for random signal generator */
+ Word16 mem_hp400_fx[6]; /* HF (6-7kHz) BWE - hp400 filter memory */
+ Word16 q_mem_hp400_fx; /* Exponent for mem_hp400_fx[] scaling */
+ Word16 mem_hf_fx[2 * L_FILT16k]; /* HF (6-7kHz) BWE - band-pass filter memory Q(-2-memExp1)*/
+ Word16 mem_syn_hf_fx[M]; /* HF (6-7kHz) BWE - synthesis filter memory Q0 */
Word16 delay_syn_hf_fx[NS2SA( 16000, DELAY_CLDFB_NS )]; /* HF (6-7kHz) BWE - To synchronise BWE content with postfiltered synthesis Q0*/
+ Word16 mem_hp_interp_fx[INTERP_3_1_MEM_LEN]; /* HF (6-7 kHz) BWE - interp. memory */
+ Word16 memExp1; /* Exponent for mem_hf_fx scaling */
- Word16 mem_hp_interp_fx[INTERP_3_1_MEM_LEN]; /* HF (6-7 kHz) BWE - interp. memory */
- Word16 memExp1; /* Exponent for mem_hf_fx scaling*/
} ZERO_BWE_DEC_DATA, *ZERO_BWE_DEC_HANDLE;
@@ -960,147 +813,104 @@ typedef struct td_bwe_dec_structure
{
/* states for the filters used in generating SHB excitation from WB excitation */
Word16 state_lpc_syn_fx[LPC_SHB_ORDER];
-
Word32 mem_csfilt_fx[2];
/* states for the filters used in generating SHB signal from SHB excitation*/
Word16 state_syn_shbexc_fx[L_SHB_LAHEAD];
-
Word16 syn_overlap_fx[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/
- Word32 syn_overlap_fx_32[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain*/
+ Word32 syn_overlap_fx_32[L_SHB_LAHEAD]; /* overlap buffer used to Adjust SHB Frame Gain, IVAS 32-bit variant */
/* previous frame parameters for frame error concealment */
Word16 lsp_prevfrm_fx[LPC_SHB_ORDER];
-
Word32 GainFrame_prevfrm_fx;
-
Word16 GainShape_Delay_fx[NUM_SHB_SUBFR / 2];
-
Word16 GainAttn_fx;
-
Word16 old_bwe_exc_fx[PIT16k_MAX * 2]; /*Q_exc*/
-
Word16 bwe_seed[2];
-
Word32 bwe_non_lin_prev_scale_fx;
-
Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET];
-
Word32 genSHBsynth_Hilbert_Mem_fx[HILBERT_MEM_SIZE];
Word16 mem_genSHBexc_filt_down_shb_fx[2 * ALLPASSSECTIONS_STEEP + 1];
-
Word16 mem_genSHBexc_filt_down_wb2_fx[2 * ALLPASSSECTIONS_STEEP + 1];
-
Word16 mem_genSHBexc_filt_down_wb3_fx[2 * ALLPASSSECTIONS_STEEP + 1];
-
Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[2 * ALLPASSSECTIONS_STEEP];
- Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[2 * ALLPASSSECTIONS_STEEP];
-
+ Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[2 * ALLPASSSECTIONS_STEEP]; /* IVAS 32-bit variant */
Word16 state_lsyn_filt_shb_fx[2 * ALLPASSSECTIONS_STEEP];
- Word32 state_lsyn_filt_shb_fx_32[2 * ALLPASSSECTIONS_STEEP];
-
+ Word32 state_lsyn_filt_shb_fx_32[2 * ALLPASSSECTIONS_STEEP]; /* IVAS 32-bit variant */
Word16 state_lsyn_filt_dwn_shb_fx[2 * ALLPASSSECTIONS_STEEP];
- Word32 state_lsyn_filt_dwn_shb_fx_32[2 * ALLPASSSECTIONS_STEEP];
-
+ Word32 state_lsyn_filt_dwn_shb_fx_32[2 * ALLPASSSECTIONS_STEEP]; /* IVAS 32-bit variant */
Word16 mem_resamp_HB_fx[INTERP_3_1_MEM_LEN];
- Word32 mem_resamp_HB_fx_32[INTERP_3_1_MEM_LEN];
-
+ Word32 mem_resamp_HB_fx_32[INTERP_3_1_MEM_LEN]; /* IVAS 32-bit variant */
Word16 mem_resamp_HB_32k_fx[2 * ALLPASSSECTIONS_STEEP + 1];
- Word32 mem_resamp_HB_32k_fx_32[2 * ALLPASSSECTIONS_STEEP + 1];
+ Word32 mem_resamp_HB_32k_fx_32[2 * ALLPASSSECTIONS_STEEP + 1]; /* IVAS 32-bit variant */
+ Word32 prev_pow_exc16kWhtnd_fx32; /* power of the LB excitation signal in the previous frame */
+ Word16 prev_mix_factor_fx; /* mixing factor in the previous frame */
Word16 state_32and48k_WB_upsample_fx[2 * ALLPASSSECTIONS_STEEP]; /* !!! this memory in FLP is called mem_resamp_HB */
- Word32 prev_pow_exc16kWhtnd_fx32; /* power of the LB excitation signal in the previous frame */
- Word16 prev_mix_factor_fx; /* mixing factor in the previous frame */
-
Word16 syn_dm_phase;
-
Word32 fbbwe_hpf_mem_fx[4][4];
-
Word16 fbbwe_hpf_mem_fx_Q[4];
-
Word32 prev_wb_bwe_frame_pow_fx;
-
Word32 prev_swb_bwe_frame_pow_fx;
-
Word32 prev_ener_fx;
-
Word16 prev_GainShape_fx;
-
Word16 fb_state_lpc_syn_fx[LPC_SHB_ORDER];
-
Word16 fb_tbe_demph_fx;
-
Word16 prev_fbbwe_ratio_fx;
-
Word16 tbe_demph_fx;
-
Word16 tbe_premph_fx;
-
Word16 mem_stp_swb_fx[LPC_SHB_ORDER];
-
Word16 *ptr_mem_stp_swb_fx;
-
Word16 gain_prec_swb_fx;
-
Word16 mem_zero_swb_fx[LPC_SHB_ORDER];
Word16 swb_lsp_prev_interp_fx[LPC_SHB_ORDER];
-
Word32 prev1_shb_ener_sf_fx, prev2_shb_ener_sf_fx, prev3_shb_ener_sf_fx;
-
Word16 prev_res_shb_gshape_fx, prev_mixFactors_fx;
-
Word16 tilt_mem_fx;
-
Word16 prev_lsf_diff_fx[LPC_SHB_ORDER - 2]; /*Q15*/
-
- Word16 prev_tilt_para_fx; /*Q10*/
-
- Word16 cur_sub_Aq_fx[M + 1]; /*Q12*/
-
+ Word16 prev_tilt_para_fx; /*Q10*/
+ Word16 cur_sub_Aq_fx[M + 1]; /*Q12*/
/* quantized data */
Word16 lsf_idx[NUM_Q_LSF];
-
Word16 m_idx;
-
Word16 grid_idx;
-
Word16 idxSubGains;
-
Word16 idxFrameGain;
-
Word16 idx_shb_fr_gain;
-
Word16 idx_res_gs[NB_SUBFR16k];
-
Word16 idx_mixFac;
Word16 lsf_WB;
-
Word16 gFrame_WB;
Word16 idxGain;
Word16 old_core_synth_fx[L_FRAME16k];
-
Word16 old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH];
- Word32 old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH];
+ Word32 old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH]; /* IVAS 32-bit variant */
Word16 int_3_over_2_tbemem_dec_fx[INTERP_3_2_MEM_LEN];
- Word32 int_3_over_2_tbemem_dec_fx_32[INTERP_3_2_MEM_LEN];
+ Word32 int_3_over_2_tbemem_dec_fx_32[INTERP_3_2_MEM_LEN]; /* IVAS 32-bit variant */
Word16 old_hb_synth_fx[L_FRAME48k];
Word16 tilt_swb_fec_fx; /* FEC - SWB TBE TILT */
Word16 prev_hb_synth_fx_exp;
-
+ Word16 prev_frame_pow_exp;
+ Word16 prev_ener_fx_Q;
+ Word16 prev_lpc_wb_fx[LPC_SHB_ORDER_WB];
+ Word16 prev_Q_bwe_syn;
+ Word16 prev_Q_bwe_syn2;
+ Word16 prev_Q_bwe_exc_fb;
+ Word16 prev_Qx;
} TD_BWE_DEC_DATA, *TD_BWE_DEC_HANDLE;
@@ -1110,42 +920,27 @@ typedef struct td_bwe_dec_structure
typedef struct fd_bwe_dec_structure
{
- Word16 old_wtda_wb_fx_exp;
-
Word16 L_old_wtda_swb_fx[L_FRAME48k];
Word32 L_old_wtda_swb_fx32[L_FRAME48k];
-
Word16 old_wtda_swb_fx_exp;
-
Word16 old_syn_12k8_16k_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; /*Q_syn2-1*/
-
Word16 mem_deemph_old_syn_fx;
-
Word16 prev_mode;
-
-
+ Word16 prev_SWB_fenv_fx[SWB_FENV];
Word16 prev_Energy_fx;
-
Word32 prev_Energy_wb_fx;
-
Word16 prev_L_swb_norm;
-
Word16 Seed;
-
Word16 memExp1;
-
Word16 prev_frica_flag;
-
Word16 mem_imdct_fx[L_FRAME48k];
-
Word16 mem_imdct_exp_fx;
-
Word16 prev_td_energy_fx;
-
Word16 prev_weight_fx;
-
Word16 prev_flag;
-
+ Word16 last_wb_bwe_ener_fx;
+ Word16 prev_Q_synth;
+ Word16 prev_fb_ener_adjust_fx;
} FD_BWE_DEC_DATA, *FD_BWE_DEC_HANDLE;
@@ -1156,22 +951,13 @@ typedef struct fd_bwe_dec_structure
typedef struct hr_swb_bwe_dec_structure
{
-
- Word16 bwe_highrate_seed;
Word16 bwe_highrate_seed_fx;
-
Word16 t_audio_prev_fx[2 * END_FREQ_BWE_FULL_FB / 50 - NUM_NONTRANS_START_FREQ_COEF];
-
Word16 t_audio_prev_fx_exp[NUM_TIME_SWITCHING_BLOCKS];
-
- Word16 old_is_transient_hr_bwe;
Word16 old_is_transient_hr_bwe_fx;
-
Word32 L_mem_EnergyLT_fx;
-
Word16 mem_EnergyLT_fx_exp;
-
} HR_BWE_DEC_DATA, *HR_BWE_DEC_HANDLE;
@@ -1199,45 +985,26 @@ typedef struct amrwb_io_dec_structure
{
Word16 past_qua_en_fx[GAIN_PRED_ORDER]; /* gain quantization memory (used also in AMR-WB IO mode) */
- Word16 prev_r_fx; /* HF BWE - previous sub-frame gain */
-
- Word16 fmerit_w_sm_fx; /* HF BWE - fmerit parameter memory */
-
- Word16 frame_count; /* HF BWE - frame count */
- Word16 frame_count_fx; /* HF BWE - frame count */
- Word16 ne_min_fx; /* HF BWE - minimum Noise gate - short-term energy */
-
- Word16 fmerit_m_sm_fx; /* HF BWE - memory of fmerit_m param */
-
+ Word16 prev_r_fx; /* HF BWE - previous sub-frame gain */
+ Word16 fmerit_w_sm_fx; /* HF BWE - fmerit parameter memory */
+ Word16 frame_count_fx; /* HF BWE - frame count */
+ Word16 ne_min_fx; /* HF BWE - minimum Noise gate - short-term energy */
+ Word16 fmerit_m_sm_fx; /* HF BWE - memory of fmerit_m param */
Word16 voice_fac_amr_wb_hf; /* HF BWE - voice factor */
-
- Word16 unvoicing_fx; /* HF BWE - unvoiced parameter */
-
- Word16 unvoicing_sm_fx; /* HF BWE - smoothed unvoiced parameter */
-
- Word16 unvoicing_flag; /* HF BWE - unvoiced flag */
- Word16 unvoicing_flag_fx; /* HF BWE - unvoiced flag */
-
- Word16 voicing_flag; /* HF BWE - voiced flag */
- Word16 voicing_flag_fx; /* HF BWE - voiced flag */
-
- Word16 start_band_old; /* HF BWE - previous start point for copying frequency band */
- Word16 start_band_old_fx; /* HF BWE - previous start point for copying frequency band */
- Word32 OptCrit_old_fx; /* HF BWE - previous criterion value for deciding the start point */
+ Word16 unvoicing_fx; /* HF BWE - unvoiced parameter */
+ Word16 unvoicing_sm_fx; /* HF BWE - smoothed unvoiced parameter */
+ Word16 unvoicing_flag_fx; /* HF BWE - unvoiced flag */
+ Word16 voicing_flag_fx; /* HF BWE - voiced flag */
+ Word16 start_band_old_fx; /* HF BWE - previous start point for copying frequency band */
+ Word32 OptCrit_old_fx; /* HF BWE - previous criterion value for deciding the start point */
/* Improvement of unvoiced and audio signals in AMR-WB IO mode */
- Word16 UV_cnt; /* number of consecutives frames classified as UV */
- Word16 UV_cnt_fx; /* number of consecutives frames classified as UV */
- Word16 LT_UV_cnt_fx; /* long-term consecutives frames classified as UV */
-
- Word16 Last_ener_fx; /* last_energy frame */
-
+ Word16 UV_cnt_fx; /* number of consecutives frames classified as UV */
+ Word16 LT_UV_cnt_fx; /* long-term consecutives frames classified as UV */
+ Word16 Last_ener_fx; /* last_energy frame */
Word16 lt_diff_etot_fx[MAX_LT]; /* stability estimation - long-term total energy variation */
-
- Word16 old_Aq_fx[68]; /* old LPC filter coefficient */
-
- Word16 lt_voice_fac_fx; /* average voice factor over 4 sub-frames */
-
+ Word16 old_Aq_fx[68]; /* old LPC filter coefficient */
+ Word16 lt_voice_fac_fx; /* average voice factor over 4 sub-frames */
} AMRWB_IO_DEC_DATA, *AMRWB_IO_DEC_HANDLE;
@@ -1255,115 +1022,74 @@ typedef struct Decoder_State
* Common parameters
*----------------------------------------------------------------------------------*/
- Word16 idchan; /* channel ID (audio channel number) */
- Word16 element_mode; /* element mode */
+ Word16 idchan; /* channel ID (audio channel number) */
+ Word16 element_mode; /* element mode */
+#ifdef DEBUGGING
+ Word16 id_element; /* element ID */
+#endif
Word32 element_brate; /* element bitrate */
Word16 codec_mode; /* Mode 1 or 2 */
Word16 mdct_sw_enable; /* MDCT switching enable flag */
Word16 mdct_sw; /* MDCT switching indicator */
Word16 last_codec_mode; /* last used codec mode */
- UWord16 *bit_stream; /* pointer to bitstream buffer */
-
- Word16 next_bit_pos; /* position of the next bit to be read from the bitstream */
-
- Word16 bitstreamformat; /* Bitstream format flag (G.192/MIME/VOIP_G192_RTP/VOIP_RTPDUMP) */
- Word16 sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */
- Word16 amrwb_rfc4867_flag; /* MIME from rfc4867 is used */
- Word16 total_num_bits; /* == st->total_brate / 50 */
-
- Word16 BER_detect; /* flag to signal detected bit error in the bitstream */
-
- Word32 output_Fs; /* output sampling rate */
-
- Word16 output_frame_fx; /* Output frame length Q0*/
-
- Word32 total_brate; /* total bitrate in kbps of the codec */
-
- Word32 last_total_brate; /* last total bitrate in kbps of the codec */
- // Word32 last_total_brate_fx; /* last total bitrate in kbps of the codec Q0*/
-
- Word32 last_total_brate_ber; /* last total bitrate in kbps of the codec - used only when first frame is lost and BER is detected afterwards */
-
- Word16 bits_frame_nominal; /* avg bits per frame on active frame */
- Word32 last_bits_frame_nominal; /* last avg bits per frame on active frame */
- Word16 flag_ACELP16k; /* flag indicating use of ACELP core at 16kHz internal sampling rate */
- Word16 bits_frame_channel; /* bits frame channel */
- Word16 side_bits_frame_channel; /* bits frame channel */
-
- Word16 core; /* core (ACELP_CORE, TCX_20_CORE, TCX_10_CORE, HQ_CORE, AMR_WB_CORE) */
-
- Word16 coder_type; /* coder type */
- Word16 transform_type[2]; /* TCX20/10/5 mode in each subframe */
-
- Word32 core_brate; /* core bitrate */
-
- Word32 last_core_brate; /* previous frame core bitrate */
-
- Word16 extl; /* extension layer */
-
- Word16 extl_orig; /* extension layer */
-
- Word16 last_extl; /* previous extension layer */
-
- Word32 extl_brate; /* extension layer bitrate */
-
- Word32 extl_brate_orig; /* extension layer bitrate */
-
- Word16 L_frame; /* ACELP core internal frame length */
-
- Word16 bwidth; /* encoded signal bandwidth */
-
- Word16 Opt_AMR_WB; /* flag indicating AMR-WB IO mode */
-
- Word16 Opt_VOIP_fx; /* flag indicating VOIP mode with JBM */
-
- Word16 ini_frame; /* initialization frames counter */
-
+ UWord16 *bit_stream; /* pointer to bitstream buffer */
+ Word16 next_bit_pos; /* position of the next bit to be read from the bitstream */
+ Word16 bitstreamformat; /* Bitstream format flag (G.192/MIME/VOIP_G192_RTP/VOIP_RTPDUMP) */
+ Word16 sdp_hf_only; /* RTP payload format parameter: only Header-Full format without zero padding for size collision avoidance */
+ Word16 amrwb_rfc4867_flag; /* MIME from rfc4867 is used */
+ Word16 total_num_bits; /* == st->total_brate / 50 */
+ Word16 BER_detect; /* flag to signal detected bit error in the bitstream */
+ Word32 output_Fs; /* output sampling rate */
+ Word16 output_frame_fx; /* Output frame length Q0*/
+ Word32 total_brate; /* total bitrate in kbps of the codec */
+ Word32 last_total_brate; /* last total bitrate in kbps of the codec */
+ Word32 last_total_brate_ber; /* last total bitrate in kbps of the codec - used only when first frame is lost and BER is detected afterwards */
+ Word16 bits_frame_nominal; /* avg bits per frame on active frame */
+ Word32 last_bits_frame_nominal; /* last avg bits per frame on active frame */
+ Word16 flag_ACELP16k; /* flag indicating use of ACELP core at 16kHz internal sampling rate */
+ Word16 bits_frame_channel; /* bits frame channel */
+ Word16 side_bits_frame_channel; /* bits frame channel */
+ Word16 core; /* core (ACELP_CORE, TCX_20_CORE, TCX_10_CORE, HQ_CORE, AMR_WB_CORE) */
+ Word16 coder_type; /* coder type */
+ Word16 transform_type[2]; /* TCX20/10/5 mode in each subframe */
+ Word32 core_brate; /* core bitrate */
+ Word32 last_core_brate; /* previous frame core bitrate */
+ Word16 extl; /* extension layer */
+ Word16 extl_orig; /* extension layer */
+ Word16 last_extl; /* previous extension layer */
+ Word32 extl_brate; /* extension layer bitrate */
+ Word32 extl_brate_orig; /* extension layer bitrate */
+ Word16 L_frame; /* ACELP core internal frame length */
+ Word16 bwidth; /* encoded signal bandwidth */
+ Word16 Opt_AMR_WB; /* flag indicating AMR-WB IO mode */
+ Word16 Opt_VOIP_fx; /* flag indicating VOIP mode with JBM */
+ Word16 ini_frame; /* initialization frames counter */
Word16 prev_coder_type; /* coding type of last frame */
Word16 low_rate_mode; /* low-rate mode flag */
Word16 last_low_rate_mode; /* previous frame low-rate mode flag */
Word16 inactive_coder_type_flag; /* inactive coder type flag (0 = AVQ / 1 = GSC) */
- Word16 CNG_fx; /* RXDTX handler: CNG=1, nonCNG=0 */
- Word16 prev_ft_speech_fx; /* RXDTX handler: previous frametype flag for G.192 format AMRWB SID_FIRST detection */
-
-
- // note_ : produces failures if added below their float parts
- Word16 old_exc_fx[L_EXC_MEM_DEC]; /* old excitation Q_exc*/
- Word16 lsf_old_fx[M]; /* old LSF vector at the end of the frame Q2.56*/
- Word16 lsp_old_fx[M]; /* old LSP vector at the end of the frame Q15*/
-
/*----------------------------------------------------------------------------------*
* ACELP core parameters
*----------------------------------------------------------------------------------*/
-
- Word16 tilt_code_fx; /* tilt of code Q15*/
-
-
- Word16 mem_syn1_fx[M]; /* synthesis filter memory (for core switching and FD BWE) */
- Word16 mem_syn2_fx[M]; /* synthesis filter memory Q_syn*/
+ Word16 old_exc_fx[L_EXC_MEM_DEC]; /* old excitation Q_exc*/
+ Word16 lsf_old_fx[M]; /* old LSF vector at the end of the frame Q2.56*/
+ Word16 lsp_old_fx[M]; /* old LSP vector at the end of the frame Q15*/
+ Word16 tilt_code_fx; /* tilt of code Q15*/
+ Word16 mem_syn1_fx[M]; /* synthesis filter memory (for core switching and FD BWE) */
+ Word16 mem_syn2_fx[M]; /* synthesis filter memory Q_syn*/
Word16 mem_syn3_fx[M];
-
- Word16 mem_deemph_fx; /* deemphasis filter memory Q_syn*/
-
- Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean)(Qx2.56) */
-
- Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual)(Qx2.56)*/
-
- Word16 stab_fac_fx; /* LSF stability factor Q15*/
-
+ Word16 mem_deemph_fx; /* deemphasis filter memory Q_syn*/
+ Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean)(Qx2.56) */
+ Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual)(Qx2.56)*/
+ Word16 stab_fac_fx; /* LSF stability factor Q15*/
Word16 stab_fac_smooth_fx; /* low-pass filtered stability factor Q15*/
-
- Word16 last_coder_type; /* previous coder type */
-
- Word16 agc_mem_fx[2]; /* memory of AGC for saturation control Q0*/
-
+ Word16 last_coder_type; /* previous coder type */
+ Word16 agc_mem_fx[2]; /* memory of AGC for saturation control Q0*/
Word16 mid_lsf_int;
-
Word16 safety_net;
-
Word32 log_energy_diff_lt_fx; /*In range of word16*/ /*Q-15*/
Word16 stab_fac_smooth_lt_fx; /*In range of word16*/ /*Q-15*/
Word32 log_energy_old_fx;
@@ -1376,145 +1102,88 @@ typedef struct Decoder_State
Word16 no_scales_p_fx[MAX_NO_MODES_p][2]; /* LSF LVQ structure Q0*/
Word32 L_mem_hp_out_fx[5]; /* hp filter memory for synthesis */
-
- Word16 GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */
-
- Word16 GSC_IVAS_mode; /* AC mode (GSC) - GSC IVAS mode */
-
+ Word16 GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */
+ Word16 GSC_IVAS_mode; /* AC mode (GSC) - GSC IVAS mode */
Word16 Last_GSC_noisy_speech_flag; /* AC mode (GSC) - mem of the past flag to indicate GSC osn SWB noisy speech */
-
GSC_DEC_HANDLE hGSCDec;
-
- Word32 gc_threshold_fx; /* Noise enhancer - threshold for gain_code Q16*/
-
+ Word32 gc_threshold_fx; /* Noise enhancer - threshold for gain_code Q16*/
struct dispMem_fx dm_fx; /* Noise enhancer - phase dispersion algorithm memory */
ZERO_BWE_DEC_HANDLE hBWE_zero; /* HF (6-7kHz) BWE */
- Word16 unv_cnt; /* Stationary noise UV modification - unvoiced frame counter */
-
- Word16 uv_count; /* Stationary noise UV modification - unvoiced counter */
-
- Word16 act_count; /* Stationary noise UV modification - activation counter */
-
- Word32 ge_sm_fx; /* Stationary noise UV modification - smoothed excitation gain Q(GE_SHIFT)*/
-
- Word16 lspold_s_fx[M]; /* Stationary noise UV modification - old LSP vector Q15*/
-
- Word16 noimix_seed; /* Stationary noise UV modification - mixture seed */
-
- Word16 min_alpha_fx; /* Stationary noise UV modification - minimum alpha Q15*/
-
- Word16 Q_stat_noise; /* Q of Exc_pe */
-
- Word16 exc_pe_fx; /* Stationary noise UV modification - scale (Q_stat_noise) */
-
+ Word16 unv_cnt; /* Stationary noise UV modification - unvoiced frame counter */
+ Word16 uv_count; /* Stationary noise UV modification - unvoiced counter */
+ Word16 act_count; /* Stationary noise UV modification - activation counter */
+ Word32 ge_sm_fx; /* Stationary noise UV modification - smoothed excitation gain Q(GE_SHIFT)*/
+ Word16 lspold_s_fx[M]; /* Stationary noise UV modification - old LSP vector Q15*/
+ Word16 noimix_seed; /* Stationary noise UV modification - mixture seed */
+ Word16 min_alpha_fx; /* Stationary noise UV modification - minimum alpha Q15*/
+ Word16 Q_stat_noise; /* Q of Exc_pe */
+ Word16 exc_pe_fx; /* Stationary noise UV modification - scale (Q_stat_noise) */
Word16 Q_stat_noise_ge; /* Q of ge_sm_fx */
-
- Word16 bfi; /* FEC - bad frame indicator */
-
- Word16 prev_bfi; /* FEC - previous bad frame indicator */
-
- Word16 prev_old_bfi; /* FEC - previous old bad frame indicator */
-
- Word16 seed; /* FEC - seed for random generator for excitation */
- // Word16 seed_fx; /* FEC - seed for random generator for excitation Q0*/
-
-
- Word16 last_good; /* FEC - clas of last good received */
-
- Word16 lp_gainp_fx; /* FEC - low-pass filtered pitch gain Q14 */
-
- Word16 lp_gainc_fx; /* FEC - low-pass filtered code gain Q3*/
-
- Word32 lp_ener_fx; /* FEC - low-pass filtered energy Q6*/
-
- Word32 enr_old_fx; /* FEC - energy of the concealed frame Q0*/
-
- Word16 bfi_pitch_fx; /* FEC - pitch for FEC */
-
- Word16 bfi_pitch_frame; /* FEC - frame length when pitch for FEC is saved */
-
+ Word16 bfi; /* FEC - bad frame indicator */
+ Word16 prev_bfi; /* FEC - previous bad frame indicator */
+ Word16 prev_old_bfi; /* FEC - previous old bad frame indicator */
+ Word16 seed; /* FEC - seed for random generator for excitation */
+ Word16 last_good; /* FEC - clas of last good received */
+ Word16 lp_gainp_fx; /* FEC - low-pass filtered pitch gain Q14 */
+ Word16 lp_gainc_fx; /* FEC - low-pass filtered code gain Q3*/
+ Word32 lp_ener_fx; /* FEC - low-pass filtered energy Q6*/
+ Word32 enr_old_fx; /* FEC - energy of the concealed frame Q0*/
+ Word16 bfi_pitch_fx; /* FEC - pitch for FEC */
+ Word16 bfi_pitch_frame; /* FEC - frame length when pitch for FEC is saved */
Word16 old_pitch_buf_16_fx[2 * NB_SUBFR16k + 2]; /* FEC - buffer of old subframe pitch values Q6 */
Word32 old_pitch_buf_fx[2 * NB_SUBFR16k + 2]; /* FEC - buffer of old subframe pitch values 15Q16 */
-
- Word16 upd_cnt; /* FEC - counter of frames since last update */
-
- Word16 scaling_flag; /* FEC - flag to indicate energy control of syn */
-
- Word32 lp_ener_FEC_av; /* FEC - averaged voiced signal energy Q0 */
-
- Word32 lp_ener_FEC_max; /* FEC - averaged voiced signal energy Q0 */
-
- Word16 old_enr_LP; /* FEC - LP filter gain Q5*/
-
- Word16 prev_nbLostCmpt; /* FEC - compt for number of consecutive lost frame at the previous frame*/
- Word16 mode_lvq; /* FEC - index for LSF mean vector*/
-
-
- Word16 lsfoldbfi0_fx[M]; /* FEC - LSF vector of the previous frame (Qx2.56)*/
-
- Word16 lsfoldbfi1_fx[M]; /* FEC - LSF vector of the past previous frame (Qx2.56) */
-
- Word16 lsf_adaptive_mean_fx[M]; /* FEC - adaptive mean LSF vector for FEC (Qx2.56)*/
-
- Word16 decision_hyst; /* FEC - hysteresis of the music/speech decision */
-
- Word16 lp_ener_FER_fx; /* FEC - long-term active-signal average energy Q8*/
-
-
+ Word16 upd_cnt; /* FEC - counter of frames since last update */
+ Word16 scaling_flag; /* FEC - flag to indicate energy control of syn */
+ Word32 lp_ener_FEC_av; /* FEC - averaged voiced signal energy Q0 */
+ Word32 lp_ener_FEC_max; /* FEC - averaged voiced signal energy Q0 */
+ Word16 old_enr_LP; /* FEC - LP filter gain Q5*/
+ Word16 prev_nbLostCmpt; /* FEC - compt for number of consecutive lost frame at the previous frame*/
+ Word16 mode_lvq; /* FEC - index for LSF mean vector*/
+ Word16 lsfoldbfi0_fx[M]; /* FEC - LSF vector of the previous frame (Qx2.56)*/
+ Word16 lsfoldbfi1_fx[M]; /* FEC - LSF vector of the past previous frame (Qx2.56) */
+ Word16 lsf_adaptive_mean_fx[M]; /* FEC - adaptive mean LSF vector for FEC (Qx2.56)*/
+ Word16 decision_hyst; /* FEC - hysteresis of the music/speech decision */
+ Word16 lp_ener_FER_fx; /* FEC - long-term active-signal average energy Q8*/
WI_DEC_HANDLE hWIDec;
-
Word16 relax_prev_lsf_interp;
-
Word16 mem_syn_clas_estim_fx[L_SYN_MEM_CLAS_ESTIM]; /* FEC - memory of the synthesis signal for frame class estimation */
- Word16 bpf_off; /* Bass post-filter - do not use BPF when this flag is set to 1 */
-
+ Word16 bpf_off; /* Bass post-filter - do not use BPF when this flag is set to 1 */
BPF_DEC_HANDLE hBPF; /* Bass post-filter handle */
- HANDLE_CLDFB_FILTER_BANK cldfbAna; /* main analysis filter bank handle */
-
- HANDLE_CLDFB_FILTER_BANK cldfbBPF; /* BPF analysis filter bank handle */
-
- HANDLE_CLDFB_FILTER_BANK cldfbSyn; /* main synthesis filter bank handle */
-
+ HANDLE_CLDFB_FILTER_BANK cldfbAna; /* main analysis filter bank handle */
+ HANDLE_CLDFB_FILTER_BANK cldfbBPF; /* BPF analysis filter bank handle */
+ HANDLE_CLDFB_FILTER_BANK cldfbSyn; /* main synthesis filter bank handle */
HANDLE_CLDFB_FILTER_BANK cldfbSynHB; /* high band synthesis filter bank needed in SBA2Stereo DTX handling */
-
Word16 last_active_bandsToZero_bwdec;
Word16 last_flag_filter_NB;
-
Word16 perc_bwddec; /*Q14*/
-
Word16 active_frame_cnt_bwddec;
Word16 flag_buffer[20];
Word16 total_frame_cnt_bwddec;
-
Word32 avg_nrg_LT;
-
Word16 Ng_ener_ST_fx; /* Noise gate - short-term energy Q8*/
- Word16 last_L_frame; /* ACELP@16kHz - last value of st->L_frame */
-
+ Word16 last_L_frame; /* ACELP@16kHz - last value of st->L_frame */
Word16 mem_preemp_preQ_fx; /* ACELP@16kHz - prequantizer preemhasis memory */
-
- Word16 last_nq_preQ; /* ACELP@16kHz - AVQ subquantizer number of the last sub-band of the last subframe */
-
- Word16 last_code_preq; /* ACELP@16kHz - last coefficient of the pre-quantizer contribution */
-
- Word16 use_acelp_preq; /* ACELP@16kHz - flag of prequantizer usage */
-
+ Word16 last_nq_preQ; /* ACELP@16kHz - AVQ subquantizer number of the last sub-band of the last subframe */
+ Word16 last_code_preq; /* ACELP@16kHz - last coefficient of the pre-quantizer contribution */
+ Word16 use_acelp_preq; /* ACELP@16kHz - flag of prequantizer usage */
/* NB and formant post-filter */
PFSTAT_HANDLE hPFstat; /* NB and formant post-filter states */
-
Word16 psf_lp_noise_fx;
- Word16 last_voice_factor_fx; /* Q6*/
-
+ Word16 last_voice_factor_fx; /* Q6*/
+ Word16 prev_synth_buffer_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )]; /*Updated IVAS size is 96*/
+ Word32 prev_synth_buffer32_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )];
+ Word16 q_prev_synth_buffer_fx;
+ Word16 Qprev_synth_buffer_fx;
Word16 old_bfi_cnt; /* HQ core - # of bfi until previous frame(for FEC) */
@@ -1523,23 +1192,16 @@ typedef struct Decoder_State
*----------------------------------------------------------------------------------*/
Word16 first_CNG; /* DTX/CNG - first CNG frame flag */
-
- Word16 cng_type; /* DTX/CNG - flag indicating LP or CLDFB based SID/CNG */
-
- Word16 last_vad;
-
+ Word16 cng_type; /* DTX/CNG - flag indicating LP or CLDFB based SID/CNG */
+ Word16 last_vad_fx;
Word32 last_active_brate; /* DTX/CNG - last active frame bitrate used for CNG_mode control */
+ Word16 last_CNG_L_frame; /* DTX/CNG - last CNG frame length */
- Word16 last_CNG_L_frame; /* DTX/CNG - last CNG frame length */
- // Word16 last_CNG_L_frame_fx; /* DTX/CNG - last CNG frame length */
-
- Word16 CNG_mode; /* DTX/CNG - mode for DTX configuration */
- // Word16 CNG_mode_fx; /* DTX/CNG - mode for DTX configuration */
+ Word16 active_cnt;
+ Word16 CNG_mode; /* DTX/CNG - mode for DTX configuration */
Word16 lspCNG_fx[M]; /* CNG and DTX - LP filtered ISPs Q15*/
- Word16 active_cnt;
-
TD_CNG_DEC_HANDLE hTdCngDec;
Word16 masa_sid_format;
@@ -1556,20 +1218,12 @@ typedef struct Decoder_State
SC_VBR_DEC_HANDLE hSC_VBR;
Word16 last_ppp_mode_dec;
-
Word16 ppp_mode_dec;
-
Word16 last_nelp_mode_dec;
-
Word16 nelp_mode_dec;
-
- Word16 prev_gain_pit_dec_fx; /*Q14*/
-
-
+ Word16 prev_gain_pit_dec_fx; /*Q14*/
Word16 prev_tilt_code_dec_fx; /*Q15*/
-
Word16 vbr_hw_BWE_disable_dec;
-
Word16 last_vbr_hw_BWE_disable_dec;
/*----------------------------------------------------------------------------------*
@@ -1599,7 +1253,6 @@ typedef struct Decoder_State
*----------------------------------------------------------------------------------*/
HR_BWE_DEC_HANDLE hBWE_FD_HR;
- Word16 Qprev_synth_buffer_fx;
/*----------------------------------------------------------------------------------*
* HQ core parameters
@@ -1608,26 +1261,18 @@ typedef struct Decoder_State
HQ_DEC_HANDLE hHQ_core;
Word16 last_core;
-
Word16 last_core_from_bs; /* last frame core as coded in TCX bitstream */
- // Word16 last_core_bs_fx;
Word16 last_L_frame_ori;
-
Word16 previoussynth_fx[L_FRAME48k];
Word32 previoussynth_fx_32[L_FRAME48k];
-
-
Word16 old_synth_sw_fx[NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS )];
-
Word16 delay_buf_out_fx[HQ_DELTA_MAX * HQ_DELAY_COMP]; /*Q0*/
Word32 delay_buf_out32_fx[HQ_DELTA_MAX * HQ_DELAY_COMP]; /*Q11*/
-
Word16 old_Aq_12_8_fx[M + 1]; /* Q12 old Aq[] for core switching */
Word32 old_Aq_12_8_fx_32[M + 1]; /* Q28 old Aq[] for core switching */
-
- Word16 old_Es_pred_fx; /* old Es_pred for core switching */
+ Word16 old_Es_pred_fx; /* old Es_pred for core switching */
HQ_NBFEC_HANDLE hHQ_nbfec;
@@ -1638,74 +1283,41 @@ typedef struct Decoder_State
TD_BWE_DEC_HANDLE hBWE_TD;
Word16 old_bwe_delay;
-
Word16 hb_prev_synth_buffer_fx[NS2SA( 48000, DELAY_BWE_TOTAL_NS )];
/* WB/SWB bandwidth switching */
- Word16 tilt_wb_fx; // Q11
-
- Word16 tilt_swb_fx; // Q24
-
+ Word16 tilt_wb_fx; // Q11
+ Word16 tilt_swb_fx; // Q24
Word16 prev_ener_shb_fx; // Q1
-
Word32 enerLH_fx;
Word16 enerLH_fx_Q;
-
Word32 prev_enerLH_fx; // Q1
-
Word32 enerLL_fx;
Word16 enerLL_fx_Q;
-
Word32 prev_enerLL_fx; // Q1
-
Word16 prev_fractive;
-
Word16 prev_bws_cnt;
-
Word16 bws_cnt;
-
Word16 bws_cnt1;
-
Word16 attenu_fx;
-
Word16 last_inner_frame;
-
Word16 last_bwidth;
-
Word16 t_audio_q_fx[L_FRAME];
- Word16 interpol_3_2_cng_dec_fx[INTERP_3_2_MEM_LEN];
-
/*----------------------------------------------------------------------------------*
* Fixed point only
*----------------------------------------------------------------------------------*/
+
Word16 Q_exc;
Word16 Q_exc_cng;
Word16 prev_Q_exc;
Word16 Q_subfr[L_Q_MEM];
- Word16 prev_Q_bwe_syn;
- Word16 prev_Q_bwe_syn2;
-
- Word16 prev_Q_bwe_exc_fb;
- Word16 prev_Qx;
- Word16 prev_Q_bwe_exc;
- Word16 prev_Q_synth;
- Word16 prev_SWB_fenv_fx[SWB_FENV];
-
Word16 Q_syn;
Word16 Q_syn2;
Word16 Q_syn_cng;
Word16 prev_Q_syn;
- Word16 prev_frame_pow_exp;
- Word16 prev_ener_fx_Q;
- Word16 last_wb_bwe_ener_fx;
- Word16 prev_fb_ener_adjust_fx;
-
- Word16 prev_synth_buffer_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )]; /*Updated IVAS size is 96*/
- Word16 q_prev_synth_buffer_fx;
- Word16 GainShape_Delay[NUM_SHB_SUBFR / 2];
- Word16 prev_lpc_wb_fx[LPC_SHB_ORDER_WB];
+ Word16 prev_Q_bwe_exc;
/*----------------------------------------------------------------------------------*
* SWB BWE structure
@@ -1713,22 +1325,6 @@ typedef struct Decoder_State
FD_BWE_DEC_HANDLE hBWE_FD;
- /*----------------------------------------------------------------------------------*
- * SWB DTX/CNG parameters
- *----------------------------------------------------------------------------------*/
-
- Word16 shb_cng_ener_fx;
- Word16 wb_cng_ener_fx;
- Word16 last_wb_cng_ener_fx;
- Word16 last_shb_cng_ener_fx;
- Word16 swb_cng_seed;
- Word16 lsp_shb_prev_prev_fx[LPC_SHB_ORDER];
- Word16 lsp_shb_prev_fx[LPC_SHB_ORDER];
- Word16 shb_dtx_count_fx;
- Word16 last_vad_fx;
- Word16 trans_cnt_fx;
- Word16 last_shb_ener_fx;
-
/*----------------------------------------------------------------------------------*
* LD music post-filter
*----------------------------------------------------------------------------------*/
@@ -1738,6 +1334,7 @@ typedef struct Decoder_State
/*----------------------------------------------------------------------------------*
* TCX LTP decoder handle
*----------------------------------------------------------------------------------*/
+
TCX_LTP_DEC_HANDLE hTcxLtpDec;
/*----------------------------------------------------------------------------------*
@@ -1746,6 +1343,7 @@ typedef struct Decoder_State
TCX_DEC_HANDLE hTcxDec;
+ /* in floating point implementation, different buffers are used: lp_error_ener <-> pst_lp_ener, mem_error <-> pst_mem_deemp_err */
Word32 lp_error_ener;
Word32 mem_error;
@@ -1774,43 +1372,25 @@ typedef struct Decoder_State
Word16 L_frame_past;
Word16 L_frameTCX_past;
- Word16 lsfold_uw[M]; /* old lsf (unweighted) */
-
- Word16 lspold_uw[M]; /* old lsp (unweighted) */
-
- Word16 seed_tcx_plc; /* seed memory (for random function in TCX PLC) */
-
-
+ Word16 lsfold_uw[M]; /* old lsf (unweighted) */
+ Word16 lspold_uw[M]; /* old lsp (unweighted) */
+ Word16 seed_tcx_plc; /* seed memory (for random function in TCX PLC) */
Word16 past_gpit; /* past gain of pitch (for frame recovery) */
Word32 past_gcode; /* past energy (!) of code (for frame recovery) */ /*15Q16*/
-
- Word16 lsf_cng[M]; /* xSF coefficients used for CNG generation (long term) */
-
- Word16 lspold_cng[M]; /* xSP coefficients used for CNG generation (long term) */
-
- Word16 lsp_q_cng[M]; /* xSP coefficients used for CNG generation (short term interpolated) */
-
- Word16 old_lsp_q_cng[M]; /* xSP coefficients used for CNG generation (short term interpolated) */
-
- Word16 lsf_q_cng[M]; /* xSF coefficients used for CNG generation (short term interpolated) */
-
- Word16 old_lsf_q_cng[M]; /* xSF: old quantized lsfs for background noise */
-
- Word16 Aq_cng[( NB_SUBFR16k + 1 ) * ( M + 1 )]; /* LPC coefficients derived from CNG estimate */
-
- Word16 mem_syn_unv_back[M]; /* filter memory for unvoiced synth */
-
- Word16 plcBackgroundNoiseUpdated; /* flag: Is background noise estimate updated? */
-
- Word16 last_gain_syn_deemph; /*Q15*/
-
+ Word16 lsf_cng[M]; /* xSF coefficients used for CNG generation (long term) */
+ Word16 lspold_cng[M]; /* xSP coefficients used for CNG generation (long term) */
+ Word16 lsp_q_cng[M]; /* xSP coefficients used for CNG generation (short term interpolated) */
+ Word16 old_lsp_q_cng[M]; /* xSP coefficients used for CNG generation (short term interpolated) */
+ Word16 lsf_q_cng[M]; /* xSF coefficients used for CNG generation (short term interpolated) */
+ Word16 old_lsf_q_cng[M]; /* xSF: old quantized lsfs for background noise */
+ Word16 Aq_cng[( NB_SUBFR16k + 1 ) * ( M + 1 )]; /* LPC coefficients derived from CNG estimate */
+ Word16 mem_syn_unv_back[M]; /* filter memory for unvoiced synth */
+ Word16 plcBackgroundNoiseUpdated; /* flag: Is background noise estimate updated? */
+ Word16 last_gain_syn_deemph; /*Q15*/
Word16 last_gain_syn_deemph_e;
-
Word16 last_concealed_gain_syn_deemph; /*Q15*/
-
Word16 last_concealed_gain_syn_deemph_e;
-
/* variables for framing */
Word16 nb_subfr;
@@ -1828,10 +1408,7 @@ typedef struct Decoder_State
/*Preemphasis factor*/
Word16 preemph_fac; /*0Q15*/
-
-
Word16 gamma;
-
Word16 inv_gamma;
/*for AMR-WB like 6.4 to 7 kHz upsampling and noise filling*/
@@ -1841,34 +1418,22 @@ typedef struct Decoder_State
Word16 last_core_bfi; /* PLC - mode in previous frame */
Word16 nbLostCmpt; /* PLC - compt for number of consecutive lost frame */
- Word32 old_fpitch; /* last pitch of previous frame */ /*15Q16*/
-
+ Word32 old_fpitch; /* last pitch of previous frame */ /*15Q16*/
Word32 old_fpitchFB; /* PLC - last pitch of previous FB frame (depends on output sr) */ /*15Q16*/
-
- Word16 clas_dec; /* PLC - frame class at the decoder */
-
- Word16 mem_pitch_gain[2 * NB_SUBFR16k + 2]; /* Pitch gain memory Q14 */
-
- Word16 plc_use_future_lag; /* PLC - flag indicating if info (pitch lag / pitch gain) about future frame is usable */
+ Word16 clas_dec; /* PLC - frame class at the decoder */
+ Word16 mem_pitch_gain[2 * NB_SUBFR16k + 2]; /* Pitch gain memory Q14 */
+ Word16 plc_use_future_lag; /* PLC - flag indicating if info (pitch lag / pitch gain) about future frame is usable */
Word32 Mode2_lp_gainc; /* 15Q16 low passed code gain used for concealment*/
Word32 Mode2_lp_gainp; /* 15Q16 low passed pitch gain used for concealment*/
-
Word16 cummulative_damping; /*Q15*/
-
Word16 cngTDLevel;
Word16 cngTDLevel_e;
-
- Word16 prev_widow_left_rect;
-
Word16 reset_mem_AR;
-
Word16 classifier_Q_mem_syn; /*scalingfactor of mem_syn_clas_estim_fx in MODE2 */
-
Word16 rate_switching_init;
-
/* LPC quantization */
Word16 lpcQuantization;
Word16 numlpc;
@@ -1882,8 +1447,6 @@ typedef struct Decoder_State
Word16 last_ctx_hm_enabled;
- struct tonalmdctconceal tonalMDCTconceal;
-
TonalMDCTConcealPtr hTonalMDCTConc;
Word16 tonal_mdct_plc_active;
Word16 last_tns_active;
@@ -1908,7 +1471,6 @@ typedef struct Decoder_State
Word16 enablePlcWaveadjust;
Word16 tonality_flag;
T_PLCInfo_HANDLE hPlcInfo;
- T_PLCInfo plcInfo;
Word16 VAD;
Word16 flag_cna;
@@ -1959,6 +1521,7 @@ typedef struct Decoder_State
Word16 tec_flag;
Word16 tfa_flag;
TEC_DEC_HANDLE hTECDec;
+
/*----------------------------------------------------------------------------------*
* IVAS parameters
*----------------------------------------------------------------------------------*/
@@ -1968,21 +1531,11 @@ typedef struct Decoder_State
Word16 cng_sba_flag; /* CNG in SBA flag */
/* MCT Channel mode indication: LFE, ignore channel? */
- // note_ : one extra value in evs ivas macro code
MCT_CHAN_MODE mct_chan_mode;
Word16 cng_ism_flag; /* CNG in ISM format flag */
Word16 is_ism_format; /* Indication whether the codec operates in ISM format */
- Word16 last_element_mode; /* element mode */
- // Word16 coder_type; /* low-rate mode flag */
- Word32 prev_synth_buffer32_fx[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS )];
-
-#ifdef DEBUGGING
- Word16 id_element; /* element ID */
-#endif
- IVAS_FORMAT ivas_format; /* format; corresponds to st_ivas->ivas_format, unless the signal gets transormed to a different domain for rendering */
-
} Decoder_State, *DEC_CORE_HANDLE;
#endif
diff --git a/lib_dec/swb_bwe_dec_fx.c b/lib_dec/swb_bwe_dec_fx.c
index b91dcdf328f1d9151f6574777ff24e73d0324304..42d2a9cc4a2e8015773e402e81b9751400538e11 100644
--- a/lib_dec/swb_bwe_dec_fx.c
+++ b/lib_dec/swb_bwe_dec_fx.c
@@ -19,6 +19,7 @@
*
* predict SWB parameters for bandwidth switching
*-------------------------------------------------------------------*/
+
static Word16 para_pred_bws_fx(
Decoder_State *st_fx, /* i/o: decoder state structure */
Word16 *signal_wb_fx, /* i : wideband frequency signal Q_syn*/
@@ -27,6 +28,7 @@ static Word16 para_pred_bws_fx(
{
Word16 i, j, k;
Word16 mode;
+ FD_BWE_DEC_HANDLE hBWE_FD;
Word16 tmp, tmp_den, tmp_num;
Word32 L_tmp, L_tmp_max;
Word16 exp;
@@ -39,6 +41,7 @@ static Word16 para_pred_bws_fx(
Word16 coder_type = st_fx->coder_type;
move16();
+ hBWE_FD = st_fx->hBWE_FD;
mode = NORMAL;
move16();
@@ -226,16 +229,16 @@ static Word16 para_pred_bws_fx(
FOR( i = 0; i < SWB_FENV; i++ )
{
test();
- IF( NE_16( st_fx->prev_coder_type, coder_type ) && GT_16( mult_r( SWB_fenv_fx[i], 16384 ), st_fx->prev_SWB_fenv_fx[i] ) )
+ IF( NE_16( st_fx->prev_coder_type, coder_type ) && GT_16( mult_r( SWB_fenv_fx[i], 16384 ), hBWE_FD->prev_SWB_fenv_fx[i] ) )
{
/*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 3277), mult_r(st_fx->prev_SWB_fenv_fx[i], 29491)); */
- SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 3277 ), st_fx->prev_SWB_fenv_fx[i], 29491 ) );
+ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 3277 ), hBWE_FD->prev_SWB_fenv_fx[i], 29491 ) );
move16();
}
ELSE
{
/*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], st_fx->attenu_fx), mult_r(st_fx->prev_SWB_fenv_fx[i], sub(32767, st_fx->attenu_fx))); */
- SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], st_fx->attenu_fx ), st_fx->prev_SWB_fenv_fx[i], sub( 32767, st_fx->attenu_fx ) ) );
+ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], st_fx->attenu_fx ), hBWE_FD->prev_SWB_fenv_fx[i], sub( 32767, st_fx->attenu_fx ) ) );
move16();
}
}
@@ -257,9 +260,9 @@ static Word16 para_pred_bws_fx(
{
FOR( i = 0; i < SWB_FENV; i++ )
{
- if ( GT_16( mult_r( SWB_fenv_fx[i], 16384 ), st_fx->prev_SWB_fenv_fx[i] ) )
+ if ( GT_16( mult_r( SWB_fenv_fx[i], 16384 ), hBWE_FD->prev_SWB_fenv_fx[i] ) )
{
- SWB_fenv_fx[i] = st_fx->prev_SWB_fenv_fx[i];
+ SWB_fenv_fx[i] = hBWE_FD->prev_SWB_fenv_fx[i];
move16();
}
}
@@ -268,7 +271,7 @@ static Word16 para_pred_bws_fx(
FOR( i = 0; i < SWB_FENV; i++ )
{
/*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 29491), mult_r(st_fx->prev_SWB_fenv_fx[i], 3277)); */
- SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 29491 ), st_fx->prev_SWB_fenv_fx[i], 3277 ) );
+ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 29491 ), hBWE_FD->prev_SWB_fenv_fx[i], 3277 ) );
move16();
}
st_fx->attenu_fx = 3277; /*Q15*/
@@ -349,16 +352,18 @@ Word16 WB_BWE_gain_deq_fx(
*
* WB BWE decoder (only for 16kHz signals)
*-------------------------------------------------------------------*/
-Word16 ivas_wb_bwe_dec_fx( /* o : Q_syn_hb */
- Decoder_State *st_fx, /* i/o: decoder state structure */
- const Word16 output[], /* i : suntehsis @ internal Fs Q_input */
- Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis Q0/Qpost */
- Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */
- const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */
- const Word16 output_frame, /* i : frame length */
- Word16 *voice_factors_fx, /* i : voicing factors Q15 */
- const Word16 pitch_buf_fx[], /* i : pitch buffer Q6 */
- Word16 *Qpost )
+
+/* o : Q_syn_hb */
+Word16 ivas_wb_bwe_dec_fx(
+ Decoder_State *st_fx, /* i/o: decoder state structure */
+ const Word16 output[], /* i : suntehsis @ internal Fs Q_input */
+ Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis Q0/Qpost */
+ Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */
+ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */
+ const Word16 output_frame, /* i : frame length */
+ Word16 *voice_factors_fx, /* i : voicing factors Q15 */
+ const Word16 pitch_buf_fx[], /* i : pitch buffer Q6 */
+ Word16 *Qpost )
{
Word16 mode;
Word16 WB_fenv_fx[SWB_FENV];
@@ -421,7 +426,7 @@ Word16 ivas_wb_bwe_dec_fx( /* o :
{
/* de-quantization */
mode = WB_BWE_gain_deq_fx( st_fx, WB_fenv_fx );
- st_fx->last_wb_bwe_ener_fx = extract_l( Mpy_32_16_r( L_add( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 /*0.5f in Q15*/ ) );
+ st_fx->hBWE_FD->last_wb_bwe_ener_fx = extract_l( Mpy_32_16_r( L_add( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 /*0.5f in Q15*/ ) );
move16();
}
ELSE
@@ -438,12 +443,12 @@ Word16 ivas_wb_bwe_dec_fx( /* o :
}
if ( NE_16( st_fx->last_extl, WB_BWE ) )
{
- st_fx->prev_SWB_fenv_fx[0] = 0;
+ hBWE_FD->prev_SWB_fenv_fx[0] = 0;
move16();
}
- mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, st_fx->prev_SWB_fenv_fx[0],
- voice_factors_fx, pitch_buf_fx, tmp_brate, st_fx->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx );
+ mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, hBWE_FD->prev_SWB_fenv_fx[0],
+ voice_factors_fx, pitch_buf_fx, tmp_brate, st_fx->hBWE_FD->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx );
}
}
ELSE
@@ -453,32 +458,34 @@ Word16 ivas_wb_bwe_dec_fx( /* o :
move16();
FOR( i = 0; i < 2; i++ )
{
- WB_fenv_fx[i] = mult_r( st_fx->prev_SWB_fenv_fx[i], 24576 );
+ WB_fenv_fx[i] = mult_r( hBWE_FD->prev_SWB_fenv_fx[i], 24576 );
move16();
}
}
test();
IF( NE_16( st_fx->last_extl, WB_BWE ) || st_fx->bfi )
{
- Copy( WB_fenv_fx, st_fx->prev_SWB_fenv_fx, 2 );
+ Copy( WB_fenv_fx, hBWE_FD->prev_SWB_fenv_fx, 2 );
}
exp = norm_l( hBWE_FD->prev_Energy_wb_fx );
- IF( GT_16( add( st_fx->prev_Q_synth, exp ), Q_syn ) )
+ IF( GT_16( add( hBWE_FD->prev_Q_synth, exp ), Q_syn ) )
{
- hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( st_fx->prev_Q_synth, Q_syn ) );
+ hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( hBWE_FD->prev_Q_synth, Q_syn ) );
move32();
}
ELSE
{
- Q_syn = add( st_fx->prev_Q_synth, exp );
+ Q_syn = add( hBWE_FD->prev_Q_synth, exp );
hBWE_FD->prev_Energy_wb_fx = L_shl( hBWE_FD->prev_Energy_wb_fx, exp );
move32();
}
+
WB_BWE_decoding_fx( ysynth_fx, WB_fenv_fx, ysynth_32, L_FRAME16k, mode,
- st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm,
+ st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, hBWE_FD->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm,
st_fx->extl, coder_type, st_fx->total_brate, &hBWE_FD->Seed, &hBWE_FD->prev_flag,
st_fx->prev_coder_type, Q_syn, &Q_syn_hb );
+
IF( EQ_32( st_fx->output_Fs, 32000 ) )
{
set32_fx( &ysynth_32[L_FRAME16k], 0, L_FRAME16k );
@@ -487,7 +494,9 @@ Word16 ivas_wb_bwe_dec_fx( /* o :
{
set32_fx( &ysynth_32[L_FRAME16k], 0, L_FRAME32k );
}
+
Inverse_Transform( ysynth_32, &Q_syn_hb, t_audio32_tmp, 0, output_frame, output_frame, st_fx->element_mode );
+
window_ola_fx( t_audio32_tmp, hb_synth_fx, &Q_syn_hb, hBWE_FD->mem_imdct_fx, &hBWE_FD->mem_imdct_exp_fx, output_frame,
ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 );
@@ -497,13 +506,16 @@ Word16 ivas_wb_bwe_dec_fx( /* o :
/* add HB synth from hf_synth() */
v_add_16( hb_synth_fx, synth_fx, hb_synth_fx, output_frame );
}
+
hBWE_FD->prev_mode = mode;
move16();
- st_fx->prev_Q_synth = Q_syn;
+ hBWE_FD->prev_Q_synth = Q_syn;
move16();
+
return Q_syn_hb;
}
+
Word16 wb_bwe_dec_fx(
Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis Q0/Qpost */
Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */
@@ -560,7 +572,7 @@ Word16 wb_bwe_dec_fx(
{
/* de-quantization */
mode = WB_BWE_gain_deq_fx( st_fx, WB_fenv_fx );
- st_fx->last_wb_bwe_ener_fx = mult_r( add_sat( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 ); // this would not saturate if written like : rounf_fx(L_mac(L_mult(WB_fenv_fx[0], 16384), WB_fenv_fx[1], 16384))
+ hBWE_FD->last_wb_bwe_ener_fx = mult_r( add_sat( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 ); // this would not saturate if written like : rounf_fx(L_mac(L_mult(WB_fenv_fx[0], 16384), WB_fenv_fx[1], 16384))
move16();
}
ELSE
@@ -579,12 +591,12 @@ Word16 wb_bwe_dec_fx(
if ( NE_16( st_fx->last_extl, WB_BWE ) )
{
- st_fx->prev_SWB_fenv_fx[0] = 0;
+ hBWE_FD->prev_SWB_fenv_fx[0] = 0;
move16();
}
- mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, st_fx->prev_SWB_fenv_fx[0],
- voice_factors_fx, pitch_buf_fx, tmp_brate, st_fx->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx );
+ mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, hBWE_FD->prev_SWB_fenv_fx[0],
+ voice_factors_fx, pitch_buf_fx, tmp_brate, hBWE_FD->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx );
}
}
ELSE
@@ -594,32 +606,34 @@ Word16 wb_bwe_dec_fx(
move16();
FOR( i = 0; i < 2; i++ )
{
- WB_fenv_fx[i] = mult_r( st_fx->prev_SWB_fenv_fx[i], 24576 );
+ WB_fenv_fx[i] = mult_r( hBWE_FD->prev_SWB_fenv_fx[i], 24576 );
move16();
}
}
test();
IF( NE_16( st_fx->last_extl, WB_BWE ) || st_fx->bfi )
{
- Copy( WB_fenv_fx, st_fx->prev_SWB_fenv_fx, 2 );
+ Copy( WB_fenv_fx, hBWE_FD->prev_SWB_fenv_fx, 2 );
}
exp = norm_l( hBWE_FD->prev_Energy_wb_fx );
- IF( GT_16( add( st_fx->prev_Q_synth, exp ), Q_syn ) )
+ IF( GT_16( add( hBWE_FD->prev_Q_synth, exp ), Q_syn ) )
{
- hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( st_fx->prev_Q_synth, Q_syn ) );
+ hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( hBWE_FD->prev_Q_synth, Q_syn ) );
move32();
}
ELSE
{
- Q_syn = add( st_fx->prev_Q_synth, exp );
+ Q_syn = add( hBWE_FD->prev_Q_synth, exp );
hBWE_FD->prev_Energy_wb_fx = L_shl( hBWE_FD->prev_Energy_wb_fx, exp );
move32();
}
+
WB_BWE_decoding_fx( ysynth_fx, WB_fenv_fx, ysynth_32, L_FRAME16k, mode,
- st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm,
+ st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, hBWE_FD->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm,
st_fx->extl, coder_type, st_fx->total_brate, &hBWE_FD->Seed, &hBWE_FD->prev_flag,
st_fx->prev_coder_type, Q_syn, &Q_syn_hb );
+
IF( EQ_32( st_fx->output_Fs, 32000 ) )
{
set32_fx( &ysynth_32[L_FRAME16k], 0, L_FRAME16k );
@@ -628,13 +642,15 @@ Word16 wb_bwe_dec_fx(
{
set32_fx( &ysynth_32[L_FRAME16k], 0, L_FRAME32k );
}
+
Inverse_Transform( ysynth_32, &Q_syn_hb, t_audio32_tmp, 0, output_frame, output_frame, st_fx->element_mode );
+
window_ola_fx( t_audio32_tmp, hb_synth_fx, &Q_syn_hb, hBWE_FD->mem_imdct_fx, &hBWE_FD->mem_imdct_exp_fx, output_frame,
ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 );
hBWE_FD->prev_mode = mode;
move16();
- st_fx->prev_Q_synth = Q_syn;
+ hBWE_FD->prev_Q_synth = Q_syn;
move16();
return Q_syn_hb;
@@ -646,13 +662,15 @@ Word16 wb_bwe_dec_fx(
*
* Decoding of SWB parameters
*-------------------------------------------------------------------*/
-Word16 swb_bwe_gain_deq_fx( /* o : BWE class */
- Decoder_State *st_fx, /* i/o: decoder state structure */
- const Word16 core, /* i : core : Q0 */
- Word16 *SWB_tenv, /* o : time-domain BWE envelope : Q0 */
- Word16 *SWB_fenv, /* o : frequency-domain BWE envelope : Q1 */
- const Word16 hr_flag, /* i : high rate flag : Q0 */
- const Word16 hqswb_clas /* i : HQ BWE class : Q0 */
+
+/* o : BWE class */
+Word16 swb_bwe_gain_deq_fx(
+ Decoder_State *st_fx, /* i/o: decoder state structure */
+ const Word16 core, /* i : core : Q0 */
+ Word16 *SWB_tenv, /* o : time-domain BWE envelope : Q0 */
+ Word16 *SWB_fenv, /* o : frequency-domain BWE envelope : Q1 */
+ const Word16 hr_flag, /* i : high rate flag : Q0 */
+ const Word16 hqswb_clas /* i : HQ BWE class : Q0 */
)
{
Word16 index, mode, n_band;
@@ -883,12 +901,14 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class
*
* SWB BWE decoder
*-------------------------------------------------------------------*/
-Word16 swb_bwe_dec_fx( /*o :Q_syn_hb*/
- Decoder_State *st_fx, /* i/o: decoder state structure */
- Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis (might be rescaled inside wtda() ) Q0/Qpost */
- Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */
- const Word16 output_frame, /* i : frame length */
- Word16 *Qpost )
+
+/*o : Q_syn_hb */
+Word16 swb_bwe_dec_fx(
+ Decoder_State *st_fx, /* i/o: decoder state structure */
+ Word16 *synth_fx, /* i/o: ACELP core synthesis/final synthesis (might be rescaled inside wtda() ) Q0/Qpost */
+ Word16 *hb_synth_fx, /* o : SHB synthesis/final synthesis Q_syn_hb */
+ const Word16 output_frame, /* i : frame length */
+ Word16 *Qpost )
{
Word16 i, l_subfr;
Word16 mode;
@@ -997,19 +1017,19 @@ Word16 swb_bwe_dec_fx( /*o :Q_syn_hb*/
move16();
}
- Copy( st_fx->prev_SWB_fenv_fx, SWB_fenv_fx, SWB_FENV );
+ Copy( hBWE_FD->prev_SWB_fenv_fx, SWB_fenv_fx, SWB_FENV );
}
/* reconstruction of MDCT spectrum of the error signal */
set32_fx( ysynth_32, 0, output_frame );
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
{
- SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, st_fx->prev_SWB_fenv_fx,
+ SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, hBWE_FD->prev_SWB_fenv_fx,
&hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
}
ELSE
{
- SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, st_fx->prev_SWB_fenv_fx,
+ SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, ysynth_32, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, hBWE_FD->prev_SWB_fenv_fx,
&hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 6, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
}
@@ -1040,11 +1060,11 @@ Word16 swb_bwe_dec_fx( /*o :Q_syn_hb*/
}
ELSE IF( st_fx->bfi )
{
- fb_ener_adjust_fx = st_fx->prev_fb_ener_adjust_fx;
+ fb_ener_adjust_fx = hBWE_FD->prev_fb_ener_adjust_fx;
move16();
}
- st_fx->prev_fb_ener_adjust_fx = fb_ener_adjust_fx;
+ hBWE_FD->prev_fb_ener_adjust_fx = fb_ener_adjust_fx;
move16();
IF( EQ_16( mode, TRANSIENT ) )
{
@@ -1158,23 +1178,18 @@ Word16 swb_bwe_dec_fx( /*o :Q_syn_hb*/
* Initialize FD BWE state structure at the decoder
*-------------------------------------------------------------------*/
-void fd_bwe_dec_init(
- Decoder_State *st_fx, /* i/o: decoder state structure */
+void fd_bwe_dec_init_fx(
FD_BWE_DEC_HANDLE hBWE_FD /* i/o: FD BWE data handle */
)
{
- hBWE_FD->old_wtda_wb_fx_exp = 0;
- move16();
set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) );
set16_fx( hBWE_FD->L_old_wtda_swb_fx, 0, L_FRAME48k );
hBWE_FD->old_wtda_swb_fx_exp = 0;
move16();
- hBWE_FD->mem_imdct_exp_fx = 0;
- move16();
hBWE_FD->prev_mode = NORMAL;
move16();
- set16_fx( st_fx->prev_SWB_fenv_fx, 0, SWB_FENV );
+ set16_fx( hBWE_FD->prev_SWB_fenv_fx, 0, SWB_FENV );
hBWE_FD->prev_Energy_fx = 0;
move16();
hBWE_FD->prev_L_swb_norm = 8;
@@ -1184,13 +1199,15 @@ void fd_bwe_dec_init(
hBWE_FD->prev_frica_flag = 0;
move16();
set16_fx( hBWE_FD->mem_imdct_fx, 0, L_FRAME48k );
+ hBWE_FD->mem_imdct_exp_fx = 0;
+ move16();
hBWE_FD->prev_td_energy_fx = 0;
move16();
hBWE_FD->prev_weight_fx = 6554; /*0.2 in Q15*/
move16();
hBWE_FD->prev_flag = 0;
move16();
- st_fx->last_wb_bwe_ener_fx = 0;
+ hBWE_FD->last_wb_bwe_ener_fx = 0;
move16();
hBWE_FD->prev_Energy_wb_fx = L_deposit_l( 0 );
move32();
@@ -1198,12 +1215,12 @@ void fd_bwe_dec_init(
move16();
/* Previous frame LPC initialization for PPP */
- st_fx->prev_Q_synth = 0;
+ hBWE_FD->prev_Q_synth = 0;
move16();
hBWE_FD->mem_deemph_old_syn_fx = 0;
move16();
- st_fx->prev_fb_ener_adjust_fx = 0;
+ hBWE_FD->prev_fb_ener_adjust_fx = 0;
move16();
return;
@@ -1362,7 +1379,7 @@ Word16 swb_bwe_dec_fx32(
move16();
}
- Copy( st_fx->prev_SWB_fenv_fx, SWB_fenv_fx, SWB_FENV );
+ Copy( hBWE_FD->prev_SWB_fenv_fx, SWB_fenv_fx, SWB_FENV );
}
/* reconstruction of MDCT spectrum of the error signal */
@@ -1370,11 +1387,11 @@ Word16 swb_bwe_dec_fx32(
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
{
- SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, yerror_fx, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
+ SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, yerror_fx, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, hBWE_FD->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 80, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
}
ELSE
{
- SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, yerror_fx, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 6, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
+ SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, yerror_fx, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, hBWE_FD->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 6, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl );
}
test();
@@ -1404,11 +1421,11 @@ Word16 swb_bwe_dec_fx32(
}
ELSE IF( st_fx->bfi )
{
- fb_ener_adjust_fx = st_fx->prev_fb_ener_adjust_fx;
+ fb_ener_adjust_fx = hBWE_FD->prev_fb_ener_adjust_fx;
move16();
}
- st_fx->prev_fb_ener_adjust_fx = fb_ener_adjust_fx;
+ hBWE_FD->prev_fb_ener_adjust_fx = fb_ener_adjust_fx;
move16();
IF( EQ_16( mode, TRANSIENT ) )
{
@@ -1544,35 +1561,3 @@ Word16 swb_bwe_dec_fx32(
return Q_syn_hb;
}
-
-
-void fd_bwe_dec_init_fx(
- FD_BWE_DEC_HANDLE hBWE_FD /* i/o: FD BWE data handle */
-)
-{
- set16_fx( hBWE_FD->L_old_wtda_swb_fx, 0, L_FRAME48k );
- set16_fx( hBWE_FD->old_syn_12k8_16k_fx, 0, NS2SA_FX2( 16000, DELAY_FD_BWE_ENC_NS ) );
- hBWE_FD->prev_mode = NORMAL;
- move16();
- hBWE_FD->prev_Energy_fx = 0;
- move16();
- hBWE_FD->prev_L_swb_norm = 8;
- move16();
- hBWE_FD->Seed = 21211;
- move16();
- hBWE_FD->prev_frica_flag = 0;
- move16();
- set16_fx( hBWE_FD->mem_imdct_fx, 0, L_FRAME48k );
- hBWE_FD->prev_td_energy_fx = 0;
- move16();
- hBWE_FD->prev_weight_fx = 0;
- move16();
- hBWE_FD->prev_flag = 0;
- move16();
- hBWE_FD->prev_Energy_wb_fx = 0;
- move32();
- hBWE_FD->mem_deemph_old_syn_fx = 0;
- move16();
-
- return;
-}
diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c
index 18867ce40bcd5d9ad0bb09e12c67b1212a9b31d0..9fae1ded560681fb2420b3bc487adbb7ab23ece4 100644
--- a/lib_dec/swb_bwe_dec_hr_fx.c
+++ b/lib_dec/swb_bwe_dec_hr_fx.c
@@ -1306,7 +1306,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB
}
FOR( i = 0; i < SWB_FENV; i++ )
{
- st_fx->prev_SWB_fenv_fx[i] = st_fx->prev_ener_shb_fx; /*gain_e + 15*/
+ st_fx->hBWE_FD->prev_SWB_fenv_fx[i] = st_fx->prev_ener_shb_fx; /*gain_e + 15*/
move16();
}
diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c
index cc9b681fba0ff907e5ca3a4cd863242a66e6bba6..492c927b6e7fcf81fd3ce8eaedd017ab5b55660c 100644
--- a/lib_dec/swb_tbe_dec_fx.c
+++ b/lib_dec/swb_tbe_dec_fx.c
@@ -25,16 +25,8 @@ static void rescale_genWB_mem( Decoder_State *st_fx, Word16 sf );
static void Dequant_lower_LSF_fx( const Word16 lsf_idx[], Word16 lsf_q[] );
static void Map_higher_LSF_fx( Word16 lsf_q[], const Word16 m, const Word16 grid_in[] );
static void Dequant_mirror_point_fx( const Word16 lsf_q[], const Word16 m_idx, Word16 *m );
-Word16 dotp_loc(
- const Word16 x[], /* i : vector x[] */
- const Word32 y[], /* i : vector y[] */
- const Word16 n /* i : vector length */
-);
-
-void find_max_mem_dec_m3(
- Decoder_State *st,
- Word16 *n_mem3 );
-
+static Word16 dotp_loc( const Word16 x[], const Word32 y[], const Word16 n );
+static void find_max_mem_dec_m3( Decoder_State *st, Word16 *n_mem3 );
/* gain shape concealment code */
static void gradientGainShape( Decoder_State *st_fx, Word16 *GainShape, Word32 *GainFrame );
@@ -411,62 +403,14 @@ void rescale_genWB_mem( Decoder_State *st_fx, Word16 sf )
hBWE_TD->mem_csfilt_fx[i] = L_shl( hBWE_TD->mem_csfilt_fx[i], sf );
move32();
}
-}
-
-void InitSWBdecBuffer_ivas_fx(
- Decoder_State *st_fx /* i/o: SHB decoder structure */
-)
-{
- TD_BWE_DEC_HANDLE hBWE_TD;
- hBWE_TD = st_fx->hBWE_TD;
-
- set16_fx( hBWE_TD->old_bwe_exc_fx, 0, ( PIT16k_MAX * 2 ) );
- hBWE_TD->bwe_seed[0] = 23;
- move16();
- hBWE_TD->bwe_seed[1] = 59;
- move16();
- set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET );
- hBWE_TD->bwe_non_lin_prev_scale_fx = 0;
- move16();
-
- set32_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, 0, HILBERT_MEM_SIZE );
- set16_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); /* Interp all pass memory */
- set32_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP ); /* Interp all pass memory */
-
- hBWE_TD->syn_dm_phase = 0;
- move16();
- hBWE_TD->prev_fbbwe_ratio_fx = 32767 /*1.0f Q15*/;
- move16();
-
- /* these are fd-bwe constants */
- hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */
- move32();
- hBWE_TD->prev_swb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */
- move32();
- st_fx->prev_Q_bwe_exc = 31;
- move16();
- st_fx->prev_ener_fx_Q = 31;
- move16();
- st_fx->prev_Qx = 0;
- move16();
- st_fx->prev_frame_pow_exp = 0;
- move16();
- st_fx->prev_Q_bwe_syn = 0;
- move16();
- st_fx->prev_Q_bwe_syn2 = 0;
- move16();
return;
}
-void InitSWBdecBuffer_fx(
- Decoder_State *st_fx /* i/o: SHB decoder structure */
-)
+static void InitSWBdecBuffer_fx(
+ TD_BWE_DEC_HANDLE hBWE_TD /* TD BWE data handle */ )
{
- TD_BWE_DEC_HANDLE hBWE_TD;
- hBWE_TD = st_fx->hBWE_TD;
-
set16_fx( hBWE_TD->old_bwe_exc_fx, 0, ( PIT16k_MAX * 2 ) );
hBWE_TD->bwe_seed[0] = 23;
move16();
@@ -478,7 +422,8 @@ void InitSWBdecBuffer_fx(
move16();
set32_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, 0, HILBERT_MEM_SIZE );
- set16_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); /* Interp all pass memory */
+ set16_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); /* Interp all pass memory */
+ set32_fx( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP ); /* Interp all pass memory */
hBWE_TD->syn_dm_phase = 0;
move16();
@@ -490,31 +435,33 @@ void InitSWBdecBuffer_fx(
move32();
hBWE_TD->prev_swb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */
move32();
- st_fx->prev_Q_bwe_exc = 31;
+ hBWE_TD->prev_ener_fx_Q = 31;
move16();
- st_fx->prev_ener_fx_Q = 31;
+ hBWE_TD->prev_Qx = 0;
move16();
- st_fx->prev_Qx = 0;
+ hBWE_TD->prev_frame_pow_exp = 0;
move16();
- st_fx->prev_frame_pow_exp = 0;
+ hBWE_TD->prev_Q_bwe_syn = 0;
move16();
- st_fx->prev_Q_bwe_syn = 0;
+ hBWE_TD->prev_Q_bwe_syn2 = 0;
move16();
- st_fx->prev_Q_bwe_syn2 = 0;
+ hBWE_TD->prev_hb_synth_fx_exp = 31;
move16();
+
return;
}
-void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure */ )
+void ResetSHBbuffer_Dec_fx(
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ const Word16 extl /* i : BWE extension layer */
+)
{
Word16 i;
Word16 f;
Word16 inc;
- TD_BWE_DEC_HANDLE hBWE_TD;
- hBWE_TD = st_fx->hBWE_TD;
- IF( NE_16( st_fx->extl, WB_TBE ) )
+ IF( NE_16( extl, WB_TBE ) )
{
f = 1489;
move16(); /* Q15 */
@@ -536,7 +483,7 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure *
set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD );
set16_fx( hBWE_TD->state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- IF( EQ_16( st_fx->extl, FB_TBE ) )
+ IF( EQ_16( extl, FB_TBE ) )
{
set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
hBWE_TD->fb_tbe_demph_fx = 0;
@@ -559,7 +506,7 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure *
/* States for FEC */
- IF( NE_16( st_fx->extl, WB_TBE ) )
+ IF( NE_16( extl, WB_TBE ) )
{
FOR( i = 0; i < LPC_SHB_ORDER; i++ )
{
@@ -595,7 +542,7 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure *
set16_fx( hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER );
hBWE_TD->gain_prec_swb_fx = 16384; /*Q14 =1*/
move16();
- set16_fx( &st_fx->GainShape_Delay[0], 0, NUM_SHB_SUBFR / 2 );
+ set16_fx( hBWE_TD->GainShape_Delay_fx, 0, NUM_SHB_SUBFR / 2 );
hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /* Q0 1.f */
move32();
hBWE_TD->prev_mix_factor_fx = 32767; /*Q15 1.f*/
@@ -825,11 +772,11 @@ void ivas_wb_tbe_dec_fx(
IF( EQ_32( st_fx->extl_brate, WB_TBE_0k35 ) )
{
/* convert LSPs back into LP coeffs */
- lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB );
+ lsp2lpc_fx( lpc_wb + 1, lsf_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB );
set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) );
FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ )
{
- st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
+ hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
move16();
}
FOR( i = 1; i < LPC_SHB_ORDER_LBR_WB + 1; i++ )
@@ -843,10 +790,10 @@ void ivas_wb_tbe_dec_fx(
ELSE
{
/* convert LSPs back into LP coeffs */
- lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_WB );
+ lsp2lpc_fx( lpc_wb + 1, lsf_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_WB );
FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ )
{
- st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
+ hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
move16();
}
FOR( i = 1; i < LPC_SHB_ORDER_WB + 1; i++ )
@@ -1010,15 +957,15 @@ void ivas_wb_tbe_dec_fx(
}
curr_frame_pow_exp = add( n, n );
- IF( GT_16( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) )
+ IF( GT_16( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp ) )
{
- curr_frame_pow = L_shr( curr_frame_pow, sub( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) );
- curr_frame_pow_exp = st_fx->prev_frame_pow_exp;
+ curr_frame_pow = L_shr( curr_frame_pow, sub( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp ) );
+ curr_frame_pow_exp = hBWE_TD->prev_frame_pow_exp;
move16();
}
ELSE
{
- hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, st_fx->prev_frame_pow_exp ) );
+ hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, hBWE_TD->prev_frame_pow_exp ) );
move32();
}
@@ -1074,7 +1021,7 @@ void ivas_wb_tbe_dec_fx(
hBWE_TD->prev_wb_bwe_frame_pow_fx = curr_frame_pow;
move32();
- st_fx->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
/* generate 16kHz SHB signal (6 - 8 kHz) from 2kHz signal */
@@ -1132,8 +1079,10 @@ void ivas_wb_tbe_dec_fx(
}
n_mem = s_max( n_mem, 0 );
- if ( GT_16( sub( Qx, st_fx->prev_Qx ), n_mem ) )
- Qx = add( st_fx->prev_Qx, n_mem );
+ if ( GT_16( sub( Qx, hBWE_TD->prev_Qx ), n_mem ) )
+ {
+ Qx = add( hBWE_TD->prev_Qx, n_mem );
+ }
FOR( i = 0; i < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; i++ )
{
@@ -1143,13 +1092,13 @@ void ivas_wb_tbe_dec_fx(
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->state_lsyn_filt_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_shb_fx[i], sub( Qx, st_fx->prev_Qx ) );
+ hBWE_TD->state_lsyn_filt_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_shb_fx[i], sub( Qx, hBWE_TD->prev_Qx ) );
move16();
}
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i], sub( Qx, st_fx->prev_Qx ) );
+ hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i], sub( Qx, hBWE_TD->prev_Qx ) );
move16();
}
@@ -1163,56 +1112,58 @@ void ivas_wb_tbe_dec_fx(
move16();
}
- max = 0;
- move16();
- FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
+ IF( st_fx->hBWE_FD != NULL )
{
- max = s_max( max, abs_s( synth[cnt] ) );
- }
-
- IF( max == 0 )
- {
- st_fx->last_wb_bwe_ener_fx = 0;
+ max = 0;
move16();
- }
- ELSE
- {
- n = norm_s( max );
FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
{
- synth_frac[cnt] = shl( synth[cnt], n ); /*Q14*/
- move16();
+ max = s_max( max, abs_s( synth[cnt] ) );
}
- n = sub( sub( 14, n ), Qx );
- Lacc = 0;
- move32();
- FOR( i = 0; i < L_FRAME16k; i++ )
+ IF( max == 0 )
{
- L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */
- Lacc = L_add( Lacc, L_shr( L_tmp, 7 ) ); /* Q22 */
+ st_fx->hBWE_FD->last_wb_bwe_ener_fx = 0;
+ move16();
}
+ ELSE
+ {
+ n = norm_s( max );
+ FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
+ {
+ synth_frac[cnt] = shl( synth[cnt], n ); /*Q14*/
+ move16();
+ }
+ n = sub( sub( 14, n ), Qx );
- L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */
- exp = norm_l( L_tmp );
- tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow );
- exp = sub( add( exp, 22 ), 30 );
- tmp = div_s( 16384, tmp );
- L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */
- st_fx->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */
- move16();
- }
+ Lacc = 0;
+ move32();
+ FOR( i = 0; i < L_FRAME16k; i++ )
+ {
+ L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */
+ Lacc = L_add( Lacc, L_shr( L_tmp, 7 ) ); /* Q22 */
+ }
+ L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */
+ exp = norm_l( L_tmp );
+ tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow );
+ exp = sub( add( exp, 22 ), 30 );
+ tmp = div_s( 16384, tmp );
+ L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */
+ st_fx->hBWE_FD->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */
+ move16();
+ }
+ }
IF( EQ_32( st_fx->output_Fs, 32000 ) ) /* 32kHz sampling rate, but only WB output - interpolate */
{
- Scale_sig( hBWE_TD->state_32and48k_WB_upsample_fx, 2 * ALLPASSSECTIONS_STEEP, sub( Qx, st_fx->prev_Qx ) );
+ Scale_sig( hBWE_TD->state_32and48k_WB_upsample_fx, 2 * ALLPASSSECTIONS_STEEP, sub( Qx, hBWE_TD->prev_Qx ) );
Interpolate_allpass_steep_fx( synth, hBWE_TD->state_32and48k_WB_upsample_fx, L_FRAME16k, upsampled_synth );
Copy( upsampled_synth, synth, L_FRAME32k );
}
ELSE IF( EQ_32( st_fx->output_Fs, 48000 ) )
{
- Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, st_fx->prev_Qx ) );
+ Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, hBWE_TD->prev_Qx ) );
ivas_interpolate_3_over_1_allpass_fx( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx );
Copy( upsampled_synth, synth, L_FRAME48k );
}
@@ -1238,7 +1189,7 @@ void ivas_wb_tbe_dec_fx(
move16();
hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */
move32();
- st_fx->prev_frame_pow_exp = 0;
+ hBWE_TD->prev_frame_pow_exp = 0;
move16();
}
@@ -1265,7 +1216,7 @@ void ivas_wb_tbe_dec_fx(
st_fx->prev_Q_bwe_exc = Q_bwe_exc;
move16();
- st_fx->prev_Qx = Qx;
+ hBWE_TD->prev_Qx = Qx;
move16();
return;
@@ -1463,11 +1414,11 @@ void wb_tbe_dec_fx(
IF( EQ_32( st_fx->extl_brate, WB_TBE_0k35 ) )
{
/* convert LSPs back into LP coeffs */
- lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB );
+ lsp2lpc_fx( lpc_wb + 1, lsf_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB );
set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB );
FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ )
{
- st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
+ hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
move16();
}
FOR( i = 1; i < LPC_SHB_ORDER_LBR_WB + 1; i++ )
@@ -1481,10 +1432,10 @@ void wb_tbe_dec_fx(
ELSE
{
/* convert LSPs back into LP coeffs */
- lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_WB );
+ lsp2lpc_fx( lpc_wb + 1, lsf_wb, hBWE_TD->prev_lpc_wb_fx, LPC_SHB_ORDER_WB );
FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ )
{
- st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
+ hBWE_TD->prev_lpc_wb_fx[i] = lpc_wb[i + 1];
move16();
}
FOR( i = 1; i < LPC_SHB_ORDER_WB + 1; i++ )
@@ -1648,15 +1599,15 @@ void wb_tbe_dec_fx(
}
curr_frame_pow_exp = add( n, n );
- IF( GT_16( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) )
+ IF( GT_16( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp ) )
{
- curr_frame_pow = L_shr( curr_frame_pow, sub( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) );
- curr_frame_pow_exp = st_fx->prev_frame_pow_exp;
+ curr_frame_pow = L_shr( curr_frame_pow, sub( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp ) );
+ curr_frame_pow_exp = hBWE_TD->prev_frame_pow_exp;
move16();
}
ELSE
{
- hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, st_fx->prev_frame_pow_exp ) );
+ hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, hBWE_TD->prev_frame_pow_exp ) );
move32();
}
@@ -1710,7 +1661,7 @@ void wb_tbe_dec_fx(
hBWE_TD->prev_wb_bwe_frame_pow_fx = curr_frame_pow;
move32();
- st_fx->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
/* generate 16kHz SHB signal (6 - 8 kHz) from 2kHz signal */
@@ -1737,13 +1688,17 @@ void wb_tbe_dec_fx(
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ), max ) )
+ {
max = abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] );
+ }
}
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ), max ) )
+ {
max = abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] );
+ }
}
IF( EQ_32( st_fx->output_Fs, 32000 ) )
@@ -1768,8 +1723,10 @@ void wb_tbe_dec_fx(
}
n_mem = s_max( n_mem, 0 );
- if ( GT_16( sub( Qx, st_fx->prev_Qx ), n_mem ) )
- Qx = add( st_fx->prev_Qx, n_mem );
+ if ( GT_16( sub( Qx, hBWE_TD->prev_Qx ), n_mem ) )
+ {
+ Qx = add( hBWE_TD->prev_Qx, n_mem );
+ }
FOR( i = 0; i < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; i++ )
{
@@ -1779,13 +1736,13 @@ void wb_tbe_dec_fx(
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->state_lsyn_filt_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_shb_fx[i], sub( Qx, st_fx->prev_Qx ) );
+ hBWE_TD->state_lsyn_filt_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_shb_fx[i], sub( Qx, hBWE_TD->prev_Qx ) );
move16();
}
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
{
- hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i], sub( Qx, st_fx->prev_Qx ) );
+ hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] = shl( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i], sub( Qx, hBWE_TD->prev_Qx ) );
move16();
}
@@ -1799,56 +1756,58 @@ void wb_tbe_dec_fx(
move16();
}
- max = 0;
- move16();
- FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
+ IF( st_fx->hBWE_FD != NULL )
{
- max = s_max( max, abs_s( synth[cnt] ) );
- }
-
- IF( max == 0 )
- {
- st_fx->last_wb_bwe_ener_fx = 0;
+ max = 0;
move16();
- }
- ELSE
- {
- n = norm_s( max );
FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
{
- synth_frac[cnt] = shl( synth[cnt], n ); /*Q14*/
- move16();
+ max = s_max( max, abs_s( synth[cnt] ) );
}
- n = sub( sub( 14, n ), Qx );
- Lacc = 0;
- move32();
- FOR( i = 0; i < L_FRAME16k; i++ )
+ IF( max == 0 )
{
- L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */
- Lacc = L_add( Lacc, L_shr( L_tmp, 7 ) ); /* Q22 */
+ st_fx->hBWE_FD->last_wb_bwe_ener_fx = 0;
+ move16();
}
+ ELSE
+ {
+ n = norm_s( max );
+ FOR( cnt = 0; cnt < L_FRAME16k; cnt++ )
+ {
+ synth_frac[cnt] = shl( synth[cnt], n ); /*Q14*/
+ move16();
+ }
+ n = sub( sub( 14, n ), Qx );
- L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */
- exp = norm_l( L_tmp );
- tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow );
- exp = sub( add( exp, 22 ), 30 );
- tmp = div_s( 16384, tmp );
- L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */
- st_fx->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */
- move16();
- }
+ Lacc = 0;
+ move32();
+ FOR( i = 0; i < L_FRAME16k; i++ )
+ {
+ L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */
+ Lacc = L_add( Lacc, L_shr( L_tmp, 7 ) ); /* Q22 */
+ }
+ L_tmp = Mult_32_16( Lacc, 102 ); /* Q22 */
+ exp = norm_l( L_tmp );
+ tmp = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow );
+ exp = sub( add( exp, 22 ), 30 );
+ tmp = div_s( 16384, tmp );
+ L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */
+ st_fx->hBWE_FD->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */
+ move16();
+ }
+ }
IF( EQ_32( st_fx->output_Fs, 32000 ) ) /* 32kHz sampling rate, but only WB output - interpolate */
{
- Scale_sig( hBWE_TD->state_32and48k_WB_upsample_fx, 2 * ALLPASSSECTIONS_STEEP, sub( Qx, st_fx->prev_Qx ) );
+ Scale_sig( hBWE_TD->state_32and48k_WB_upsample_fx, 2 * ALLPASSSECTIONS_STEEP, sub( Qx, hBWE_TD->prev_Qx ) );
Interpolate_allpass_steep_fx( synth, hBWE_TD->state_32and48k_WB_upsample_fx, L_FRAME16k, upsampled_synth );
Copy( upsampled_synth, synth, L_FRAME32k );
}
ELSE IF( EQ_32( st_fx->output_Fs, 48000 ) )
{
- Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, st_fx->prev_Qx ) );
+ Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, hBWE_TD->prev_Qx ) );
interpolate_3_over_1_allpass_fx( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx );
Copy( upsampled_synth, synth, L_FRAME48k );
}
@@ -1874,7 +1833,7 @@ void wb_tbe_dec_fx(
move16();
hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */
move32();
- st_fx->prev_frame_pow_exp = 0;
+ hBWE_TD->prev_frame_pow_exp = 0;
move16();
}
@@ -1901,7 +1860,7 @@ void wb_tbe_dec_fx(
st_fx->prev_Q_bwe_exc = Q_bwe_exc;
move16();
- st_fx->prev_Qx = Qx;
+ hBWE_TD->prev_Qx = Qx;
move16();
return;
@@ -2014,7 +1973,7 @@ void swb_tbe_dec_fx(
move16();
shb_ener_sf_32 = L_deposit_l( 0 );
set16_fx( shaped_shb_excitationTemp, 0, L_FRAME16k );
- st_fx->shb_dtx_count_fx = 0;
+ st_fx->hTdCngDec->shb_dtx_count_fx = 0;
move16();
is_fractive = 0;
move16();
@@ -2269,7 +2228,7 @@ void swb_tbe_dec_fx(
{
FOR( j = 0; j < 4; j++ )
{
- GainShape[add( i * 4, j )] = mult_r( st_fx->cummulative_damping, st_fx->GainShape_Delay[4 + i] );
+ GainShape[add( i * 4, j )] = mult_r( st_fx->cummulative_damping, hBWE_TD->GainShape_Delay_fx[4 + i] );
move16();
}
}
@@ -2374,13 +2333,13 @@ void swb_tbe_dec_fx(
}
/* get the gainshape delay */
- Copy( &st_fx->GainShape_Delay[4], &st_fx->GainShape_Delay[0], NUM_SHB_SUBFR / 4 );
+ Copy( &hBWE_TD->GainShape_Delay_fx[4], &hBWE_TD->GainShape_Delay_fx[0], NUM_SHB_SUBFR / 4 );
test();
IF( ( st_fx->rf_flag != 0 ) || EQ_32( st_fx->total_brate, ACELP_9k60 ) )
{
FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ )
{
- st_fx->GainShape_Delay[i + 4] = s_min( s_max( GainShape[i * 4], 3277 /*0.1f Q15*/ ), 16384 /*0.5f Q15*/ );
+ hBWE_TD->GainShape_Delay_fx[i + 4] = s_min( s_max( GainShape[i * 4], 3277 /*0.1f Q15*/ ), 16384 /*0.5f Q15*/ );
move16();
}
}
@@ -2388,7 +2347,7 @@ void swb_tbe_dec_fx(
{
FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ )
{
- st_fx->GainShape_Delay[i + 4] = GainShape[i * 4];
+ hBWE_TD->GainShape_Delay_fx[i + 4] = GainShape[i * 4];
move16();
}
}
@@ -2600,8 +2559,11 @@ void swb_tbe_dec_fx(
move16();
/* SWB CNG/DTX - update memories */
- Copy( st_fx->lsp_shb_prev_fx, st_fx->lsp_shb_prev_prev_fx, LPC_SHB_ORDER ); /* Q15 */
- Copy( lsf_shb, st_fx->lsp_shb_prev_fx, LPC_SHB_ORDER ); /* Q15 */
+ if ( st_fx->hTdCngDec != NULL )
+ {
+ Copy( st_fx->hTdCngDec->lsp_shb_prev_fx, st_fx->hTdCngDec->lsp_shb_prev_prev_fx, LPC_SHB_ORDER ); /* Q15 */
+ Copy( lsf_shb, st_fx->hTdCngDec->lsp_shb_prev_fx, LPC_SHB_ORDER ); /* Q15 */
+ }
/* vind = (short)(mixFactors*8.0f); */
vind = shl( mixFactors, 3 - 15 ); /* 3 for mpy by 8.0f, -15 to bring it to Q0 */
@@ -2665,7 +2627,7 @@ void swb_tbe_dec_fx(
Q_bwe_exc = sub( Q_bwe_exc, 16 ); /* Q_bwe_exc reflecting the single precision dynamic norm-ed buffers from here */
/* -------- end of rescaling memories -------- */
- Q_bwe_exc_fb = st_fx->prev_Q_bwe_exc_fb;
+ Q_bwe_exc_fb = hBWE_TD->prev_Q_bwe_exc_fb;
move16();
IF( GT_32( st_fx->total_brate, ACELP_32k ) )
@@ -2682,26 +2644,26 @@ void swb_tbe_dec_fx(
coder_type, bwe_exc_extended_16, hBWE_TD->bwe_seed, vf_modified, st_fx->extl,
&( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), lpc_shb_sf, shb_ener_sf_32,
shb_res_gshape, shb_res_dummy, &vind, formant_fac, hBWE_TD->fb_state_lpc_syn_fx,
- &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, st_fx->prev_Q_bwe_syn, st_fx->total_brate, st_fx->prev_bfi );
+ &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, hBWE_TD->prev_Q_bwe_syn, st_fx->total_brate, st_fx->prev_bfi );
*Q_white_exc = Q_bwe_exc_fb;
move16();
IF( EQ_16( st_fx->extl, FB_TBE ) )
{
- st_fx->prev_Q_bwe_exc_fb = Q_bwe_exc_fb;
+ hBWE_TD->prev_Q_bwe_exc_fb = Q_bwe_exc_fb;
move16();
}
ELSE
{
/*Indirectly a memory reset of FB memories for next frame such that rescaling of memories would lead to 0 due to such high prev. Q value.
51 because of 31 + 20(shift of Q_bwe_exc_fb before de-emphasis)*/
- st_fx->prev_Q_bwe_exc_fb = 51;
+ hBWE_TD->prev_Q_bwe_exc_fb = 51;
move16();
}
/* rescale the TBE post proc memory */
FOR( i = 0; i < LPC_SHB_ORDER; i++ )
{
- hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st_fx->prev_Q_bwe_syn ) );
+ hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_syn ) );
move16();
}
@@ -2727,11 +2689,7 @@ void swb_tbe_dec_fx(
curr_pow = L_shr( curr_pow, 2 ); /* Q(2*Q_bwe_exc) */
}
- Lscale = root_a_over_b_fx( curr_pow,
- shl( Q_bwe_exc, 1 ),
- prev_pow,
- shl( Q_bwe_exc, 1 ),
- &exp );
+ Lscale = root_a_over_b_fx( curr_pow, shl( Q_bwe_exc, 1 ), prev_pow, shl( Q_bwe_exc, 1 ), &exp );
FOR( i = 0; i < L_SHB_LAHEAD; i++ )
{
@@ -3060,7 +3018,7 @@ void swb_tbe_dec_fx(
/* if( ener_tmp_fx[i]*GainShape_tmp_fx[i] > st_fx->prev_ener_fx*st_fx->prev_GainShape_fx ) */
L_tmp1 = Mult_32_16( ener_tmp[i], GainShape_tmp[i] ); /* (2*Q_bwe_exc) */
L_tmp2 = Mult_32_16( hBWE_TD->prev_ener_fx, hBWE_TD->prev_GainShape_fx ); /* (2*st_fx->prev_ener_fx_Q) */
- tmp = sub( shl( Q_bwe_exc, 1 ), shl( st_fx->prev_ener_fx_Q, 1 ) );
+ tmp = sub( shl( Q_bwe_exc, 1 ), shl( hBWE_TD->prev_ener_fx_Q, 1 ) );
L_tmp2 = L_shl_sat( L_tmp2, tmp ); /* new Q = (2*Q_bwe_exc) */
IF( GT_32( L_tmp1, L_tmp2 ) )
{
@@ -3096,7 +3054,7 @@ void swb_tbe_dec_fx(
move32();
hBWE_TD->prev_GainShape_fx = GainShape_tmp[i];
move16();
- st_fx->prev_ener_fx_Q = Q_bwe_exc;
+ hBWE_TD->prev_ener_fx_Q = Q_bwe_exc;
move16();
}
FOR( i = 0; i < NUM_SHB_SUBFR; i++ )
@@ -3113,13 +3071,13 @@ void swb_tbe_dec_fx(
}
ELSE
{
- st_fx->prev_ener_fx_Q = Q_bwe_exc;
+ hBWE_TD->prev_ener_fx_Q = Q_bwe_exc;
move16();
}
/* Back up the Q_bwe_exc associated with shaped_shb_excitation for the next frame*/
- st_fx->prev_Q_bwe_syn = Q_bwe_exc;
+ hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc;
move16();
/* Scale the shaped excitation */
@@ -3130,13 +3088,7 @@ void swb_tbe_dec_fx(
GainFrame, /* Q18 */
window_shb_fx,
subwin_shb_fx,
- &Q_bwe_exc, &Qx, n_mem3, st_fx->prev_Q_bwe_syn2 );
- /* i: GainShape Q15 */
- /* i: GainFrame Q18 */
- /* i: shaped_shb_excitation Q_bwe_exc */
- /* o: shaped_shb_excitation Q_bwe_exc */
- /* o: st_fx->syn_overlap_fx Q_bwe_exc */
-
+ &Q_bwe_exc, &Qx, n_mem3, hBWE_TD->prev_Q_bwe_syn2 );
max = 0;
move16();
@@ -3174,31 +3126,31 @@ void swb_tbe_dec_fx(
curr_frame_pow_exp = sub( shl( add( Q_bwe_exc, n ), 1 ), 9 );
- tmp = sub( st_fx->prev_frame_pow_exp, curr_frame_pow_exp );
+ tmp = sub( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp );
IF( tmp > 0 ) /* shifting prev */
{
IF( GT_16( tmp, 32 ) )
{
- st_fx->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 );
+ hBWE_TD->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 );
move16();
tmp = 32;
move16();
}
hBWE_TD->prev_swb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, tmp );
move32();
- st_fx->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
}
ELSE /* shifting curr */
{
IF( LT_16( tmp, -32 ) )
{
- curr_frame_pow_exp = sub( st_fx->prev_frame_pow_exp, 32 );
+ curr_frame_pow_exp = sub( hBWE_TD->prev_frame_pow_exp, 32 );
tmp = -32;
move16();
}
curr_frame_pow = L_shr( curr_frame_pow, -tmp );
- curr_frame_pow_exp = st_fx->prev_frame_pow_exp;
+ curr_frame_pow_exp = hBWE_TD->prev_frame_pow_exp;
move16();
}
test();
@@ -3363,10 +3315,9 @@ void swb_tbe_dec_fx(
hBWE_TD->prev_swb_bwe_frame_pow_fx = curr_frame_pow;
move32();
- st_fx->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
-
{
Word64 prev_ener_shb64 = 0;
move64();
@@ -3377,7 +3328,6 @@ void swb_tbe_dec_fx(
L_prev_ener_shb = W_sat_l( prev_ener_shb64 );
}
-
/* st->prev_ener_shb = sqrt(st->prev_ener_shb/L_FRAME16k) */
L_prev_ener_shb = Mult_32_16( L_prev_ener_shb, 26214 ); /* 2*Q_bwe_exc_mod+8; 26214=(1/L_FRAME16k) in Q23 */
st_fx->prev_ener_shb_fx = 0;
@@ -3410,11 +3360,10 @@ void swb_tbe_dec_fx(
L_tmp = Isqrt_lc( L_tmp, &exp );
tmp = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /* Q1 */
}
- set16_fx( st_fx->prev_SWB_fenv_fx, tmp, SWB_FENV ); /* Q1 */
-
+ set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, tmp, SWB_FENV ); /* Q1 */
/* rescale the memories if Q_bwe_exc is different from previous frame */
- sc = sub( Q_bwe_exc, st_fx->prev_Q_bwe_syn2 );
+ sc = sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_syn2 );
IF( sc != 0 )
{
FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
@@ -3577,10 +3526,11 @@ void swb_tbe_dec_fx(
move32();
*Q_synth = Q_bwe_exc;
move16();
- st_fx->prev_Q_bwe_syn2 = Q_bwe_exc;
+ hBWE_TD->prev_Q_bwe_syn2 = Q_bwe_exc;
move16();
- st_fx->prev_Qx = Q_bwe_exc;
+ hBWE_TD->prev_Qx = Q_bwe_exc;
move16();
+
return;
}
@@ -3600,9 +3550,9 @@ static void gradientGainShape(
/* the previous frame gainshape gradient and the gainshape gradient pattern for the current frame */
FOR( j = 0; j < 3; j++ )
{
- GainGrad0[j] = sub( shr( st_fx->GainShape_Delay[j + 1], 1 ), shr( st_fx->GainShape_Delay[j], 1 ) );
+ GainGrad0[j] = sub( shr( hBWE_TD->GainShape_Delay_fx[j + 1], 1 ), shr( hBWE_TD->GainShape_Delay_fx[j], 1 ) );
move16(); /* Q14 */
- GainGrad1[j] = sub( shr( st_fx->GainShape_Delay[j + 5], 1 ), shr( st_fx->GainShape_Delay[j + 4], 1 ) );
+ GainGrad1[j] = sub( shr( hBWE_TD->GainShape_Delay_fx[j + 5], 1 ), shr( hBWE_TD->GainShape_Delay_fx[j + 4], 1 ) );
move16(); /* Q14 */
GainGradFEC[j + 1] = add( mult_r( GainGrad0[j], 13107 ), mult_r( GainGrad1[j], 19660 ) );
move16(); /* Q14 */
@@ -3631,17 +3581,17 @@ static void gradientGainShape(
test();
IF( ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) && ( GainGradFEC[0] > 0 ) )
{
- GainShapeTemp[0] = add( shr( st_fx->GainShape_Delay[7], 1 ), GainGradFEC[0] );
+ GainShapeTemp[0] = add( shr( hBWE_TD->GainShape_Delay_fx[7], 1 ), GainGradFEC[0] );
move16();
}
ELSE IF( GainGradFEC[0] > 0 )
{
- GainShapeTemp[0] = add( shr( st_fx->GainShape_Delay[7], 1 ), mult_r( GainGradFEC[0], 16384 ) );
+ GainShapeTemp[0] = add( shr( hBWE_TD->GainShape_Delay_fx[7], 1 ), mult_r( GainGradFEC[0], 16384 ) );
move16(); /* Q14 */
}
ELSE
{
- GainShapeTemp[0] = shr( st_fx->GainShape_Delay[7], 1 );
+ GainShapeTemp[0] = shr( hBWE_TD->GainShape_Delay_fx[7], 1 );
move16(); /* Q14 */
}
@@ -3874,7 +3824,9 @@ static void Dequant_mirror_point_fx(
return;
}
-Word16 dotp_loc(
+
+
+static Word16 dotp_loc(
const Word16 x[], /* i : vector x[] Qx */
const Word32 y[], /* i : vector y[] Qy */
const Word16 n /* i : vector length */
@@ -4893,35 +4845,33 @@ void tbe_read_bitstream_fx(
* buffer to fill the gap caused by the delay alignment buffer when
* switching from TBE to IGF
*---------------------------------------------------------------------*/
+
void GenTransition_fx(
- const Word16 *input, /* i : gain shape overlap buffer Q11 */
- const Word16 *old_hb_synth, /* i : synthesized HB from previous frame Q(15 - hb_synth_fx_exp)*/
- Word16 length, /* i : targeted length of transition signal */
- Word16 *output, /* o : synthesized transitions signal st_fx->prev_Q_bwe_syn2 */
- Word32 Hilbert_Mem[], /* i/o: memory st_fx->prev_Q_bwe_syn2 */
- Word16 state_lsyn_filt_shb_local[], /* i/o: memory st_fx->prev_Q_bwe_syn2*/
- Word16 mem_resamp_HB_32k[], /* i/o: memory */
- Word16 *syn_dm_phase,
- Word32 target_fs,
- Word16 *up_mem,
- Word16 rf_flag,
- Word32 bitrate )
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word16 *output_HB, /* o : synthesized HB transitions signal st_fx->prev_Q_bwe_syn2 */
+ const Word32 output_Fs, /* i : output sampling rate */
+ Word16 rf_flag, /* i : RF flag */
+ Word32 total_bitrate /* i : total bitrate */
+)
{
- Word16 i;
+ Word16 i, length;
Word16 syn_overlap_32k[L_FRAME32k];
Word32 L_tmp;
Word16 ol_len = 2 * SHB_OVERLAP_LEN;
+ /* set targeted length of transition signal */
+ length = shl( NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ), 1 );
+
/* upsample overlap snippet */
- Interpolate_allpass_steep_fx( input, state_lsyn_filt_shb_local, SHB_OVERLAP_LEN, syn_overlap_32k );
+ Interpolate_allpass_steep_fx( hBWE_TD->syn_overlap_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, SHB_OVERLAP_LEN, syn_overlap_32k );
/* perform spectral flip and downmix with overlap snippet to match HB synth */
test();
- IF( ( rf_flag != 0 ) || EQ_32( bitrate, ACELP_9k60 ) )
+ IF( ( rf_flag != 0 ) || EQ_32( total_bitrate, ACELP_9k60 ) )
{
- flip_and_downmix_generic_fx( syn_overlap_32k, syn_overlap_32k, 2 * SHB_OVERLAP_LEN, Hilbert_Mem,
- Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
- syn_dm_phase );
+ flip_and_downmix_generic_fx( syn_overlap_32k, syn_overlap_32k, 2 * SHB_OVERLAP_LEN, hBWE_TD->genSHBsynth_Hilbert_Mem_fx,
+ hBWE_TD->genSHBsynth_Hilbert_Mem_fx + HILBERT_ORDER1, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
+ &( hBWE_TD->syn_dm_phase ) );
}
ELSE
{
@@ -4937,25 +4887,91 @@ void GenTransition_fx(
/* cross fade of overlap snippet and mirrored HB synth from previous frame */
FOR( i = 0; i < ol_len; i++ )
{
- L_tmp = L_mult( window_shb_32k_fx[i], old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i] );
- output[i] = mac_r( L_tmp, window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i], syn_overlap_32k[i] );
+ L_tmp = L_mult( window_shb_32k_fx[i], hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i] );
+ output_HB[i] = mac_r( L_tmp, window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i], syn_overlap_32k[i] );
move16();
}
/* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
FOR( ; i < length; i++ )
{
- output[i] = old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i];
+ output_HB[i] = hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i];
move16();
}
- IF( EQ_32( target_fs, 48000 ) )
+ IF( EQ_32( output_Fs, 48000 ) )
+ {
+ interpolate_3_over_2_allpass_fx( output_HB, length, output_HB, hBWE_TD->int_3_over_2_tbemem_dec_fx, allpass_poles_3_ov_2 );
+ }
+ ELSE IF( EQ_32( output_Fs, 16000 ) )
+ {
+ Decimate_allpass_steep_fx( output_HB, hBWE_TD->mem_resamp_HB_32k_fx, L_FRAME32k, output_HB );
+ }
+
+ return;
+}
+
+/* IVAS 32-bit variant */
+void GenTransition_fx32(
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
+ const Word32 output_Fs, /* i : output sampling rate : Q0 */
+ const Word16 L_frame, /* i : ACELP frame length : Q0 */
+ const Word16 prev_Qx )
+{
+ Word16 i, length;
+
+ Word32 syn_overlap_32k_fx[2 * SHB_OVERLAP_LEN];
+
+ /* set targeted length of transition signal */
+ length = i_mult( 2, NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ) );
+
+ /* upsample overlap snippet */
+ Interpolate_allpass_steep_fx32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, SHB_OVERLAP_LEN, syn_overlap_32k_fx );
+
+ /* perform spectral flip and downmix with overlap snippet to match HB synth */
+ test();
+ IF( EQ_16( L_frame, L_FRAME ) )
+ {
+ flip_and_downmix_generic_fx32( syn_overlap_32k_fx, syn_overlap_32k_fx, 2 * SHB_OVERLAP_LEN, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + HILBERT_ORDER1, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), &( hBWE_TD->syn_dm_phase ) );
+ }
+ ELSE
+ {
+ FOR( i = 0; i < 2 * SHB_OVERLAP_LEN; i++ )
+ {
+ IF( i % 2 == 0 )
+ {
+ syn_overlap_32k_fx[i] = L_negate( syn_overlap_32k_fx[i] );
+ }
+ ELSE
+ {
+ syn_overlap_32k_fx[i] = syn_overlap_32k_fx[i];
+ }
+ move32();
+ }
+ }
+
+ /* cross fade of overlap snippet and mirrored HB synth from previous frame */
+ FOR( i = 0; i < 2 * L_SHB_LAHEAD; i++ )
+ {
+ outputHB_fx[i] = L_add_sat( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_32k_fx[i] ), Mpy_32_16_1( syn_overlap_32k_fx[i], window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i] ) );
+ move32();
+ }
+
+ /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
+ FOR( ; i < length; i++ )
+ {
+ outputHB_fx[i] = L_shl( hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i], sub( Q11, prev_Qx ) );
+ move32();
+ }
+
+ IF( EQ_32( output_Fs, 48000 ) )
{
- interpolate_3_over_2_allpass_fx( output, length, output, up_mem, allpass_poles_3_ov_2 );
+ interpolate_3_over_2_allpass_fx32( outputHB_fx, length, outputHB_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 );
}
- ELSE IF( EQ_32( target_fs, 16000 ) )
+ ELSE IF( EQ_32( output_Fs, 16000 ) )
{
- Decimate_allpass_steep_fx( output, mem_resamp_HB_32k, L_FRAME32k, output );
+ Decimate_allpass_steep_fx32( outputHB_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, outputHB_fx );
}
return;
@@ -4963,32 +4979,29 @@ void GenTransition_fx(
/*---------------------------------------------------------------------*
- * GenTransition_WB_fx()
+ * GenTransition_WB()
*
*---------------------------------------------------------------------*/
void GenTransition_WB_fx(
- const Word16 *input, /* i : gain shape overlap buffer */
- const Word16 *old_hb_synth, /* i : synthesized HB from previous frame */
- const Word16 prev_Qx, /* i : scaling of old_hb_synth */
- Word16 length, /* i : targeted length of transition signal */
- Word16 *output, /* o : synthesized transitions signal */
- Word16 state_lsyn_filt_shb1[],
- Word16 state_lsyn_filt_shb2[],
- Word32 output_Fs,
- Word16 *up_mem )
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word16 *output, /* o : synthesized transitions signal */
+ const Word32 output_Fs /* i : output sampling rate */
+)
{
- Word16 i;
+ Word16 i, length;
Word32 L_tmp;
Word16 speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k];
Word16 upsampled_synth[L_FRAME48k];
Word16 input_scaled[SHB_OVERLAP_LEN / 2];
- /* upsample overlap snippet */
- Copy_Scale_sig( input, input_scaled, SHB_OVERLAP_LEN / 2, prev_Qx );
- Interpolate_allpass_steep_fx( input_scaled, state_lsyn_filt_shb1, SHB_OVERLAP_LEN / 2, speech_buf_16k1 );
- Interpolate_allpass_steep_fx( speech_buf_16k1, state_lsyn_filt_shb2, SHB_OVERLAP_LEN, speech_buf_16k2 );
+ /* set targeted length of transition signal */
+ length = shl( NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ), 1 );
+ /* upsample overlap snippet */
+ Copy_Scale_sig( hBWE_TD->syn_overlap_fx, input_scaled, SHB_OVERLAP_LEN / 2, hBWE_TD->prev_Qx );
+ Interpolate_allpass_steep_fx( input_scaled, hBWE_TD->state_lsyn_filt_shb_fx, SHB_OVERLAP_LEN / 2, speech_buf_16k1 );
+ Interpolate_allpass_steep_fx( speech_buf_16k1, hBWE_TD->state_lsyn_filt_dwn_shb_fx, SHB_OVERLAP_LEN, speech_buf_16k2 );
/* perform spectral flip and downmix with overlap snippet to match HB synth */
FOR( i = 0; i < SHB_OVERLAP_LEN; i += 2 )
@@ -5000,7 +5013,7 @@ void GenTransition_WB_fx(
/* cross fade of overlap snippet and mirrored HB synth from previous frame */
FOR( i = 0; i < L_SHB_LAHEAD; i++ )
{
- L_tmp = L_mult( window_shb_fx[i], old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i] );
+ L_tmp = L_mult( window_shb_fx[i], hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i] );
output[i] = mac_r( L_tmp, window_shb_fx[L_SHB_LAHEAD - 1 - i], speech_buf_16k2[i] );
move16();
output[i] = mult_r( output[i], 21299 );
@@ -5010,105 +5023,116 @@ void GenTransition_WB_fx(
/* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
FOR( ; i < length; i++ )
{
- output[i] = mult_r( old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i], 21299 );
+ output[i] = mult_r( hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i], 21299 );
move16();
}
/* upsampling if necessary */
IF( EQ_32( output_Fs, 32000 ) )
{
- Interpolate_allpass_steep_fx( output, up_mem, L_FRAME16k, upsampled_synth );
+ Interpolate_allpass_steep_fx( output, hBWE_TD->mem_resamp_HB_fx, L_FRAME16k, upsampled_synth );
Copy( upsampled_synth, output, L_FRAME32k );
}
ELSE IF( EQ_32( output_Fs, 48000 ) )
{
- interpolate_3_over_1_allpass_fx( output, L_FRAME16k, upsampled_synth, up_mem );
+ interpolate_3_over_1_allpass_fx( output, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx );
Copy( upsampled_synth, output, L_FRAME48k );
}
return;
}
-/*---------------------------------------------------------------------*
- * TBEreset_dec_fx()
- *
- *---------------------------------------------------------------------*/
-void TBEreset_dec_fx(
- Decoder_State *st_fx, /* i/o: decoder state structure */
- Word16 bandwidth /* i : bandwidth mode */
+/* IVAS 32-bit variant */
+void GenTransition_WB_fx32(
+ TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
+ const Word32 output_Fs /* i : output sampling rate */
)
{
- TD_BWE_DEC_HANDLE hBWE_TD;
- hBWE_TD = st_fx->hBWE_TD;
+ Word16 i, length;
+ Word32 speech_buf_16k1_fx[SHB_OVERLAP_LEN], speech_buf_16k2_fx[2 * SHB_OVERLAP_LEN];
+ Word32 upsampled_synth_fx[L_FRAME48k];
- IF( NE_16( st_fx->last_core, ACELP_CORE ) )
+ /* set targeted length of transition signal */
+ length = i_mult( 2, NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ) );
+
+ /* upsample overlap snippet */
+ Interpolate_allpass_steep_fx32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->state_lsyn_filt_shb_fx_32, SHB_OVERLAP_LEN / 2, speech_buf_16k1_fx );
+ Interpolate_allpass_steep_fx32( speech_buf_16k1_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, SHB_OVERLAP_LEN, speech_buf_16k2_fx );
+
+ /* perform spectral flip and downmix with overlap snippet to match HB synth */
+ FOR( i = 0; i < SHB_OVERLAP_LEN; i++ )
{
- set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 );
- hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 );
+ IF( i % 2 == 0 )
+ {
+ speech_buf_16k2_fx[i] = L_negate( speech_buf_16k2_fx[i] );
+ move32();
+ }
+ ELSE
+ {
+ speech_buf_16k2_fx[i] = speech_buf_16k2_fx[i];
+ move32();
+ }
+ }
+
+ /* cross fade of overlap snippet and mirrored HB synth from previous frame */
+ FOR( i = 0; i < L_SHB_LAHEAD; i++ )
+ {
+ outputHB_fx[i] = L_add( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_fx[i] ), Mpy_32_16_1( speech_buf_16k2_fx[i], window_shb_fx[L_SHB_LAHEAD - 1 - i] ) );
+ move32();
+ outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 );
move32();
- st_fx->prev_Q_bwe_exc = 31;
- move16();
}
- test();
- IF( EQ_16( bandwidth, WB ) )
+ /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
+ FOR( ; i < length; i++ )
{
- wb_tbe_extras_reset_fx( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, hBWE_TD->mem_genSHBexc_filt_down_wb3_fx );
- wb_tbe_extras_reset_synth_fx( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_32and48k_WB_upsample_fx, hBWE_TD->mem_resamp_HB_fx );
+ outputHB_fx[i] = hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i];
+ move32();
+ outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 );
+ move32();
+ }
- set16_fx( hBWE_TD->mem_genSHBexc_filt_down_shb_fx, 0, 7 );
- set16_fx( hBWE_TD->state_lpc_syn_fx, 0, 10 );
- set16_fx( hBWE_TD->state_syn_shbexc_fx, 0, L_SHB_LAHEAD / 4 );
- set16_fx( hBWE_TD->syn_overlap_fx, 0, L_SHB_LAHEAD );
- set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 );
+ /* upsampling if necessary */
+ IF( EQ_32( output_Fs, 32000 ) )
+ {
+ Interpolate_allpass_steep_fx32( outputHB_fx, hBWE_TD->mem_resamp_HB_fx_32, L_FRAME16k, upsampled_synth_fx );
+ Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME32k );
}
- ELSE IF( EQ_16( bandwidth, SWB ) || EQ_16( bandwidth, FB ) )
+ ELSE IF( EQ_32( output_Fs, 48000 ) )
{
- swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
- hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ),
- &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
-
- swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
-
- set16_fx( st_fx->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 );
- set16_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN );
- set32_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN );
- set16_fx( hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
- set32_fx( hBWE_TD->mem_resamp_HB_32k_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
-
- IF( EQ_16( bandwidth, FB ) )
- {
- st_fx->prev_fb_ener_adjust_fx = 0;
- move16();
- set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- hBWE_TD->fb_tbe_demph_fx = 0;
- move16();
- fb_tbe_reset_synth_fx( hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, &hBWE_TD->prev_fbbwe_ratio_fx );
- }
+ interpolate_3_over_1_allpass_fx32( outputHB_fx, L_FRAME16k, upsampled_synth_fx, hBWE_TD->mem_resamp_HB_fx_32 );
+ Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME48k );
}
return;
}
-void TBEreset_dec_ivas_fx(
- Decoder_State *st /* i/o: decoder state structure */
+
+/*---------------------------------------------------------------------*
+ * TBEreset_dec()
+ *
+ *---------------------------------------------------------------------*/
+
+void TBEreset_dec_fx(
+ Decoder_State *st_fx /* i/o: decoder state structure */
)
{
TD_BWE_DEC_HANDLE hBWE_TD;
+ hBWE_TD = st_fx->hBWE_TD;
- hBWE_TD = st->hBWE_TD;
-
- IF( st->last_core != ACELP_CORE )
+ IF( NE_16( st_fx->last_core, ACELP_CORE ) )
{
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();
- st->prev_Q_bwe_exc = 31;
+ st_fx->prev_Q_bwe_exc = 31;
move16();
}
+
test();
- IF( EQ_16( st->bwidth, WB ) )
+ IF( EQ_16( st_fx->bwidth, WB ) )
{
wb_tbe_extras_reset_fx( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx, hBWE_TD->mem_genSHBexc_filt_down_wb3_fx );
wb_tbe_extras_reset_synth_fx( hBWE_TD->state_lsyn_filt_shb_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx, hBWE_TD->state_32and48k_WB_upsample_fx, hBWE_TD->mem_resamp_HB_fx );
@@ -5120,11 +5144,15 @@ void TBEreset_dec_ivas_fx(
set32_fx( hBWE_TD->syn_overlap_fx_32, 0, L_SHB_LAHEAD );
set32_fx( hBWE_TD->mem_csfilt_fx, 0, 2 );
}
- ELSE IF( EQ_16( st->bwidth, SWB ) || EQ_16( st->bwidth, FB ) )
+ ELSE IF( EQ_16( st_fx->bwidth, SWB ) || EQ_16( st_fx->bwidth, FB ) )
{
- swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx, hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
+ swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
+ hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &( hBWE_TD->tbe_demph_fx ),
+ &( hBWE_TD->tbe_premph_fx ), hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
+
+ swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
- set16_fx( st->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 );
+ set16_fx( hBWE_TD->GainShape_Delay_fx, 0, NUM_SHB_SUBFR / 2 );
set16_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN );
set32_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN );
set16_fx( hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
@@ -5133,15 +5161,12 @@ void TBEreset_dec_ivas_fx(
move32();
hBWE_TD->prev_mix_factor_fx = 32767; /* Q15 1.f */
move16();
- // swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
- swb_tbe_reset_synth_ivas_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
-
- IF( EQ_16( st->bwidth, FB ) )
+ IF( EQ_16( st_fx->bwidth, FB ) )
{
- if ( st->hBWE_FD != NULL )
+ if ( st_fx->hBWE_FD != NULL )
{
- st->prev_fb_ener_adjust_fx = 0;
+ st_fx->hBWE_FD->prev_fb_ener_adjust_fx = 0;
move16();
}
set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
@@ -5154,97 +5179,27 @@ void TBEreset_dec_ivas_fx(
return;
}
+
/*-------------------------------------------------------------------*
* td_bwe_dec_init()
*
* Initialize TD BWE state structure at the decoder
*-------------------------------------------------------------------*/
-void td_bwe_dec_init_ivas_fx(
- Decoder_State *st_fx, /* i/o: SHB decoder structure */
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- const Word32 output_Fs /* i : output sampling rate */
-)
-{
- Word16 i;
-
- /* init. SHB buffers */;
- InitSWBdecBuffer_ivas_fx( st_fx );
-
- /* reset SHB buffers */
- ResetSHBbuffer_Dec_fx( st_fx );
- IF( EQ_32( output_Fs, 48000 ) )
- {
- set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[0], 0, 4 );
- set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[1], 0, 4 );
- set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[2], 0, 4 );
- set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[3], 0, 4 );
- set16_fx( hBWE_TD->fbbwe_hpf_mem_fx_Q, 0, 4 );
- }
-
- set16_fx( hBWE_TD->mem_resamp_HB_fx, 0, INTERP_3_1_MEM_LEN );
- set32_fx( hBWE_TD->mem_resamp_HB_fx_32, 0, INTERP_3_1_MEM_LEN );
- set16_fx( hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
- set32_fx( hBWE_TD->mem_resamp_HB_32k_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
-
- hBWE_TD->tilt_mem_fx = 0;
- move16();
- set16_fx( hBWE_TD->prev_lsf_diff_fx, 16384, LPC_SHB_ORDER - 2 );
- hBWE_TD->prev_tilt_para_fx = 0;
- move16();
- set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, M + 1 );
- set16_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN );
- set32_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN );
- /* TD BWE post-processing */
- hBWE_TD->ptr_mem_stp_swb_fx = hBWE_TD->mem_stp_swb_fx + LPC_SHB_ORDER - 1;
- set16_fx( hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
-
- FOR( i = 0; i < LPC_SHB_ORDER; i++ )
- {
- hBWE_TD->swb_lsp_prev_interp_fx[i] = swb_lsp_prev_interp_init[i];
- move16();
- }
-
- hBWE_TD->prev1_shb_ener_sf_fx = 32767; /* Q15*/
- move16();
- hBWE_TD->prev2_shb_ener_sf_fx = 32767; /* Q15*/
- move16();
- hBWE_TD->prev3_shb_ener_sf_fx = 32767; /* Q15*/
- move16();
- hBWE_TD->prev_res_shb_gshape_fx = 8192; /* 0.125 in Q14*/
- move16();
- hBWE_TD->prev_mixFactors_fx = 16384; /* 0.5 in Q15*/
- move16();
- hBWE_TD->prev_GainShape_fx = 0;
- move16();
- st_fx->prev_Q_bwe_exc_fb = 51;
- move16();
- set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
- hBWE_TD->fb_tbe_demph_fx = 0;
- move16();
-
- set16_fx( hBWE_TD->old_hb_synth_fx, 0, L_FRAME48k );
-
- hBWE_TD->prev_ener_fx = L_deposit_l( 0 );
- move32();
-
- return;
-}
-
-
void td_bwe_dec_init_fx(
- Decoder_State *st_fx, /* i/o: SHB decoder structure */
TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
+ const Word16 extl, /* i : BWE extension layer */
const Word32 output_Fs /* i : output sampling rate */
)
{
Word16 i;
/* init. SHB buffers */;
- InitSWBdecBuffer_fx( st_fx );
+ InitSWBdecBuffer_fx( hBWE_TD );
/* reset SHB buffers */
- ResetSHBbuffer_Dec_fx( st_fx );
+ ResetSHBbuffer_Dec_fx( hBWE_TD, extl );
+
IF( EQ_32( output_Fs, 48000 ) )
{
set32_fx( hBWE_TD->fbbwe_hpf_mem_fx[0], 0, 4 );
@@ -5255,7 +5210,7 @@ void td_bwe_dec_init_fx(
}
set16_fx( hBWE_TD->mem_resamp_HB_fx, 0, INTERP_3_1_MEM_LEN );
-
+ set32_fx( hBWE_TD->mem_resamp_HB_fx_32, 0, INTERP_3_1_MEM_LEN );
set16_fx( hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
set32_fx( hBWE_TD->mem_resamp_HB_32k_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
@@ -5267,6 +5222,7 @@ void td_bwe_dec_init_fx(
set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, M + 1 );
set16_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx, 0, INTERP_3_2_MEM_LEN );
set32_fx( hBWE_TD->int_3_over_2_tbemem_dec_fx_32, 0, INTERP_3_2_MEM_LEN );
+
/* TD BWE post-processing */
hBWE_TD->ptr_mem_stp_swb_fx = hBWE_TD->mem_stp_swb_fx + LPC_SHB_ORDER - 1;
set16_fx( hBWE_TD->mem_zero_swb_fx, 0, LPC_SHB_ORDER );
@@ -5289,7 +5245,7 @@ void td_bwe_dec_init_fx(
move16();
hBWE_TD->prev_GainShape_fx = 0;
move16();
- st_fx->prev_Q_bwe_exc_fb = 51;
+ hBWE_TD->prev_Q_bwe_exc_fb = 51;
move16();
set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
hBWE_TD->fb_tbe_demph_fx = 0;
@@ -5300,6 +5256,8 @@ void td_bwe_dec_init_fx(
hBWE_TD->prev_ener_fx = L_deposit_l( 0 );
move32();
+ set16_fx( hBWE_TD->prev_lpc_wb_fx, 0, LPC_SHB_ORDER_WB );
+
return;
}
@@ -5438,9 +5396,11 @@ static void rescale_genSHB_mem_dec_ivas(
move16();
hBWE_TD->tbe_premph_fx = shl_r( hBWE_TD->tbe_premph_fx, sf );
move16();
+
+ return;
}
-void find_max_mem_dec_m3(
+static void find_max_mem_dec_m3(
Decoder_State *st,
Word16 *n_mem3 )
{
@@ -5567,7 +5527,7 @@ void ivas_swb_tbe_dec_fx(
set16_fx( shaped_shb_excitationTemp_fx, 0, L_FRAME16k );
if ( st->hTdCngDec != NULL )
{
- st->hTdCngDec->shb_dtx_count = 0;
+ st->hTdCngDec->shb_dtx_count_fx = 0;
move16();
}
is_fractive = 0;
@@ -5825,7 +5785,7 @@ void ivas_swb_tbe_dec_fx(
{
FOR( j = 0; j < 4; j++ )
{
- GainShape_fx[i * 4 + j] = mult_r( st->cummulative_damping, st->GainShape_Delay[4 + i] );
+ GainShape_fx[i * 4 + j] = mult_r( st->cummulative_damping, hBWE_TD->GainShape_Delay_fx[4 + i] );
move16();
}
}
@@ -5922,10 +5882,10 @@ void ivas_swb_tbe_dec_fx(
}
/* get the gainshape delay */
- Copy( &st->GainShape_Delay[4], &st->GainShape_Delay[0], NUM_SHB_SUBFR / 4 );
+ Copy( &hBWE_TD->GainShape_Delay_fx[4], &hBWE_TD->GainShape_Delay_fx[0], NUM_SHB_SUBFR / 4 );
FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ )
{
- st->GainShape_Delay[i + 4] = GainShape_fx[i * 4]; /*Q15*/
+ hBWE_TD->GainShape_Delay_fx[i + 4] = GainShape_fx[i * 4]; /*Q15*/
move16();
}
@@ -6225,7 +6185,7 @@ void ivas_swb_tbe_dec_fx(
/* -------- end of rescaling memories -------- */
- Q_bwe_exc_fb = st->prev_Q_bwe_exc_fb;
+ Q_bwe_exc_fb = hBWE_TD->prev_Q_bwe_exc_fb;
move16();
Q_shb = 0;
@@ -6237,7 +6197,7 @@ void ivas_swb_tbe_dec_fx(
st->coder_type, bwe_exc_extended_16, hBWE_TD->bwe_seed, vf_modified_fx, st->extl,
&( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), lpc_shb_sf_fx, shb_ener_sf_32,
shb_res_gshape_fx, shb_res_dummy_fx, &vind, formant_fac_fx, hBWE_TD->fb_state_lpc_syn_fx,
- &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, st->prev_Q_bwe_syn, st->total_brate, st->prev_bfi,
+ &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, hBWE_TD->prev_Q_bwe_syn, st->total_brate, st->prev_bfi,
st->element_mode, st->flag_ACELP16k, nlExc16k_fx, mixExc16k_fx, st->extl_brate, MSFlag,
NULL, &( hBWE_TD->prev_pow_exc16kWhtnd_fx32 ), &( hBWE_TD->prev_mix_factor_fx ), NULL, NULL );
@@ -6245,21 +6205,21 @@ void ivas_swb_tbe_dec_fx(
move16();
IF( EQ_16( st->extl, FB_TBE ) )
{
- st->prev_Q_bwe_exc_fb = Q_bwe_exc_fb;
+ hBWE_TD->prev_Q_bwe_exc_fb = Q_bwe_exc_fb;
move16();
}
ELSE
{
/*Indirectly a memory reset of FB memories for next frame such that rescaling of memories would lead to 0 due to such high prev. Q value.
51 because of 31 + 20(shift of Q_bwe_exc_fb before de-emphasis)*/
- st->prev_Q_bwe_exc_fb = 51;
+ hBWE_TD->prev_Q_bwe_exc_fb = 51;
move16();
}
/* rescale the TBE post proc memory */
FOR( i = 0; i < LPC_SHB_ORDER; i++ )
{
- hBWE_TD->mem_stp_swb_fx[i] = shl_sat( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st->prev_Q_bwe_syn ) );
+ hBWE_TD->mem_stp_swb_fx[i] = shl_sat( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, hBWE_TD->prev_Q_bwe_syn ) );
move16();
}
/* fill-in missing SHB excitation */
@@ -6301,11 +6261,7 @@ void ivas_swb_tbe_dec_fx(
curr_pow_fx = L_shr( curr_pow_fx, 2 ); /* Q(2*Q_bwe_exc) */
}
- Lscale = root_a_over_b_fx( curr_pow_fx,
- shl( Q_bwe_exc, 1 ),
- prev_pow_fx,
- shl( Q_bwe_exc, 1 ),
- &exp );
+ Lscale = root_a_over_b_fx( curr_pow_fx, shl( Q_bwe_exc, 1 ), prev_pow_fx, shl( Q_bwe_exc, 1 ), &exp );
FOR( i = 0; i < L_SHB_LAHEAD; i++ )
{
@@ -6636,7 +6592,7 @@ void ivas_swb_tbe_dec_fx(
{
L_tmp1 = Mult_32_16( ener_tmp_fx[i], GainShape_tmp_fx[i] ); /* (2*Q_bwe_exc) */
L_tmp2 = Mult_32_16( hBWE_TD->prev_ener_fx, hBWE_TD->prev_GainShape_fx ); /* (2*st->prev_ener_fx_Q) */
- tmp = sub( shl( Q_bwe_exc, 1 ), shl( st->prev_ener_fx_Q, 1 ) );
+ tmp = sub( shl( Q_bwe_exc, 1 ), shl( hBWE_TD->prev_ener_fx_Q, 1 ) );
L_tmp2 = L_shl_sat( L_tmp2, tmp ); /* new Q = (2*Q_bwe_exc) */
IF( GT_32( L_tmp1, L_tmp2 ) )
{
@@ -6670,7 +6626,7 @@ void ivas_swb_tbe_dec_fx(
move32();
hBWE_TD->prev_GainShape_fx = GainShape_tmp_fx[i];
move16();
- st->prev_ener_fx_Q = Q_bwe_exc;
+ hBWE_TD->prev_ener_fx_Q = Q_bwe_exc;
move16();
}
@@ -6688,10 +6644,10 @@ void ivas_swb_tbe_dec_fx(
}
ELSE
{
- st->prev_ener_fx_Q = Q_bwe_exc;
+ hBWE_TD->prev_ener_fx_Q = Q_bwe_exc;
move16();
}
- st->prev_Q_bwe_syn = Q_bwe_exc;
+ hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc;
move16();
@@ -6757,7 +6713,7 @@ void ivas_swb_tbe_dec_fx(
GainFrame_fx, /* Q18 */
window_shb_fx,
subwin_shb_fx,
- &Q_bwe_exc, &Qx, n_mem3_new, st->prev_Q_bwe_syn2 );
+ &Q_bwe_exc, &Qx, n_mem3_new, hBWE_TD->prev_Q_bwe_syn2 );
IF( hStereoICBWE != NULL )
{
@@ -6802,31 +6758,31 @@ void ivas_swb_tbe_dec_fx(
}
}
curr_frame_pow_exp = sub( shl( add( Q_bwe_exc, n ), 1 ), 9 );
- tmp = sub( st->prev_frame_pow_exp, curr_frame_pow_exp );
+ tmp = sub( hBWE_TD->prev_frame_pow_exp, curr_frame_pow_exp );
IF( tmp > 0 ) /* shifting prev */
{
IF( GT_16( tmp, 32 ) )
{
- st->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 );
+ hBWE_TD->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 );
move16();
tmp = 32;
move16();
}
hBWE_TD->prev_swb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, tmp );
move32();
- st->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
}
ELSE /* shifting curr */
{
IF( LT_16( tmp, -32 ) )
{
- curr_frame_pow_exp = sub( st->prev_frame_pow_exp, 32 );
+ curr_frame_pow_exp = sub( hBWE_TD->prev_frame_pow_exp, 32 );
tmp = -32;
move16();
}
curr_frame_pow_fx = L_shr( curr_frame_pow_fx, -tmp );
- curr_frame_pow_exp = st->prev_frame_pow_exp;
+ curr_frame_pow_exp = hBWE_TD->prev_frame_pow_exp;
move16();
}
test();
@@ -6992,7 +6948,7 @@ void ivas_swb_tbe_dec_fx(
hBWE_TD->prev_swb_bwe_frame_pow_fx = curr_frame_pow_fx;
move32();
- st->prev_frame_pow_exp = curr_frame_pow_exp;
+ hBWE_TD->prev_frame_pow_exp = curr_frame_pow_exp;
move16();
Word64 prev_ener_shb64 = 0;
@@ -7035,7 +6991,7 @@ void ivas_swb_tbe_dec_fx(
L_tmp = Isqrt_lc( L_tmp, &exp );
tmp = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /* Q1 */
}
- set16_fx( st->prev_SWB_fenv_fx, tmp, SWB_FENV ); /* Q1 */
+ set16_fx( st->hBWE_FD->prev_SWB_fenv_fx, tmp, SWB_FENV ); /* Q1 */
}
FOR( i = 0; i < L_FRAME16k; i++ )
@@ -7045,7 +7001,7 @@ void ivas_swb_tbe_dec_fx(
}
/* generate 32kHz SHB synthesis from 12.8(16)kHz signal */
- GenSHBSynth_fx_32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) );
+ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) );
Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) );
Copy32( error_fx + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH );
@@ -7112,7 +7068,7 @@ void ivas_swb_tbe_dec_fx(
move32();
}
}
- interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 );
+ interpolate_3_over_2_allpass_fx32( error_fx, L_FRAME32k, synth_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 );
}
ELSE IF( EQ_32( st->output_Fs, 32000 ) )
{
@@ -7143,7 +7099,6 @@ void ivas_swb_tbe_dec_fx(
Decimate_allpass_steep_fx32( error_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, synth_fx );
}
-
/* Update previous frame parameters for FEC */
Copy( lsf_shb_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER );
IF( EQ_16( st->codec_mode, MODE1 ) )
@@ -7176,145 +7131,10 @@ void ivas_swb_tbe_dec_fx(
move32();
hBWE_TD->prev_GainShape_fx = GainShape_fx[NUM_SHB_SUBFR - 1];
move16();
- st->prev_Q_bwe_syn2 = Q_bwe_exc;
+ hBWE_TD->prev_Q_bwe_syn2 = Q_bwe_exc;
move16();
- st->prev_Qx = Q_bwe_exc;
+ hBWE_TD->prev_Qx = Q_bwe_exc;
move16();
return;
}
-
-void GenTransition_fixed(
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
- const Word32 output_Fs, /* i : output sampling rate : Q0 */
- const Word16 element_mode, /* i : element mode : Q0 */
- const Word16 L_frame, /* i : ACELP frame length : Q0 */
- const Word16 rf_flag, /* i : RF flag : Q0 */
- const Word32 total_brate, /* i : total bitrate : Q0 */
- const Word16 prev_Qx )
-{
- Word16 i, length;
-
- Word32 syn_overlap_32k_fx[2 * SHB_OVERLAP_LEN];
-
- /* set targeted length of transition signal */
- length = i_mult( 2, NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ) );
-
- /* upsample overlap snippet */
- Interpolate_allpass_steep_32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, SHB_OVERLAP_LEN, syn_overlap_32k_fx );
-
- /* perFORm spectral flip and downmix with overlap snippet to match HB synth */
- test();
- test();
- test();
- test();
- IF( ( ( element_mode == EVS_MONO ) && ( rf_flag || EQ_32( total_brate, ACELP_9k60 ) ) ) || ( ( element_mode > EVS_MONO ) && EQ_16( L_frame, L_FRAME ) ) )
- {
- flip_and_downmix_generic_fx_32( syn_overlap_32k_fx, syn_overlap_32k_fx, 2 * SHB_OVERLAP_LEN, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + HILBERT_ORDER1, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), &( hBWE_TD->syn_dm_phase ) );
- }
- ELSE
- {
- FOR( i = 0; i < 2 * SHB_OVERLAP_LEN; i++ )
- {
- IF( i % 2 == 0 )
- {
- syn_overlap_32k_fx[i] = L_negate( syn_overlap_32k_fx[i] );
- }
- ELSE
- {
- syn_overlap_32k_fx[i] = syn_overlap_32k_fx[i];
- }
- move32();
- }
- }
-
- /* cross fade of overlap snippet and mirrored HB synth from previous frame */
- FOR( i = 0; i < 2 * L_SHB_LAHEAD; i++ )
- {
- outputHB_fx[i] = L_add_sat( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_32k_fx[i] ), Mpy_32_16_1( syn_overlap_32k_fx[i], window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i] ) );
- move32();
- }
-
- /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
- FOR( ; i < length; i++ )
- {
- outputHB_fx[i] = L_shl( hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i], sub( Q11, prev_Qx ) );
- move32();
- }
-
- IF( EQ_32( output_Fs, 48000 ) )
- {
- interpolate_3_over_2_allpass_32( outputHB_fx, length, outputHB_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 );
- }
- ELSE IF( EQ_32( output_Fs, 16000 ) )
- {
- Decimate_allpass_steep_fx32( outputHB_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, outputHB_fx );
- }
-
- return;
-}
-void GenTransition_WB_fixed(
- TD_BWE_DEC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */
- Word32 *outputHB_fx, /* o : synthesized HB transitions signal : Q11 */
- const Word32 output_Fs /* i : output sampling rate */
-)
-{
- Word16 i, length;
- Word32 speech_buf_16k1_fx[SHB_OVERLAP_LEN], speech_buf_16k2_fx[2 * SHB_OVERLAP_LEN];
- Word32 upsampled_synth_fx[L_FRAME48k];
-
- /* set targeted length of transition signal */
- length = i_mult( 2, NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ) );
-
- /* upsample overlap snippet */
- Interpolate_allpass_steep_32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->state_lsyn_filt_shb_fx_32, SHB_OVERLAP_LEN / 2, speech_buf_16k1_fx );
- Interpolate_allpass_steep_32( speech_buf_16k1_fx, hBWE_TD->state_lsyn_filt_dwn_shb_fx_32, SHB_OVERLAP_LEN, speech_buf_16k2_fx );
-
- /* perform spectral flip and downmix with overlap snippet to match HB synth */
- FOR( i = 0; i < SHB_OVERLAP_LEN; i++ )
- {
- IF( i % 2 == 0 )
- {
- speech_buf_16k2_fx[i] = L_negate( speech_buf_16k2_fx[i] );
- move32();
- }
- ELSE
- {
- speech_buf_16k2_fx[i] = speech_buf_16k2_fx[i];
- move32();
- }
- }
-
- /* cross fade of overlap snippet and mirrored HB synth from previous frame */
- FOR( i = 0; i < L_SHB_LAHEAD; i++ )
- {
- outputHB_fx[i] = L_add( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_fx[i] ), Mpy_32_16_1( speech_buf_16k2_fx[i], window_shb_fx[L_SHB_LAHEAD - 1 - i] ) );
- move32();
- outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 );
- move32();
- }
-
- /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */
- FOR( ; i < length; i++ )
- {
- outputHB_fx[i] = hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i];
- move32();
- outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 );
- move32();
- }
-
- /* upsampling if necessary */
- IF( EQ_32( output_Fs, 32000 ) )
- {
- Interpolate_allpass_steep_32( outputHB_fx, hBWE_TD->mem_resamp_HB_fx_32, L_FRAME16k, upsampled_synth_fx );
- Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME32k );
- }
- ELSE IF( EQ_32( output_Fs, 48000 ) )
- {
- interpolate_3_over_1_allpass_32( outputHB_fx, L_FRAME16k, upsampled_synth_fx, hBWE_TD->mem_resamp_HB_fx_32 );
- Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME48k );
- }
-
- return;
-}
diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c
index 36cadf6ffea2934dc2a7ebf63f9927240c33ba46..650e8572bc7bbcaddb28a1a385df35933750cd1b 100644
--- a/lib_dec/tonalMDCTconcealment_fx.c
+++ b/lib_dec/tonalMDCTconcealment_fx.c
@@ -554,11 +554,12 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx(
}
-TONALMDCTCONCEAL_ERROR TonalMDCTConceal_UpdateState( TonalMDCTConcealPtr hTonalMDCTConc,
- Word16 nNewSamples, // Q0
- Word32 pitchLag, // Qx
- Word16 badBlock, // Q0
- Word8 tonalConcealmentActive )
+void TonalMDCTConceal_UpdateState(
+ TonalMDCTConcealPtr hTonalMDCTConc,
+ Word16 nNewSamples, // Q0
+ Word32 pitchLag, // Qx
+ Word16 badBlock, // Q0
+ Word8 tonalConcealmentActive )
{
Word8 newBlockIsValid;
@@ -598,13 +599,16 @@ TONALMDCTCONCEAL_ERROR TonalMDCTConceal_UpdateState( TonalMDCTConcealPtr hTonalM
hTonalMDCTConc->lastPitchLag = pitchLag;
move32();
- return TONALMDCTCONCEAL_OK;
+ return;
}
-static void FindPhases( /* o: currenc phase [-pi;pi] 2Q13 */
- TonalMDCTConcealPtr const hTonalMDCTConc, /* i: pointer to internal structure */
- Word32 secondLastMDCT[], /* i: MDST spectrum data Qx +31 -diff_exp */
- Word32 secondLastMDST[], /* i: MDCT spectrum data Qx */
- Word16 diff_exp ) /* i: exp_MDST - exp_MDCT */
+
+
+/* o: currenc phase [-pi;pi] 2Q13 */
+static void FindPhases(
+ TonalMDCTConcealPtr const hTonalMDCTConc, /* i: pointer to internal structure */
+ Word32 secondLastMDCT[], /* i: MDST spectrum data Qx +31 -diff_exp */
+ Word32 secondLastMDST[], /* i: MDCT spectrum data Qx */
+ Word16 diff_exp ) /* i: exp_MDST - exp_MDCT */
{
Word16 i;
Word16 l;
@@ -624,6 +628,8 @@ static void FindPhases( /* o: currenc
move16();
}
}
+
+ return;
}
#define BANDWIDTH 7.0f
@@ -634,9 +640,10 @@ static void FindPhases( /* o: currenc
#define N 931758243 /* FL2WORD32(sin(EVS_PI/BANDWIDTH)); */
#define J 31946 /* FL2WORD16(sin((3*EVS_PI)/BANDWIDTH)); */
-static void FindPhaseDifferences( /* o: Phase difference [-pi;pi] 2Q13*/
- TonalMDCTConcealPtr const hTonalMDCTConc, /* i: Pointer to internal structure */
- Word32 powerSpectrum[] ) /* i: Power spectrum data Qx */
+/* o: Phase difference [-pi;pi] 2Q13*/
+static void FindPhaseDifferences(
+ TonalMDCTConcealPtr const hTonalMDCTConc, /* i: Pointer to internal structure */
+ Word32 powerSpectrum[] ) /* i: Power spectrum data Qx */
{
Word16 i, k;
Word16 *phaseDiff;
@@ -814,6 +821,7 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx(
hTonalMDCTConc->lastBlockData.scaleFactors_exp,
hTonalMDCTConc->lastBlockData.scaleFactors_max_e,
powerSpectrum,
+ powerSpectrum_exp,
nSamples,
hTonalMDCTConc->nSamplesCore,
floorPowerSpectrum, psychParamsCurrent, element_mode );
@@ -1319,6 +1327,8 @@ void TonalMDCTConceal_Detect_ivas_fx(
powerSpectrum[i] = Mpy_32_32( t, t ); // Q(31-secondLastMDST_exp+powerSpectrum_exp)
move32();
}
+ powerSpectrum_exp = 0;
+ move16();
}
ELSE
{
@@ -1336,6 +1346,7 @@ void TonalMDCTConceal_Detect_ivas_fx(
powerSpectrum[i] = Mpy_32_32( t, t ); // 2*(Q31 - powerSpectrum_exp -3)-31
move32();
}
+ powerSpectrum_exp = sub( 31, sub( shl( sub( Q31 - 3, powerSpectrum_exp ), 1 ), 31 ) );
}
ivas_RefineTonalComponents_fx( (Word16 *) hTonalMDCTConc->pTCI->indexOfTonalPeak,
@@ -1352,6 +1363,7 @@ void TonalMDCTConceal_Detect_ivas_fx(
hTonalMDCTConc->lastBlockData.scaleFactors_exp,
hTonalMDCTConc->lastBlockData.scaleFactors_max_e,
powerSpectrum,
+ powerSpectrum_exp,
nSamples,
hTonalMDCTConc->nSamplesCore,
extract_l( Mpy_32_16_1( L_mult0( hTonalMDCTConc->nSamples, hTonalMDCTConc->nSamples ), 82 ) ), element_mode, psychParamsCurrent ); /* floorPowerSpectrum */
diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c
index 67621c442f24536792690208ac8915c5649d0846..0e1b951bb4afc1e1b5e636f067099700fba78b32 100644
--- a/lib_dec/updt_dec_fx.c
+++ b/lib_dec/updt_dec_fx.c
@@ -249,17 +249,17 @@ void updt_IO_switch_dec_fx(
{
swb_tbe_reset_fx( hBWE_TD->mem_csfilt_fx, hBWE_TD->mem_genSHBexc_filt_down_shb_fx, hBWE_TD->state_lpc_syn_fx,
hBWE_TD->syn_overlap_fx, hBWE_TD->state_syn_shbexc_fx, &hBWE_TD->tbe_demph_fx, &hBWE_TD->tbe_premph_fx, hBWE_TD->mem_stp_swb_fx, &( hBWE_TD->gain_prec_swb_fx ) );
- set16_fx( st_fx->GainShape_Delay, 0, NUM_SHB_SUBFR / 2 );
+ set16_fx( hBWE_TD->GainShape_Delay_fx, 0, NUM_SHB_SUBFR / 2 );
hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /*Q0 1.f*/
move32();
hBWE_TD->prev_mix_factor_fx = 32767; /*Q15 1.f*/
move16();
- swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx );
+ swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 );
}
IF( EQ_16( output_frame, L_FRAME48k ) )
{
- st_fx->prev_fb_ener_adjust_fx = 0;
+ hBWE_FD->prev_fb_ener_adjust_fx = 0;
move16();
set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER );
hBWE_TD->fb_tbe_demph_fx = 0;
@@ -740,7 +740,7 @@ void updt_dec_common_fx(
IF( st_fx->hTcxDec != NULL && st_fx->enablePlcWaveadjust && !concealWholeFrameTmp && NE_16( st_fx->core, AMR_WB_CORE ) )
{
/* update the parameters used in waveform adjustment */
- concealment_update2_x( (const Word16 *) synth, &st_fx->plcInfo, hTcxDec->L_frameTCX );
+ concealment_update2_x( (const Word16 *) synth, st_fx->hPlcInfo, hTcxDec->L_frameTCX );
}
st_fx->last_total_brate_ber = st_fx->total_brate;
@@ -1163,7 +1163,7 @@ void ivas_updt_dec_common_fx(
IF( st_fx->hTcxDec != NULL && st_fx->enablePlcWaveadjust && !concealWholeFrameTmp && NE_16( st_fx->core, AMR_WB_CORE ) )
{
/* update the parameters used in waveform adjustment */
- concealment_update2_x( (const Word16 *) synth, &st_fx->plcInfo, hTcxDec->L_frameTCX );
+ concealment_update2_x( (const Word16 *) synth, st_fx->hPlcInfo, hTcxDec->L_frameTCX );
}
st_fx->last_total_brate_ber = st_fx->total_brate;
diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c
index 80241a24c9f79d528f9c4e7004e9ab7a54348e6a..f993caa8d1650555dc32b1c8ff9c2dc53f5e3df0 100644
--- a/lib_dec/waveadjust_fec_dec_fx.c
+++ b/lib_dec/waveadjust_fec_dec_fx.c
@@ -35,28 +35,36 @@ void set_state( Word16 *state, Word16 num, Word16 N ) /*i/o: Qx */
}
state[tmp] = num;
move16();
+
+ return;
}
-void concealment_update_x( Word16 bfi, Word16 curr_mode, Word16 tonality, Word32 *invkoef /*Qinvkoef_scale*/, Word16 *invkoef_scale, void *_plcInfo )
+void concealment_update_x(
+ const Word16 bfi,
+ const Word16 core,
+ const Word16 tonality,
+ Word32 *invkoef /*Qinvkoef_scale*/,
+ Word16 *invkoef_scale,
+ T_PLCInfo_HANDLE hPlcInfo )
{
- T_PLCInfo *plcInfo = (T_PLCInfo *) _plcInfo;
- Word32 *data_reci2 = plcInfo->data_reci2_fx;
- Word16 *tcx_tonality = plcInfo->TCX_Tonality;
- Word16 FrameSize = plcInfo->FrameSize;
- Word16 subframe = plcInfo->subframe_fx;
+ Word32 *data_reci2 = hPlcInfo->data_reci2_fx;
+ Word16 *tcx_tonality = hPlcInfo->TCX_Tonality;
+ Word16 L_frameTCX = hPlcInfo->L_frameTCX;
+ Word16 subframe = hPlcInfo->subframe_fx;
Word16 i;
move16();
move16();
- IF( EQ_16( curr_mode, 1 ) )
+
+ IF( EQ_16( core, TCX_20_CORE ) )
{
- set_state( plcInfo->Transient, curr_mode, MAX_POST_LEN );
+ set_state( hPlcInfo->Transient, core, MAX_POST_LEN );
- FOR( i = 0; i < FrameSize; i++ )
+ FOR( i = 0; i < L_frameTCX; i++ )
{
data_reci2[i] = invkoef[i];
move32();
}
- plcInfo->data_reci2_scale = *invkoef_scale;
+ hPlcInfo->data_reci2_scale = *invkoef_scale;
move16();
IF( !bfi )
{
@@ -68,7 +76,7 @@ void concealment_update_x( Word16 bfi, Word16 curr_mode, Word16 tonality, Word32
IF( subframe == 0 )
{
- set_state( plcInfo->Transient, curr_mode, MAX_POST_LEN );
+ set_state( hPlcInfo->Transient, core, MAX_POST_LEN );
IF( !bfi )
{
@@ -83,7 +91,7 @@ void concealment_update_x( Word16 bfi, Word16 curr_mode, Word16 tonality, Word32
{
Word32 *ptr = data_reci2 + subframe;
- Word16 FrameSize2 = shr( FrameSize, 1 );
+ Word16 FrameSize2 = shr( L_frameTCX, 1 );
FOR( i = 0; i < FrameSize2; i++ )
{
@@ -91,13 +99,15 @@ void concealment_update_x( Word16 bfi, Word16 curr_mode, Word16 tonality, Word32
move32();
}
- plcInfo->data_reci2_scale = *invkoef_scale;
+ hPlcInfo->data_reci2_scale = *invkoef_scale;
move16();
}
}
+
return;
}
+
static Word16 zero_pass_w32_x( const Word16 *s, const Word16 N ) /* i: Qx*/ /* o: 2*Qx-31*/
{
Word16 i;
@@ -601,15 +611,17 @@ Word16 get_conv_relation_x( Word16 *s_LP /*Qx*/, Word16 shIFt, Word16 N ) /*o :Q
return tmp;
}
-static Word16 pitch_search_fx( Word16 *s /*Qs*/, /* lastPcmOut */
- Word16 *outx_new /*Qoutx_new*/,
- Word16 Framesize,
- Word16 *voicing /*Q15*/,
- Word16 zp, /*Q0*/
- Word32 ener /*Q8*/,
- Word32 ener_mean /*Q8*/,
- Word32 *mdct_data /*Qmdct*/,
- Word16 curr_mode )
+
+static Word16 pitch_search_fx(
+ Word16 *s /*Qs*/, /* lastPcmOut */
+ Word16 *outx_new /*Qoutx_new*/,
+ Word16 Framesize,
+ Word16 *voicing /*Q15*/,
+ Word16 zp, /*Q0*/
+ Word32 ener /*Q8*/,
+ Word32 ener_mean /*Q8*/,
+ Word32 *mdct_data /*Qmdct*/,
+ Word16 curr_mode )
{
Word16 pitch = 0;
Word32 cov_max = L_deposit_l( 0 ), tilt_enr1, tilt_enr2;
@@ -767,78 +779,85 @@ static Word16 pitch_search_fx( Word16 *s /*Qs*/, /* lastPcmOut */
return pitch;
}
-void concealment_init_x( Word16 N, void *_plcInfo )
+void concealment_init_x(
+ const Word16 L_frameTCX,
+ T_PLCInfo_HANDLE hPlcInfo )
{
- T_PLCInfo *plcInfo = (T_PLCInfo *) _plcInfo;
Word16 i;
- plcInfo->FrameSize = N;
+ hPlcInfo->L_frameTCX = L_frameTCX;
move16();
- plcInfo->Pitch_fx = 0;
+ hPlcInfo->Pitch_fx = 0;
move16();
- plcInfo->T_bfi_fx = 0;
+ hPlcInfo->T_bfi_fx = 0;
move16();
- plcInfo->outx_new_n1_fx = 0;
+ hPlcInfo->outx_new_n1_fx = 0;
move16();
- plcInfo->nsapp_gain_fx = 0;
+ hPlcInfo->nsapp_gain_fx = 0;
move16();
- plcInfo->nsapp_gain_n_fx = 0;
+ hPlcInfo->nsapp_gain_n_fx = 0;
move16();
- plcInfo->ener_mean_fx = L_deposit_l( 15213 ); /*Q8 59.4260f*256*/
- plcInfo->ener_fx = L_deposit_l( 0 );
- plcInfo->zp_fx = N;
+ hPlcInfo->ener_mean_fx = L_deposit_l( 15213 ); /*Q8 59.4260f*256*/
+ hPlcInfo->ener_fx = L_deposit_l( 0 );
+ hPlcInfo->zp_fx = L_frameTCX;
move16();
- plcInfo->recovery_gain = 0;
+ hPlcInfo->recovery_gain = 0;
move16();
- plcInfo->step_concealgain_fx = 0;
+ hPlcInfo->step_concealgain_fx = 0;
move16();
- plcInfo->concealment_method = TCX_NONTONAL;
+ hPlcInfo->concealment_method = TCX_NONTONAL;
move16();
- plcInfo->subframe_fx = 0;
+ hPlcInfo->subframe_fx = 0;
move16();
- plcInfo->nbLostCmpt = (Word16) L_deposit_l( 0 );
+ hPlcInfo->nbLostCmpt = (Word16) L_deposit_l( 0 );
move16();
- plcInfo->seed = 21845;
+ hPlcInfo->seed = 21845;
move16();
FOR( i = 0; i < TCX_TONALITY_INIT_CNT; i++ )
{
- plcInfo->TCX_Tonality[i] = 1;
+ hPlcInfo->TCX_Tonality[i] = 1;
move16();
}
FOR( i = TCX_TONALITY_INIT_CNT; i < DEC_STATE_LEN; i++ )
{
- plcInfo->TCX_Tonality[i] = 0;
+ hPlcInfo->TCX_Tonality[i] = 0;
move16();
}
FOR( i = 0; i < MAX_POST_LEN; i++ )
{
- plcInfo->Transient[i] = 1;
+ hPlcInfo->Transient[i] = 1;
move16();
}
FOR( i = 0; i < L_FRAME_MAX; i++ )
{
- plcInfo->data_reci2_fx[i] = L_deposit_l( 0 );
+ hPlcInfo->data_reci2_fx[i] = L_deposit_l( 0 );
}
+
return;
}
+
+
void concealment_init_ivas_fx(
const Word16 L_frameTCX,
T_PLCInfo_HANDLE hPlcInfo )
{
Word16 i;
+
hPlcInfo->L_frameTCX = L_frameTCX;
move16();
- hPlcInfo->FrameSize = L_frameTCX;
- move16();
+#ifndef NONBE_FIX_1402_WAVEADJUST
hPlcInfo->Pitch = 0;
move16();
+#endif
hPlcInfo->Pitch_fx = 0;
move16();
+#ifndef NONBE_FIX_1402_WAVEADJUST
hPlcInfo->T_bfi = 0;
move16();
+#endif
hPlcInfo->T_bfi_fx = 0;
move16();
hPlcInfo->outx_new_n1_fx = 0;
@@ -849,8 +868,6 @@ void concealment_init_ivas_fx(
move16();
hPlcInfo->ener_mean_fx = L_deposit_l( 15213 );
hPlcInfo->ener_fx = L_deposit_l( 0 );
- hPlcInfo->zp = L_frameTCX;
- move16();
hPlcInfo->zp_fx = L_frameTCX;
move16();
hPlcInfo->recovery_gain = 0;
@@ -859,8 +876,10 @@ void concealment_init_ivas_fx(
move16();
hPlcInfo->concealment_method = TCX_NONTONAL;
move16();
+#ifndef NONBE_FIX_1402_WAVEADJUST
hPlcInfo->subframe = 0;
move16();
+#endif
hPlcInfo->subframe_fx = 0;
move16();
hPlcInfo->nbLostCmpt = (Word16) L_deposit_l( 0 );
@@ -900,21 +919,25 @@ static Word16 own_random_fix( /* o : output random value */
return ( *seed );
}
-void concealment_decode_fix( Word16 curr_mode, Word32 *invkoef /*Qinvkoef_scale*/, Word16 *invkoef_scale, void *_plcInfo )
+void concealment_decode_fix(
+ Word16 curr_mode,
+ Word32 *invkoef /*Qinvkoef_scale*/,
+ Word16 *invkoef_scale,
+ T_PLCInfo_HANDLE hPlcInfo )
{
- T_PLCInfo *plcInfo = (T_PLCInfo *) _plcInfo;
Word16 i;
- Word16 N = plcInfo->FrameSize;
- Word16 *seed = &( plcInfo->seed );
+ Word16 N = hPlcInfo->L_frameTCX;
+ Word16 *seed = &( hPlcInfo->seed );
Word16 sign;
move16();
- IF( plcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
+
+ IF( hPlcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
{
IF( EQ_16( curr_mode, 1 ) )
{
/* copy the data of the last frame */
- MVR2R_WORD32( plcInfo->data_reci2_fx, invkoef, N );
- *invkoef_scale = plcInfo->data_reci2_scale;
+ MVR2R_WORD32( hPlcInfo->data_reci2_fx, invkoef, N );
+ *invkoef_scale = hPlcInfo->data_reci2_scale;
move16();
/* sign randomization */
FOR( i = 0; i < N; i++ )
@@ -928,6 +951,7 @@ void concealment_decode_fix( Word16 curr_mode, Word32 *invkoef /*Qinvkoef_scale*
}
}
}
+
return;
}
@@ -1103,25 +1127,29 @@ Word32 con_Log10( Word32 i_s32Val /*Qi_s32Val*/, Word16 i_s16Q /*Q0*/ ) /*o; Q26
return s32Out;
}
-void concealment_update2_x( const Word16 *outx_new /*Qoutx_new*/, void *_plcInfo, const Word16 FrameSize )
+void concealment_update2_x(
+ const Word16 *outx_new /*Qoutx_new*/,
+ T_PLCInfo_HANDLE hPlcInfo,
+ const Word16 FrameSize )
{
- T_PLCInfo *plcInfo = (T_PLCInfo *) _plcInfo;
-
- plcInfo->zp_fx = zero_pass_w32_x( outx_new, FrameSize );
+ hPlcInfo->zp_fx = zero_pass_w32_x( outx_new, FrameSize );
move16();
- Log10OfEnergy_x( outx_new, &plcInfo->ener_fx, FrameSize ); /* Q8 */
+ Log10OfEnergy_x( outx_new, &hPlcInfo->ener_fx, FrameSize ); /* Q8 */
test();
- IF( LT_16( plcInfo->zp_fx, 100 ) && GT_32( plcInfo->ener_fx, L_shl( 50, 8 ) ) )
+ IF( LT_16( hPlcInfo->zp_fx, 100 ) && GT_32( hPlcInfo->ener_fx, L_shl( 50, 8 ) ) )
{
- plcInfo->ener_mean_fx = L_add( Mpy_32_16_1( plcInfo->ener_mean_fx, 32112 /* 0.98 Q15 */ ),
- Mpy_32_16_1( plcInfo->ener_fx, 655 /* 0.02 Q15 */ ) );
+ hPlcInfo->ener_mean_fx = L_add( Mpy_32_16_1( hPlcInfo->ener_mean_fx, 32112 /* 0.98 Q15 */ ),
+ Mpy_32_16_1( hPlcInfo->ener_fx, 655 /* 0.02 Q15 */ ) );
move32();
}
+
return;
}
-static Word16 array_max_indx_fx( Word16 *s /*Qs*/, Word16 N )
+static Word16 array_max_indx_fx(
+ Word16 *s /*Qs*/,
+ Word16 N )
{
Word16 i, indx = 0;
move16();
@@ -1261,20 +1289,16 @@ static void add_noise( Word16 *const sbuf, /*Qsbuf*/
return;
}
-static Word16 waveform_adj_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
- Word16 *outdata2, /*Qoutdata2*/
- Word16 *outx_new, /*Qoutx_new*/
- Word16 *data_noise, /*Qoutx_new*/
- Word16 *outx_new_n1, /*Q0*/
- Word16 *nsapp_gain, /*Q15*/
- Word16 *nsapp_gain_n, /*Q15*/
- Word16 Framesize,
- Word8 T_bfi,
- Word16 voicing, /*Q15*/
- Word16 curr_mode,
- Word16 pitch /*Q0*/ )
+static Word16 waveform_adj_fix(
+ T_PLCInfo_HANDLE hPlcInfo,
+ Word16 *overlapbuf, /*Qoverlapbuf*/
+ Word16 *outdata2, /*Qoutdata2*/
+ Word16 *outx_new, /*Qoutx_new*/
+ const Word16 Framesize,
+ const Word16 voicing, /*Q15*/
+ const Word16 core )
{
- Word16 i, zp1, zp2, Framesizediv2, s16MaxCoefNorm;
+ Word16 i, zp1, zp2, Framesizediv2, s16MaxCoefNorm, pitch;
Word16 sbuf[L_FRAME_MAX];
Word16 tmp;
@@ -1282,6 +1306,8 @@ static Word16 waveform_adj_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
zp1 = zero_pass_w32_x( outdata2, Framesizediv2 );
zp2 = zero_pass_w32_x( outdata2 + Framesizediv2, Framesizediv2 );
+ pitch = hPlcInfo->Pitch_fx;
+
/* judge if the pitch is usable */
tmp = 1;
move16();
@@ -1300,7 +1326,11 @@ static Word16 waveform_adj_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
test();
test();
test();
- IF( T_bfi && ( LE_16( pitch, Framesizediv2 ) ) && ( GT_16( Framesize, 256 ) ) && ( EQ_16( curr_mode, 1 ) ) )
+#ifdef NONBE_FIX_1402_WAVEADJUST
+ IF( hPlcInfo->T_bfi_fx && ( LE_16( pitch, Framesizediv2 ) ) && ( GT_16( Framesize, 256 ) ) && ( EQ_16( core, 1 ) ) )
+#else
+ IF( hPlcInfo->T_bfi && ( LE_16( pitch, Framesizediv2 ) ) && ( GT_16( Framesize, 256 ) ) && ( EQ_16( core, 1 ) ) )
+#endif
{
Word16 i1 = 0, i2 = 0;
Word16 pos1, pos2, pos3;
@@ -1383,15 +1413,18 @@ static Word16 waveform_adj_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
last good frame) is still needed and overlapbuf overlaps outdata2 */
Copy( &sbuf[Framesize / 4], pitch125_data, shr( imult1616( 3, Framesize ), 2 ) );
- *nsapp_gain = 0;
+ hPlcInfo->nsapp_gain_fx = 0;
move16();
- *nsapp_gain_n = sub( 32767, shr( voicing, 1 ) ); /* q15 */
+ hPlcInfo->nsapp_gain_n_fx = sub( 32767, shr( voicing, 1 ) ); /* q15 */
tmp = Framesize;
move16();
+
/* use last good signal for noise generation */
- add_noise( sbuf, outx_new_n1, outdata2, tmp, nsapp_gain, nsapp_gain_n, 1 );
+ add_noise( sbuf, &( hPlcInfo->outx_new_n1_fx ), outdata2, tmp, &( hPlcInfo->nsapp_gain_fx ), &( hPlcInfo->nsapp_gain_n_fx ), 1 );
+
/* save current (noisy) output from IMDCT */
- MVR2R_WORD16( outx_new, data_noise, tmp );
+ MVR2R_WORD16( outx_new, hPlcInfo->data_noise, tmp );
+
/* overlapbuf can now be filled with sbuf, needed for subsequently lost frames */
Copy( pitch125_data, &overlapbuf[Framesize / 4], shr( imult1616( 3, Framesize ), 2 ) );
}
@@ -1400,31 +1433,31 @@ static Word16 waveform_adj_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
outx_new[i] = sbuf[i];
move16();
}
+
return pitch;
}
-void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
- Word16 *outx_new, /*Qoutx_new*/
- Word16 *data_noise, /*Qoutx_new*/
- Word16 *outx_new_n1, /*Q0*/
- Word16 *nsapp_gain, /*Q15*/
- Word16 *nsapp_gain_n, /*Q15*/
- Word16 *recovery_gain, /*Q14*/
- Word16 step_concealgain, /*Q15*/
- Word16 pitch, /*Q0*/
- Word16 Framesize,
- Word16 delay,
- Word16 bfi_cnt,
- Word16 bfi )
+
+void waveform_adj2_fix(
+ T_PLCInfo_HANDLE hPlcInfo,
+ Word16 *overlapbuf, /*Qoverlapbuf*/
+ Word16 *outx_new, /*Qoutx_new*/
+ const Word16 delay,
+ const Word16 bfi_cnt,
+ const Word16 bfi )
{
- Word16 i, n, tablescale, ratio,
- dat, Framesizesubn, Framesizesubp, tmp16, s, ptable, temp_OUT, s16MaxCoefNorm, s16MaxCoefNorm2;
+ Word16 i, n, tablescale, ratio, dat, Framesizesubn, Framesizesubp, tmp16, s, ptable, temp_OUT, s16MaxCoefNorm, s16MaxCoefNorm2;
Word16 sbuf[L_FRAME_MAX];
+ Word16 pitch, L_frameTCX;
+ pitch = hPlcInfo->Pitch_fx;
+ move16();
+ L_frameTCX = hPlcInfo->L_frameTCX;
+ move16();
n = 0;
move16();
- Framesizesubn = sub( Framesize, n );
- Framesizesubp = sub( Framesize, pitch );
+ Framesizesubn = sub( L_frameTCX, n );
+ Framesizesubp = sub( L_frameTCX, pitch );
IF( pitch > 0 )
{
WHILE( Framesizesubn > 0 )
@@ -1437,21 +1470,21 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
move16();
}
n = add( n, pitch );
- Framesizesubn = sub( Framesize, n );
+ Framesizesubn = sub( L_frameTCX, n );
}
- FOR( i = 0; i < Framesize; i++ )
+ FOR( i = 0; i < L_frameTCX; i++ )
{
overlapbuf[i] = sbuf[i];
move16();
}
{
- Word16 size = Framesize;
- Word16 *noise_ptr = data_noise;
+ Word16 size = L_frameTCX;
+ Word16 *noise_ptr = hPlcInfo->data_noise;
move16();
/* use last (noisy) output from IMDCT for noise generation */
- add_noise( sbuf, outx_new_n1, noise_ptr, size, nsapp_gain, nsapp_gain_n, 0 );
+ add_noise( sbuf, &( hPlcInfo->outx_new_n1_fx ), noise_ptr, size, &( hPlcInfo->nsapp_gain_fx ), &( hPlcInfo->nsapp_gain_n_fx ), 0 );
/* save current (noisy) output from IMDCT */
IF( bfi )
@@ -1462,7 +1495,7 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
test();
IF( EQ_16( bfi_cnt, 4 ) || bfi == 0 )
{
- SWITCH( Framesize )
+ SWITCH( L_frameTCX )
{
case 160:
{
@@ -1510,40 +1543,40 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
Word16 gain_zero_start = 10000;
move16();
- IF( step_concealgain > 0 )
+ IF( hPlcInfo->step_concealgain_fx > 0 )
{
- gain_zero_start = BASOP_Util_Divide1616_Scale( *recovery_gain, step_concealgain, &s );
+ gain_zero_start = BASOP_Util_Divide1616_Scale( hPlcInfo->recovery_gain, hPlcInfo->step_concealgain_fx, &s );
gain_zero_start = shl( gain_zero_start, sub( s, 14 ) ); /* q0 */
gain_zero_start = add( gain_zero_start, 1 );
}
if ( delay > 0 )
{
- Framesize = sub( Framesize, delay );
+ L_frameTCX = sub( L_frameTCX, delay );
}
- s16MaxCoefNorm = sub( ffr_getSfWord16( sbuf, Framesize ), 1 );
- s16MaxCoefNorm2 = ffr_getSfWord16( outx_new, Framesize );
- tmp16 = vadmin( gain_zero_start, Framesize );
+ s16MaxCoefNorm = sub( ffr_getSfWord16( sbuf, L_frameTCX ), 1 );
+ s16MaxCoefNorm2 = ffr_getSfWord16( outx_new, L_frameTCX );
+ tmp16 = vadmin( gain_zero_start, L_frameTCX );
FOR( i = 0; i < tmp16; i++ )
{
ratio = extract_l( L_shr( L_mult( i, ptable ), tablescale ) );
dat = shl( sbuf[i], s16MaxCoefNorm );
- temp_OUT = mult( *recovery_gain, sub( 32767, ratio ) );
+ temp_OUT = mult( hPlcInfo->recovery_gain, sub( 32767, ratio ) );
outx_new[i] = round_fx_sat( L_add_sat( L_shr_sat( L_mult( temp_OUT, dat ), sub( s16MaxCoefNorm, 1 ) ), L_shr_sat( L_mult( shl( outx_new[i], s16MaxCoefNorm2 ), ratio ), s16MaxCoefNorm2 ) ) );
move16();
- *recovery_gain = sub_sat( *recovery_gain, shr_r( step_concealgain, 1 ) ); /* q14 */
+ hPlcInfo->recovery_gain = sub_sat( hPlcInfo->recovery_gain, shr_r( hPlcInfo->step_concealgain_fx, 1 ) ); /* q14 */
}
- FOR( i = gain_zero_start; i < Framesize; i++ )
+ FOR( i = gain_zero_start; i < L_frameTCX; i++ )
{
ratio = extract_l( L_shr( L_mult( i, ptable ), tablescale ) );
outx_new[i] = round_fx_sat( L_shr_sat( L_mult( shl( outx_new[i], s16MaxCoefNorm2 ), ratio ), s16MaxCoefNorm2 ) );
move16();
}
- if ( *recovery_gain < 0 )
+ if ( hPlcInfo->recovery_gain < 0 )
{
- *recovery_gain = 0;
+ hPlcInfo->recovery_gain = 0;
move16();
}
}
@@ -1551,9 +1584,9 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
{
/* overlap-and-add */
Word16 tmp;
- s16MaxCoefNorm = sub( ffr_getSfWord16( sbuf, Framesize ), 1 );
- s16MaxCoefNorm2 = ffr_getSfWord16( outx_new, Framesize );
- FOR( i = 0; i < Framesize; i++ )
+ s16MaxCoefNorm = sub( ffr_getSfWord16( sbuf, L_frameTCX ), 1 );
+ s16MaxCoefNorm2 = ffr_getSfWord16( outx_new, L_frameTCX );
+ FOR( i = 0; i < L_frameTCX; i++ )
{
dat = shl( sbuf[i], s16MaxCoefNorm );
tmp = extract_l( L_shr( L_mult( i, ptable ), tablescale ) );
@@ -1564,7 +1597,7 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
}
ELSE
{
- FOR( i = 0; i < Framesize; i++ )
+ FOR( i = 0; i < L_frameTCX; i++ )
{
outx_new[i] = sbuf[i];
move16();
@@ -1574,71 +1607,44 @@ void waveform_adj2_fix( Word16 *overlapbuf, /*Qoverlapbuf*/
return;
}
-void concealment_signal_tuning_fx( Word16 bfi, Word16 curr_mode, Word16 *outx_new_fx /*Qoutx_new_fx*/, void *_plcInfo, Word16 nbLostCmpt, Word16 pre_bfi, Word16 *OverlapBuf_fx /*QOverlapBuf_fx*/, Word16 past_core_mode, Word16 *outdata2_fx /*Qoutdata2_fx*/, Decoder_State *st )
+void concealment_signal_tuning_fx(
+ Decoder_State *st,
+ const Word16 bfi,
+ Word16 *outx_new_fx /*Qoutx_new_fx*/,
+ const Word16 past_core )
{
- T_PLCInfo *plcInfo = (T_PLCInfo *) _plcInfo;
- Word16 FrameSize = plcInfo->FrameSize;
- Word16 Pitch = plcInfo->Pitch_fx;
+ T_PLCInfo_HANDLE hPlcInfo = st->hPlcInfo;
+ Word16 L_frameTCX = hPlcInfo->L_frameTCX;
Word16 voicing_fx = 0;
+ Word16 *OverlapBuf_fx = st->hTonalMDCTConc->secondLastPcmOut;
+ Word16 *outdata2_fx = st->hTonalMDCTConc->lastPcmOut;
move16();
move16();
move16();
move16();
+
IF( bfi )
{
-
test();
- IF( st->enablePlcWaveadjust && plcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
+ IF( st->enablePlcWaveadjust && hPlcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
{
-
- IF( EQ_16( nbLostCmpt, 1 ) )
+ IF( EQ_16( st->nbLostCmpt, 1 ) )
{
- plcInfo->Pitch_fx = pitch_search_fx( outdata2_fx,
- outx_new_fx,
- FrameSize,
- &voicing_fx,
- plcInfo->zp_fx,
- ( plcInfo->ener_fx ),
- ( plcInfo->ener_mean_fx ),
- plcInfo->data_reci2_fx,
- curr_mode );
+ hPlcInfo->Pitch_fx = pitch_search_fx( outdata2_fx, outx_new_fx, L_frameTCX, &voicing_fx, hPlcInfo->zp_fx, ( hPlcInfo->ener_fx ), ( hPlcInfo->ener_mean_fx ), hPlcInfo->data_reci2_fx, st->core );
move16();
- IF( plcInfo->Pitch_fx ) /* waveform adjustment for the first lost frame */
+ IF( hPlcInfo->Pitch_fx ) /* waveform adjustment for the first lost frame */
{
- plcInfo->Pitch_fx = waveform_adj_fix( OverlapBuf_fx,
- outdata2_fx,
- outx_new_fx,
- plcInfo->data_noise,
- &plcInfo->outx_new_n1_fx,
- &plcInfo->nsapp_gain_fx,
- &plcInfo->nsapp_gain_n_fx,
- FrameSize,
- plcInfo->T_bfi_fx,
- voicing_fx,
- curr_mode,
- plcInfo->Pitch_fx );
+ hPlcInfo->Pitch_fx = waveform_adj_fix( hPlcInfo, OverlapBuf_fx, outdata2_fx, outx_new_fx, L_frameTCX, voicing_fx, st->core );
move16();
}
}
- ELSE IF( LT_16( nbLostCmpt, 5 ) ) /* waveform adjustment for the 2nd~4th lost frame */
+ ELSE IF( LT_16( st->nbLostCmpt, 5 ) ) /* waveform adjustment for the 2nd~4th lost frame */
{
- waveform_adj2_fix( OverlapBuf_fx,
- outx_new_fx,
- plcInfo->data_noise,
- &plcInfo->outx_new_n1_fx,
- &plcInfo->nsapp_gain_fx,
- &plcInfo->nsapp_gain_n_fx,
- &plcInfo->recovery_gain,
- plcInfo->step_concealgain_fx,
- Pitch,
- FrameSize,
- 0,
- nbLostCmpt,
- bfi );
+ waveform_adj2_fix( hPlcInfo, OverlapBuf_fx, outx_new_fx, 0, st->nbLostCmpt, bfi );
}
}
- plcInfo->T_bfi_fx = 1;
+ hPlcInfo->T_bfi_fx = 1;
move16();
}
ELSE
@@ -1646,34 +1652,22 @@ void concealment_signal_tuning_fx( Word16 bfi, Word16 curr_mode, Word16 *outx_ne
test();
test();
test();
- IF( pre_bfi &&
- past_core_mode != 0 &&
+ IF( st->prev_bfi &&
+ past_core != ACELP_CORE &&
GE_32( st->last_total_brate, 48000 ) &&
EQ_16( st->last_codec_mode, MODE2 ) )
{
- IF( plcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
+ IF( hPlcInfo->concealment_method == TCX_NONTONAL ) /* #define TCX_NONTONAL 0 */
{
- IF( LT_32( plcInfo->nbLostCmpt, 4 ) ) /* smoothing of the concealed signal with the good signal */
+ IF( LT_32( hPlcInfo->nbLostCmpt, 4 ) ) /* smoothing of the concealed signal with the good signal */
{
- waveform_adj2_fix( OverlapBuf_fx,
- outx_new_fx,
- plcInfo->data_noise,
- &plcInfo->outx_new_n1_fx,
- &plcInfo->nsapp_gain_fx,
- &plcInfo->nsapp_gain_n_fx,
- &plcInfo->recovery_gain,
- plcInfo->step_concealgain_fx,
- Pitch,
- FrameSize,
- 0,
- add( extract_l( plcInfo->nbLostCmpt ), 1 ),
- bfi );
+ waveform_adj2_fix( hPlcInfo, OverlapBuf_fx, outx_new_fx, 0, add( extract_l( hPlcInfo->nbLostCmpt ), 1 ), bfi );
}
}
}
ELSE
{
- plcInfo->T_bfi_fx = 0;
+ hPlcInfo->T_bfi_fx = 0;
move16();
}
}
diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c
index 7820061089f45aa3855e68c6f776f249a735f7a5..d2d5ac4e6583ab86396685bb38c2ae67610dc01e 100644
--- a/lib_enc/acelp_core_enc_fx.c
+++ b/lib_enc/acelp_core_enc_fx.c
@@ -1123,7 +1123,11 @@ ivas_error acelp_core_enc_ivas_fx(
move16();
st->hLPDmem->q_mem_syn = st->Q_syn;
move16();
-
+ // Scaling Aq to Q12
+ FOR( Word16 k = 0; k < NB_SUBFR16k; k++ )
+ {
+ Scale_sig( &Aq[( M + 1 ) * k], M + 1, sub( norm_s( Aq[( M + 1 ) * k] ), 2 ) );
+ }
/* synthesis at 12.8kHz sampling rate */
syn_12k8_fx( st->L_frame, Aq, exc3_fx, syn1_fx, hLPDmem->mem_syn3, 1, sub( Q_new, 1 ), st->Q_syn );
@@ -1275,6 +1279,11 @@ ivas_error acelp_core_enc_ivas_fx(
st->stab_fac_fx = lsf_stab_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); // Q15
move16();
}
+ // Scaling Aq to Q12
+ FOR( Word16 k = 0; k < NB_SUBFR16k; k++ )
+ {
+ Scale_sig( &Aq[( M + 1 ) * k], M + 1, sub( norm_s( Aq[( M + 1 ) * k] ), 2 ) );
+ }
test();
IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO )
{
@@ -1313,12 +1322,6 @@ ivas_error acelp_core_enc_ivas_fx(
v_multc_fixed_16_16( res_fx, att_fx, res_fx, st->L_frame );
}
- // Scaling Aq and Aw to Q12
- FOR( Word16 k = 0; k < NB_SUBFR16k; k++ )
- {
- Scale_sig( &Aq[( M + 1 ) * k], M + 1, sub( norm_s( Aq[( M + 1 ) * k] ), 2 ) );
- Scale_sig( &Aw[( M + 1 ) * k], M + 1, sub( norm_s( Aw[( M + 1 ) * k] ), 2 ) );
- }
/*-----------------------------------------------------------------*
* Determine TC subframe classification
*-----------------------------------------------------------------*/
@@ -1418,17 +1421,12 @@ ivas_error acelp_core_enc_ivas_fx(
encod_gen_voic_ivas_fx( st, inp, Aw, Aq, Es_pred_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, 0, Q_new );
}
- FOR( i = 0; i < NB_SUBFR16k; i++ )
- {
- Scale_sig( &Aq[i * ( M + 1 )], ( M + 1 ), sub( Q12, sub( Q14, norm_s( Aq[i * ( M + 1 )] ) ) ) ); // Q12
- }
-
/* update mem_syn1_flt for ACELP core switching */
Copy( hLPDmem->mem_syn, hLPDmem->mem_syn1_fx, M ); // Q_syn
/* update old synthesis buffer - needed for ACELP internal sampling rate switching */
- Copy( syn_fx + sub( st->L_frame, L_SYN_MEM ), hLPDmem->mem_syn_r, L_SYN_MEM ); // st->Q_syn
-
+ Copy( syn_fx + sub( st->L_frame, L_SYN_MEM ), hLPDmem->mem_syn_r, L_SYN_MEM ); // hLPDmem->q_mem_syn
+ // st->Q_syn = Q_new - 1;
Scale_sig( syn_fx, L_FRAME16k, sub( st->Q_syn, Q_new - 1 ) ); // Q_syn
/* save and delay synthesis to be used by SWB BWE */
IF( st->hBWE_FD != NULL )
diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c
index 976826949541973f351346dd0a2ef79abe39f42b..b1b2257e2b8f422ccc17444d939f4350c0bb305d 100644
--- a/lib_enc/amr_wb_enc_fx.c
+++ b/lib_enc/amr_wb_enc_fx.c
@@ -262,8 +262,7 @@ void amr_wb_enc_fx(
/*----------------------------------------------------------------*
* Change the sampling frequency to 12.8 kHz
*----------------------------------------------------------------*/
- Word16 Q_new_inp, mem_decim_size; // TO be removed
- modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp, 12800, st->mem_decim_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp, 12800, st->mem_decim_fx, 0 );
/* update signal buffer */
Copy( new_inp, st->buf_speech_enc + L_FRAME, L_FRAME ); /* Q0 */
@@ -450,7 +449,7 @@ void amr_wb_enc_fx(
}
ELSE IF( EQ_32( st->input_Fs, 32000 ) || EQ_32( st->input_Fs, 48000 ) )
{
- modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp_16k, 16000, st->mem_decim16k_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp_16k, 16000, st->mem_decim16k_fx, 0 );
}
/*----------------------------------------------------------------*
diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c
index e1b5ca5625949a8625c300fcdde0e0fba92cef03..b65d414033bfd12e84d19875aa07fbf21b3bfd08 100644
--- a/lib_enc/cng_enc_fx.c
+++ b/lib_enc/cng_enc_fx.c
@@ -761,8 +761,7 @@ void CNG_enc_fx(
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
{
- Word16 Q_new_inp, mem_decim_size; // TO be removed
- modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0 );
}
fft_rel_fx( fft_io, L_FFT, LOG2_L_FFT );
@@ -1936,8 +1935,7 @@ void CNG_enc_ivas_fx(
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
{
- Word16 Q_new_inp, mem_decim_size; // TO be removed
- modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0 );
}
fft_rel_fx( fft_io, L_FFT, LOG2_L_FFT );
diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c
index 430ee0f26f023275d4c6a38e32bec85055d23633..4ed9b6bc43b2a551a978860e112e26a1df9a202d 100644
--- a/lib_enc/core_enc_init_fx.c
+++ b/lib_enc/core_enc_init_fx.c
@@ -1026,8 +1026,8 @@ void init_coder_ace_plus_ivas_fx(
{
st->acelpFramesCount = 0;
move16();
- st->prevTempFlatness_fx = 128 /*1.0f Q7*/;
- move16();
+ st->prevTempFlatness_32fx = ONE_IN_Q21 /*1.0f Q21*/;
+ move32();
}
/* Initialize TBE */
diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c
index 3ed50017cc30c56612bd19f149abfccc203e7fd2..7e5734e70bdead3ae0e6a5569eac06ca3458b5f3 100644
--- a/lib_enc/enc_pit_exc_fx.c
+++ b/lib_enc/enc_pit_exc_fx.c
@@ -578,7 +578,9 @@ void enc_pit_exc_ivas_fx(
Word16 use_fcb;
Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */
Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes*/
+#ifndef FIX_ISSUE_1376
Word16 h1_q15[PIT_EXC_L_SUBFR + ( M + 1 )];
+#endif
Word16 q_h1;
BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc;
@@ -771,11 +773,15 @@ void enc_pit_exc_ivas_fx(
* Codebook target computation
* (No LP filtering of the adaptive excitation)
*-----------------------------------------------------------------*/
+#ifndef FIX_ISSUE_1376
Copy_Scale_sig( h1, h1_q15, L_subfr, 1 ); // Q14 -> Q15
lp_select = lp_filt_exc_enc_ivas_fx( MODE1, AUDIO, i_subfr, exc, h1_q15,
xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */
-
+#else
+ lp_select = lp_filt_exc_enc_ivas_fx( MODE1, AUDIO, i_subfr, exc, h1,
+ xn, y1, xn2, L_subfr, st_fx->L_frame, g_corr, clip_gain, &gain_pit, &lp_flag ); /* Q0 */
+#endif
IF( EQ_16( lp_flag, NORMAL_OPERATION ) )
{
push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 );
diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c
index cd23c1a6f4035e6a60218dc53dbfe5b06ba74467..b0c67abf528e2aef3bf40e609cfaba8e803b5f70 100644
--- a/lib_enc/enc_uv_fx.c
+++ b/lib_enc/enc_uv_fx.c
@@ -23,7 +23,7 @@ void encod_unvoiced_fx(
const Word16 Es_pred, /* i : predicted scaled innov. energy Q8*/
const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC Q0*/
const Word16 *res_fx, /* i : residual signal Q_new*/
- Word16 *syn_fx, /* o : core synthesis Q_new*/
+ Word16 *syn_fx, /* o : core synthesis Q_new -1 */
Word16 *tmp_noise_fx, /* o : long-term noise energy Q0*/
Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/
Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/
diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c
index d5f832f8ca3b50f161972cbc058cd6ca10479459..aef5fd637644d28922b643193804a24b9b93be31 100644
--- a/lib_enc/eval_pit_contr_fx.c
+++ b/lib_enc/eval_pit_contr_fx.c
@@ -182,7 +182,7 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit
test();
if ( GE_16( st_fx->GSC_IVAS_mode, 1 ) || LT_32( st_fx->core_brate, ACELP_9k60 ) )
{
- av_corr = shl( av_corr, 1 ); /*Q2 Correlation really poor at low rate, time domain still valide*/
+ av_corr = shl_sat( av_corr, 1 ); /*Q2 Correlation really poor at low rate, time domain still valide*/
}
min_corr = abs_s( sub( mfreq_loc_Q2fx[0], av_corr ) ); /*Q2*/
diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c
index 757a6951821590eaf1aa615ddaadbb8d7e6928c5..9c3a236d75d8ec84214f7397eeeb1526df695a3a 100644
--- a/lib_enc/fd_cng_enc_fx.c
+++ b/lib_enc/fd_cng_enc_fx.c
@@ -2700,7 +2700,7 @@ void stereoFdCngCoherence_fx(
reset_indices_enc_fx( 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 ) )
+ IF( NE_32( sts[0]->core_brate, sts[1]->core_brate ) )
{
sts[0]->core_brate = SID_2k40;
move32();
diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c
index 375d4c2cf3dbf9bbc092a1ee3e0a523d3ea480f3..1642d1253ca44a9da38178f806a166ebfd151297 100644
--- a/lib_enc/gs_enc_fx.c
+++ b/lib_enc/gs_enc_fx.c
@@ -23,8 +23,8 @@ static Word16 edyn_fx( const Word16 *vec, const Word16 lvec, Word16 Qnew );
void encod_audio_fx(
Encoder_State *st_fx, /* i/o: State structure */
const Word16 speech[], /* i : input speech Q_new */
- const Word16 Aw[], /* i : weighted A(z) unquantized for subframes */
- const Word16 Aq[], /* i : 12k8 Lp coefficient */
+ const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */
+ const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */
const Word16 *res, /* i : residual signal Q_new */
Word16 *synth, /* i/o: core synthesis Q-1 */
Word16 *exc, /* i/o: current non-enhanced excitation Q_new */
@@ -32,10 +32,10 @@ void encod_audio_fx(
Word16 *voice_factors, /* o : voicing factors Q15 */
Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */
const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC) */
- Word16 *lsf_new, /* i : current frame ISF vector */
- Word16 *tmp_noise, /* o : noise energy */
- const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */
- const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */
+ Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */
+ Word16 *tmp_noise, /* o : noise energy Q2*/
+ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/
+ const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer Q6*/
Word16 Q_new,
Word16 shift )
{
@@ -43,9 +43,11 @@ void encod_audio_fx(
Word16 i, i_subfr, nb_subfr, last_pit_bin;
Word16 T0_tmp, T0_frac_tmp, nb_subfr_flag;
Word16 tmp_nb_bits_tot = 0;
+ move16();
Word16 Es_pred;
Word16 dct_res[L_FRAME16k], dct_epit[L_FRAME16k];
Word16 m_mean = 0;
+ move16();
Word16 saved_bit_pos;
Word16 exc_wo_nf[L_FRAME16k];
Word32 Lm_mean;
@@ -65,7 +67,7 @@ void encod_audio_fx(
move16();
T0_frac_tmp = 0;
move16();
- Copy( hLPDmem->mem_syn, hGSCEnc->mem_syn_tmp_fx, M );
+ Copy( hLPDmem->mem_syn, hGSCEnc->mem_syn_tmp_fx, M ); /* hLPDmem->q_mem_syn */
hGSCEnc->mem_w0_tmp_fx = hLPDmem->mem_w0;
move16();
Es_pred = 0;
@@ -78,7 +80,7 @@ void encod_audio_fx(
*---------------------------------------------------------------*/
#ifdef GSC_IVAS // TVB -->>>>>>
test();
- if ( GT_16( st_fx->element_mode, EVS_MONO ) && st_fx->idchan == 0 )
+ IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 )
{
push_indice_fx( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 );
}
@@ -99,6 +101,7 @@ void encod_audio_fx(
test();
test();
test();
+ test();
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( NE_16( st_fx->coder_type, INACTIVE ) && ( ( EQ_16( st_fx->element_mode, EVS_MONO ) && GE_32( st_fx->total_brate, ACELP_13k20 ) ) ||
( GT_16( st_fx->element_mode, EVS_MONO ) && GT_32( st_fx->total_brate, MIN_BRATE_GSC_NOISY_FLAG ) && GE_16( st_fx->bwidth, SWB ) && !st_fx->flag_ACELP16k ) ) ) )
{
@@ -113,7 +116,7 @@ void encod_audio_fx(
FOR( i = 0; i < 5; i++ )
{
test();
- if ( GT_16( abs_s( hSpMusClas->gsc_lt_diff_etot_fx[MAX_LT - i - 1] ), 1536 ) && EQ_16( hGSCEnc->cor_strong_limit, 1 ) )
+ if ( GT_16( abs_s( hSpMusClas->gsc_lt_diff_etot_fx[MAX_LT - i - 1] ), 1536 /*6.0 in Q8*/ ) && EQ_16( hGSCEnc->cor_strong_limit, 1 ) )
{
hGSCEnc->cor_strong_limit = 0;
move16();
@@ -121,6 +124,9 @@ void encod_audio_fx(
}
}
test();
+ test();
+ test();
+ test();
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( st_fx->GSC_noisy_speech && st_fx->GSC_IVAS_mode == 0 ) )
{
nb_subfr = NB_SUBFR;
@@ -166,10 +172,14 @@ void encod_audio_fx(
nb_subfr_flag = 1;
move16();
}
+
+ test();
+ test();
+ test();
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && ( GT_16( hSpMusClas->mold_corr_fx, 26214 ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) && NE_16( st_fx->coder_type, INACTIVE ) ) )
{
nb_subfr = shl( nb_subfr, 1 );
- nb_subfr_flag |= 0x2;
+ nb_subfr_flag = s_or( nb_subfr_flag, 0x2 );
logic16();
}
@@ -194,14 +204,22 @@ void encod_audio_fx(
* Compute adaptive (pitch) excitation contribution
*---------------------------------------------------------------*/
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
test();
IF( !( st_fx->GSC_IVAS_mode > 0 && EQ_16( st_fx->L_frame, i_mult( nb_subfr, 2 * L_SUBFR ) ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) &&
( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || st_fx->GSC_noisy_speech ) &&
( ( EQ_16( nb_subfr, NB_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && EQ_16( st_fx->L_frame, L_FRAME16k ) ) ) ) )
{
- IF( GT_16( st_fx->element_mode, EVS_MONO ) )
+ IF( ( st_fx->element_mode > EVS_MONO ) )
{
nb_bits = 5;
+ move16();
}
ELSE
{
@@ -235,17 +253,20 @@ void encod_audio_fx(
{
/*st_fx->mid_dyn_fx = 0.2f * st_fx->mid_dyn_fx + 0.8f * m_mean;*/
hGSCEnc->mid_dyn_fx = round_fx( L_mac( L_mult( 26214, m_mean ), 6554, hGSCEnc->mid_dyn_fx ) ); /*Q7*/
+ move16();
}
ELSE
{
/*st_fx->mid_dyn_fx = 0.6f * st_fx->mid_dyn_fx + 0.4f * m_mean;*/
hGSCEnc->mid_dyn_fx = round_fx( L_mac( L_mult( 13107, m_mean ), 19661, hGSCEnc->mid_dyn_fx ) ); /*Q7*/
+ move16();
}
IF( NE_16( st_fx->coder_type, INACTIVE ) )
{
hGSCEnc->noise_lev = sub( ( NOISE_LEVEL_SP3 + 1 ), usquant_fx( hGSCEnc->mid_dyn_fx, &m_mean, MIN_DYNAMIC_FX, shr( GSF_NF_DELTA_FX, 1 ), GSC_NF_STEPS ) );
-
+ move16();
hGSCEnc->noise_lev = s_min( hGSCEnc->noise_lev, NOISE_LEVEL_SP3 );
+ move16();
}
hGSCEnc->past_dyn_dec = hGSCEnc->noise_lev;
@@ -253,6 +274,7 @@ void encod_audio_fx(
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) )
{
hGSCEnc->noise_lev = NOISE_LEVEL_SP2;
+ move16();
IF( EQ_16( st_fx->GSC_IVAS_mode, 3 ) ) /* Music like */
{
hGSCEnc->noise_lev = NOISE_LEVEL_SP0;
@@ -267,12 +289,14 @@ void encod_audio_fx(
ELSE IF( LE_32( st_fx->core_brate, ACELP_8k00 ) )
{
hGSCEnc->noise_lev = s_max( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 );
+ move16();
push_indice_fx( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ), 2 );
}
ELSE IF( st_fx->GSC_noisy_speech )
{
hGSCEnc->noise_lev = NOISE_LEVEL_SP3;
move16();
+ move16();
}
ELSE
{
@@ -373,8 +397,8 @@ void encod_audio_fx(
void encod_audio_ivas_fx(
Encoder_State *st_fx, /* i/o: State structure */
const Word16 speech[], /* i : input speech Q_new */
- const Word16 Aw[], /* i : weighted A(z) unquantized for subframes */
- const Word16 Aq[], /* i : 12k8 Lp coefficient */
+ const Word16 Aw[], /* i : weighted A(z) unquantized for subframes Q12 */
+ const Word16 Aq[], /* i : 12k8 Lp coefficient Q12 */
const Word16 *res, /* i : residual signal Q_new */
Word16 *synth, /* i/o: core synthesis Q-1 */
Word16 *exc, /* i/o: current non-enhanced excitation Q_new */
@@ -382,8 +406,8 @@ void encod_audio_ivas_fx(
Word16 *voice_factors, /* o : voicing factors Q15 */
Word16 *bwe_exc, /* o : excitation for SWB TBE Q0 */
const Word16 attack_flag, /* i : Flag that point to an attack coded with AC mode (GSC) */
- Word16 *lsf_new, /* i : current frame ISF vector */
- Word16 *tmp_noise, /* o : noise energy */
+ Word16 *lsf_new, /* i : current frame ISF vector Qx2.56 */
+ Word16 *tmp_noise, /* o : noise energy Q8*/
const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */
const Word16 tdm_Pri_pitch_buf[], /* i : primary channel pitch buffer */
Word16 Q_new,
@@ -428,7 +452,7 @@ void encod_audio_ivas_fx(
*---------------------------------------------------------------*/
test();
- if ( GT_16( st_fx->element_mode, EVS_MONO ) && st_fx->idchan == 0 )
+ if ( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 )
{
push_indice( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 );
}
@@ -449,6 +473,7 @@ void encod_audio_ivas_fx(
test();
test();
test();
+ test();
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( NE_16( st_fx->coder_type, INACTIVE ) && ( ( EQ_16( st_fx->element_mode, EVS_MONO ) && GE_32( st_fx->total_brate, ACELP_13k20 ) ) ||
( GT_16( st_fx->element_mode, EVS_MONO ) && GT_32( st_fx->total_brate, MIN_BRATE_GSC_NOISY_FLAG ) && GE_16( st_fx->bwidth, SWB ) && !st_fx->flag_ACELP16k ) ) ) )
{
@@ -471,6 +496,9 @@ void encod_audio_ivas_fx(
}
}
test();
+ test();
+ test();
+ test();
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( st_fx->GSC_noisy_speech && st_fx->GSC_IVAS_mode == 0 ) )
{
nb_subfr = NB_SUBFR;
@@ -516,6 +544,10 @@ void encod_audio_ivas_fx(
nb_subfr_flag = 1;
move16();
}
+
+ test();
+ test();
+ test();
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && ( GT_16( hSpMusClas->mold_corr_fx, 26214 ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) && NE_16( st_fx->coder_type, INACTIVE ) ) )
{
nb_subfr = shl( nb_subfr, 1 );
@@ -523,6 +555,7 @@ void encod_audio_ivas_fx(
logic16();
}
+ test();
IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) )
{
push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 );
@@ -544,14 +577,22 @@ void encod_audio_ivas_fx(
* Compute adaptive (pitch) excitation contribution
*---------------------------------------------------------------*/
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
test();
IF( !( st_fx->GSC_IVAS_mode > 0 && EQ_16( st_fx->L_frame, i_mult( nb_subfr, 2 * L_SUBFR ) ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) &&
( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || st_fx->GSC_noisy_speech ) &&
( ( EQ_16( nb_subfr, NB_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && EQ_16( st_fx->L_frame, L_FRAME16k ) ) ) ) )
{
- IF( GT_16( st_fx->element_mode, EVS_MONO ) )
+ IF( ( st_fx->element_mode > EVS_MONO ) )
{
nb_bits = 5;
+ move16();
}
ELSE
{
@@ -585,17 +626,20 @@ void encod_audio_ivas_fx(
{
/*st_fx->mid_dyn_fx = 0.2f * st_fx->mid_dyn_fx + 0.8f * m_mean;*/
hGSCEnc->mid_dyn_fx = round_fx( L_mac( L_mult( 26214, m_mean ), 6554, hGSCEnc->mid_dyn_fx ) ); /*Q7*/
+ move16();
}
ELSE
{
/*st_fx->mid_dyn_fx = 0.6f * st_fx->mid_dyn_fx + 0.4f * m_mean;*/
hGSCEnc->mid_dyn_fx = round_fx( L_mac( L_mult( 13107, m_mean ), 19661, hGSCEnc->mid_dyn_fx ) ); /*Q7*/
+ move16();
}
IF( NE_16( st_fx->coder_type, INACTIVE ) )
{
hGSCEnc->noise_lev = sub( ( NOISE_LEVEL_SP3 + 1 ), usquant_fx( hGSCEnc->mid_dyn_fx, &m_mean, MIN_DYNAMIC_FX, shr( GSF_NF_DELTA_FX, 1 ), GSC_NF_STEPS ) );
-
+ move16();
hGSCEnc->noise_lev = s_min( hGSCEnc->noise_lev, NOISE_LEVEL_SP3 );
+ move16();
}
hGSCEnc->past_dyn_dec = hGSCEnc->noise_lev;
@@ -603,6 +647,7 @@ void encod_audio_ivas_fx(
IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) )
{
hGSCEnc->noise_lev = NOISE_LEVEL_SP2;
+ move16();
IF( EQ_16( st_fx->GSC_IVAS_mode, 3 ) ) /* Music like */
{
hGSCEnc->noise_lev = NOISE_LEVEL_SP0;
@@ -708,7 +753,7 @@ void encod_audio_ivas_fx(
* Synthesis
*--------------------------------------------------------------------------------------*/
- p_Aq = Aq;
+ p_Aq = Aq; /* Q12 */
FOR( i_subfr = 0; i_subfr < st_fx->L_frame; i_subfr += L_SUBFR )
{
Syn_filt_s( 1, p_Aq, M, &exc_wo_nf[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 );
@@ -721,7 +766,7 @@ void encod_audio_ivas_fx(
hLPDmem->mem_w0 = hGSCEnc->mem_w0_tmp_fx; /*_DIFF_FLOAT_FIX_ The way it is written in the original fix point is that at this point mem_w0 falls back to its original value (before enc_pit_exc, seems not the case in float */
move16();
- Copy( exc_wo_nf, exc, st_fx->L_frame );
+ Copy( exc_wo_nf, exc, st_fx->L_frame ); /* Q_new */
return;
}
@@ -753,14 +798,14 @@ void encod_audio_ivas_fx(
void gsc_enc_fx(
Encoder_State *st_fx, /* i/o: State structure */
- Word16 res_dct_in[], /* i : dct of residual signal */
- Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation */
+ Word16 res_dct_in[], /* i : dct of residual signal Q_exc*/
+ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/
const Word16 Diff_len,
const Word16 bits_used,
const Word16 nb_subfr,
- Word16 *lsf_new, /* i : ISFs at the end of the frame */
- Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill */
- Word16 *tmp_noise, /* o : noise energy */
+ Word16 *lsf_new, /* i : ISFs at the end of the frame Qx2.56*/
+ Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/
+ Word16 *tmp_noise, /* o : noise energy Q2*/
Word16 Q_exc )
{
Word16 y2_filt[L_FRAME16k];
@@ -794,6 +839,7 @@ void gsc_enc_fx(
*--------------------------------------------------------------------------------------*/
bit = bits_used;
+ move16();
test();
test();
test();
@@ -841,10 +887,14 @@ void gsc_enc_fx(
{
IF( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) )
{
- break;
+ BREAK;
}
i++;
}
+
+ test();
+ test();
+ test();
if ( GT_16( st_fx->element_mode, EVS_MONO ) && EQ_16( st_fx->coder_type, AUDIO ) &&
LE_32( st_fx->core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */
{
@@ -854,6 +904,7 @@ void gsc_enc_fx(
mean_gain = gsc_gainQ_fx( hBstr, /*st_fX->element_mode, st_fx->idchan,IVAS_CODE*/ Ener_per_bd_iQ, Ener_per_bd_iQ, brate_intermed_tbl[i], st_fx->coder_type, st_fx->bwidth /*, st_fx->L_frame, st_fx->tdm_LRTD_flag, st_fx->core_brate*/ );
*tmp_noise = mult_r( 320, mean_gain ); /*10 in Q5 lp_gainc in Q3 */
+ move16();
/*--------------------------------------------------------------------------------------*
* Frequency encoder
@@ -873,7 +924,7 @@ void gsc_enc_fx(
{
tmp = pvq_core_enc_fx( hBstr, concat_in, concat_out, &Q_tmp, bit, nb_subbands, gsc_sfm_start, gsc_sfm_end,
gsc_sfm_size, bits_per_bands, NULL, inpulses_fx, imaxpulse_fx, ACELP_CORE );
- Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) );
+ Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */
bit = sub( bit, tmp );
}
/* write unused bits */
@@ -974,11 +1025,11 @@ void gsc_enc_ivas_fx(
const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral)*/
const Word16 bits_used, /* i : Number of bit used before frequency Q */
const Word16 nb_subfr, /* i : Number of subframe considered */
- const Word16 *lsf_new_fx,
+ const Word16 *lsf_new_fx, /* Qx2.56 */
/* i : ISFs at the end of the frame */ // Q15
Word16 *exc_wo_nf_fx,
/* o : excitation (in f domain) without noisefill */ // Q_exc
- Word16 *tmp_noise_fx, /* o : long-term noise energy */
+ Word16 *tmp_noise_fx, /* o : long-term noise energy Q8*/
Word16 *Q_exc )
{
Word16 i;
@@ -1031,7 +1082,7 @@ void gsc_enc_ivas_fx(
* (non valuable temporal content present in exc_dct_in is already zeroed)
*--------------------------------------------------------------------------------------*/
- v_sub_16( res_dct_in_fx, exc_dct_in_fx, exc_diff_fx, st->L_frame );
+ v_sub_16( res_dct_in_fx, exc_dct_in_fx, exc_diff_fx, st->L_frame ); /* Q_exc */
exc_diff_fx[0] = 0;
move16();
@@ -1064,18 +1115,18 @@ void gsc_enc_ivas_fx(
{
IF( LE_32( st->core_brate, brate_intermed_tbl[i] ) )
{
- break;
+ BREAK;
}
- i = add( i, 1 );
+ i++;
}
test();
test();
test();
- IF( st->element_mode > EVS_MONO && EQ_16( st->coder_type, AUDIO ) &&
- LE_32( st->core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */
+ if ( st->element_mode > EVS_MONO && EQ_16( st->coder_type, AUDIO ) &&
+ LE_32( st->core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */
{
- i = sub( i, 1 );
+ i--;
}
mean_gain_fx = gsc_gainQ_ivas_fx( hBstr, st->element_mode, st->idchan, Ener_per_bd_iQ_fx, Ener_per_bd_iQ_fx, brate_intermed_tbl[i], st->coder_type, st->bwidth, st->L_frame, st->tdm_LRTD_flag, st->core_brate );
@@ -1129,18 +1180,18 @@ void gsc_enc_ivas_fx(
j = emaximum_fx( Q12, concat_out_fx, shl( nb_subbands, 4 ), &L_tmp );
IF( LE_16( add( abs_s( concat_out_fx[j] ), 41 /* 0.01f in Q12 */ ), ONE_IN_Q12 ) )
{
- max_eq = 32767;
+ max_eq = 32767; /* Q15 */
move16();
}
ELSE
{
- max_eq = div_s( ONE_IN_Q12, add( abs_s( concat_out_fx[j] ), 41 /* 0.01f in Q12 */ ) );
+ max_eq = div_s( ONE_IN_Q12, add( abs_s( concat_out_fx[j] ), 41 /* 0.01f in Q12 */ ) ); /* Q15 */
}
}
FOR( j = 0; j < nb_subbands; j++ )
{
- Copy( concat_out_fx + i_mult( j, 16 ), exc_diffQ_fx + i_mult( max_ener_band[j], 16 ), 16 );
+ Copy( concat_out_fx + i_mult( j, 16 ), exc_diffQ_fx + i_mult( max_ener_band[j], 16 ), 16 ); /* Q12 */
IF( GT_16( max_ener_band[j], last_bin ) )
{
@@ -1209,7 +1260,7 @@ void gsc_enc_ivas_fx(
{
FOR( i = 64; i < st->L_frame; i++ )
{
- exc_diffQ_fx[i] = mult( exc_diffQ_fx[i], max_eq );
+ exc_diffQ_fx[i] = mult( exc_diffQ_fx[i], max_eq ); /* Q12 */
move16();
}
}
@@ -1217,7 +1268,7 @@ void gsc_enc_ivas_fx(
{
FOR( i = 0; i < L_FRAME; i++ )
{
- exc_diffQ_fx[i] = mult( exc_diffQ_fx[i], max_eq );
+ exc_diffQ_fx[i] = mult( exc_diffQ_fx[i], max_eq ); /* Q12 */
move16();
}
}
@@ -1229,13 +1280,13 @@ void gsc_enc_ivas_fx(
Word16 Q_exc_new = s_min( *Q_exc, hGSCEnc->Q_last_exc_dct_in );
IF( NE_16( Q_exc_new, hGSCEnc->Q_last_exc_dct_in ) )
{
- Scale_sig( hGSCEnc->last_exc_dct_in_fx, st->L_frame, sub( Q_exc_new, hGSCEnc->Q_last_exc_dct_in ) );
+ Scale_sig( hGSCEnc->last_exc_dct_in_fx, st->L_frame, sub( Q_exc_new, hGSCEnc->Q_last_exc_dct_in ) ); /* Q_exc_new */
hGSCEnc->Q_last_exc_dct_in = Q_exc_new;
move16();
}
ELSE
{
- Scale_sig( exc_dct_in_fx, st->L_frame, sub( Q_exc_new, *Q_exc ) );
+ Scale_sig( exc_dct_in_fx, st->L_frame, sub( Q_exc_new, *Q_exc ) ); /* Q_exc_new */
*Q_exc = Q_exc_new;
move16();
}
@@ -1275,7 +1326,7 @@ void gsc_enc_ivas_fx(
/*=======================================================================*/
static Word16 edyn_fx( /* o : ratio of max to mean */
- const Word16 *vec, /* i : input vector */
+ const Word16 *vec, /* i : input vector Qnew*/
const Word16 lvec, /* i : length of input vector */
Word16 Qnew )
{
@@ -1286,6 +1337,7 @@ static Word16 edyn_fx( /* o : ratio of max to mean */
Word16 scale;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
Flag Overflow = 0;
+ move32();
#endif
ener_mean = L_shl( 1, shl( Qnew, 1 ) ); /*2*Qnew*/
@@ -1323,10 +1375,10 @@ static Word16 edyn_fx( /* o : ratio of max to mean */
}
ELSE
{
- dyn = 1280;
+ dyn = 1280; /* 10.0f in Q7 */
move16();
}
- return dyn;
+ return dyn; /* Q7 */
}
@@ -1341,7 +1393,7 @@ void GSC_enc_init_fx(
)
{
/* AC mode */
- hGSCEnc->seed_tcx = 15687;
+ hGSCEnc->seed_tcx = 15687; /* Q0 */
move16();
hGSCEnc->cor_strong_limit = 1;
move16();
@@ -1351,6 +1403,7 @@ void GSC_enc_init_fx(
set16_fx( hGSCEnc->last_bitallocation_band, 0, 6 );
hGSCEnc->mem_last_pit_band = BAND1k2 + 1;
+ move16();
hGSCEnc->Last_frame_ener_fx = MAX_32;
move32();
hGSCEnc->lt_gpitch_fx = 0;
@@ -1363,8 +1416,8 @@ void GSC_enc_init_fx(
move16();
set16_fx( hGSCEnc->mem_syn_tmp_fx, 0, M );
- hGSCEnc->mid_dyn_fx = 5120;
- move16(); /*40 -> Q7 */
+ hGSCEnc->mid_dyn_fx = 5120; /*40 -> Q7 */
+ move16();
hGSCEnc->noise_lev = NOISE_LEVEL_SP0;
move16();
hGSCEnc->past_dyn_dec = 0;
diff --git a/lib_enc/guided_plc_enc_fx.c b/lib_enc/guided_plc_enc_fx.c
index 9aa2ecb65550f4be98ba9615395e56d73888cd2b..60a3f8f50773d8e32359d71cc2ed14587e4d5a03 100644
--- a/lib_enc/guided_plc_enc_fx.c
+++ b/lib_enc/guided_plc_enc_fx.c
@@ -6,7 +6,6 @@
#include
#include "options.h"
#include "cnst.h"
-//#include "prot_fx.h"
#include "prot_fx.h" /* Function prototypes */
#include "prot_fx_enc.h" /* Function prototypes */
#include "stat_enc.h"
@@ -19,8 +18,8 @@
*
*-------------------------------------------------------------------*/
static void coderLookAheadInnovation(
- Word16 A_3Q12[], /* input: coefficients NxAz[M+1] */
- Word16 *pT, /* out: pitch */
+ Word16 A_3Q12[], /* input: coefficients NxAz[M+1] Q12*/
+ Word16 *pT, /* out: pitch Q0*/
PLC_ENC_EVS_HANDLE st, /* i/o: coder memory state */
Word16 *speechLookAhead_Qx, /* i: input speech in Q(st->Qold) */
Word16 *old_exc, /* i: input excitation in Q(st->Qold) */
@@ -41,13 +40,18 @@ static void coderLookAheadInnovation(
Word32 max_ps, max_ps_tmp;
Word16 max_ps_e;
Word16 tmp_loop;
+ move32();
+ move16();
+ move16();
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
Flag Overflow = 0;
+ move32();
#endif
/* Debug init (not instrumented) */
T0_fx = -3000;
+ move16();
subfr_len = shl( L_SUBFR, 1 ); /* 2*L_SUBFR */
if ( GT_16( L_FRAME16k, L_frame ) )
{
@@ -59,10 +63,10 @@ static void coderLookAheadInnovation(
* - BASOP specific initialization. *
*------------------------------------------------------------------------*/
/* initialization */
- exc_Qx = exc_buf_Qx + L_EXC_MEM + 8;
+ exc_Qx = exc_buf_Qx + L_EXC_MEM + 8; /* Q(st->Qold) */
FOR( i = 0; i < L_EXC_MEM + 8; i++ )
{
- exc_buf_Qx[i] = old_exc[i];
+ exc_buf_Qx[i] = old_exc[i]; /* Q(st->Qold) */
move16();
}
@@ -72,17 +76,17 @@ static void coderLookAheadInnovation(
*------------------------------------------------------------------------*/
/* find LP residual signal for look-ahead part */
getLookAheadResSig( speechLookAhead_Qx, A_3Q12, exc_Qx, L_frame, 2 );
- Scale_sig( exc_Qx, subfr_len, 1 );
+ Scale_sig( exc_Qx, subfr_len, 1 ); /* Q(st->Qold) + 1 */
/* find target signals */
- prev_pitch = st->T0_4th;
+ prev_pitch = st->T0_4th; /* Q0 */
move16();
/* find best candidate of pitch lag */
- T0_fx = st->T0_4th;
+ T0_fx = st->T0_4th; /* Q0 */
move16();
- mantissa_max = -0x7fffffffL;
+ mantissa_max = -0x7fffffffL; /* Q15 */
move32();
- max_ps = -0x7fffffffL;
+ max_ps = -0x7fffffffL; /* Q15 */
move32();
max_ps_e = 16;
move16();
@@ -90,14 +94,14 @@ static void coderLookAheadInnovation(
/*find maximum*/
exc_max = 0;
move16();
- tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 );
+ tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 ); /* Q0 */
FOR( i = -prev_pitch - search_range; i < tmp_loop; i++ )
{
- exc_max = s_max( exc_Qx[i], exc_max );
+ exc_max = s_max( exc_Qx[i], exc_max ); /* Q(st->Qold) + 1 */
}
FOR( i = 0; i < subfr_len; i++ )
{
- exc_max = s_max( exc_max, exc_Qx[i] );
+ exc_max = s_max( exc_max, exc_Qx[i] ); /* Q(st->Qold) + 1 */
}
/*calculate scaling factor for optimal precision and assure no overflow in dotproduct*/
exc_sh = sub( 15, norm_s( sub( subfr_len, 1 ) ) ); /*ceil(ld(subfr_len))*/
@@ -105,15 +109,15 @@ static void coderLookAheadInnovation(
exc_sh = shr( add( exc_sh, 1 ), 1 );
/*scale buffer only where its needed*/
- tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 );
+ tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 ); /* Q0 */
FOR( i = -prev_pitch - search_range; i < tmp_loop; i++ )
{
- exc_Qx[i] = shr( exc_Qx[i], exc_sh );
+ exc_Qx[i] = shr( exc_Qx[i], exc_sh ); /* Q(st->Qold) + 1 */
move16();
}
FOR( i = 0; i < subfr_len; i++ )
{
- exc_Qx[i] = shr( exc_Qx[i], exc_sh );
+ exc_Qx[i] = shr( exc_Qx[i], exc_sh ); /* Q(st->Qold) + 1 */
move16();
}
@@ -122,7 +126,7 @@ static void coderLookAheadInnovation(
move16();
FOR( i = -prev_pitch - search_range; i < -prev_pitch + search_range + subfr_len; i++ )
{
- alp_ini = L_mac( alp_ini, exc_Qx[i], exc_Qx[i] );
+ alp_ini = L_mac( alp_ini, exc_Qx[i], exc_Qx[i] ); /* 2*(Q(st->Qold) + 1) + 1 */
}
FOR( i = -search_range; i < search_range; i++ )
@@ -138,24 +142,24 @@ static void coderLookAheadInnovation(
FOR( k = 0; k < subfr_len; k++ )
{
- ps = L_mac( ps, exc_Qx[k], exc_Qx[k - prev_pitch - i] );
+ ps = L_mac( ps, exc_Qx[k], exc_Qx[k - prev_pitch - i] ); /* 2*(Q(st->Qold) + 1) + 1 */
}
/*calculate "small" dotproducts in order to subtract them from the "bigger" one*/
- FOR( k = negate( add( prev_pitch, search_range ) ); k < -prev_pitch - i; k++ )
+ FOR( k = -( ( prev_pitch + search_range ) ); k < -prev_pitch - i; k++ )
{
- alp_s1 = L_mac( alp_s1, exc_Qx[k], exc_Qx[k] );
+ alp_s1 = L_mac( alp_s1, exc_Qx[k], exc_Qx[k] ); /* 2*(Q(st->Qold) + 1) + 1 */
}
tmp_loop = sub( add( search_range, subfr_len ), prev_pitch );
FOR( k = +subfr_len - i - prev_pitch; k < tmp_loop; k++ )
{
- alp_s2 = L_mac( alp_s2, exc_Qx[k], exc_Qx[k] );
+ alp_s2 = L_mac( alp_s2, exc_Qx[k], exc_Qx[k] ); /* 2*(Q(st->Qold) + 1) + 1 */
}
alp = L_sub( alp_ini, L_add( alp_s1, alp_s2 ) );
alp = L_max( alp, 1 ); /* alp must not be 0 */
alp_e = shl( exc_sh, 1 );
ps_e = shl( exc_sh, 1 );
- alp = ISqrt32( alp, &alp_e );
+ alp = ISqrt32( alp, &alp_e ); /* Q31-alp_e */
ps = Mpy_32_16_1( ps, round_fx( alp ) ); /*alp_e+ps_e*/
ps_e = add( alp_e, ps_e );
@@ -173,7 +177,7 @@ static void coderLookAheadInnovation(
T0_fx = add( prev_pitch, i );
}
}
- mantissa_max = max_ps;
+ mantissa_max = max_ps; /* Q31-ps_e */
move32();
if ( mantissa_max < 0 )
{
@@ -239,9 +243,9 @@ void enc_prm_side_Info_fx(
void encoderSideLossSimulation_fx(
Encoder_State *st,
PLC_ENC_EVS_HANDLE hPlc_Ext,
- Word16 *lsf_q, /* Q1*1.28 */
- const Word16 stab_fac, /* Q15 */
- const Word16 calcOnlyISF,
+ Word16 *lsf_q, /* Qx2.56 */
+ const Word16 stab_fac, /* Q15 */
+ const Word16 calcOnlyISF, /* Q0 */
const Word16 L_frame )
{
Word16 lspLocal_Q15[M];
@@ -251,11 +255,11 @@ void encoderSideLossSimulation_fx(
/* Decoder State Update */
IF( EQ_16( L_frame, L_FRAME_16k ) )
{
- lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_16k_FX );
+ lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_16k_FX ); /* Q15 */
}
ELSE
{
- lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_FX );
+ lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_FX ); /* Q15 */
}
@@ -263,8 +267,8 @@ void encoderSideLossSimulation_fx(
st->narrowBand,
st->sr_core );
- Copy( st->mem_MA_fx, hPlc_Ext->mem_MA_14Q1, M );
- Copy( st->mem_AR_fx, hPlc_Ext->mem_AR, M );
+ Copy( st->mem_MA_fx, hPlc_Ext->mem_MA_14Q1, M ); /* Qx2.56 */
+ Copy( st->mem_AR_fx, hPlc_Ext->mem_AR, M ); /* Qx2.56 */
/* ISF parameter processing for concealment */
@@ -272,15 +276,15 @@ void encoderSideLossSimulation_fx(
hPlc_Ext->stab_fac_Q15 = stab_fac;
move16();
- Copy( lsf_q, hPlc_Ext->lsfold_14Q1, M );
- Copy( lspLocal_Q15, hPlc_Ext->lspold_Q15, M );
+ Copy( lsf_q, hPlc_Ext->lsfold_14Q1, M ); /* Qx2.56 */
+ Copy( lspLocal_Q15, hPlc_Ext->lspold_Q15, M ); /* Q15 */
IF( calcOnlyISF != 0 )
{
/* ISF concealment simulation */
getConcealedLSF( hPlc_Ext, xsfBase, st->clas, L_frame );
- hPlc_Ext->T0 = hPlc_Ext->T0_4th;
+ hPlc_Ext->T0 = hPlc_Ext->T0_4th; /* Q0 */
move16();
}
ELSE
@@ -300,9 +304,9 @@ void encoderSideLossSimulation_fx(
getConcealedLP( hPlc_Ext, A_3Q12, xsfBase, st->clas, L_frame );
/* apply encoder side PLC simulation */
- hPlc_Ext->pit_min = st->pit_min;
+ hPlc_Ext->pit_min = st->pit_min; /* Q0 */
move16();
- hPlc_Ext->pit_max = st->pit_max;
+ hPlc_Ext->pit_max = st->pit_max; /* Q0 */
move16();
coderLookAheadInnovation( A_3Q12, &( hPlc_Ext->T0 ), hPlc_Ext, speechLookAhead_Qx, old_exc_Qx, L_frame );
}
@@ -336,11 +340,11 @@ void GplcTcxEncSetup_fx(
*
*-------------------------------------------------------------------*/
Word16 encSideSpecPowDiffuseDetector_fx(
- Word16 *lsf_ref,
- Word16 *lsf_con,
- const Word32 sr_core,
- Word16 *prev_lsf4_mean,
- const Word8 sw,
+ Word16 *lsf_ref, /* Qx2.56 */
+ Word16 *lsf_con, /* Qx2.56 */
+ const Word32 sr_core, /* Q0 */
+ Word16 *prev_lsf4_mean, /* Qx2.56 */
+ const Word8 sw, /* Q0 */
const Word16 coder_type )
{
Word16 tmp;
@@ -355,14 +359,14 @@ Word16 encSideSpecPowDiffuseDetector_fx(
/* calculate the mean of the lowest 4 LSFs */
- L_tmp = L_mult( lsf_ref[0], 8192 /*1.0/4.0 Q15*/ );
- L_tmp = L_mac( L_tmp, lsf_ref[1], 8192 /*1.0/4.0 Q15*/ );
- L_tmp = L_mac( L_tmp, lsf_ref[2], 8192 /*1.0/4.0 Q15*/ );
- lsf4_mean = mac_r( L_tmp, lsf_ref[3], 8192 /*1.0/4.0 Q15*/ );
+ L_tmp = L_mult( lsf_ref[0], 8192 /*1.0/4.0 Q15*/ ); /* Qx2.56 */
+ L_tmp = L_mac( L_tmp, lsf_ref[1], 8192 /*1.0/4.0 Q15*/ ); /* Qx2.56 */
+ L_tmp = L_mac( L_tmp, lsf_ref[2], 8192 /*1.0/4.0 Q15*/ ); /* Qx2.56 */
+ lsf4_mean = mac_r( L_tmp, lsf_ref[3], 8192 /*1.0/4.0 Q15*/ ); /* Qx2.56 */
IF( sw )
{
- Copy( lsf_con, lsf_mod, M );
+ Copy( lsf_con, lsf_mod, M ); /* Qx2.56 */
modify_lsf( lsf_mod, M, sr_core, 1 );
@@ -372,28 +376,29 @@ Word16 encSideSpecPowDiffuseDetector_fx(
cum_dist2 = 0;
cnt_imprv = 0;
+ move16();
IF( EQ_32( sr_core, INT_FS_16k ) )
{
- th = 2560;
- move16(); /* LSF */
- th_dif = 288;
- move16(); /* LSF */
+ th = 2560; /* Qx2.56 */
+ move16(); /* LSF */
+ th_dif = 288; /* Qx2.56 */
+ move16(); /* LSF */
}
ELSE
{
- th = 2048;
- move16(); /* LSF */
- th_dif = 230;
- move16(); /* LSF */
+ th = 2048; /* Qx2.56 */
+ move16(); /* LSF */
+ th_dif = 230; /* Qx2.56 */
+ move16(); /* LSF */
}
FOR( i = 0; i < M; i++ )
{
tmp = sub( lsf_con[i], lsf_ref[i] );
- dist1 = L_mult( tmp, tmp );
+ dist1 = L_mult( tmp, tmp ); /* 2*(Qx2.56)+1 */
tmp = sub( lsf_mod[i], lsf_ref[i] );
- dist2 = L_mult( tmp, tmp );
+ dist2 = L_mult( tmp, tmp ); /* 2*(Qx2.56)+1 */
if ( GT_32( dist1, dist2 ) )
{
@@ -409,6 +414,7 @@ Word16 encSideSpecPowDiffuseDetector_fx(
test();
test();
test();
+ test();
if ( GT_32( cum_dist1, L_add( cum_dist2, Mpy_32_16_1( cum_dist2, 4915 ) ) ) && GT_16( sub( lsf4_mean, *prev_lsf4_mean ), th_dif ) && LT_16( *prev_lsf4_mean, th ) && GT_16( cnt_imprv, 2 ) && EQ_16( coder_type, GENERIC ) )
{
idx = 1;
@@ -438,17 +444,19 @@ void updateSpecPowDiffuseIdx_fx(
Word16 k;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
Flag Overflow = 0;
+ move32();
#endif
move32();
move16();
- st->mean_gc[1] = st->gain_code[0];
- min_gp = st->bpf_gainT[0];
+ st->mean_gc[1] = st->gain_code[0]; /* Q15 */
+ min_gp = st->bpf_gainT[0]; /* Q15 */
FOR( k = 1; k < 4; k++ )
{
st->mean_gc[1] = L_add_o( st->mean_gc[1], st->gain_code[k], &Overflow );
+ move32();
min_gp = s_min( min_gp, st->bpf_gainT[k] );
}
@@ -460,5 +468,5 @@ void updateSpecPowDiffuseIdx_fx(
st->glr_idx[0] = 0;
}
move16();
- st->mean_gc[0] = st->mean_gc[1];
+ st->mean_gc[0] = st->mean_gc[1]; /* Q15 */
}
diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c
index 42920a46a17d78e32195459a41e82ee68554cc75..45098926ecb19c6bca014e525e975845f050359f 100644
--- a/lib_enc/ivas_core_pre_proc_front_fx.c
+++ b/lib_enc/ivas_core_pre_proc_front_fx.c
@@ -115,7 +115,7 @@ ivas_error pre_proc_front_ivas_fx(
Word16 *fft_buff_fx_q, /* o : FFT buffer */
const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/
const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/
- const Word16 currFlatness_fx, /* i : flatness parameter Q7*/
+ const Word32 currFlatness_fx, /* i : flatness parameter Q21*/
const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/
Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/
Word16 fr_bands_LR_fx_q[CPE_CHANNELS],
diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c
index 1152736f6ca121133fbe8e86f0584f9a015cba23..ea70a33d36279ed00872b406d49e338eee6294ad 100644
--- a/lib_enc/ivas_cpe_enc_fx.c
+++ b/lib_enc/ivas_cpe_enc_fx.c
@@ -103,7 +103,7 @@ ivas_error ivas_cpe_enc_fx(
Word16 vad_flag_dtx[CPE_CHANNELS]; /* HE-SAD flag with additional DTX HO */
Word32 enerBuffer_fx[CPE_CHANNELS][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */
Word16 enerBuffer_fx_exp[CPE_CHANNELS]; /* energy buffer */
- Word16 currFlatness_fx[CPE_CHANNELS]; /* flatness parameter Q7 */
+ Word32 currFlatness_fx[CPE_CHANNELS]; /* flatness parameter Q21 */
Word16 tdm_ratio_idx, tdm_ratio_idx_SM; /* temp. TD stereo parameters */
Word16 tdm_SM_or_LRTD_Pri; /* temp. TD stereo parameters */
@@ -517,7 +517,7 @@ ivas_error ivas_cpe_enc_fx(
IF( sts[n]->hTranDet == NULL )
{
currFlatness_fx[n] = 0;
- move16();
+ move32();
CONTINUE;
}
@@ -527,8 +527,8 @@ ivas_error ivas_cpe_enc_fx(
RunTransientDetection_ivas_fx( sts[n]->input_fx, input_frame, sts[n]->hTranDet, sts[n]->q_inp ); // Note q of sts[n]->input_fx changes inside function
}
- currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q7
- move16();
+ currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q21
+ move32();
}
/* Synchonize detection for downmix-based stereo */
diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c
index ac0ce95566a5adf5c1bd12f7cd54b605a27b6055..db5ee872becb1e0b4b4af63ed17377082f48ccfd 100644
--- a/lib_enc/ivas_dirac_enc_fx.c
+++ b/lib_enc/ivas_dirac_enc_fx.c
@@ -1203,19 +1203,22 @@ void ivas_dirac_param_est_enc_fx(
move16();
}
- Word16 buffer_intensity_real_single_q;
+ Word16 buffer_intensity_real_single_q, min_shift = MAX_16;
+ move16();
buffer_intensity_real_single_q = hDirAC->buffer_intensity_real_q[0][0][0];
move16();
FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
{
FOR( j = 0; j < hDirAC->no_col_avg_diff; j++ )
{
+ min_shift = s_min( min_shift, L_norm_arr( hDirAC->buffer_intensity_real_fx[i][j], num_freq_bands ) );
FOR( k = 0; k < num_freq_bands; k++ )
{
buffer_intensity_real_single_q = s_min( buffer_intensity_real_single_q, hDirAC->buffer_intensity_real_q[i][j][k] );
}
}
}
+ buffer_intensity_real_single_q = add( buffer_intensity_real_single_q, min_shift );
FOR( i = 0; i < DIRAC_NUM_DIMS; i++ )
{
FOR( j = 0; j < hDirAC->no_col_avg_diff; j++ )
@@ -1569,8 +1572,20 @@ static void computeIntensityVector_enc_fx(
#endif
}
#ifdef NONBE_IMPROVE_DIRAC_INTENSITY_PREC
- norm = s_min( W_norm( tmp_1 ), W_norm( tmp_2 ) );
- norm = s_min( norm, W_norm( tmp_3 ) );
+ norm = 63;
+ move16();
+ IF( tmp_1 != 0 )
+ {
+ norm = s_min( norm, W_norm( tmp_1 ) );
+ }
+ IF( tmp_2 != 0 )
+ {
+ norm = s_min( norm, W_norm( tmp_2 ) );
+ }
+ IF( tmp_3 != 0 )
+ {
+ norm = s_min( norm, W_norm( tmp_3 ) );
+ }
intensity_real[0][i] = W_extract_h( W_shl( tmp_1, norm ) ); // shift_value - (gb - norm)
move32();
intensity_real[1][i] = W_extract_h( W_shl( tmp_2, norm ) ); // shift_value - (gb - norm)
diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c
index 8b76b37a44dc1d3a1ddf0fa7b98ece00ddc1172c..b37e618299f706dfe8bbfe83620a447895e1b225 100644
--- a/lib_enc/ivas_front_vad_fx.c
+++ b/lib_enc/ivas_front_vad_fx.c
@@ -230,7 +230,7 @@ ivas_error front_vad_fx(
MVR2R_WORD16( hFrontVad->buffer_12k8_fx + L_FFT, hFrontVad->buffer_12k8_fx, L_FFT / 2 );
/* Resample to 12k8 */
- modify_Fs_fx( sts[n]->input_fx, input_frame, sts[0]->input_Fs, hFrontVad->buffer_12k8_fx + L_FFT / 2, INT_FS_12k8, hFrontVad->mem_decim_fx, ( sts[0]->max_bwidth == NB ), &Qband, &mem_decim_size );
+ modify_Fs_ivas_fx( sts[n]->input_fx, input_frame, sts[0]->input_Fs, hFrontVad->buffer_12k8_fx + L_FFT / 2, INT_FS_12k8, hFrontVad->mem_decim_fx, ( sts[0]->max_bwidth == NB ), &Qband, &mem_decim_size );
/* Preemphasis */
hFrontVad->mem_preemph_fx = shl( hFrontVad->mem_preemph_fx, sub( add( Q_inp, Qband ), hFrontVad->q_mem_preemph_fx ) ); /* Q_inp + Qband */
@@ -557,7 +557,7 @@ ivas_error front_vad_spar_fx(
st->input_fx = input_fx;
Copy_Scale_sig32_16( omni_in, st->input_fx, input_frame, Q16 - Q11 ); /* Q16 */
- delay_signal( st->input_fx, input_frame, hFrontVad->delay_buf_fx, hFrontVad->delay_samples );
+ delay_signal_fx( st->input_fx, input_frame, hFrontVad->delay_buf_fx, hFrontVad->delay_samples );
/* Scaling only if the omni_in buffer contains non-zero values */
maximum_abs_16_fx( st->input_fx, input_frame, &tmp );
diff --git a/lib_enc/ivas_ism_enc_fx.c b/lib_enc/ivas_ism_enc_fx.c
index 1b648cc98a530eea4f7b8a8db1b089d6044e3e34..c2f77c159eb6fa180db94e04d81fde15bcda15fb 100644
--- a/lib_enc/ivas_ism_enc_fx.c
+++ b/lib_enc/ivas_ism_enc_fx.c
@@ -88,7 +88,7 @@ ivas_error ivas_ism_enc_fx(
Word16 vad_flag_dtx[MAX_NUM_OBJECTS][1]; /* HE-SAD flag with additional DTX HO */
Word32 enerBuffer_fx[MAX_NUM_OBJECTS][1][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */
Word16 enerBuffer_fx_exp[MAX_NUM_OBJECTS][1]; /* energy buffer */
- Word16 currFlatness_fx[1]; /* flatness parameter */
+ Word32 currFlatness_fx[1]; /* flatness parameter */
Word16 fft_buff_fx[MAX_NUM_OBJECTS][1][2 * L_FFT]; /* FFT buffer */
Word16 fft_buff_fx_q[MAX_NUM_OBJECTS][1]; /* FFT buffer */
Word32 fr_bands_fx[1][2 * NB_BANDS]; /* energy in frequency bands */
@@ -213,7 +213,7 @@ ivas_error ivas_ism_enc_fx(
RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, st->q_inp );
- currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q7
+ currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q21
move16();
/*----------------------------------------------------------------*
diff --git a/lib_enc/ivas_osba_enc_fx.c b/lib_enc/ivas_osba_enc_fx.c
index 2a6944c502fd97256ec50250b6c774159c9694fc..0ca93e1a1dc16bab0cd8bf2b00d17d1674e9580c 100644
--- a/lib_enc/ivas_osba_enc_fx.c
+++ b/lib_enc/ivas_osba_enc_fx.c
@@ -446,7 +446,7 @@ void ivas_osba_enc_fx(
/* delay ISM input channels to match the SBA encoder delay */
FOR( n = 0; n < nchan_ism; n++ )
{
- delay_signal_fx( data_in_fx[n], input_frame, hOSba->input_data_mem_fx[n], delay_s );
+ delay_signal32_fx( data_in_fx[n], input_frame, hOSba->input_data_mem_fx[n], delay_s );
azimuth_fx = extract_l( L_shr( L_add( hIsmMeta[n]->azimuth_fx, 2097152 /*0.5.Q22*/ ), Q22 ) ); // Q0
elevation_fx = extract_l( L_shr( L_add( hIsmMeta[n]->elevation_fx, 2097152 /*0.5.Q22*/ ), Q22 ) ); // Q0
diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c
index 35b65e4c1604f4cf2a0763aefc69553aec6bb6a4..3a0f19c505c59a7a7e5456edc8e2777e9a727953 100644
--- a/lib_enc/ivas_sce_enc_fx.c
+++ b/lib_enc/ivas_sce_enc_fx.c
@@ -78,7 +78,7 @@ ivas_error ivas_sce_enc_fx(
Word16 pitch_fr_fx[1][NB_SUBFR]; /* fractional pitch values */
Word16 voicing_fr_fx[1][NB_SUBFR]; /* fractional pitch gains */
Word16 relE_fx[1]; /* frame relative energy Q8 */
- Word16 currFlatness_fx[1]; /* flatness parameter Q7 */
+ Word32 currFlatness_fx[1]; /* flatness parameter Q7 */
Word16 Etot_LR_fx[1]; /* total energy Q8 */
Word32 realBuffer_fx[1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */
Word32 imagBuffer_fx[1][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */
@@ -180,8 +180,8 @@ ivas_error ivas_sce_enc_fx(
RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, q_input );
}
- currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q7
- move16();
+ currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q21
+ move32();
/*----------------------------------------------------------------*
* Configuration of core encoder
diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h
index ac258cfc1b9a428df1bdb1466943095d24577d5d..918acc41711f5135bfa0ede33d664e6d43363de2 100644
--- a/lib_enc/ivas_stat_enc.h
+++ b/lib_enc/ivas_stat_enc.h
@@ -66,7 +66,7 @@ typedef struct stereo_itd_data_struct
Word16 prev_index;
Word32 prev_avg_max_fx;
Word16 prev_avg_max_fx_e;
- Word16 currFlatness_fx;
+ Word32 currFlatness_fx;
/* Xtalk classifier */
Word32 prev_m1_fx; // Q31
diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c
index 8a887de89f027b6906f8fddd25843e59e21cfdbc..af10f7dea96e2cd49be4d2038f452cd834fd09f8 100644
--- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c
+++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c
@@ -2233,7 +2233,7 @@ void stereo_dft_enc_compute_itd_fx(
test();
test();
test();
- IF( flag_noisy_speech_snr == 0 && EQ_16( hCPE->hCoreCoder[0]->vad_flag, 1 ) && hItd->detected_itd_flag == 0 && ( LT_16( hItd->currFlatness_fx, 192 ) /* 1.5 in Q7*/ || EQ_16( hCPE->hCoreCoder[0]->sp_aud_decision0, 1 ) ) )
+ IF( flag_noisy_speech_snr == 0 && EQ_16( hCPE->hCoreCoder[0]->vad_flag, 1 ) && hItd->detected_itd_flag == 0 && ( LT_32( hItd->currFlatness_fx, 3145728 ) /* 1.5 in Q21*/ || EQ_16( hCPE->hCoreCoder[0]->sp_aud_decision0, 1 ) ) )
{
// hItd->itd_thres *= 1.5f;
hItd->itd_thres_fx = L_shl_sat( Mpy_32_32( hItd->itd_thres_fx, 1610612736 ), 1 ); /* Saturation added to avoid assertions (this needs to be investigated) */
diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c
index bc84ba419072bd70dd77f4726678c80f6c4a4591..ad038f0fa33392763ccb3751d73ca3deebd2895c 100644
--- a/lib_enc/ivas_stereo_icbwe_enc_fx.c
+++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c
@@ -1395,7 +1395,7 @@ void stereo_icBWE_preproc_fx(
Scale_sig( temp_inp_fx, L_FRAME48k, sub( 0, hStereoICBWE->q_dataChan_fx ) ); /* q_dataChan_fx */
/* IVAS-219: Re-wire the shb nonref estimation through a lite CLDFB */
- modify_Fs_fx( temp_inp_fx, L_FRAME32k, 32000, tempSHB_fx, 16000, hStereoICBWE->mem_decim_shb_ch0_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_ivas_fx( temp_inp_fx, L_FRAME32k, 32000, tempSHB_fx, 16000, hStereoICBWE->mem_decim_shb_ch0_fx, 0, &Q_new_inp, &mem_decim_size );
Copy_Scale_sig( tempSHB_fx, shb_speech_nonref_fx, L_FRAME16k, sub( q_shb_speech_nonref_fx, Q_new_inp ) ); /* q_shb_speech_nonref_fx */
diff --git a/lib_enc/ivas_tcx_core_enc_fx.c b/lib_enc/ivas_tcx_core_enc_fx.c
index 1e66c148868960ae61e8dbcdbfe15f84b7cff136..eabfe87b48124b8e97d483242005d0ceada58950 100644
--- a/lib_enc/ivas_tcx_core_enc_fx.c
+++ b/lib_enc/ivas_tcx_core_enc_fx.c
@@ -78,27 +78,27 @@ void stereo_tcx_init_enc_fx(
move16();
}
- st->hTcxCfg->coder_type = st->coder_type;
+ st->hTcxCfg->coder_type = st->coder_type; /* Q0 */
move16();
test();
test();
- IF( !st->tcxonly && !st->localVAD && EQ_16( st->hTcxCfg->coder_type, GENERIC ) )
+ if ( !st->tcxonly && !st->localVAD && EQ_16( st->hTcxCfg->coder_type, GENERIC ) )
{
st->hTcxCfg->coder_type = UNVOICED;
move16();
}
/*sampling rate*/
- total_brate = L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC );
+ total_brate = L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ); /* Q0 */
st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format );
move32();
st->fscale = sr2fscale_fx( st->sr_core );
move16();
/*frame size*/
- st->L_frame = extract_l( Mpy_32_32( st->sr_core, ONE_BY_FRAMES_PER_SEC_Q31 ) );
+ st->L_frame = extract_l( Mpy_32_32( st->sr_core, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /* Q0 */
move16();
- st->hTcxEnc->L_frameTCX = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) );
+ st->hTcxEnc->L_frameTCX = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /* Q0 */
move16();
test();
@@ -117,17 +117,17 @@ void stereo_tcx_init_enc_fx(
}
/*TCX tools*/
- st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_mode );
+ st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_mode ); /* Q0 */
move16();
- st->hTcxCfg->resq = getResq( total_brate );
+ st->hTcxCfg->resq = getResq( total_brate ); /* Q0 */
move16();
- st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_mode, st->element_mode );
+ st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_mode, st->element_mode ); /* Q0 */
move16();
- st->igf = getIgfPresent_fx( st->element_mode, total_brate, st->bwidth, st->rf_mode );
+ st->igf = getIgfPresent_fx( st->element_mode, total_brate, st->bwidth, st->rf_mode ); /* Q0 */
move16();
prev_IsTNSAllowed = st->hTcxCfg->fIsTNSAllowed;
move16();
- IF( NE_16( st->element_mode, EVS_MONO ) )
+ if ( ( st->element_mode != EVS_MONO ) )
{
st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode );
move16();
@@ -154,8 +154,8 @@ void stereo_tcx_init_enc_fx(
void stereo_tcx_core_enc(
Encoder_State *st, /* i/o: encoder state structure */
- const Word16 new_samples_12k8[], /* i : buffer of input signal @12.8 kHz */
- const Word16 new_samples_16k[], /* i : buffer of input signal @16 kHz */
+ const Word16 new_samples_12k8[], /* i : buffer of input signal @12.8 kHz Q_new*/
+ const Word16 new_samples_16k[], /* i : buffer of input signal @16 kHz Q_new*/
const Word16 Aw_fx[], /* i : weighted A(z) unquant. for subframes, Q12 */
Word16 lsp_new_fx[], /* i : LSPs at the end of the frame, Q15 */
Word16 lsp_mid_fx[], /* i : LSPs in the middle of the frame, Q15 */
@@ -242,14 +242,14 @@ void stereo_tcx_core_enc(
*---------------------------------------------------------------*/
/* Subtract the bits of common header */
- st->bits_frame_core = extract_l( L_sub( Mpy_32_32( st->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ), hBstr->nb_bits_tot ) );
+ st->bits_frame_core = extract_l( L_sub( Mpy_32_32( st->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ), hBstr->nb_bits_tot ) ); /* Q0 */
move16();
/*Get Bits of TCX header*/
nbits_header = 3; /* Coder types (2) + last_core for bfi (1) */
move16();
- IF( st->tcxonly )
+ if ( st->tcxonly )
{
/* TCX20/10 flag */
nbits_header = add( nbits_header, 1 );
@@ -281,7 +281,7 @@ void stereo_tcx_core_enc(
move16();
/* check minimum pitch for quantization */
- IF( LT_16( T_op[i], PIT_MIN_SHORTER ) )
+ if ( LT_16( T_op[i], PIT_MIN_SHORTER ) )
{
T_op[i] = shl( T_op[i], 1 );
move16();
@@ -302,11 +302,11 @@ void stereo_tcx_core_enc(
IF( EQ_16( st->L_frame, L_FRAME ) )
{
- p_new_samples = new_samples_12k8;
+ p_new_samples = new_samples_12k8; /* Q_new */
}
ELSE
{
- p_new_samples = new_samples_16k;
+ p_new_samples = new_samples_16k; /* Q_new */
}
/*--------------------------------------------------------------*
@@ -351,7 +351,7 @@ void stereo_tcx_core_enc(
q_ind_val = 0;
move16();
test();
- IF( NE_16( st->last_core, ACELP_CORE ) || EQ_16( st->core, TCX_10_CORE ) )
+ if ( ( st->last_core != ACELP_CORE ) || EQ_16( st->core, TCX_10_CORE ) )
{
q_ind_val = 1;
move16();
@@ -372,10 +372,9 @@ void stereo_tcx_core_enc(
*---------------------------------------------------------------*/
/* TODO: integrate this. */
-#ifdef IVAS_FLOAT_FIXED_CONVERSIONS
st->prev_Q_new = 0;
st->Q_old = 0;
-#endif
+
Q_new = 0;
move16();
input_frame = idiv1616U( extract_l( L_shr( st->input_Fs, 1 ) ), FRAMES_PER_SEC / 2 );
@@ -389,32 +388,31 @@ void stereo_tcx_core_enc(
core_signal_analysis_high_bitrate_ivas_fx( p_new_samples, T_op, lsp_new_fx, lsp_mid_fx, st, tnsSize, tnsBits, param_core, <pBits, NULL, st->L_frame, hTcxEnc->L_frameTCX, last_element_mode, vad_hover_flag, NULL, NULL, &Q_new, NULL );
bitsAvailable = sub( st->bits_frame_core, nbits_header );
- IF( st->igf )
+ if ( st->igf )
{
bitsAvailable = sub( bitsAvailable, st->hIGFEnc->infoTotalBitsWritten );
}
- const Word16 Q_ener = Q_new + Q_SCALE - 2; // Q_new + Q_SCALE -2
+ const Word16 Q_ener = add( Q_new, sub( Q_SCALE, 2 ) ); // Q_new + Q_SCALE -2
Q_exc = Q_new;
st->prev_Q_new = Q_exc;
+ move16();
+ move16();
+ move16();
- Scale_sig( st->synth, st->L_frame, st->Q_syn );
- IF( st->tcxonly == 0 )
- {
- st->wspeech_enc[st->L_frame - 1] = shl( st->wspeech_enc[st->L_frame - 1], st->Q_syn );
- }
IF( st->hTdCngEnc )
{
FOR( Word16 ii = 0; ii < HO_HIST_SIZE; ii++ )
{
- Scale_sig( st->hTdCngEnc->cng_exc2_buf + ii * L_FFT, L_FFT, sub( Q_exc, st->hTdCngEnc->cng_Qexc_buf[ii] ) );
+ Scale_sig( st->hTdCngEnc->cng_exc2_buf + ii * L_FFT, L_FFT, sub( Q_exc, st->hTdCngEnc->cng_Qexc_buf[ii] ) ); /* Q_exc */
st->hTdCngEnc->cng_Qexc_buf[ii] = Q_exc;
+ move16();
}
}
- Scale_sig( st->hLPDmem->old_exc, L_EXC_MEM, sub( Q_new, st->hLPDmem->q_lpd_old_exc ) );
+ Scale_sig( st->hLPDmem->old_exc, L_EXC_MEM, sub( Q_new, st->hLPDmem->q_lpd_old_exc ) ); /* Q_exc */
st->hLPDmem->q_lpd_old_exc = Q_new;
move16();
- Scale_sig( st->hLPDmem->syn, M + 1, sub( st->Q_syn, st->hLPDmem->q_lpd_syn ) );
+ Scale_sig( st->hLPDmem->syn, M + 1, sub( st->Q_syn, st->hLPDmem->q_lpd_syn ) ); /* st->Q_syn */
st->hLPDmem->q_lpd_syn = st->Q_syn;
move16();
@@ -437,8 +435,8 @@ void stereo_tcx_core_enc(
IF( st->rate_switching_reset )
{
- Copy( lsp_q_fx, st->lsp_old_fx, M );
- Copy( lsf_q_fx, st->lsf_old_fx, M );
+ Copy( lsp_q_fx, st->lsp_old_fx, M ); /* Q15 */
+ Copy( lsf_q_fx, st->lsf_old_fx, M ); /* Qx2.56 */
}
}
@@ -520,12 +518,12 @@ void stereo_tcx_core_enc(
* Run TCX10/20 Core
*---------------------------------------------------------------*/
- hTcxEnc->measuredBwRatio = ONE_IN_Q14;
+ hTcxEnc->measuredBwRatio = ONE_IN_Q14; /* Q14 */
move16();
FOR( n = 0; n < n_subframes; n++ )
{
- target_bits[n] = sub( idiv1616( add( bitsAvailable, sub( sub( n_subframes, 1 ), n ) ), n_subframes ), tnsBits[n] );
+ target_bits[n] = sub( idiv1616( add( bitsAvailable, sub( sub( n_subframes, 1 ), n ) ), n_subframes ), tnsBits[n] ); /* Q0 */
move16();
test();
@@ -546,7 +544,7 @@ void stereo_tcx_core_enc(
{
tmp1 = idiv1616( tmp1, n_subframes );
}
- tmp2 = imult1616( n, NPRM_DIV );
+ tmp2 = imult1616( n, NPRM_DIV ); /* Q0 */
QuantizeSpectrum_ivas_fx( st, A_q_fx, A_q_ind, gainlpc_fx[n], gainlpc_e[n], st->synth + tmp1, target_bits[n], tnsSize[n], param_core + tmp2, n, &hm_cfg[n], vad_hover_flag );
}
@@ -562,8 +560,8 @@ void stereo_tcx_core_enc(
s = s_min( s, norm_s( st->wspeech_enc[st->L_frame - 1] ) );
st->wspeech_enc[st->L_frame - 1] = shl( st->wspeech_enc[st->L_frame - 1], s );
}
- Scale_sig( st->synth, st->L_frame, s );
- Scale_sig( st->hLPDmem->syn, M + 1, s );
+ Scale_sig( st->synth, st->L_frame, s ); /* st->Q_syn + s */
+ Scale_sig( st->hLPDmem->syn, M + 1, s ); /* st->Q_syn + s */
Q_new = add( Q_new, s );
move16();
move16();
@@ -583,8 +581,8 @@ void stereo_tcx_core_enc(
IF( st->enableTcxLpc && st->core != ACELP_CORE )
{
/* Update lsf / lsp memory */
- Copy( lsf_tcx_q_fx, st->lsf_old_fx, M );
- Copy( lsp_tcx_q_fx, st->lsp_old_fx, M );
+ Copy( lsf_tcx_q_fx, st->lsf_old_fx, M ); /* Qx2.56 */
+ Copy( lsp_tcx_q_fx, st->lsp_old_fx, M ); /* Q15 */
st->envWeighted = 1;
move16();
@@ -597,12 +595,12 @@ void stereo_tcx_core_enc(
/* check resonance for pitch clipping algorithm */
gp_clip_test_lsf_ivas_fx( st->element_mode, st->core_brate, st->lsf_old_fx, st->clip_var_fx, 0 );
- Copy( st->lsf_old_fx, st->mem_AR_fx, M );
+ Copy( st->lsf_old_fx, st->mem_AR_fx, M ); /* Qx2.56 */
}
ELSE
{
- Copy( lsf_q_fx, st->lsf_old_fx, M );
- Copy( lsp_q_fx, st->lsp_old_fx, M );
+ Copy( lsf_q_fx, st->lsf_old_fx, M ); /* Qx2.56 */
+ Copy( lsp_q_fx, st->lsp_old_fx, M ); /* Q15 */
}
test();
@@ -612,7 +610,7 @@ void stereo_tcx_core_enc(
/* update CNG parameters in active frames */
test();
test();
- IF( EQ_16( st->bwidth, NB ) && st->enableTcxLpc && NE_16( st->core, ACELP_CORE ) )
+ IF( EQ_16( st->bwidth, NB ) && st->enableTcxLpc && ( st->core != ACELP_CORE ) )
{
Word16 buf_fx[L_LP], res_fx[L_FRAME], A_fx[M + 1], tmp_fx, lsptmp_fx[M];
Word32 A_fx32[M + 1], r_fx[M + 1];
@@ -620,7 +618,7 @@ void stereo_tcx_core_enc(
assert( st->L_frame == L_FRAME );
- Copy( st->synth + L_FRAME - L_LP, buf_fx, L_LP );
+ Copy( st->synth + L_FRAME - L_LP, buf_fx, L_LP ); /* st->Q_syn */
tmp_fx = st->synth[L_FRAME - L_LP - 1];
move16();
preemph_copy_fx( buf_fx, buf_fx, st->preemph_fac, L_LP, &tmp_fx );
@@ -629,7 +627,8 @@ void stereo_tcx_core_enc(
lev_dur_fx( A_fx32, r_fx, M, NULL, Q12, Q_r );
FOR( Word16 j = 0; j < M; j++ )
{
- A_fx[j] = extract_l( A_fx32[j] );
+ A_fx[j] = extract_l( A_fx32[j] ); /* Q12 */
+ move16();
}
E_LPC_a_lsp_conversion( A_fx, lsptmp_fx, lsp_new_fx, M );
Residu3_fx( A_fx, buf_fx + L_LP - L_FRAME, res_fx, L_FRAME, 0 );
@@ -650,7 +649,7 @@ void stereo_tcx_core_enc(
IF( EQ_16( st->L_frame, L_FRAME ) )
{
/* store LSPs@16k, potentially to be used in CNG@16k */
- Copy( st->lsp_old16k_fx, &( st->hTdCngEnc->ho_lsp_circ2_fx[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M );
+ Copy( st->lsp_old16k_fx, &( st->hTdCngEnc->ho_lsp_circ2_fx[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M ); /* Q15 */
}
/* Set 16k LSP flag for CNG buffer */
@@ -679,25 +678,25 @@ void stereo_tcx_core_enc(
total_nbbits = sub( hBstr->nb_bits_tot, nbits_start );
- IF( NE_16( param_core[1 + NOISE_FILL_RANGES], 0 ) )
+ IF( ( param_core[1 + NOISE_FILL_RANGES] != 0 ) )
{
Word32 tcxltp_pitch_tmp = L_add( L_deposit_h( hTcxEnc->tcxltp_pitch_int ), L_shl( L_deposit_l( div_s( hTcxEnc->tcxltp_pitch_fr, st->pit_res_max ) ), 1 ) ); /* 15Q16 */
tcxltp_pitch_tmp = L_shr( tcxltp_pitch_tmp, 10 ); // Q6
- set16_fx( pitch_buf_fx, extract_l( tcxltp_pitch_tmp ), NB_SUBFR16k );
+ set16_fx( pitch_buf_fx, extract_l( tcxltp_pitch_tmp ), NB_SUBFR16k ); /* Q6 */
}
ELSE
{
- set16_fx( pitch_buf_fx, L_SUBFR * ONE_IN_Q6, NB_SUBFR16k );
+ set16_fx( pitch_buf_fx, L_SUBFR * ONE_IN_Q6, NB_SUBFR16k ); /* Q6 */
}
/* Memory scaling to keep everything in common q */
Word16 curr_q_syn = sub( shl( Q_new, 1 ), 1 );
- Scale_sig( st->hLPDmem->mem_syn_r, L_SYN_MEM, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) );
- Scale_sig( st->hLPDmem->mem_syn, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) );
- Scale_sig( st->hLPDmem->mem_syn2, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) );
- st->hLPDmem->mem_w0 = shl_sat( st->hLPDmem->mem_w0, sub( s_min( Q_new, st->hLPDmem->q_mem_syn ), Q_new ) );
+ Scale_sig( st->hLPDmem->mem_syn_r, L_SYN_MEM, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */
+ Scale_sig( st->hLPDmem->mem_syn, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */
+ Scale_sig( st->hLPDmem->mem_syn2, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), curr_q_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */
+ st->hLPDmem->mem_w0 = shl_sat( st->hLPDmem->mem_w0, sub( s_min( Q_new, st->hLPDmem->q_mem_syn ), Q_new ) ); /* s_min( Q_new, st->hLPDmem->q_mem_syn ) */
move16();
- Scale_sig( st->hLPDmem->mem_syn1_fx, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) );
- Scale_sig( st->hLPDmem->mem_syn3, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) );
+ Scale_sig( st->hLPDmem->mem_syn1_fx, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */
+ Scale_sig( st->hLPDmem->mem_syn3, M, sub( s_min( curr_q_syn, st->hLPDmem->q_mem_syn ), st->hLPDmem->q_mem_syn ) ); /* s_min( curr_q_syn, st->hLPDmem->q_mem_syn ) */
st->hLPDmem->q_mem_syn = s_min( curr_q_syn, st->hLPDmem->q_mem_syn );
move16();
st->hLPDmem->q_lpd_syn = Q_new;
@@ -706,7 +705,7 @@ void stereo_tcx_core_enc(
{
FOR( Word16 ii = 0; ii < HO_HIST_SIZE; ii++ )
{
- Scale_sig( st->hTdCngEnc->cng_exc2_buf + ii * L_FFT, L_FFT, sub( Q_exc, st->hTdCngEnc->cng_Qexc_buf[ii] ) );
+ Scale_sig( st->hTdCngEnc->cng_exc2_buf + ii * L_FFT, L_FFT, sub( Q_exc, st->hTdCngEnc->cng_Qexc_buf[ii] ) ); /* Q_exc */
st->hTdCngEnc->cng_Qexc_buf[ii] = Q_exc;
move16();
}
@@ -715,6 +714,7 @@ void stereo_tcx_core_enc(
IF( st->tcxonly == 0 )
{
st->wspeech_enc[st->L_frame - 1] = shl( st->wspeech_enc[st->L_frame - 1], -st->Q_syn );
+ move16();
}
pop_wmops();
@@ -737,12 +737,12 @@ Word16 ivas_acelp_tcx20_switching_fx(
Word16 non_staX, /*Q8 i : unbound non-stationarity for sp/mu clas*/
Word16 *pitch_fr, /*Q6 i : fraction pitch values */
Word16 *voicing_fr, /*Q15 i : fractional voicing values */
- Word16 currFlatness, /*Q7 i : flatness */
+ Word32 currFlatness, /*Q21 i : flatness */
Word16 lsp_mid[M], /*Q15 i : LSPs at the middle of the frame */
- Word16 stab_fac, /* i : LP filter stability */
+ Word16 stab_fac, /* i : LP filter stability Q15*/
Word32 *res_cod_SNR_M,
Word16 *res_cod_SNR_M_e,
- const Word16 flag_16k_smc /* i : flag to compute parameters with 16kHz core */
+ const Word16 flag_16k_smc /* i : flag to compute parameters with 16kHz core Q0*/
)
{
TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc;
@@ -774,6 +774,8 @@ Word16 ivas_acelp_tcx20_switching_fx(
Word32 tcx_snr;
Flag Overflow;
Word32 gain, noise;
+ Word16 noise_e = 0;
+ move16();
Word32 *pt_ener_sfr, ener_sfr[NB_SUBFR16k];
/* Initialization */
@@ -802,7 +804,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
L_frame_tmp = L_frame;
move16();
- x_fx = hTcxEnc->spectrum_long_fx;
+ x_fx = hTcxEnc->spectrum_long_fx; /* Q15 */
move32();
e_x = 31 - 15;
move16();
@@ -811,16 +813,16 @@ Word16 ivas_acelp_tcx20_switching_fx(
/* Check minimum pitch for quantization */
FOR( i = 0; i < 4; i++ )
{
- pitch_fr_local[i] = pitch_fr[i];
+ pitch_fr_local[i] = pitch_fr[i]; /* Q6 */
move16();
- voicing_fr_local[i] = voicing_fr[i];
+ voicing_fr_local[i] = voicing_fr[i]; /* Q15 */
move16();
}
E_LPC_f_lsp_a_conversion( lsp_mid, A_q_tcx_fx, M );
Q_A_q_tcx = sub( 14, norm_s( A_q_tcx_fx[0] ) );
scale_A = sub( Q12, Q_A_q_tcx );
- Copy_Scale_sig( A_q_tcx_fx, A_q_tcx_fx, M + 1, scale_A );
+ Copy_Scale_sig( A_q_tcx_fx, A_q_tcx_fx, M + 1, scale_A ); /* Q12 */
/*--------------------------------------------------------------*
* Estimate TCX SNR
@@ -829,7 +831,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
target = L_add( 0x11A5D28, 0 ); /* 0x11A5D28 -> 850.f * log2(10)/10 (Q16) */
IF( flag_16k_smc )
{
- tcx_offset = st->hTcxCfg->tcx_offset;
+ tcx_offset = st->hTcxCfg->tcx_offset; /* Q0 */
move16();
IF( st->last_core == ACELP_CORE )
@@ -893,9 +895,9 @@ Word16 ivas_acelp_tcx20_switching_fx(
}
}
- Copy( inp_fx + sub( tcx_offset, shr( overlap, 1 ) ), xn_buf_fx, add( L_frame, overlap ) );
+ Copy( inp_fx + sub( tcx_offset, shr( overlap, 1 ) ), xn_buf_fx, add( L_frame, overlap ) ); /* q_inp */
- L_frame_4 = shr( L_frame, 2 );
+ L_frame_4 = shr( L_frame, 2 ); /* q0 */
IF( st->last_core == ACELP_CORE )
{
test();
@@ -909,21 +911,21 @@ Word16 ivas_acelp_tcx20_switching_fx(
{
FOR( i = 0; i < overlap; i++ )
{
- xn_buf_fx[i] = mult( xn_buf_fx[i], window_fx[i] );
+ xn_buf_fx[i] = mult( xn_buf_fx[i], window_fx[i] ); /* q_inp */
move16();
}
}
FOR( i = 0; i < overlap; i++ )
{
- xn_buf_fx[L_frame + i] = mult( xn_buf_fx[L_frame + i], window_fx[overlap - 1 - i] );
+ xn_buf_fx[L_frame + i] = mult( xn_buf_fx[L_frame + i], window_fx[overlap - 1 - i] ); /* q_inp */
move16();
}
e_x = sub( 16, q_inp ); /*exponent for xn_buf_fx*/
move16();
TCX_MDCT( xn_buf_fx, x_fx, &e_x, overlap, sub( L_frame, overlap ), overlap, st->element_mode );
scale_A = getScaleFactor32( x_fx, L_frame );
- Copy_Scale_sig32( x_fx, x_fx, L_frame, scale_A );
+ Copy_Scale_sig32( x_fx, x_fx, L_frame, scale_A ); /* Q31-e_x+scale_A */
e_x = sub( e_x, scale_A );
tmp16 = mult_r( shl( L_frame, 5 ), 29309 /*16*0.0559017 Q15*/ ); /* L_frame / sqrt(2*NORM_MDCT_FACTOR); Q9 */
@@ -944,7 +946,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
{
com_gainlpc_e = s_max( com_gainlpc_e, gainlpc_e[i] );
}
- Copy_Scale_sig32( x_fx, x_fx, L_frame, -com_gainlpc_e );
+ Copy_Scale_sig32( x_fx, x_fx, L_frame, -com_gainlpc_e ); /* Q31-e_x-com_gainlpc_e */
e_x = add( e_x, com_gainlpc_e );
mdct_shaping( x_fx, L_frame, gainlpc_fx, gainlpc_e );
@@ -975,17 +977,17 @@ Word16 ivas_acelp_tcx20_switching_fx(
/* calc quadruple energy */
ener = L_deposit_l( 1 );
- tmp16 = extract_h( L_shl( x_fx[0], s ) );
- ener = L_mac( ener, tmp16, tmp16 );
+ tmp16 = extract_h( L_shl( x_fx[0], s ) ); /* Q15-e_x+s */
+ ener = L_mac( ener, tmp16, tmp16 ); /* 2*(Q15-e_x+s)+1 */
- tmp16 = extract_h( L_shl( x_fx[1], s ) );
- ener = L_mac( ener, tmp16, tmp16 );
+ tmp16 = extract_h( L_shl( x_fx[1], s ) ); /* Q15-e_x+s */
+ ener = L_mac( ener, tmp16, tmp16 ); /* 2*(Q15-e_x+s)+1 */
- tmp16 = extract_h( L_shl( x_fx[2], s ) );
- ener = L_mac( ener, tmp16, tmp16 );
+ tmp16 = extract_h( L_shl( x_fx[2], s ) ); /* Q15-e_x+s */
+ ener = L_mac( ener, tmp16, tmp16 ); /* 2*(Q15-e_x+s)+1 */
- tmp16 = extract_h( L_shl( x_fx[3], s ) );
- ener = L_mac( ener, tmp16, tmp16 );
+ tmp16 = extract_h( L_shl( x_fx[3], s ) ); /* Q15-e_x+s */
+ ener = L_mac( ener, tmp16, tmp16 ); /* 2*(Q15-e_x+s)+1 */
s = shl( sub( e_x, s ), 1 );
@@ -1001,7 +1003,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
FOR( iter = 0; iter < 10; iter++ )
{
- fac = L_shr( fac, 1 );
+ fac = L_shr( fac, 1 ); /* q0 */
offset = L_sub( offset, fac );
ener = L_deposit_l( 0 );
@@ -1009,33 +1011,33 @@ Word16 ivas_acelp_tcx20_switching_fx(
{
tmp32 = L_sub( en[i], offset );
- IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
+ if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
{
ener = L_add( ener, tmp32 );
}
tmp32 = L_sub( en[i + 1], offset );
- IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
+ if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
{
ener = L_add( ener, tmp32 );
}
tmp32 = L_sub( en[i + 2], offset );
- IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
+ if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
{
ener = L_add( ener, tmp32 );
}
tmp32 = L_sub( en[i + 3], offset );
- IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
+ if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 3.f * log2(10)/10 */
{
ener = L_add( ener, tmp32 );
}
- IF( GT_32( ener, target ) )
+ if ( GT_32( ener, target ) )
{
offset = L_add( offset, fac );
BREAK;
@@ -1089,7 +1091,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
Word16 temp_e, e_num, e_den, temp_ene_e;
temp_ene_e = ener_e;
move16();
- tmp32 = Sqrt32( ener, &temp_ene_e );
+ tmp32 = Sqrt32( ener, &temp_ene_e ); /* Q31-temp_ene_e */
/*Approximate SNR of TCX*/
set32_fx( x_fx, tmp32, L_frame ); /* ener_e */
mdct_noiseShaping_ivas_fx( x_fx, &temp_ene_e, L_frame, gainlpc_noinv, gainlpc_noinv_e );
@@ -1116,10 +1118,10 @@ Word16 ivas_acelp_tcx20_switching_fx(
FOR( i = bands[iter]; i < bands[iter + 1]; i++ )
{
- nrg_s = BASOP_Util_Add_Mant32Exp( nrg_s, e_num, Mpy_32_32( y_fx[i], y_fx[i] ), shl( e_x, 1 ), &e_num );
- nrg_n = BASOP_Util_Add_Mant32Exp( nrg_n, e_den, Mpy_32_32( x_fx[i], x_fx[i] ), shl( temp_ene_e, 1 ), &e_den );
+ nrg_s = BASOP_Util_Add_Mant32Exp( nrg_s, e_num, Mpy_32_32( y_fx[i], y_fx[i] ), shl( e_x, 1 ), &e_num ); /* Q31-e_num */
+ nrg_n = BASOP_Util_Add_Mant32Exp( nrg_n, e_den, Mpy_32_32( x_fx[i], x_fx[i] ), shl( temp_ene_e, 1 ), &e_den ); /* Q31-e_den */
}
- res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_cadence( nrg_s, nrg_n, &temp_e );
+ res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_cadence( nrg_s, nrg_n, &temp_e ); /* Q31-res_cod_SNR_M_e[iter] */
move32();
res_cod_SNR_M_e[iter] = add( temp_e, sub( e_num, e_den ) );
move16();
@@ -1129,7 +1131,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
pt_ener_sfr = ener_sfr;
tcx_snr = L_deposit_l( 0 );
- L_loop = L_frame;
+ L_loop = L_frame; /* Q0 */
move16();
if ( flag_16k_smc )
{
@@ -1138,16 +1140,16 @@ Word16 ivas_acelp_tcx20_switching_fx(
}
Word16 temp32_e = 0;
move16();
- Word32 temp_energy = L_add( BASOP_Util_Log2( ener ), L_shl( L_deposit_l( ener_e ), 25 ) );
- temp_energy = L_add( temp_energy, 201326592 /* 6 in Q25*/ );
- temp_energy = L_shr( temp_energy, 9 ); /*temp_energy is log(( ener * L_SUBFR ))*/
+ Word32 temp_energy = L_add( BASOP_Util_Log2( ener ), L_shl( L_deposit_l( ener_e ), 25 ) ); /* Q25 */
+ temp_energy = L_add( temp_energy, 201326592 /* 6 in Q25*/ ); /* Q25 */
+ temp_energy = L_shr( temp_energy, 9 ); /*temp_energy is log(( ener * L_SUBFR ))*/
FOR( i = 0; i < L_loop; i += L_SUBFR )
{
tmp32 = L_deposit_l( 0 );
FOR( j = 0; j < L_SUBFR; j++ )
{
- tmp32 = BASOP_Util_Add_Mant32Exp( tmp32, temp32_e, L_mult0( wsp[i + j], wsp[i + j] ), sub( 31, add( q_inp, q_inp ) ), &temp32_e );
+ tmp32 = BASOP_Util_Add_Mant32Exp( tmp32, temp32_e, L_mult0( wsp[i + j], wsp[i + j] ), sub( 31, add( q_inp, q_inp ) ), &temp32_e ); /* Q31-temp32_e */
}
IF( tmp32 == 0 )
{
@@ -1162,17 +1164,17 @@ Word16 ivas_acelp_tcx20_switching_fx(
}
ELSE
{
- tmp32 = L_add( BASOP_Util_Log2( tmp32 ), L_shl( L_deposit_l( temp32_e ), 25 ) );
- *pt_ener_sfr = tmp32;
+ tmp32 = L_add( BASOP_Util_Log2( tmp32 ), L_shl( L_deposit_l( temp32_e ), 25 ) ); /* Q25 */
+ *pt_ener_sfr = tmp32; /* Q25 */
move32();
tmp32 = L_shr( tmp32, 9 ); /* 15Q16 */
}
tcx_snr = L_sub( L_add( tcx_snr, tmp32 ), temp_energy ); /*15Q16*/
pt_ener_sfr++;
}
- tmp16 = BASOP_Util_Divide1616_Scale( L_SUBFR, L_loop, &temp32_e );
- tmp16 = shl( tmp16, temp32_e );
- tcx_snr = Mpy_32_16_1( tcx_snr, tmp16 );
+ tmp16 = BASOP_Util_Divide1616_Scale( L_SUBFR, L_loop, &temp32_e ); /* Q15-temp32_e */
+ tmp16 = shl( tmp16, temp32_e ); /* Q15 */
+ tcx_snr = Mpy_32_16_1( tcx_snr, tmp16 ); /* Q16 */
tcx_snr = L_shl( Mpy_32_16_1( tcx_snr, 0x6054 /* 0x6054 -> 10/log2(10) (2Q13) */ ), 2 ); /* Q16*/
/*--------------------------------------------------------------*
@@ -1216,15 +1218,18 @@ Word16 ivas_acelp_tcx20_switching_fx(
T0 = shr( add( pitch_fr_local[i2], ( 1 << 5 ) ), 6 );
}
- gain = get_gain2( wsp + i, wsp + sub( i, T0 ), L_SUBFR );
+ gain = get_gain2( wsp + i, wsp + sub( i, T0 ), L_SUBFR ); /*Q16*/
noise = L_deposit_l( 1 );
-
+ noise_e = 0;
+ move16();
FOR( j = 0; j < L_SUBFR; j++ )
{
- tmp16 = round_fx_o( L_shl_o( Mpy_32_16_r( gain, wsp[i + j - T0] ), 15, &Overflow ), &Overflow ); // q_in
- tmp16 = sub_o( wsp[i + j], tmp16, &Overflow ); // q_in
- noise = L_mac0_o( noise, tmp16, tmp16, &Overflow ); // 2*q_in//
+ tmp32 = Mpy_32_16_1( gain, wsp[i + j - T0] ); // Q16 + q_inp - 15
+ tmp32 = L_sub( wsp[i + j], L_shr( tmp32, 1 ) ); // q_inp
+ tmp16 = norm_l( tmp32 );
+ tmp32 = L_shl( tmp32, tmp16 ); // q_inp +tmp16
+ noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, Mpy_32_32( tmp32, tmp32 ), shl( sub( 31, add( q_inp, tmp16 ) ), 1 ), &noise_e ); // noise_e
}
test();
IF( noise == 0 || EQ_32( noise, 1 ) )
@@ -1243,7 +1248,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
ELSE
{
noise = Mpy_32_16_1( noise, scale );
- tmp32 = L_add( BASOP_Util_Log2( noise ), L_shl( sub( 31, add( q_inp, q_inp ) ), 25 ) ); // Q25
+ tmp32 = L_add( BASOP_Util_Log2( noise ), L_shl( noise_e, 25 ) ); // Q25
}
tmp32 = L_sub( *pt_ener_sfr, tmp32 ); // Q25
temp_energy = BASOP_Util_Add_Mant32Exp( tmp32, 6, temp_energy, ener_e, &ener_e );
@@ -1275,8 +1280,8 @@ Word16 ivas_acelp_tcx20_switching_fx(
test();
if ( ( GT_32( snr_acelp, tcx_snr ) ) &&
( LT_32( snr_acelp, L_add( tcx_snr, 131072 /*2.0f Q16*/ ) ) ) &&
- ( LT_16( add_o( st->prevTempFlatness_fx, currFlatness, &Overflow ), 416 /*3.25f Q7*/ ) || EQ_16( stab_fac, 0x7fff ) ||
- ( !flag_16k_smc && ( st->sp_aud_decision0 > 0 ) && LT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 2560 /*20.f Q7*/ ) ) ) &&
+ ( LT_32( L_add_o( st->prevTempFlatness_32fx, currFlatness, &Overflow ), 6815744 /*3.25f Q21*/ ) || EQ_16( stab_fac, 0x7fff ) ||
+ ( !flag_16k_smc && ( st->sp_aud_decision0 > 0 ) && LT_32( L_add_sat( st->prevTempFlatness_32fx, currFlatness ), 41943040 /*20.f Q21*/ ) ) ) &&
( LE_16( st->Nb_ACELP_frames, 6 ) ) )
{
dsnr = -131072 /*-2.0f Q16*/;
@@ -1288,7 +1293,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
test();
if ( ( LT_32( snr_acelp, tcx_snr ) ) &&
( GT_32( snr_acelp, L_sub( tcx_snr, 131072 /*2.0f Q16*/ ) ) ) &&
- ( GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 416 /*3.25f Q7*/ ) ) &&
+ ( GT_32( L_add_sat( st->prevTempFlatness_32fx, currFlatness ), 6815744 /*3.25f Q21*/ ) ) &&
( GE_16( st->Nb_ACELP_frames, 6 ) ) )
{
dsnr = 131072 /*2.0f Q16*/;
@@ -1334,7 +1339,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
/* Select ACELP or TCX */
test();
test();
- IF( GT_32( L_add( snr_acelp, dsnr ), tcx_snr ) && ( st->sp_aud_decision0 == 0 || GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 416 /*3.25f Q7*/ ) ) )
+ IF( GT_32( L_add( snr_acelp, dsnr ), tcx_snr ) && ( st->sp_aud_decision0 == 0 || GT_32( L_add_sat( st->prevTempFlatness_32fx, currFlatness ), 6815744 /*3.25f Q21*/ ) ) )
{
smc_dec_ol = 0;
move16();
@@ -1358,7 +1363,7 @@ Word16 ivas_acelp_tcx20_switching_fx(
}
#endif
- st->prevTempFlatness_fx = currFlatness;
+ st->prevTempFlatness_32fx = currFlatness;
move16();
return smc_dec_ol;
}
diff --git a/lib_enc/ivas_td_low_rate_enc_fx.c b/lib_enc/ivas_td_low_rate_enc_fx.c
index 2daa9ed5035a5747a51d0cdd486d20fa0a1d7527..c959ef758f7f2b8e07fc3e98e8e4e5a8fa1d5188 100644
--- a/lib_enc/ivas_td_low_rate_enc_fx.c
+++ b/lib_enc/ivas_td_low_rate_enc_fx.c
@@ -51,17 +51,17 @@
void tdm_low_rate_enc(
Encoder_State *st, /* i/o: State structure */
- const Word16 Aq[], /* i : 12k8 Lp coefficient */
- const Word16 *res, /* i : residual signal */
- Word16 *synth, /* i/o: core synthesis */
- Word16 *exc_fx, /* i/o: current non-enhanced excitation */
+ const Word16 Aq[], /* i : 12k8 Lp coefficient Q12*/
+ const Word16 *res, /* i : residual signal Q_new*/
+ Word16 *synth, /* i/o: core synthesis Q_new*/
+ Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/
Word16 *pitch_buf,
/* i/o: floating pitch values for each subframe */ // Q6
- Word16 *voice_factors, /* o : voicing factors */
- Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */
- const Word16 attack_flag, /* i : GSC attack flag */
- const Word16 *lsf_new, /* i : current frame ISF vector */
- Word16 *tmp_noise, /* o : long-term noise energy */
+ Word16 *voice_factors, /* o : voicing factors Q15*/
+ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_new*/
+ const Word16 attack_flag, /* i : GSC attack flag Q0*/
+ const Word16 *lsf_new, /* i : current frame ISF vector Qx2.56*/
+ Word16 *tmp_noise, /* o : long-term noise energy Q11*/
Word16 Q_new )
{
const Word16 *p_Aq;
@@ -88,7 +88,7 @@ void tdm_low_rate_enc(
hLPDmem->tilt_code = 0;
move16();
set16_fx( dct_epit_fx, 0, L_FRAME );
- set16_fx( pitch_buf, L_SUBFR_Q6, NB_SUBFR );
+ set16_fx( pitch_buf, L_SUBFR_Q6, NB_SUBFR ); /* Q6 */
last_pit_bin = L_FRAME / 2;
move16();
@@ -103,7 +103,7 @@ void tdm_low_rate_enc(
*--------------------------------------------------------------------------------------*/
/* Find the current total number of bits used */
- tmp_nb_bits_tot = st->hBstr->nb_bits_tot;
+ tmp_nb_bits_tot = st->hBstr->nb_bits_tot; /* Q0 */
move16();
if ( st->extl_brate > 0 )
@@ -152,17 +152,17 @@ void tdm_low_rate_enc(
* Synthesis
*--------------------------------------------------------------------------------------*/
- p_Aq = Aq;
+ p_Aq = Aq; /* Q12 */
FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR )
{
- E_UTIL_synthesis( 0, p_Aq, &exc_wo_nf_fx[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1, M );
+ E_UTIL_synthesis( 0, p_Aq, &exc_wo_nf_fx[i_subfr], &synth[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1, M ); /* Q_new */
p_Aq += ( M + 1 );
}
/*--------------------------------------------------------------------------------------*
* Updates
*--------------------------------------------------------------------------------------*/
- Copy( exc_wo_nf_fx, exc_fx, L_FRAME );
+ Copy( exc_wo_nf_fx, exc_fx, L_FRAME ); /* Q_new */
return;
}
@@ -250,9 +250,9 @@ void encod_gen_2sbfr(
coder_type = GENERIC;
move16();
- p_Aw = Aw;
- p_Aq = Aq;
- pt_pitch = pitch_buf;
+ p_Aw = Aw; /* e(norm_s(Aw[0]+1) */
+ p_Aq = Aq; /* e(norm_s(Aw[0]+1) */
+ pt_pitch = pitch_buf; /*Q6*/
/*------------------------------------------------------------------*
* ACELP subframe loop
@@ -314,7 +314,7 @@ void encod_gen_2sbfr(
lp_filt_exc_enc_ivas_fx( MODE1, coder_type, i_subfr, exc, h1, xn, y1, xn2, 2 * L_SUBFR, L_frame, g_corr, clip_gain, &gain_pit, &st->acelp_cfg.ltf_mode );
#endif
/* update long-term pitch gain for speech/music classifier */
- st->hSpMusClas->lowrate_pitchGain = add( mult( 29491, st->hSpMusClas->lowrate_pitchGain ), mult( 3277, gain_pit ) ); // Q14
+ st->hSpMusClas->lowrate_pitchGain = add( mult( 29491, st->hSpMusClas->lowrate_pitchGain ), mult( 3277 /*Q15*/, gain_pit ) ); // Q14
move16();
/*-----------------------------------------------------------------*
@@ -331,7 +331,7 @@ void encod_gen_2sbfr(
IF( st->Opt_SC_VBR )
{
- IF( EQ_16( st->hSC_VBR->last_ppp_mode, 1 ) )
+ if ( EQ_16( st->hSC_VBR->last_ppp_mode, 1 ) )
{
/* SC-VBR - all other st->clip_var values will be updated even in a PPP frame */
st->clip_var_fx[1] = gain_pit;
@@ -348,9 +348,9 @@ void encod_gen_2sbfr(
#ifndef FIX_1320_LOWRATE_ACELP
hLPDmem->tilt_code = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, Q_new, 2 * L_SUBFR, 0 );
#else
- Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/
- gcode16 = round_fx_sat( Lgcode ); /*Q0*/
- hLPDmem->tilt_code = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, Lgcode, &voice_fac, Q_new, 2 * L_SUBFR, 0 );
+ Lgcode = L_shl_sat( gain_code, Q_new ); /* scaled gain_code with Qnew -> Q16*/
+ gcode16 = round_fx_sat( Lgcode ); /*Q0*/
+ hLPDmem->tilt_code = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, Lgcode, &voice_fac, Q_new, 2 * L_SUBFR, 0 ); /* Q15 */
#endif
move16();
@@ -361,8 +361,8 @@ void encod_gen_2sbfr(
#ifndef FIX_1320_LOWRATE_ACELP
hLPDmem->mem_w0 = sub( sub( xn[2 * L_SUBFR - 1], mult_r( gain_pit, y1[2 * L_SUBFR - 1] ) ), mult_r( extract_h( gain_code ), y2[2 * L_SUBFR - 1] ) );
#else
- Ltmp = L_mult0( gcode16, y2[2 * L_SUBFR - 1] ); /*Q10*/
- Ltmp = L_shl( Ltmp, add( 5, shift ) ); /*Q15+shift*/
+ Ltmp = L_mult0( gcode16, y2[2 * L_SUBFR - 1] ); /*Q10*/
+ Ltmp = L_shl( Ltmp, add( 5, shift ) ); /*Q15+shift*/
Ltmp = L_negate( Ltmp );
Ltmp = L_mac( Ltmp, xn[2 * L_SUBFR - 1], 16384 /*Q14*/ ); /* Q_new-1+shift+14+1 */
Ltmp = L_msu( Ltmp, y1[2 * L_SUBFR - 1], gain_pit /*Q14*/ ); /* Q_new-1+shift+14+1 */
@@ -388,11 +388,11 @@ void encod_gen_2sbfr(
FOR( i = 0; i < 2 * L_SUBFR; i++ )
{
/* code in Q9, gain_pit in Q14 */
- exc2[i + i_subfr] = shl_sat( mult( gain_pit, exc[i + i_subfr] ), 1 );
- Ltmp = L_mult( gcode16, code[i] ); /* Q10 */
- Ltmp = L_shl_sat( Ltmp, 5 ); /* Q15 */
- Ltmp = L_mac_sat( Ltmp, exc[i + i_subfr], gain_pit ); /* Q15 */
- Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16*/
+ exc2[i + i_subfr] = shl_sat( mult( gain_pit, exc[i + i_subfr] ), 1 ); /* Q_new-1 */
+ Ltmp = L_mult( gcode16, code[i] ); /* Q10 */
+ Ltmp = L_shl_sat( Ltmp, 5 ); /* Q15 */
+ Ltmp = L_mac_sat( Ltmp, exc[i + i_subfr], gain_pit ); /* Q15 */
+ Ltmp = L_shl_sat( Ltmp, 1 ); /* saturation can occur here Q16*/
exc[i + i_subfr] = round_fx_sat( Ltmp );
move16();
move16();
@@ -404,7 +404,7 @@ void encod_gen_2sbfr(
prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag );
- voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR];
+ voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; /* Q15 */
move16();
/*-----------------------------------------------------------------*
@@ -428,8 +428,8 @@ void encod_gen_2sbfr(
/* SC-VBR */
IF( st->Opt_SC_VBR )
{
- st->hSC_VBR->prev_ppp_gain_pit_fx = gain_pit;
- st->hSC_VBR->prev_tilt_code_fx = hLPDmem->tilt_code;
+ st->hSC_VBR->prev_ppp_gain_pit_fx = gain_pit; /* Q14 */
+ st->hSC_VBR->prev_tilt_code_fx = hLPDmem->tilt_code; /* Q15 */
move16();
move16();
}
diff --git a/lib_enc/lead_indexing_fx.c b/lib_enc/lead_indexing_fx.c
index ff29330140ca4071d8d975ac14ce545a57050c97..70e0c4796ac2a53ea93ea8b1e7368999f4726e5c 100644
--- a/lib_enc/lead_indexing_fx.c
+++ b/lib_enc/lead_indexing_fx.c
@@ -22,8 +22,8 @@ static Word16 fcb_encode_pos_fx( const Word16 pos_vector[], const Word16 pulse_n
*-------------------------------------------------------------------*/
void re8_compute_base_index_fx(
const Word16 *x, /* i : Elemen of Q2, Q3 or Q4 */
- const Word16 ka, /* i : Identifier of the absolute leader related to x */
- UWord16 *I /* o : index */
+ const Word16 ka, /* i : Identifier of the absolute leader related to x Q0*/
+ UWord16 *I /* o : index Q0*/
)
{
Word16 i, j, k1, m;
@@ -35,9 +35,9 @@ void re8_compute_base_index_fx(
Word16 code_index;
UWord16 offset;
- a1 = vals_a[ka];
+ a1 = vals_a[ka]; /* Q0 */
move16();
- a2 = vals_q[ka];
+ a2 = vals_q[ka]; /* Q0 */
move16();
/* the sign process */
@@ -48,7 +48,7 @@ void re8_compute_base_index_fx(
move16();
code_index = 0;
move16();
- k1 = a2[0];
+ k1 = a2[0]; /* Q0 */
move16();
test();
@@ -59,15 +59,15 @@ void re8_compute_base_index_fx(
{
IF( x[i] != 0 )
{
- sign_8p = shl( sign_8p, 1 );
+ sign_8p = shl( sign_8p, 1 ); /* Q0 */
setor_8p_temp[m] = i;
move16();
- m = add( m, 1 );
+ m++;
}
- IF( x[i] < 0 )
+ if ( x[i] < 0 )
{
- sign_8p = add( sign_8p, 1 );
+ sign_8p = add( sign_8p, 1 ); /* Q0 */
}
}
@@ -78,33 +78,35 @@ void re8_compute_base_index_fx(
move16();
*I = extract_l( L_add( offset, (Word32) code_index ) );
+ move16();
}
ELSE
{
FOR( i = 0; i < 8; i++ )
{
- setor_8p[i] = abs_s( x[i] );
+ setor_8p[i] = abs_s( x[i] ); /* Q0 */
+ move16();
IF( x[i] != 0 )
{
- sign_8p = shl( sign_8p, 1 );
- m = add( m, 1 );
+ sign_8p = shl( sign_8p, 1 ); /* Q0 */
+ m++;
}
- IF( x[i] < 0 )
+ if ( x[i] < 0 )
{
- sign_8p = add( sign_8p, 1 );
+ sign_8p = add( sign_8p, 1 ); /* Q0 */
}
}
- IF( NE_16( k1, m ) )
+ if ( NE_16( k1, m ) )
{
- sign_8p = shr( sign_8p, 1 );
+ sign_8p = shr( sign_8p, 1 ); /* Q0 */
}
/* code level by level */
- code_level = sub( a2[1], 1 );
+ code_level = sub( a2[1], 1 ); /* Q0 */
code_area = 8;
move16();
@@ -119,15 +121,15 @@ void re8_compute_base_index_fx(
{
IF( NE_16( setor_8p[i], a1[j] ) )
{
- setor_8p_temp[m] = i;
+ setor_8p_temp[m] = i; /* Q0 */
move16();
- setor_8p[m] = setor_8p[i];
+ setor_8p[m] = setor_8p[i]; /* Q0 */
move16();
- m = add( m, 1 );
+ m++;
}
}
- code_index = extract_l( L_mult0( code_index, select_table22[m][code_area] ) );
- code_index = add( code_index, fcb_encode_pos_fx( setor_8p_temp, code_area, m ) );
+ code_index = extract_l( L_mult0( code_index, select_table22[m][code_area] ) ); /* Q0 */
+ code_index = add( code_index, fcb_encode_pos_fx( setor_8p_temp, code_area, m ) ); /* Q0 */
code_area = m;
move16();
}
@@ -136,18 +138,19 @@ void re8_compute_base_index_fx(
{
FOR( i = 0; i < code_area; i++ )
{
- IF( EQ_16( setor_8p[i], a1[1] ) )
+ if ( EQ_16( setor_8p[i], a1[1] ) )
{
- code_index = add( code_index, i );
+ code_index = add( code_index, i ); /* Q0 */
}
}
}
code_index = add( shl( code_index, k1 ), sign_8p );
- offset = Is[ka];
+ offset = Is[ka]; /* Q0 */
move16();
- *I = extract_l( L_add( offset, (Word32) code_index ) );
+ *I = extract_l( L_add( offset, (Word32) code_index ) ); /* Q0 */
+ move16();
}
}
@@ -156,10 +159,10 @@ void re8_compute_base_index_fx(
*
* Base function to compute base index for RE8
*-------------------------------------------------------------------*/
-static Word16 fcb_encode_pos_fx( /* o : Code index */
- const Word16 pos_vector[], /* i : Position vectort */
- const Word16 pulse_num, /* i : Pulse number */
- const Word16 pos_num /* i : Position number */
+static Word16 fcb_encode_pos_fx( /* o : Code index Q0*/
+ const Word16 pos_vector[], /* i : Position vectort Q0*/
+ const Word16 pulse_num, /* i : Pulse number Q0*/
+ const Word16 pos_num /* i : Position number Q0*/
)
{
Word16 i, j;
@@ -171,10 +174,10 @@ static Word16 fcb_encode_pos_fx( /* o : Code index
temp = sub( pulse_num, 1 );
- select_table23 = select_table22[pos_num];
+ select_table23 = select_table22[pos_num]; /* Q0 */
move16();
- code_index = sub( select_table23[pulse_num], select_table23[sub( pulse_num, pos_vector[0] )] );
+ code_index = sub( select_table23[pulse_num], select_table23[( pulse_num - pos_vector[0] )] ); /* Q0 */
j = 1;
move16();
@@ -184,12 +187,12 @@ static Word16 fcb_encode_pos_fx( /* o : Code index
{
temp1 = sub( pos_num, j );
- select_table23 = select_table22[temp1];
+ select_table23 = select_table22[temp1]; /* Q0 */
move16();
- code_index = add( code_index, sub( select_table23[sub( temp, pos_vector[i] )], select_table23[sub( pulse_num, pos_vector[j] )] ) );
+ code_index = add( code_index, sub( select_table23[( temp - pos_vector[i] )], select_table23[( pulse_num - pos_vector[j] )] ) ); /* Q0 */
- j = add( j, 1 );
+ j++;
}
return code_index;
diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c
index 9c15a329c4fe37f917ea2c2facf30f0601dbf6ac..e90381597122d500c067b177ed565f86b62572b0 100644
--- a/lib_enc/lib_enc.c
+++ b/lib_enc/lib_enc.c
@@ -157,6 +157,7 @@ ivas_error IVAS_ENC_Open(
st_ivas->mc_mode = MC_MODE_NONE;
st_ivas->ism_mode = ISM_MODE_NONE;
st_ivas->sba_analysis_order = 0;
+ move16();
return IVAS_ERR_OK;
}
@@ -223,6 +224,7 @@ ivas_error IVAS_ENC_Open_fx(
st_ivas->mc_mode = MC_MODE_NONE;
st_ivas->ism_mode = ISM_MODE_NONE;
st_ivas->sba_analysis_order = 0;
+ move16();
return IVAS_ERR_OK;
}
@@ -237,18 +239,19 @@ void IVAS_ENC_Close(
)
{
/* Free all memory */
- if ( phIvasEnc == NULL || *phIvasEnc == NULL )
+ test();
+ IF( phIvasEnc == NULL || *phIvasEnc == NULL )
{
return;
}
- if ( ( *phIvasEnc )->isConfigured )
+ IF( ( *phIvasEnc )->isConfigured )
{
ivas_destroy_enc_fx( ( *phIvasEnc )->st_ivas );
}
- else
+ ELSE
{
- if ( ( *phIvasEnc )->st_ivas->hEncoderConfig )
+ IF( ( *phIvasEnc )->st_ivas->hEncoderConfig )
{
free( ( *phIvasEnc )->st_ivas->hEncoderConfig );
( *phIvasEnc )->st_ivas->hEncoderConfig = NULL;
@@ -289,17 +292,20 @@ ivas_error IVAS_ENC_ConfigureForMono(
error = IVAS_ERR_OK;
- if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT;
hIvasEnc->st_ivas->hEncoderConfig->is_binaural = (Word16) is_binaural;
+ move16();
+ move16();
if ( downmixFromStereo )
{
hIvasEnc->st_ivas->hEncoderConfig->stereo_dmx_evs = 1;
+ move16();
}
hIvasEnc->maxBandwidthUser = max_bwidth_user;
@@ -334,7 +340,7 @@ ivas_error IVAS_ENC_ConfigureForStereo(
ivas_error error;
- if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -342,8 +348,11 @@ ivas_error IVAS_ENC_ConfigureForStereo(
st_ivas = hIvasEnc->st_ivas;
hEncoderConfig = st_ivas->hEncoderConfig;
hEncoderConfig->nchan_inp = 2;
+ move16();
hEncoderConfig->ivas_format = STEREO_FORMAT;
+ move16();
hEncoderConfig->is_binaural = (Word16) is_binaural;
+ move16();
#ifdef DEBUGGING
switch ( stereoMode )
@@ -412,7 +421,7 @@ ivas_error IVAS_ENC_ConfigureForMASAObjects(
return error;
}
- IF( GT_16( numObjects, MAX_NUM_OBJECTS ) )
+ IF( GT_32( numObjects, MAX_NUM_OBJECTS ) )
{
return IVAS_ERR_TOO_MANY_INPUTS;
}
@@ -469,22 +478,27 @@ ivas_error IVAS_ENC_ConfigureForObjects(
Encoder_Struct *st_ivas;
ivas_error error;
- if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
- if ( numObjects > MAX_NUM_OBJECTS )
+ IF( GT_32( numObjects, MAX_NUM_OBJECTS ) )
{
return IVAS_ERR_TOO_MANY_INPUTS;
}
st_ivas = hIvasEnc->st_ivas;
st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT;
+ move16();
st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE;
+ move16();
st_ivas->hEncoderConfig->nchan_inp = numObjects;
+ move16();
st_ivas->hEncoderConfig->nchan_ism = numObjects;
+ move16();
st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata;
+ move16();
hIvasEnc->extMetadataApi = ( ism_extended_metadata == 1 );
hIvasEnc->maxBandwidthUser = max_bwidth_user;
@@ -510,17 +524,19 @@ ivas_error IVAS_ENC_FeedObjectMetadata(
error = IVAS_ERR_OK;
- if ( !hIvasEnc->isConfigured )
+ IF( !hIvasEnc->isConfigured )
{
return IVAS_ERR_NOT_CONFIGURED;
}
- if ( hIvasEnc->st_ivas->hEncoderConfig->ivas_format != ISM_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_ISM_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != SBA_ISM_FORMAT )
+ test();
+ test();
+ IF( NE_16( hIvasEnc->st_ivas->hEncoderConfig->ivas_format, ISM_FORMAT ) && NE_16( hIvasEnc->st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) && NE_16( hIvasEnc->st_ivas->hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) )
{
return IVAS_ERR_METADATA_NOT_EXPECTED;
}
- if ( ismIndex > hIvasEnc->st_ivas->hEncoderConfig->nchan_inp )
+ IF( GT_32( ismIndex, hIvasEnc->st_ivas->hEncoderConfig->nchan_inp ) )
{
return IVAS_ERR_INVALID_INDEX;
}
@@ -531,7 +547,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata(
Word32 pitch_fx = float_to_fix( metadata.pitch, Q22 ); /* Q22 */
error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag );
- if ( error != IVAS_ERR_OK )
+ IF( error != IVAS_ERR_OK )
{
return error;
}
@@ -563,7 +579,7 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics(
ENCODER_CONFIG_HANDLE hEncoderConfig;
ivas_error error;
- if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -574,12 +590,17 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics(
hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */
hEncoderConfig->sba_planar = isPlanar;
hEncoderConfig->sba_order = order;
+ move16();
+ move16();
+ move16();
/* Input in ACN/SN3D in all cases (3D and planar): get number of channels */
hEncoderConfig->nchan_inp = ivas_sba_get_nchan_fx( hEncoderConfig->sba_order, 0 ); /*planar input arg. deliberately set to zero since input always in ACN/SN3D*/
+ move16();
hEncoderConfig->Opt_PCA_ON = (Word16) Opt_PCA_ON;
+ move16();
hIvasEnc->maxBandwidthUser = max_bwidth_user;
@@ -614,12 +635,17 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics_fx(
hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */
hEncoderConfig->sba_planar = isPlanar;
hEncoderConfig->sba_order = order;
+ move16();
+ move16();
+ move16();
/* Input in ACN/SN3D in all cases (3D and planar): get number of channels */
hEncoderConfig->nchan_inp = ivas_sba_get_nchan_fx( hEncoderConfig->sba_order, 0 ); /*planar input arg. deliberately set to zero since input always in ACN/SN3D*/
+ move16();
hEncoderConfig->Opt_PCA_ON = (Word16) Opt_PCA_ON;
+ move16();
hIvasEnc->maxBandwidthUser = max_bwidth_user;
@@ -790,7 +816,7 @@ ivas_error IVAS_ENC_ConfigureForMultichannel(
ENCODER_CONFIG_HANDLE hEncoderConfig;
ivas_error error;
- if ( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -798,31 +824,34 @@ ivas_error IVAS_ENC_ConfigureForMultichannel(
hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig;
hEncoderConfig->ivas_format = MC_FORMAT;
+ move16();
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; /*just for initialization*/
+ move16();
- switch ( mcLayout )
+ SWITCH( mcLayout )
{
case IVAS_ENC_MC_5_1:
hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1;
- break;
+ BREAK;
case IVAS_ENC_MC_7_1:
hEncoderConfig->mc_input_setup = MC_LS_SETUP_7_1;
- break;
+ BREAK;
case IVAS_ENC_MC_5_1_2:
hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1_2;
- break;
+ BREAK;
case IVAS_ENC_MC_5_1_4:
hEncoderConfig->mc_input_setup = MC_LS_SETUP_5_1_4;
- break;
+ BREAK;
case IVAS_ENC_MC_7_1_4:
hEncoderConfig->mc_input_setup = MC_LS_SETUP_7_1_4;
- break;
+ BREAK;
default:
return IVAS_ERR_INVALID_MC_LAYOUT;
- break;
+ BREAK;
}
hEncoderConfig->nchan_inp = ivas_mc_ls_setup_get_num_channels_fx( hEncoderConfig->mc_input_setup );
+ move16();
hIvasEnc->maxBandwidthUser = max_bwidth_user;
@@ -860,7 +889,7 @@ static ivas_error configureEncoder(
* Bandwidth limitation
*-----------------------------------------------------------------*/
- if ( ( error = setBandwidth_fx( hIvasEnc, initBandwidth ) ) != IVAS_ERR_OK )
+ IF( ( error = setBandwidth_fx( hIvasEnc, initBandwidth ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -869,32 +898,39 @@ static ivas_error configureEncoder(
* DTX/CNG
*-----------------------------------------------------------------*/
- if ( dtxConfig.enabled )
+ IF( dtxConfig.enabled )
{
hEncoderConfig->Opt_DTX_ON = 1;
+ move16();
- if ( dtxConfig.variable_SID_rate )
+ IF( dtxConfig.variable_SID_rate )
{
hEncoderConfig->var_SID_rate_flag = 1;
hEncoderConfig->interval_SID = 0;
+ move16();
+ move16();
}
- else
+ ELSE
{
hEncoderConfig->var_SID_rate_flag = 0;
+ move16();
- if ( dtxConfig.SID_interval >= 3 && dtxConfig.SID_interval <= 100 )
+ test();
+ IF( GE_16( dtxConfig.SID_interval, 3 ) && LE_16( dtxConfig.SID_interval, 100 ) )
{
hEncoderConfig->interval_SID = dtxConfig.SID_interval;
+ move16();
}
- else
+ ELSE
{
return IVAS_ERR_INVALID_DTX_UPDATE_RATE;
}
}
}
- else
+ ELSE
{
hEncoderConfig->Opt_DTX_ON = 0;
+ move16();
}
/*-----------------------------------------------------------------*
@@ -902,36 +938,42 @@ static ivas_error configureEncoder(
*-----------------------------------------------------------------*/
hEncoderConfig->ivas_total_brate = initBitrate;
+ move32();
/* SC-VBR at 5.90 kbps */
- if ( hEncoderConfig->ivas_total_brate == ACELP_5k90 )
+ IF( EQ_32( hEncoderConfig->ivas_total_brate, ACELP_5k90 ) )
{
hEncoderConfig->ivas_total_brate = ACELP_7k20;
hEncoderConfig->Opt_SC_VBR = 1;
hEncoderConfig->last_Opt_SC_VBR = hEncoderConfig->Opt_SC_VBR;
+ move32();
+ move16();
+ move16();
- if ( hEncoderConfig->max_bwidth != NB )
+ if ( ( hEncoderConfig->max_bwidth != NB ) )
{
hEncoderConfig->max_bwidth = WB;
+ move16();
}
}
/* check if the entered bitrate is supported */
- if ( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && hEncoderConfig->ivas_format != MONO_FORMAT ) /* IVAS */
+ test();
+ IF( NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) /* IVAS */
{
- if ( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) )
+ IF( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) )
{
- if ( hEncoderConfig->Opt_SC_VBR )
+ IF( hEncoderConfig->Opt_SC_VBR )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", ACELP_5k90 );
}
- else
+ ELSE
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", hEncoderConfig->ivas_total_brate );
}
}
- if ( hEncoderConfig->ivas_format == STEREO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) )
{
#ifdef DEBUGGING
if ( hIvasEnc->cmd_stereo )
@@ -942,57 +984,64 @@ static ivas_error configureEncoder(
hEncoderConfig->stereo_mode_cmdl = 1;
#endif
- if ( hEncoderConfig->ivas_total_brate >= MIN_BRATE_MDCT_STEREO )
+ if ( GE_32( hEncoderConfig->ivas_total_brate, MIN_BRATE_MDCT_STEREO ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
#ifdef DEBUGGING
hEncoderConfig->stereo_mode_cmdl = 0;
#endif
}
}
- if ( ( hEncoderConfig->element_mode_init == IVAS_CPE_TD || hEncoderConfig->element_mode_init == IVAS_CPE_DFT ) && hEncoderConfig->ivas_total_brate > IVAS_48k )
+ test();
+ test();
+ IF( ( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_TD ) || EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_DFT ) ) && GT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for TD/DFT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
- if ( hEncoderConfig->element_mode_init == IVAS_CPE_MDCT && hEncoderConfig->ivas_total_brate < IVAS_48k )
+ test();
+ IF( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_MDCT ) && LT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for MDCT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
- if ( hEncoderConfig->ivas_total_brate > IVAS_256k )
+ IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
}
- else if ( hEncoderConfig->ivas_format == ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) )
{
- if ( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK )
+ IF( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK )
{
return error;
}
}
- else if ( hEncoderConfig->ivas_format == SBA_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) )
{
/* nothing */
}
- else if ( hEncoderConfig->ivas_format == MASA_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_FORMAT ) )
{
/* adapt element_mode according to the bitrate */
- if ( hEncoderConfig->nchan_inp == 2 && hEncoderConfig->element_mode_init != IVAS_SCE )
+ test();
+ IF( EQ_16( hEncoderConfig->nchan_inp, 2 ) && NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) )
{
- if ( hEncoderConfig->ivas_total_brate >= IVAS_48k )
+ IF( GE_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
}
- else if ( hEncoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE )
+ ELSE IF( LT_32( hEncoderConfig->ivas_total_brate, MASA_STEREO_MIN_BITRATE ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_DFT;
+ move16();
}
}
}
- else if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) )
{
st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism );
move32();
@@ -1000,51 +1049,59 @@ static ivas_error configureEncoder(
cpe_brate = calculate_cpe_brate_MASA_ISM_fx( st_ivas->ism_mode, st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism );
/*adapt element_mode according to the bit-rate*/
- if ( hEncoderConfig->element_mode_init != IVAS_SCE )
+ IF( NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) )
{
- if ( cpe_brate >= IVAS_48k )
+ if ( GE_32( cpe_brate, IVAS_48k ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
}
}
}
- else if ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) )
{
st_ivas->ism_mode = ISM_MODE_NONE;
+ move16();
}
}
- else /* EVS mono */
+ ELSE /* EVS mono */
{
hEncoderConfig->ivas_format = MONO_FORMAT;
+ move16();
hEncoderConfig->element_mode_init = EVS_MONO;
+ move16();
- if ( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) )
+ IF( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate );
}
- if ( hEncoderConfig->stereo_dmx_evs == 1 )
+ IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) )
{
hEncoderConfig->nchan_inp = 2;
+ move16();
}
}
/*-----------------------------------------------------------------*
* Input sampling frequency
*-----------------------------------------------------------------*/
-
- if ( inputFs != 8000 && inputFs != 16000 && inputFs != 32000 && inputFs != 48000 )
+ test();
+ test();
+ test();
+ IF( NE_32( inputFs, 8000 ) && NE_32( inputFs, 16000 ) && NE_32( inputFs, 32000 ) && NE_32( inputFs, 48000 ) )
{
return IVAS_ERR_INVALID_SAMPLING_RATE;
}
hEncoderConfig->input_Fs = inputFs;
+ move32();
/*-----------------------------------------------------------------*
* Channel-aware mode
*-----------------------------------------------------------------*/
- if ( ( error = setChannelAwareConfig_fx( hIvasEnc, caConfig ) ) != IVAS_ERR_OK )
+ IF( ( error = setChannelAwareConfig_fx( hIvasEnc, caConfig ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -1054,25 +1111,31 @@ static ivas_error configureEncoder(
*-----------------------------------------------------------------*/
st_ivas->codec_mode = MODE1; /* Note: in IVAS, set MODE1 */
+ move16();
- if ( hEncoderConfig->ivas_format == MONO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
- if ( hEncoderConfig->Opt_AMR_WB )
+ IF( hEncoderConfig->Opt_AMR_WB )
{
st_ivas->codec_mode = MODE1;
+ move16();
}
- else
+ ELSE
{
st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate );
+ move16();
}
}
- if ( hEncoderConfig->ivas_total_brate == IVAS_13k2 && hEncoderConfig->Opt_RF_ON == 1 )
+ test();
+ IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_13k2 ) && EQ_16( hEncoderConfig->Opt_RF_ON, 1 ) )
{
st_ivas->codec_mode = MODE2;
+ move16();
}
st_ivas->last_codec_mode = st_ivas->codec_mode;
+ move16();
/*-----------------------------------------------------------------*
* Sanity checks
@@ -1080,21 +1143,31 @@ static ivas_error configureEncoder(
assert( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" );
- if ( ( hEncoderConfig->ivas_format != MONO_FORMAT || hEncoderConfig->stereo_dmx_evs ) && hEncoderConfig->input_Fs == 8000 )
+ test();
+ test();
+ IF( ( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) || hEncoderConfig->stereo_dmx_evs ) && EQ_32( hEncoderConfig->input_Fs, 8000 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." );
}
- if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT &&
- ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs_fx( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) ||
- hEncoderConfig->ivas_format == MC_FORMAT || hEncoderConfig->ivas_format == MASA_ISM_FORMAT || hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) )
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
+ IF( hEncoderConfig->Opt_DTX_ON && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) &&
+ ( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && GT_16( ivas_get_sba_num_TCs_fx( hEncoderConfig->ivas_total_brate, 1 ), 2 ) ) ||
+ EQ_16( hEncoderConfig->ivas_format, MC_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) )
{
return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." );
}
-
+ test();
+ test();
+ test();
#ifdef NONBE_FIX_708_OSBA_BR_SWITCHING_CRASH
- if ( hEncoderConfig->Opt_PCA_ON && !( ( hEncoderConfig->ivas_format == SBA_FORMAT || hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) && hEncoderConfig->ivas_total_brate == PCA_BRATE && hEncoderConfig->sba_order == SBA_FOA_ORDER ) )
+ IF( hEncoderConfig->Opt_PCA_ON && !( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) && EQ_32( hEncoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( hEncoderConfig->sba_order, SBA_FOA_ORDER ) ) )
#else
if ( hEncoderConfig->Opt_PCA_ON && !( hEncoderConfig->ivas_format == SBA_FORMAT && hEncoderConfig->ivas_total_brate == PCA_BRATE && hEncoderConfig->sba_order == SBA_FOA_ORDER ) )
#endif
@@ -1102,12 +1175,15 @@ static ivas_error configureEncoder(
return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." );
}
- if ( ( error = sanitizeBandwidth_fx( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = sanitizeBandwidth_fx( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
- if ( hEncoderConfig->is_binaural && !( ( hEncoderConfig->ivas_format == MONO_FORMAT && hEncoderConfig->stereo_dmx_evs ) || hEncoderConfig->ivas_format == STEREO_FORMAT ) )
+ test();
+ test();
+ test();
+ IF( hEncoderConfig->is_binaural && !( ( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && hEncoderConfig->stereo_dmx_evs ) || EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) )
{
return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" );
}
@@ -1116,22 +1192,24 @@ static ivas_error configureEncoder(
* Finalize initialization
*-----------------------------------------------------------------*/
- if ( ( error = ivas_init_encoder( st_ivas ) ) != IVAS_ERR_OK )
+ IF( ( error = ivas_init_encoder( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
}
- if ( hEncoderConfig->ivas_format == MONO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
hIvasEnc->hCoreCoder = st_ivas->hSCE[0]->hCoreCoder[0]; /* Note: this is needed for switching in EVS mono */
}
- else
+ ELSE
{
hIvasEnc->hCoreCoder = NULL;
}
hIvasEnc->Opt_RF_ON_loc = hEncoderConfig->Opt_RF_ON;
hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset;
+ move16();
+ move16();
hIvasEnc->isConfigured = true;
@@ -1171,19 +1249,24 @@ static ivas_error configureEncoder_fx(
IF( dtxConfig.enabled )
{
hEncoderConfig->Opt_DTX_ON = 1;
+ move16();
IF( dtxConfig.variable_SID_rate )
{
hEncoderConfig->var_SID_rate_flag = 1;
hEncoderConfig->interval_SID = 0;
+ move16();
+ move16();
}
ELSE
{
hEncoderConfig->var_SID_rate_flag = 0;
-
+ move16();
+ test();
IF( GE_16( dtxConfig.SID_interval, 3 ) && LE_16( dtxConfig.SID_interval, 100 ) )
{
hEncoderConfig->interval_SID = dtxConfig.SID_interval;
+ move16();
}
ELSE
{
@@ -1194,6 +1277,7 @@ static ivas_error configureEncoder_fx(
ELSE
{
hEncoderConfig->Opt_DTX_ON = 0;
+ move16();
}
/*-----------------------------------------------------------------*
@@ -1201,21 +1285,27 @@ static ivas_error configureEncoder_fx(
*-----------------------------------------------------------------*/
hEncoderConfig->ivas_total_brate = initBitrate;
+ move16();
/* SC-VBR at 5.90 kbps */
- IF( hEncoderConfig->ivas_total_brate == ACELP_5k90 )
+ IF( EQ_32( hEncoderConfig->ivas_total_brate, ACELP_5k90 ) )
{
hEncoderConfig->ivas_total_brate = ACELP_7k20;
hEncoderConfig->Opt_SC_VBR = 1;
hEncoderConfig->last_Opt_SC_VBR = hEncoderConfig->Opt_SC_VBR;
+ move32();
+ move16();
+ move16();
- IF( NE_16( hEncoderConfig->max_bwidth, NB ) )
+ IF( ( hEncoderConfig->max_bwidth != NB ) )
{
hEncoderConfig->max_bwidth = WB;
+ move16();
}
}
/* check if the entered bitrate is supported */
+ test();
IF( NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) /* IVAS */
{
IF( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) )
@@ -1230,26 +1320,32 @@ static ivas_error configureEncoder_fx(
}
}
- IF( hEncoderConfig->ivas_format == STEREO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) )
{
{
hEncoderConfig->element_mode_init = IVAS_CPE_DFT;
- IF( hEncoderConfig->ivas_total_brate >= MIN_BRATE_MDCT_STEREO )
+ move16();
+ IF( GE_32( hEncoderConfig->ivas_total_brate, MIN_BRATE_MDCT_STEREO ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
}
}
+ test();
+ test();
IF( ( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_TD ) || EQ_32( hEncoderConfig->element_mode_init, IVAS_CPE_DFT ) ) && GT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for TD/DFT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_MDCT ) && LT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for MDCT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
@@ -1269,15 +1365,18 @@ static ivas_error configureEncoder_fx(
ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_FORMAT ) )
{
/* adapt element_mode according to the bitrate */
+ test();
IF( EQ_16( hEncoderConfig->nchan_inp, 2 ) && NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) )
{
IF( GE_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
}
ELSE IF( LT_32( hEncoderConfig->ivas_total_brate, MASA_STEREO_MIN_BITRATE ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_DFT;
+ move16();
}
}
}
@@ -1293,6 +1392,7 @@ static ivas_error configureEncoder_fx(
IF( GE_32( cpe_brate, IVAS_48k ) )
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ move16();
}
}
}
@@ -1305,6 +1405,7 @@ static ivas_error configureEncoder_fx(
{
hEncoderConfig->ivas_format = MONO_FORMAT;
hEncoderConfig->element_mode_init = EVS_MONO;
+ move16();
IF( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) )
{
@@ -1314,19 +1415,23 @@ static ivas_error configureEncoder_fx(
IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) )
{
hEncoderConfig->nchan_inp = 2;
+ move16();
}
}
/*-----------------------------------------------------------------*
* Input sampling frequency
*-----------------------------------------------------------------*/
-
+ test();
+ test();
+ test();
IF( NE_32( inputFs, 8000 ) && NE_32( inputFs, 16000 ) && NE_32( inputFs, 32000 ) && NE_32( inputFs, 48000 ) )
{
return IVAS_ERR_INVALID_SAMPLING_RATE;
}
hEncoderConfig->input_Fs = inputFs;
+ move32();
/*-----------------------------------------------------------------*
* Channel-aware mode
@@ -1342,25 +1447,31 @@ static ivas_error configureEncoder_fx(
*-----------------------------------------------------------------*/
st_ivas->codec_mode = MODE1; /* Note: in IVAS, set MODE1 */
+ move16();
IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
IF( hEncoderConfig->Opt_AMR_WB )
{
st_ivas->codec_mode = MODE1;
+ move16();
}
ELSE
{
st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate );
+ move16();
}
}
- IF( hEncoderConfig->ivas_total_brate == IVAS_13k2 && hEncoderConfig->Opt_RF_ON == 1 )
+ test();
+ IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_13k2 ) && EQ_16( hEncoderConfig->Opt_RF_ON, 1 ) )
{
st_ivas->codec_mode = MODE2;
+ move16();
}
st_ivas->last_codec_mode = st_ivas->codec_mode;
+ move16();
/*-----------------------------------------------------------------*
* Sanity checks
@@ -1368,11 +1479,19 @@ static ivas_error configureEncoder_fx(
assert( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" );
+ test();
+ test();
IF( ( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) || hEncoderConfig->stereo_dmx_evs ) && EQ_32( hEncoderConfig->input_Fs, 8000 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." );
}
+ test();
+ test();
+ test();
+ test();
+ test();
+ test();
IF( hEncoderConfig->Opt_DTX_ON && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) &&
( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && GT_32( ivas_get_sba_num_TCs_fx( hEncoderConfig->ivas_total_brate, 1 ), 2 ) ) ||
EQ_16( hEncoderConfig->ivas_format, MC_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) )
@@ -1380,7 +1499,9 @@ static ivas_error configureEncoder_fx(
return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." );
}
-
+ test();
+ test();
+ test();
IF( hEncoderConfig->Opt_PCA_ON && !( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && EQ_32( hEncoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( hEncoderConfig->sba_order, SBA_FOA_ORDER ) ) )
{
return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." );
@@ -1391,6 +1512,9 @@ static ivas_error configureEncoder_fx(
return error;
}
+ test();
+ test();
+ test();
IF( hEncoderConfig->is_binaural && !( ( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && hEncoderConfig->stereo_dmx_evs ) || EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) )
{
return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" );
@@ -1416,6 +1540,8 @@ static ivas_error configureEncoder_fx(
hIvasEnc->Opt_RF_ON_loc = hEncoderConfig->Opt_RF_ON;
hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset;
+ move16();
+ move16();
hIvasEnc->isConfigured = true;
@@ -1429,7 +1555,7 @@ static ivas_error configureEncoder_fx(
ivas_error IVAS_ENC_GetDelay(
const IVAS_ENC_HANDLE hIvasEnc, /* i : IVAS encoder handle */
- Word16 *delay /* o : encoder delay */
+ Word16 *delay /* o : encoder delay Q0*/
)
{
ENCODER_CONFIG_HANDLE hEncoderConfig;
@@ -1450,11 +1576,11 @@ ivas_error IVAS_ENC_GetDelay(
*delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL, IVAS_AUDIO_CONFIG_INVALID ) );
move16();
#else
- *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) );
+ *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) ); /*Q0*/
move16();
#endif
- *delay = imult1616( *delay, hEncoderConfig->nchan_inp );
+ *delay = imult1616( *delay, hEncoderConfig->nchan_inp ); /*Q0*/
move16();
return IVAS_ERR_OK;
@@ -1483,17 +1609,19 @@ ivas_error IVAS_ENC_GetNumInChannels(
Word16 *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */
)
{
- if ( hIvasEnc == NULL || numInChannels == NULL )
+ test();
+ IF( hIvasEnc == NULL || numInChannels == NULL )
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
- if ( !hIvasEnc->isConfigured )
+ IF( !hIvasEnc->isConfigured )
{
return IVAS_ERR_NOT_CONFIGURED;
}
*numInChannels = hIvasEnc->st_ivas->hEncoderConfig->nchan_inp;
+ move16();
return IVAS_ERR_OK;
}
@@ -1533,10 +1661,10 @@ ivas_error IVAS_ENC_GetInputBufferSize(
*---------------------------------------------------------------------*/
ivas_error IVAS_ENC_EncodeFrameToSerial(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- Word16 *inputBuffer, /* i : PCM input, Q0 */
- Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */
- UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */
- UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */
+ Word16 *inputBuffer, /* i : PCM input, Q0 Q0*/
+ Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() Q0*/
+ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME Q0*/
+ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value Q0*/
)
{
Encoder_Struct *st_ivas;
@@ -1773,7 +1901,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
}
/* write indices into bitstream buffer */
- IF( EQ_16( hEncoderConfig->element_mode_init, EVS_MONO ) )
+ IF( hEncoderConfig->element_mode_init == EVS_MONO )
{
test();
IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && ( hCoreCoder->element_mode == EVS_MONO ) )
@@ -1811,7 +1939,7 @@ ivas_error IVAS_ENC_SetBandwidth(
ivas_error error;
/* Do additional checks for user-facing function */
- if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -1835,7 +1963,7 @@ ivas_error IVAS_ENC_SetBitrate(
ivas_error error;
/* Do additional checks for user-facing function */
- if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -1860,7 +1988,7 @@ ivas_error IVAS_ENC_SetChannelAwareConfig(
ivas_error error;
/* Do additional checks for user-facing function */
- if ( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
+ IF( ( error = doCommonSetterChecks( hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -1961,6 +2089,7 @@ IVAS_ENC_DTX_CONFIG IVAS_ENC_GetDefaultDtxConfig( void )
IVAS_ENC_DTX_CONFIG defaultDtxConfig;
defaultDtxConfig.enabled = false;
defaultDtxConfig.SID_interval = 0;
+ move16();
defaultDtxConfig.variable_SID_rate = false;
return defaultDtxConfig;
@@ -2027,11 +2156,11 @@ static ivas_error printConfigInfo_enc(
* Print bitrate
*-----------------------------------------------------------------*/
- if ( st_ivas->hEncoderConfig->Opt_SC_VBR )
+ IF( st_ivas->hEncoderConfig->Opt_SC_VBR )
{
fprintf( stdout, "Average bitrate: %.2f kbps\n", (float) ACELP_5k90 / 1000 );
}
- else
+ ELSE
{
fprintf( stdout, "Bitrate: %.2f kbps\n", (float) hEncoderConfig->ivas_total_brate / 1000 );
}
@@ -2040,18 +2169,18 @@ static ivas_error printConfigInfo_enc(
* Print IVAS format
*-----------------------------------------------------------------*/
- if ( hEncoderConfig->ivas_format == MONO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
- if ( hEncoderConfig->stereo_dmx_evs )
+ IF( hEncoderConfig->stereo_dmx_evs )
{
fprintf( stdout, "IVAS format: stereo downmix to bit-exact EVS mono\n" );
}
- else
+ ELSE
{
fprintf( stdout, "IVAS format: bit-exact EVS mono\n" );
}
}
- else if ( hEncoderConfig->ivas_format == STEREO_FORMAT )
+ ELSE IF( hEncoderConfig->ivas_format == STEREO_FORMAT )
{
#ifdef DEBUGGING
if ( hEncoderConfig->stereo_mode_cmdl == 1 )
@@ -2081,64 +2210,65 @@ static ivas_error printConfigInfo_enc(
}
#endif
}
- else if ( hEncoderConfig->ivas_format == ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) )
{
- if ( hEncoderConfig->ivas_total_brate <= ACELP_32k && hEncoderConfig->nchan_inp > 2 )
+ test();
+ IF( LE_32( hEncoderConfig->ivas_total_brate, ACELP_32k ) && GT_16( hEncoderConfig->nchan_inp, 2 ) )
{
fprintf( stdout, "IVAS format: Param-ISM (%i streams)\n", hEncoderConfig->nchan_inp );
}
- else
+ ELSE
{
fprintf( stdout, "IVAS format: ISM (%i streams)\n", hEncoderConfig->nchan_inp );
}
}
- else if ( hEncoderConfig->ivas_format == SBA_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) )
{
fprintf( stdout, "IVAS format: Scene Based Audio, Ambisonic order %i %s ", hEncoderConfig->sba_order, hEncoderConfig->sba_planar ? "(Planar)" : "" );
- if ( hEncoderConfig->Opt_PCA_ON )
+ IF( hEncoderConfig->Opt_PCA_ON )
{
fprintf( stdout, "- PCA configured with signal adaptive decision " );
}
fprintf( stdout, "\n" );
}
- else if ( hEncoderConfig->ivas_format == MASA_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_FORMAT ) )
{
fprintf( stdout, "IVAS format: MASA format\n" );
}
- else if ( hEncoderConfig->ivas_format == MC_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, MC_FORMAT ) )
{
- if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1 )
+ IF( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1 )
{
fprintf( stdout, "IVAS mode: Multi-Channel 5.1 \n" );
}
- else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1 )
+ ELSE IF( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1 )
{
fprintf( stdout, "IVAS mode: Multi-Channel 7.1 \n" );
}
- else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_2 )
+ ELSE IF( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_2 )
{
fprintf( stdout, "IVAS mode: Multi-Channel 5.1+2 \n" );
}
- else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_4 )
+ ELSE IF( hEncoderConfig->mc_input_setup == MC_LS_SETUP_5_1_4 )
{
fprintf( stdout, "IVAS mode: Multi-Channel 5.1+4\n" );
}
- else if ( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1_4 )
+ ELSE IF( hEncoderConfig->mc_input_setup == MC_LS_SETUP_7_1_4 )
{
fprintf( stdout, "IVAS mode: Multi-Channel 7.1+4\n" );
}
}
- else if ( hEncoderConfig->ivas_format == SBA_ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) )
{
fprintf( stdout, "IVAS format: combined ISM and SBA (%i ISM stream(s))\n", hEncoderConfig->nchan_ism );
}
- else if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT )
+ ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) )
{
fprintf( stdout, "IVAS format: combined ISM and MASA (%i ISM stream(s))\n", hEncoderConfig->nchan_ism );
}
- if ( hEncoderConfig->is_binaural )
+ IF( hEncoderConfig->is_binaural )
{
fprintf( stdout, "Optional indication: binaural audio\n" );
}
@@ -2147,13 +2277,13 @@ static ivas_error printConfigInfo_enc(
* Print CNG update interval, if DTX is activated
*-----------------------------------------------------------------*/
- if ( hEncoderConfig->Opt_DTX_ON )
+ IF( hEncoderConfig->Opt_DTX_ON )
{
- if ( hEncoderConfig->var_SID_rate_flag )
+ IF( hEncoderConfig->var_SID_rate_flag )
{
fprintf( stdout, "DTX: ON, variable CNG update interval\n" );
}
- else
+ ELSE
{
fprintf( stdout, "DTX: ON, CNG update interval = %d frames\n", hEncoderConfig->interval_SID );
}
@@ -2163,54 +2293,57 @@ static ivas_error printConfigInfo_enc(
* Print potential limitation of audio bandwidth
*-----------------------------------------------------------------*/
- if ( ( error = bandwidthApiToInternal( hIvasEnc->newBandwidthApi, &newBandwidthApi ) ) != IVAS_ERR_OK )
+ IF( ( error = bandwidthApiToInternal( hIvasEnc->newBandwidthApi, &newBandwidthApi ) ) != IVAS_ERR_OK )
{
return error;
}
- if ( st_ivas->hEncoderConfig->Opt_SC_VBR && !hEncoderConfig->Opt_DTX_ON )
+ test();
+ IF( st_ivas->hEncoderConfig->Opt_SC_VBR && !hEncoderConfig->Opt_DTX_ON )
{
return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "\nError: SC-VBR 5900 bps not supported without DTX\n\n" );
}
- if ( hEncoderConfig->ivas_format == MONO_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
- if ( newBandwidthApi != hEncoderConfig->max_bwidth )
+ IF( NE_16( newBandwidthApi, hEncoderConfig->max_bwidth ) )
{
- if ( newBandwidthApi == FB )
+ IF( EQ_16( newBandwidthApi, FB ) )
{
fprintf( stdout, "\nFB coding not supported below %.2f kbps. ", ACELP_16k40 / 1000.f );
- if ( hEncoderConfig->max_bwidth == WB )
+ IF( EQ_16( hEncoderConfig->max_bwidth, WB ) )
{
fprintf( stdout, "Switching to WB.\n" );
}
- else
+ ELSE
{
fprintf( stdout, "Switching to SWB.\n" );
}
}
- else if ( newBandwidthApi == SWB )
+ ELSE IF( EQ_16( newBandwidthApi, SWB ) )
{
fprintf( stdout, "\nSWB coding not supported below %.2f kbps. Switching to WB.\n", ACELP_9k60 / 1000.f );
}
}
/* in case of 8kHz input sampling or "-max_band NB", require the total bitrate to be below 24.40 kbps */
- if ( ( newBandwidthApi == NB || hEncoderConfig->input_Fs == 8000 ) && hEncoderConfig->ivas_total_brate > ACELP_24k40 )
+ test();
+ test();
+ IF( ( ( newBandwidthApi == NB ) || EQ_32( hEncoderConfig->input_Fs, 8000 ) ) && GT_32( hEncoderConfig->ivas_total_brate, ACELP_24k40 ) )
{
fprintf( stdout, "\nError: Unsupported mode NB %d bps, NB mode supports rates 5900-24400 bps\n\n", hEncoderConfig->ivas_total_brate );
return IVAS_ERR_INVALID_BITRATE;
}
}
- else
+ ELSE
{
- if ( newBandwidthApi != hEncoderConfig->max_bwidth )
+ IF( NE_16( newBandwidthApi, hEncoderConfig->max_bwidth ) )
{
- if ( hEncoderConfig->ivas_format == ISM_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) )
{
fprintf( stdout, "\nFB coding not supported below %.2f kbps for %i objects. Switching to SWB.\n", hEncoderConfig->nchan_ism * MIN_BRATE_FB_ISM / 1000.f, hEncoderConfig->nchan_ism );
}
- else
+ ELSE
{
fprintf( stdout, "\nFB coding not supported below %.2f kbps. Switching to SWB.\n", MIN_BRATE_FB_STEREO / 1000.f );
}
@@ -2221,9 +2354,9 @@ static ivas_error printConfigInfo_enc(
* Print Channel-aware limitation
*-----------------------------------------------------------------*/
- if ( channelAwareModeEnabled )
+ IF( channelAwareModeEnabled )
{
- if ( hEncoderConfig->Opt_RF_ON == 0 )
+ IF( hEncoderConfig->Opt_RF_ON == 0 )
{
fprintf( stdout, "\nChannel-aware mode is supported at 13.2 kbps 32/48 kHz only. Switching to normal mode.\n" );
}
@@ -2252,65 +2385,76 @@ static ivas_error setBitrate(
hEncoderConfig->ivas_total_brate = totalBitrate;
hIvasEnc->switchingActive = true;
+ move32();
/* channel-aware mode is supported only at 13.20 kbps */
- if ( hEncoderConfig->Opt_RF_ON && hEncoderConfig->ivas_total_brate != ACELP_13k20 )
+ test();
+ IF( hEncoderConfig->Opt_RF_ON && NE_32( hEncoderConfig->ivas_total_brate, ACELP_13k20 ) )
{
assert( 0 && "\nChannel-aware mode is supported only at 13.20 kbps\n" );
hEncoderConfig->Opt_RF_ON = 0;
+ move16();
}
- if ( hEncoderConfig->ivas_total_brate == ACELP_5k90 )
+ IF( EQ_32( hEncoderConfig->ivas_total_brate, ACELP_5k90 ) )
{
st_ivas->hEncoderConfig->Opt_SC_VBR = 1;
hEncoderConfig->ivas_total_brate = ACELP_7k20;
+ move16();
+ move32();
}
- else
+ ELSE
{
st_ivas->hEncoderConfig->Opt_SC_VBR = 0;
+ move16();
}
/* check if the entered bitrate is supported */
- if ( hEncoderConfig->element_mode_init > EVS_MONO )
+ IF( hEncoderConfig->element_mode_init > EVS_MONO )
{
- if ( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) )
+ IF( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
}
- else
+ ELSE
{
- if ( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) )
+ IF( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate );
}
/* in case of 8kHz signal, limit the total bitrate to 24.40 kbps */
- if ( hEncoderConfig->input_Fs == 8000 && hEncoderConfig->ivas_total_brate > ACELP_24k40 )
+ test();
+ IF( EQ_32( hEncoderConfig->input_Fs, 8000 ) && GT_32( hEncoderConfig->ivas_total_brate, ACELP_24k40 ) )
{
hEncoderConfig->ivas_total_brate = ACELP_24k40;
+ move32();
}
}
- if ( hEncoderConfig->ivas_format == ISM_FORMAT )
+ IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) )
{
- if ( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK )
+ IF( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK )
{
return error;
}
}
st_ivas->codec_mode = MODE1;
+ move16();
- if ( hEncoderConfig->element_mode_init == EVS_MONO )
+ IF( hEncoderConfig->element_mode_init == EVS_MONO )
{
- if ( hEncoderConfig->Opt_AMR_WB )
+ IF( hEncoderConfig->Opt_AMR_WB )
{
st_ivas->codec_mode = MODE1;
+ move16();
}
- else
+ ELSE
{
st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate );
+ move16();
}
}
@@ -2337,16 +2481,22 @@ static ivas_error setChannelAwareConfig_fx(
hEncoderConfig = st_ivas->hEncoderConfig;
/* channel-aware mode is supported only at 13.20 kbps and with WB or SWB bandwidth */
+ test();
+ test();
+ test();
IF( ( caConfig.channelAwareModeEnabled && NE_32( st_ivas->hEncoderConfig->ivas_total_brate, ACELP_13k20 ) ) || ( hEncoderConfig->Opt_RF_ON && EQ_32( hEncoderConfig->input_Fs, 8000 ) ) )
{
hEncoderConfig->Opt_RF_ON = 0;
+ move16();
hEncoderConfig->rf_fec_offset = 0;
+ move16();
return IVAS_ERR_OK;
}
IF( caConfig.channelAwareModeEnabled )
{
hEncoderConfig->Opt_RF_ON = 1;
+ move16();
/* Convert FEC indicator from API type */
IF( ( error = fecIndicatorApiToInternal( caConfig.fec_indicator, &newFecIndicator ) ) != IVAS_ERR_OK )
@@ -2355,14 +2505,21 @@ static ivas_error setChannelAwareConfig_fx(
}
/* Set new values only if they differ from current values */
+ test();
IF( ( NE_16( newFecIndicator, hEncoderConfig->rf_fec_indicator ) || NE_16( caConfig.fec_offset, hEncoderConfig->rf_fec_offset ) ) )
{
hEncoderConfig->rf_fec_indicator = newFecIndicator;
+ move16();
/* Check if new FEC offset has a valid value */
+ test();
+ test();
+ test();
+ test();
IF( EQ_16( caConfig.fec_offset, 0 ) || EQ_16( caConfig.fec_offset, 2 ) || EQ_16( caConfig.fec_offset, 3 ) || EQ_16( caConfig.fec_offset, 5 ) || EQ_16( caConfig.fec_offset, 7 ) )
{
hEncoderConfig->rf_fec_offset = caConfig.fec_offset;
+ move16();
}
ELSE
{
@@ -2374,10 +2531,12 @@ static ivas_error setChannelAwareConfig_fx(
/* Save a copy of FEC offset value - needed during encoding */
hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset;
+ move16();
}
ELSE
{
hEncoderConfig->Opt_RF_ON = 0;
+ move16();
}
return IVAS_ERR_OK;
@@ -2415,13 +2574,14 @@ static ivas_error doCommonConfigureChecks(
static ivas_error doCommonSetterChecks(
IVAS_ENC_HANDLE hIvasEnc )
{
- if ( hIvasEnc == NULL || hIvasEnc->st_ivas == NULL )
+ test();
+ IF( hIvasEnc == NULL || hIvasEnc->st_ivas == NULL )
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
/* Currently settings can be changed only after configuration step */
- if ( !hIvasEnc->isConfigured )
+ IF( !hIvasEnc->isConfigured )
{
return IVAS_ERR_NOT_CONFIGURED;
}
@@ -2447,25 +2607,34 @@ static ivas_error sanitizeBandwidth_fx(
max_bwidth_tmp = hIvasEnc->newBandwidthApi;
/* Prevent st_ivas->max_bwidth from being higher than Fs/2 */
- IF( EQ_32( hEncoderConfig->input_Fs, 8000 ) && GT_16( max_bwidth_tmp, NB ) )
+ test();
+ test();
+ test();
+ IF( EQ_32( hEncoderConfig->input_Fs, 8000 ) && ( max_bwidth_tmp > NB ) )
{
max_bwidth_tmp = NB;
+ move16();
}
ELSE IF( EQ_32( hEncoderConfig->input_Fs, 16000 ) && GT_16( max_bwidth_tmp, WB ) )
{
max_bwidth_tmp = WB;
+ move16();
}
ELSE IF( EQ_32( hEncoderConfig->input_Fs, 32000 ) && GT_16( max_bwidth_tmp, SWB ) )
{
max_bwidth_tmp = SWB;
+ move16();
}
/* NB coding not supported in IVAS. Switching to WB. */
- IF( EQ_16( max_bwidth_tmp, NB ) && NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
+ test();
+ test();
+ IF( ( max_bwidth_tmp == NB ) && NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
IF( GE_32( hEncoderConfig->input_Fs, 16000 ) )
{
max_bwidth_tmp = WB;
+ move16();
}
ELSE
{
@@ -2515,16 +2684,23 @@ static ivas_error sanitizeBandwidth_fx(
{
iDiv_and_mod_32( hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism, &quo, &rem, 0 );
}
+
+ test();
+ test();
+ test();
+ test();
IF( EQ_16( max_bwidth_tmp, FB ) && ( ( NE_16( hEncoderConfig->ivas_format, ISM_FORMAT ) && LT_32( hEncoderConfig->ivas_total_brate, MIN_BRATE_FB_STEREO ) ) ||
( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) && LT_32( quo, MIN_BRATE_FB_ISM ) ) ) )
{
max_bwidth_tmp = SWB;
+ move16();
}
}
IF( NE_16( hEncoderConfig->max_bwidth, max_bwidth_tmp ) )
{
hEncoderConfig->max_bwidth = max_bwidth_tmp;
+ move16();
hIvasEnc->switchingActive = true;
}
@@ -2540,31 +2716,37 @@ static ivas_error sanitizeBitrateISM_fx(
const ENCODER_CONFIG_HANDLE hEncoderConfig,
const bool extMetadataApi )
{
+ test();
IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_128k ) && EQ_16( hEncoderConfig->nchan_inp, 1 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 1 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) && EQ_16( hEncoderConfig->nchan_inp, 2 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 2 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_384k ) && EQ_16( hEncoderConfig->nchan_inp, 3 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_16k4 ) && EQ_16( hEncoderConfig->nchan_inp, 2 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 2 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 3 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
+ test();
IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 4 ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
@@ -2573,10 +2755,12 @@ static ivas_error sanitizeBitrateISM_fx(
IF( extMetadataApi )
{
hEncoderConfig->ism_extended_metadata_flag = (Word16) GE_32( hEncoderConfig->ivas_total_brate, ISM_EXTENDED_METADATA_BRATE );
+ move16();
}
ELSE
{
hEncoderConfig->ism_extended_metadata_flag = 0;
+ move16();
}
return IVAS_ERR_OK;
@@ -2606,15 +2790,19 @@ static ivas_error setBandwidth_fx(
hIvasEnc->newBandwidthApi = newBandwidth;
/* NB coding not supported in IVAS. Switching to WB. */
- IF( newBandwidth == NB && hEncoderConfig->ivas_format != UNDEFINED_FORMAT && hEncoderConfig->ivas_format != MONO_FORMAT )
+ test();
+ test();
+ IF( ( newBandwidth == NB ) && NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) )
{
newBandwidth = WB;
+ move16();
}
IF( hEncoderConfig->max_bwidth != newBandwidth )
{
hEncoderConfig->max_bwidth = newBandwidth;
hIvasEnc->switchingActive = true;
+ move16();
}
return IVAS_ERR_OK;
@@ -2790,33 +2978,56 @@ static void init_encoder_config(
)
{
hEncoderConfig->ivas_total_brate = ACELP_12k65;
+ move32();
hEncoderConfig->max_bwidth = SWB;
+ move16();
hEncoderConfig->input_Fs = 16000;
+ move32();
hEncoderConfig->nchan_inp = 1;
+ move16();
hEncoderConfig->element_mode_init = EVS_MONO;
+ move16();
hEncoderConfig->ivas_format = UNDEFINED_FORMAT;
+ move16();
hEncoderConfig->is_binaural = 0;
+ move16();
hEncoderConfig->Opt_SC_VBR = 0;
+ move16();
hEncoderConfig->last_Opt_SC_VBR = 0;
+ move16();
hEncoderConfig->Opt_AMR_WB = 0;
+ move16();
hEncoderConfig->Opt_DTX_ON = 0;
+ move16();
hEncoderConfig->Opt_RF_ON = 0;
+ move16();
hEncoderConfig->rf_fec_offset = 0;
+ move16();
hEncoderConfig->rf_fec_indicator = 1;
+ move16();
hEncoderConfig->interval_SID = FIXED_SID_RATE;
+ move16();
hEncoderConfig->var_SID_rate_flag = 1;
+ move16();
hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID;
+ move16();
hEncoderConfig->stereo_dmx_evs = 0;
+ move16();
hEncoderConfig->nchan_ism = 0;
+ move16();
hEncoderConfig->sba_order = 0;
+ move16();
hEncoderConfig->sba_planar = 0;
+ move16();
hEncoderConfig->ism_extended_metadata_flag = 0;
+ move16();
#ifdef DEBUGGING
hEncoderConfig->stereo_mode_cmdl = 0;
hEncoderConfig->force = -1;
hEncoderConfig->mdct_stereo_mode_cmdl = SMDCT_MS_DECISION;
#endif
hEncoderConfig->Opt_PCA_ON = 0;
+ move16();
return;
}
diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h
index ab6c39c23c4da9b2ca62da54e672eaf5dbc61607..8cf6be1cd0e6ca1385d5c7ec3588583ea115ac20 100644
--- a/lib_enc/lib_enc.h
+++ b/lib_enc/lib_enc.h
@@ -169,8 +169,8 @@ ivas_error IVAS_ENC_Open_fx(
/*! r: error code */
ivas_error IVAS_ENC_ConfigureForMono(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -182,8 +182,8 @@ ivas_error IVAS_ENC_ConfigureForMono(
/*! r: error code */
ivas_error IVAS_ENC_ConfigureForStereo(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -197,8 +197,8 @@ ivas_error IVAS_ENC_ConfigureForStereo(
/*! r: error code */
ivas_error IVAS_ENC_ConfigureForObjects(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -209,8 +209,8 @@ ivas_error IVAS_ENC_ConfigureForObjects(
/*! r: encoder error code */
ivas_error IVAS_ENC_ConfigureForMASAObjects(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the ouput bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the ouput bitstream */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
const UWord16 numObjects, /* i : number of objects to be encoded */
@@ -220,8 +220,8 @@ ivas_error IVAS_ENC_ConfigureForMASAObjects(
/*! r: encoder error code */
ivas_error IVAS_ENC_ConfigureForSBAObjects(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the ouput bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the ouput bitstream */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
const UWord16 numObjects, /* i : number of objects to be encoded */
@@ -233,8 +233,8 @@ ivas_error IVAS_ENC_ConfigureForSBAObjects(
/*! r: error code */
ivas_error IVAS_ENC_ConfigureForAmbisonics(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -245,8 +245,8 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics(
ivas_error IVAS_ENC_ConfigureForAmbisonics_fx(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -257,8 +257,8 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics_fx(
/*! r: error code */
ivas_error IVAS_ENC_ConfigureForMasa(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -268,8 +268,8 @@ ivas_error IVAS_ENC_ConfigureForMasa(
/*! r: encoder error code */
ivas_error IVAS_ENC_ConfigureForMultichannel(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 inputFs, /* i : input sampling frequency */
- const Word32 bitrate, /* i : requested bitrate of the output bitstream */
+ const Word32 inputFs, /* i : input sampling frequency */
+ const Word32 bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
@@ -285,7 +285,7 @@ void IVAS_ENC_Close(
/*! r: error code */
ivas_error IVAS_ENC_FeedObjectMetadata(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const UWord16 ismIndex, /* i : object index */
+ const UWord16 ismIndex, /* i : object index */
const IVAS_ISM_METADATA metadata /* i : object metadata handle for current frame */
);
@@ -307,8 +307,8 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
/*! r: error code */
ivas_error IVAS_ENC_EncodeFrameToCompact(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- Word16 *inputBuffer, /* i : PCM input */
- const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */
+ Word16 *inputBuffer, /* i : PCM input */
+ const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */
UWord8 *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */
UWord16 *numOutBits /* o : number of bits written to output bitstream */
);
@@ -324,7 +324,7 @@ ivas_error IVAS_ENC_SetBandwidth(
/*! r: error code */
ivas_error IVAS_ENC_SetBitrate(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- const Word32 totalBitrate /* i : requested bitrate of the output bitstream */
+ const Word32 totalBitrate /* i : requested bitrate of the output bitstream */
);
/*! r: error code */
@@ -355,13 +355,13 @@ ivas_error IVAS_ENC_GetDelay(
/*! r: encoder error code */
ivas_error IVAS_ENC_GetNumInChannels(
const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- Word16 *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */
+ Word16 *numInChannels /* o : total number of samples expected in the input buffer for current encoder configuration */
);
/*! r: encoder error code */
ivas_error IVAS_ENC_GetInputBufferSize(
const IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
- Word16 *inputBufferSize /* o : total number of samples expected in the input buffer for current encoder configuration */
+ Word16 *inputBufferSize /* o : total number of samples expected in the input buffer for current encoder configuration */
);
/* Utility functions */
diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c
index 5fe465f2946e037b8f2b92f9f2741c2c0432c308..af57edd3bd4629ef64c1c16842bc91d572fd67c7 100644
--- a/lib_enc/long_enr_fx.c
+++ b/lib_enc/long_enr_fx.c
@@ -18,11 +18,11 @@
void ivas_long_enr_fx(
Encoder_State *st_fx, /* i/o: state structure */
const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q8 */
- const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */
- Word16 high_lpn_flag, /* i : sp/mus LPN flag */
+ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover Q0*/
+ Word16 high_lpn_flag, /* i : sp/mus LPN flag Q0*/
FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */
- const Word16 n_chan, /* i : number of channels */
- const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */
+ const Word16 n_chan, /* i : number of channels Q0*/
+ const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels Q0*/
const Word16 Etot_LR[] /* i : total channel energy LR channels Q8 */
)
@@ -42,13 +42,13 @@ void ivas_long_enr_fx(
{
FOR( n = 0; n < n_chan; n++ )
{
- hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx;
+ hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; /* Q8 */
move16();
- tmp = add( hFrontVad[n]->lp_noise_fx, 2560 );
+ tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); /* Q8 */
- IF( LT_16( hFrontVad[n]->lp_speech_fx, tmp ) )
+ if ( LT_16( hFrontVad[n]->lp_speech_fx, tmp ) )
{
- hFrontVad[n]->lp_speech_fx = tmp;
+ hFrontVad[n]->lp_speech_fx = tmp; /* Q8 */
move16();
}
}
@@ -59,34 +59,34 @@ void ivas_long_enr_fx(
IF( LT_16( hFrontVad[0]->ini_frame, 150 ) )
{
- smooth_prev = 31130;
- smooth_curr = 1638;
+ smooth_prev = 31130; /* 0.95f in Q15 */
+ smooth_curr = 1638; /* 0.05f in Q15 */
move16();
move16();
}
ELSE
{
- smooth_prev = 32113;
- smooth_curr = 655;
+ smooth_prev = 32113; /* 0.98f in Q15 */
+ smooth_curr = 655; /* 0.02f in Q15 */
move16();
move16();
}
FOR( n = 0; n < n_chan; n++ )
{
- hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) );
+ hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); /* Q8 */
move16();
test();
IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag )
{
- IF( LT_16( sub( hFrontVad[n]->lp_speech_fx, Etot_LR[n] ), 2560 ) )
+ IF( LT_16( sub( hFrontVad[n]->lp_speech_fx, Etot_LR[n] ), 2560 /*10.0f in Q8*/ ) )
{
- hFrontVad[n]->lp_speech_fx = add( mult_r( 32113, hFrontVad[n]->lp_speech_fx ), mult_r( 655, Etot_LR[n] ) );
+ hFrontVad[n]->lp_speech_fx = add( mult_r( 32113 /*0.98f in Q15*/, hFrontVad[n]->lp_speech_fx ), mult_r( 655 /*0.02f in Q15*/, Etot_LR[n] ) ); /* Q8 */
move16();
}
ELSE
{
- hFrontVad[n]->lp_speech_fx = sub( hFrontVad[n]->lp_speech_fx, 13 );
+ hFrontVad[n]->lp_speech_fx = sub( hFrontVad[n]->lp_speech_fx, 13 /*0.05f in Q8*/ ); /* Q8 */
move16();
}
}
@@ -94,7 +94,7 @@ void ivas_long_enr_fx(
}
FOR( n = 0; n < n_chan; n++ )
{
- hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n];
+ hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; /* Q8 */
move16();
}
}
@@ -102,7 +102,7 @@ void ivas_long_enr_fx(
{
IF( LT_16( st_fx->ini_frame, 4 ) )
{
- st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx;
+ st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx; /* Q8 */
move16();
tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/
st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp );
@@ -115,8 +115,8 @@ void ivas_long_enr_fx(
} else {
st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->totalNoise;
} */
- alpha = 655;
- move16(); /* 0.02 Q15 */
+ alpha = 655; /* 0.02 Q15 */
+ move16();
if ( LT_16( st_fx->ini_frame, 150 ) ) /* should match HE_LT_CNT_INIT_FX */
{
alpha = 1638;
@@ -141,7 +141,7 @@ void ivas_long_enr_fx(
}
}
/* Update */
- st_fx->hNoiseEst->Etot_last_fx = Etot;
+ st_fx->hNoiseEst->Etot_last_fx = Etot; /* Q8 */
move16();
}
@@ -154,9 +154,9 @@ void ivas_long_enr_fx(
void long_enr_fx(
Encoder_State *st_fx, /* i/o: state structure */
- const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */
- const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */
- Word16 high_lpn_flag /* i : sp/mus LPN flag */
+ const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q8*/
+ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover Q0*/
+ Word16 high_lpn_flag /* i : sp/mus LPN flag Q0*/
)
{
Word16 tmp;
@@ -171,10 +171,11 @@ void long_enr_fx(
{
IF( LT_16( st_fx->ini_frame, 4 ) )
{
- st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx;
+ st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx; /* Q8 */
+ move16();
+ tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/
+ st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp ); /* Q8 */
move16();
- tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/
- st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp );
}
ELSE
{
@@ -183,14 +184,15 @@ void long_enr_fx(
} else {
st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->totalNoise;
} */
- alpha = 655;
- move16(); /* 0.02 Q15 */
+ alpha = 655; /* 0.02 Q15 */
+ move16();
if ( LT_16( st_fx->ini_frame, 150 ) ) /* should match HE_LT_CNT_INIT_FX */
{
- alpha = 1638;
- move16(); /* 0.05 Q15 */
+ alpha = 1638; /* 0.05 Q15 */
+ move16();
}
st_fx->lp_noise_fx = noise_est_AR1_Qx( hNoiseEst->totalNoise_fx, st_fx->lp_noise_fx, alpha ); /* Q8 state, alpha in Q15 */
+ move16();
test();
IF( ( localVAD_HE_SAD != 0 ) && ( high_lpn_flag == 0 ) )
@@ -199,10 +201,12 @@ void long_enr_fx(
{
/* st->lp_speech = 0.98f * st->lp_speech + 0.02f * Etot; */
st_fx->lp_speech_fx = noise_est_AR1_Qx( Etot, st_fx->lp_speech_fx, 655 ); /* Q8 state, 0.02 in Q15 */
+ move16();
}
ELSE
{
st_fx->lp_speech_fx = sub( st_fx->lp_speech_fx, 13 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/
+ move16();
}
}
}
diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c
index 4ce9403a6e22ca5fc9ceef17563a8f6322260495..6844945c02ec3ae13ff255a68e215ba0ef0cfa5d 100644
--- a/lib_enc/pre_proc_fx.c
+++ b/lib_enc/pre_proc_fx.c
@@ -213,8 +213,7 @@ void pre_proc_fx(
/*----------------------------------------------------------------*
* Change the sampling frequency to 12.8 kHz
*----------------------------------------------------------------*/
- Word16 Q_new_inp, mem_decim_size; // TO be removed
- modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) );
Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME );
Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 );
/*------------------------------------------------------------------*
@@ -1017,7 +1016,7 @@ void pre_proc_fx(
}
ELSE IF( EQ_32( st->input_Fs, 32000 ) || EQ_32( st->input_Fs, 48000 ) )
{
- modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_16k, sr_core_tmp, st->mem_decim16k_fx, 0, &Q_new_inp, &mem_decim_size );
+ modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_16k, sr_core_tmp, st->mem_decim16k_fx, 0 );
}
ELSE /* keep memories up-to-date in case of bitrate switching */
{
diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h
index 10d020ee3928e6c84324b352e5722b7e5c71f2c3..042b5af903a5232182b25de39971113d21f37e61 100644
--- a/lib_enc/prot_fx_enc.h
+++ b/lib_enc/prot_fx_enc.h
@@ -1078,7 +1078,7 @@ Word16 WB_BWE_encoding_fx( /* o : classification of wb
Word16 WB_BWE_encoding_ivas_fx( /* o : classification of wb signal */
Encoder_State *st_fx, /* i/o: Encoder structure */
- const Word16 *yos_fx, /* i : MDCT coefficients of weighted original */
+ const Word32 *yos_fx, /* i : MDCT coefficients of weighted original */
Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */
Word16 Q_synth,
Word16 Q_synth_lf );
@@ -1131,7 +1131,7 @@ void RunTransientDetection_ivas_fx(
* @return average temporal flatness measure with exponent AVG_FLAT_E
*/
Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks );
-Word16 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks );
+Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks );
/** Get the maximum energy change using subblock energies aligned with the TCX.
* @param pTransientDetection Structure that contains transient detectors to be run.
@@ -2043,7 +2043,7 @@ void encod_unvoiced_ivas_fx(
const Word16 Es_pred, /* i : predicted scaled innov. energy Q8*/
const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC Q0*/
const Word16 *res_fx, /* i : residual signal Q_new*/
- Word16 *syn_fx, /* o : core synthesis Q_new*/
+ Word16 *syn_fx, /* o : core synthesis Q_new - 1*/
Word16 *tmp_noise_fx, /* o : long-term noise energy Q0*/
Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/
Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/
diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h
index 41c6b04680eefa6ea2e268e92280e90b4179450d..7ca996af53c7db6dd4a011f7a13181b070cd564f 100644
--- a/lib_enc/stat_enc.h
+++ b/lib_enc/stat_enc.h
@@ -137,12 +137,14 @@ typedef struct
/* Subblock energies: Holds subblock energies and recursively accumulated energies. Also buffers the energies. */
typedef struct
{
- DelayBuffer *pDelayBuffer; /* Delay buffer. */
- Word32 subblockNrg[NSUBBLOCKS + MAX_TD_DELAY]; // IVAS Q(-1)
- Word32 accSubblockNrg[NSUBBLOCKS + MAX_TD_DELAY + 1]; // IVAS Q(-1)
- Word16 subblockNrgChange[NSUBBLOCKS + MAX_TD_DELAY]; /* EVS: Q7(15 - SUBBLOCK_NRG_CHANGE_E) */ /* IVAS: Q3 */
- Word16 nDelay; /* Size of the delay buffer in use, as number of subblocks. Maximum delay from all users of this buffer. */
- Word16 nPartialDelay; /* Delay of the input (modulo pDelayBuffer->nSubblockSize), nPartialDelay <= pDelayBuffer->nDelay. */
+ DelayBuffer *pDelayBuffer; /* Delay buffer. */
+ Word32 subblockNrg[NSUBBLOCKS + MAX_TD_DELAY]; // IVAS Q(-1)
+ Word32 accSubblockNrg[NSUBBLOCKS + MAX_TD_DELAY + 1]; // IVAS Q(-1)
+ Word16 subblockNrgChange[NSUBBLOCKS + MAX_TD_DELAY]; /* EVS: Q7(15 - SUBBLOCK_NRG_CHANGE_E) */
+ Word32 subblockNrgChange_32fx[NSUBBLOCKS + MAX_TD_DELAY]; /* IVAS: subblockNrgChange_exp */
+ Word16 subblockNrgChange_exp[NSUBBLOCKS + MAX_TD_DELAY];
+ Word16 nDelay; /* Size of the delay buffer in use, as number of subblocks. Maximum delay from all users of this buffer. */
+ Word16 nPartialDelay; /* Delay of the input (modulo pDelayBuffer->nSubblockSize), nPartialDelay <= pDelayBuffer->nDelay. */
/* Decay factor for the recursive accumulation */
Word16 facAccSubblockNrg;
@@ -1669,6 +1671,7 @@ typedef struct enc_core_structure
Word16 transient_info[3];
Word16 acelpFramesCount;
Word16 prevTempFlatness_fx; /* exponent is AVG_FLAT_E Q7 in EVS */ /* Q4 in IVAS */
+ Word32 prevTempFlatness_32fx; /* Q21 in IVAS */
// float currEnergyLookAhead;
Word32 currEnergyLookAhead_fx; // Q31
diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c
index 44f415dc72a3a19a7ab46eefd21661bec8f5ce8b..e0d84645895236cce9f93b1eaa9062c56a794ec2 100644
--- a/lib_enc/swb_bwe_enc_fx.c
+++ b/lib_enc/swb_bwe_enc_fx.c
@@ -211,11 +211,9 @@ void wb_bwe_enc_ivas_fx(
Word16 Sample_Delay_WB_BWE;
Word16 old_input_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME16k];
Word32 yorig_32[L_FRAME16k];
- Word16 yorig_fx[L_FRAME16k];
Word32 L_wtda_synth_fx[2 * L_FRAME16k];
Word16 *new_input_fx; /* pointer to original input signal */
- Word16 scl, new_input_fx_exp;
- Word16 Q_synth;
+ Word16 new_input_fx_exp;
FD_BWE_ENC_HANDLE hBWE_FD = st_fx->hBWE_FD;
Word16 WB_fenv_fx[SWB_FENV];
@@ -239,7 +237,7 @@ void wb_bwe_enc_ivas_fx(
/* MDCT of the core synthesis signal */
/*---------------------------------------------------------------------*/
- new_input_fx_exp = 0;
+ new_input_fx_exp = -1;
move16();
wtda_fx( old_input_fx, &new_input_fx_exp, L_wtda_synth_fx, hBWE_FD->L_old_wtda_swb_fx,
@@ -249,22 +247,7 @@ void wb_bwe_enc_ivas_fx(
/* DCT of the ACELP core synthesis */
direct_transform_fx( L_wtda_synth_fx, yorig_32, 0, L_FRAME16k, &new_input_fx_exp, st_fx->element_mode );
- /* Convert to 16 Bits (Calc Shift Required to Stay within MAX_Q_NEW_INPUT) */
- scl = sub( 16 + 8 /*MAX_Q_NEW_INPUT*/, new_input_fx_exp );
- /* Possible to Upscale? */
- IF( scl > 0 )
- {
- /* Yes */
- /* Calc Room to Upscale */
- Q_synth = Find_Max_Norm32( yorig_32, L_FRAME16k );
-
- /* Stay within MAX_Q_NEW_INPUT */
- scl = s_min( Q_synth, scl );
- }
- Copy_Scale_sig32_16( yorig_32, yorig_fx, L_FRAME16k, scl );
- Q_synth = sub( add( sub( new_input_fx_exp, 16 ), scl ), 1 );
-
- mode = WB_BWE_encoding_ivas_fx( st_fx, yorig_fx, WB_fenv_fx, Q_synth, Q_synth );
+ mode = WB_BWE_encoding_ivas_fx( st_fx, yorig_32, WB_fenv_fx, new_input_fx_exp, new_input_fx_exp );
move16();
push_indice( st_fx->hBstr, IND_WB_CLASS, sub( mode, 2 ), 1 );
}
@@ -591,7 +574,7 @@ void swb_bwe_enc_ivas_fx(
ELSE
{
SWB_BWE_encoding_ivas_fx( st_fx, old_input_fx, old_input_lp_fx, new_input_hp_fx, old_syn_12k8_16k_fx, yorig_32,
- SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_exp, Q_synth );
+ SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_exp, new_input_fx_exp );
}
@@ -2517,7 +2500,7 @@ Word16 WB_BWE_encoding_fx( /* o : classification of wb
Word16 WB_BWE_encoding_ivas_fx( /* o : classification of wb signal */
Encoder_State *st_fx, /* i/o: Encoder structure */
- const Word16 *yos_fx, /* i : MDCT coefficients of weighted original */
+ const Word32 *yos_fx, /* i : MDCT coefficients of weighted original */
Word16 *WB_fenv_fx, /* i/o: energy of WB envelope */
Word16 Q_synth,
Word16 Q_synth_lf )
@@ -2531,35 +2514,48 @@ Word16 WB_BWE_encoding_ivas_fx( /* o : classification of
Word16 ener_40, exp;
Word32 L_tmp;
Word16 tmp;
-
+ Word64 energy_fx_64;
+ Word16 q_shift, scale;
+ Word16 q_WB_fenv[2];
+ Word16 yos_fx_16[L_FRAME16k];
n_band = 0;
move16();
FOR( i = 0; i < 2; i++ )
{
- energy_fx = L_deposit_l( 0 );
+ energy_fx_64 = 0;
+ move64();
FOR( n_coeff = swb_bwe_subband[n_band]; n_coeff < swb_bwe_subband[n_band + 2]; n_coeff++ )
{
- energy_fx = L_add( energy_fx, L_shr( L_mult0( yos_fx[n_coeff], yos_fx[n_coeff] ), 6 ) ); /*2*Q_synth-6 */
+ energy_fx_64 = W_add( energy_fx_64, W_mult0_32_32( yos_fx[n_coeff], yos_fx[n_coeff] ) ); /*2*Q_synth*/
}
+ q_shift = W_norm( energy_fx_64 );
+ energy_fx = W_extract_h( W_shl( energy_fx_64, q_shift ) ); /*2*Q_synth + q_shift - 32*/
+ q_shift = sub( q_shift, 32 );
L_WB_fenv_fx[i] = energy_fx;
- move32(); /*2*Q_synth-6 */
+ move32();
+ q_WB_fenv[i] = add( shl( Q_synth, 1 ), q_shift );
+ move16();
n_band = add( n_band, 2 );
}
- mode = FD_BWE_class_fx( yos_fx, 0, 0, Q_synth, 0, st_fx );
- energy_control_ivas_fx( st_fx, ACELP_CORE, mode, st_fx->coder_type, yos_fx, 0, energy_factor_fx, Q_synth_lf );
+ scale = s_min( L_norm_arr( yos_fx, L_FRAME16k ), sub( Q27, Q_synth ) /* To accomodate 10 in Q_synth*/ );
+ Copy_Scale_sig32_16( yos_fx, yos_fx_16, L_FRAME16k, scale );
+
+ mode = FD_BWE_class_fx( yos_fx_16, 0, 0, sub( add( Q_synth, scale ), Q16 ), 0, st_fx );
+
+ energy_control_ivas_fx( st_fx, ACELP_CORE, mode, st_fx->coder_type, yos_fx_16, 0, energy_factor_fx, sub( add( Q_synth_lf, scale ), Q16 ) );
FOR( i = 0; i < 2; i++ )
{
ener_40 = mult_r( shr( energy_factor_fx[shl( i, 1 )], 1 ), 26214 ); /*Q19 */
- L_tmp = Mpy_32_16_1( L_WB_fenv_fx[i], ener_40 ); /*2*Q_synth-2 */
+ L_tmp = Mpy_32_16_1( L_WB_fenv_fx[i], ener_40 ); /*q_WB_fenv[i]+4 */
IF( L_tmp )
{
exp = norm_l( L_tmp );
tmp = Log2_norm_lc( L_shl( L_tmp, exp ) );
- /*exp = 30-exp-(2*Q_synth-2); */
- exp = sub( sub( 30, exp ), ( sub( shl( Q_synth, 1 ), 2 ) ) );
+ /*exp = 30-exp-(q_WB_fenv[i]+4); */
+ exp = sub( sub( 30, exp ), ( add( q_WB_fenv[i], 4 ) ) );
L_tmp = Mpy_32_16( exp, tmp, 32767 ); /* Q16 */
WB_fenv_fx[i] = round_fx( L_shl( L_tmp, 10 ) ); /*Q10 */
move16();
diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c
index 5c96a2f297d8eefba4346fa564f850c13f5b0b9a..b73b0f992cc83d72151d977510880ec6e87e893c 100644
--- a/lib_enc/swb_pre_proc_fx.c
+++ b/lib_enc/swb_pre_proc_fx.c
@@ -715,8 +715,7 @@ void swb_pre_proc_fx(
CldfbHB_ener = L_mult( sub( Cldfbtemp1, 1741 /*3.401 Q9*/ ), 3495 ); /* 3495 = Q19 log10(2)*0.1/log10(32768), Q = 19+9+1 = 29 */
hBWE_TD->cldfbHBLT = mac_r( CldfbHB_ener, 29491 /*0.9 Q15*/, hBWE_TD->cldfbHBLT ); /* cldfbHBLT is in Q13 */
}
- cldfbSynthesisFiltering( st_fx->cldfbSynTd, realBufferFlipped, imagBufferFlipped,
- cldfbScale, shb_speech_fx, 0, CLDFB_NO_COL_MAX, cldfbWorkBuffer );
+ cldfbSynthesis_fx( st_fx->cldfbSynTd, realBufferFlipped, imagBufferFlipped, cldfbScale, shb_speech_fx, 0, CLDFB_NO_COL_MAX, cldfbWorkBuffer );
*Q_shb_spch = 0; /*shb_speech_fx : Q0*/
move16();
@@ -1264,7 +1263,11 @@ void swb_pre_proc_ivas_fx(
thr = icbwe_thr_TDM_fx;
regV = icbwe_regressionValuesTDM_fx;
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, 0, st->cldfbSynTd );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, st->cldfbSynTd );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
Copy_Scale_sig_32_16( shb_speech_fx_32, shb_speech, L_FRAME16k, negate( sub( q_reImBuffer, 1 ) ) );
*Q_shb_spch = 0;
move16();
diff --git a/lib_enc/tcx_ltp_enc_fx.c b/lib_enc/tcx_ltp_enc_fx.c
index e1d478e954f3c24e06f61037b353e87727f1e15d..19afa82437d68511599f10d0d4a0a796ed7f0a50 100644
--- a/lib_enc/tcx_ltp_enc_fx.c
+++ b/lib_enc/tcx_ltp_enc_fx.c
@@ -1035,13 +1035,13 @@ void tcx_ltp_encode_ivas_fx(
IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
{
- tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q7
+ tempFlatness_fx = extract_l( L_shr( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ), 14 ) ); // Q7
maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10,
NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q3
}
ELSE
{
- tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, nPrevSubblocks ); // Q7
+ tempFlatness_fx = extract_l( L_shr( ( GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, nPrevSubblocks ) ), 14 ) ); // Q7
maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10,
NSUBBLOCKS, nPrevSubblocks ); // Q3
}
diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c
index 3c88ca2244c8da1e362e90c87c6c80c8b4b5eb2e..44bd8cc3c27dd144a8dac786fd0ee211a3259405 100644
--- a/lib_enc/transient_detection_fx.c
+++ b/lib_enc/transient_detection_fx.c
@@ -419,16 +419,17 @@ Word16 GetTCXAvgTemporalFlatnessMeasure_fx( struct TransientDetection const *pTr
return i;
}
-Word16 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks )
+Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const *pTransientDetection, Word16 nCurrentSubblocks, Word16 nPrevSubblocks )
{
- Word16 i;
+ Word32 i;
TransientDetector const *pTransientDetector;
SubblockEnergies const *pSubblockEnergies;
Word16 nDelay;
Word16 nRelativeDelay;
- Word16 const *pSubblockNrgChange;
+ Word32 const *pSubblockNrgChange;
+ Word16 const *pSubblockNrgChange_exp;
Word32 sumTempFlatness;
- Word16 nTotBlocks;
+ Word16 nTotBlocks, sumTempFlatness_exp, exp;
/* Initialization */
pTransientDetector = &pTransientDetection->transientDetector;
@@ -445,15 +446,21 @@ Word16 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const
assert( ( nPrevSubblocks <= nRelativeDelay ) && ( nCurrentSubblocks <= NSUBBLOCKS + nDelay ) );
- pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[sub( nRelativeDelay, nPrevSubblocks )]; // subblockNrgChange Q3
+ pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange_32fx[( nRelativeDelay - nPrevSubblocks )];
+ pSubblockNrgChange_exp = &pSubblockEnergies->subblockNrgChange_exp[( nRelativeDelay - nPrevSubblocks )];
+ sumTempFlatness = 0;
+ move32();
+ sumTempFlatness_exp = 0;
+ move16();
FOR( i = 0; i < nTotBlocks; i++ )
{
- sumTempFlatness = L_add( sumTempFlatness, L_deposit_l( pSubblockNrgChange[i] ) );
+ sumTempFlatness = BASOP_Util_Add_Mant32Exp( sumTempFlatness, sumTempFlatness_exp, pSubblockNrgChange[i], pSubblockNrgChange_exp[i], &sumTempFlatness_exp );
}
/* exponent = AVG_FLAT_E */
- i = div_l( L_shl( sumTempFlatness, 5 ), nTotBlocks ); // Q7
-
+ i = BASOP_Util_Divide3232_Scale_cadence( sumTempFlatness, nTotBlocks, &exp );
+ exp = add( exp, sub( sumTempFlatness_exp, 31 ) );
+ i = L_shl_sat( i, sub( exp, 10 ) ); // Can be saturated, since it is used for comparision againt 3.25/20.0f, Q21
return i;
}
@@ -546,7 +553,8 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet,
SubblockEnergies const *pSubblockEnergies;
Word16 nDelay;
Word16 nRelativeDelay;
- Word16 const *pSubblockNrgChange;
+ Word32 const *pSubblockNrgChange;
+ Word16 const *pSubblockNrgChange_exp;
Word16 maxEnergyChange;
Word16 nTotBlocks;
@@ -563,7 +571,8 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet,
maxEnergyChange = 0 /*0.0f Q3*/;
move16();
assert( ( nPrevSubblocks <= nRelativeDelay ) && ( nCurrentSubblocks <= NSUBBLOCKS + nDelay ) );
- pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nRelativeDelay - nPrevSubblocks];
+ pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange_32fx[nRelativeDelay - nPrevSubblocks];
+ pSubblockNrgChange_exp = &pSubblockEnergies->subblockNrgChange_exp[nRelativeDelay - nPrevSubblocks];
IF( s_or( pTransientDetector->bIsAttackPresent, isTCX10 ) ) /* frame is TCX-10 */
{
@@ -602,7 +611,7 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet,
FOR( i = 0; i < nTotBlocks; i++ )
{
- maxEnergyChange = s_max( maxEnergyChange, pSubblockNrgChange[i] );
+ maxEnergyChange = s_max( maxEnergyChange, extract_l( L_shl_sat( pSubblockNrgChange[i], sub( pSubblockNrgChange_exp[i], 28 ) ) ) ); // Q3
}
move16();
@@ -875,7 +884,7 @@ void SetTCXModeInfo_ivas_fx(
move16();
}
}
- tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q23, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff );
+ tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff );
tmp = shl_sat( tmp, exp_diff ); // Q15
test();
IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
@@ -905,7 +914,7 @@ void SetTCXModeInfo_ivas_fx(
*tcxModeOverlap = ALDO_WINDOW;
move16();
}
- tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q23, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff );
+ tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q21, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff );
tmp = shl_sat( tmp, exp_diff ); // Q15
test();
IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) )
@@ -1124,7 +1133,8 @@ static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, De
set32_fx( pSubblockEnergies->subblockNrg, 54 /* 107.37 in Q(-1) */, nMaxBuffSize );
set32_fx( pSubblockEnergies->accSubblockNrg, 54 /* 107.37 in Q(-1) */, nMaxBuffSize + 1 );
- set16_fx( pSubblockEnergies->subblockNrgChange, ONE_IN_Q3, nMaxBuffSize );
+ set32_fx( pSubblockEnergies->subblockNrgChange_32fx, ONE_IN_Q15, nMaxBuffSize );
+ set16_fx( pSubblockEnergies->subblockNrgChange_exp, 16, nMaxBuffSize );
IF( nDelay != 0 )
{
pSubblockEnergies->nDelay = idiv1616( nDelay, pDelayBuffer->nSubblockSize );
@@ -1340,12 +1350,14 @@ static void UpdateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamples
/* Shift old subblock energies */
FOR( i = 0; i < pSubblockEnergies->nDelay; i++ )
{
+ move32();
move32();
move32();
move16();
pSubblockEnergies->subblockNrg[i] = pSubblockEnergies->subblockNrg[i + NSUBBLOCKS];
pSubblockEnergies->accSubblockNrg[i] = pSubblockEnergies->accSubblockNrg[i + NSUBBLOCKS];
- pSubblockEnergies->subblockNrgChange[i] = pSubblockEnergies->subblockNrgChange[i + NSUBBLOCKS];
+ pSubblockEnergies->subblockNrgChange_32fx[i] = pSubblockEnergies->subblockNrgChange_32fx[i + NSUBBLOCKS];
+ pSubblockEnergies->subblockNrgChange_exp[i] = pSubblockEnergies->subblockNrgChange_exp[i + NSUBBLOCKS];
}
/* Compute filtered subblock energies for the new samples */
@@ -1492,7 +1504,8 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp
Word16 facAccSubblockNrg;
Word32 *pSubblockNrg;
Word32 *pAccSubblockNrg;
- Word16 *pSubblockNrgChange;
+ Word32 *pSubblockNrgChange;
+ Word16 *pSubblockNrgChange_exp;
Word32 *pAccSubblockTmp;
Word16 nWindows;
Word16 w, k, k2;
@@ -1513,7 +1526,8 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp
delayBuffer = &pDelayBuffer->buffer[sub( pDelayBuffer->nDelay, nPartialDelay )];
pSubblockNrg = &pSubblockEnergies->subblockNrg[nDelay];
pAccSubblockNrg = &pSubblockEnergies->accSubblockNrg[nDelay];
- pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nDelay];
+ pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange_32fx[nDelay];
+ pSubblockNrgChange_exp = &pSubblockEnergies->subblockNrgChange_exp[nDelay];
/* nWindows = (nSamplesAvailable + nPartialDelay) / nSubblockSize */
nWindows = shr( div_s( add( nSamplesAvailable, nPartialDelay ), shl( nSubblockSize, 7 ) ), 8 );
@@ -1564,19 +1578,16 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp
IF( GT_32( w0, w1 ) )
{
- k2 = BASOP_Util_Divide3232_uu_1616_Scale( w0, w1, &k );
+ pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w0, w1, &k );
+ pSubblockNrgChange_exp[w] = k;
}
ELSE
{
- k2 = BASOP_Util_Divide3232_uu_1616_Scale( w1, w0, &k );
+ pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w1, w0, &k );
+ pSubblockNrgChange_exp[w] = k;
}
+ move32();
move16();
- pSubblockNrgChange[w] = MAX_16;
- IF( LT_16( k, 12 ) )
- {
- move16();
- pSubblockNrgChange[w] = shr_r( k2, sub( 12, k ) );
- }
}
}
}
@@ -1803,17 +1814,17 @@ Word16 transient_analysis_ivas_fx(
*-------------------------------------------------------------------*/
void set_transient_stereo_fx(
CPE_ENC_HANDLE hCPE, /* i : CPE structure */
- Word16 currFlatness[] /* i/o: current flatness */
+ Word32 currFlatness[] /* i/o: current flatness */
)
{
Word16 n, attackIsPresent;
- Word16 currFlatnessMax;
+ Word32 currFlatnessMax;
Encoder_State **sts;
sts = hCPE->hCoreCoder;
/* for DFT/TD based stereo ,map avg. flatness to individual stereo channels (M/S or X/Y) */
- maximum_fx( currFlatness, CPE_CHANNELS, &currFlatnessMax );
+ maximum_32_fx( currFlatness, CPE_CHANNELS, &currFlatnessMax );
attackIsPresent = 0;
move16();
@@ -1822,7 +1833,7 @@ void set_transient_stereo_fx(
attackIsPresent = s_max( attackIsPresent, sts[n]->hTranDet->transientDetector.bIsAttackPresent );
}
- set16_fx( currFlatness, currFlatnessMax, CPE_CHANNELS );
+ set32_fx( currFlatness, currFlatnessMax, CPE_CHANNELS );
FOR( n = 0; n < CPE_CHANNELS; n++ )
{
@@ -1850,8 +1861,8 @@ void set_transient_stereo_fx(
move16();
FOR( n = 0; n < CPE_CHANNELS; n++ )
{
- hCPE->hStereoDft->hItd->currFlatness_fx = s_max( hCPE->hStereoDft->hItd->currFlatness_fx, currFlatness[n] );
- move16();
+ hCPE->hStereoDft->hItd->currFlatness_fx = L_max( hCPE->hStereoDft->hItd->currFlatness_fx, currFlatness[n] );
+ move32();
}
}
@@ -1861,8 +1872,8 @@ void set_transient_stereo_fx(
move16();
FOR( n = 0; n < CPE_CHANNELS; n++ )
{
- hCPE->hStereoMdct->hItd->currFlatness_fx = s_max( hCPE->hStereoMdct->hItd->currFlatness_fx, currFlatness[n] );
- move16();
+ hCPE->hStereoMdct->hItd->currFlatness_fx = L_max( hCPE->hStereoMdct->hItd->currFlatness_fx, currFlatness[n] );
+ move32();
}
}
diff --git a/lib_isar/isar_splitRendererPost.c b/lib_isar/isar_splitRendererPost.c
index 82eabb37614412bdad5d8e758be223edb2c518f4..92f5b8deaa55a165c0b4d8cec07bdb474a89f767 100644
--- a/lib_isar/isar_splitRendererPost.c
+++ b/lib_isar/isar_splitRendererPost.c
@@ -2023,7 +2023,11 @@ static void isar_rend_CldfbSplitPostRendProcessTdIn(
Q_cldfb = add( scaleFactor, Q_in );
#endif
Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, 0, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#else
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#endif
Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) );
Q_out[ch_idx] = sub( Q_cldfb, 1 );
}
@@ -2087,7 +2091,11 @@ void isar_rend_CldfbSplitPostRendProcess(
}
Q_cldfb = scaleFactor + Q_cldfb_in;
Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, 0, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#else
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch_idx][0] ), num_cldfb_bands * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#endif
Scale_sig32( hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) );
Q_out[ch_idx] = sub( Q_cldfb, 1 );
}
diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c
index 4e302cfa922187029188e490573ba6505e962da2..c4c551bc082239bc2995e456b9f01347ce69eb0e 100644
--- a/lib_isar/lib_isar_post_rend.c
+++ b/lib_isar/lib_isar_post_rend.c
@@ -1624,11 +1624,20 @@ static ivas_error renderSplitBinauralWithPostRot(
}
Q_cldfb = scaleFactor + Q_cldfb_final[sf_idx];
Scale_sig32( hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( sub( Q_cldfb, 1 ), Q11 ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
cldfbSynthesis_ivas_fx( RealBuffer_fx,
ImagBuffer_fx,
&( tmpCrendBuffer_fx[ch_idx][sf_idx * outBufNumSamplesPerChannel] ),
hSplitBin->hBinHrSplitPostRend->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES,
+ 0,
hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#else
+ cldfbSynthesis_ivas_fx( RealBuffer_fx,
+ ImagBuffer_fx,
+ &( tmpCrendBuffer_fx[ch_idx][sf_idx * outBufNumSamplesPerChannel] ),
+ hSplitBin->hBinHrSplitPostRend->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES,
+ hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx] ); // Q_cldfb - 1
+#endif
Scale_sig32( hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->cldfb_state_fx, hSplitBin->hBinHrSplitPostRend->cldfbSyn[ch_idx]->p_filter_length, sub( Q11, sub( Q_cldfb, 1 ) ) );
Q_out[sf_idx][ch_idx] = sub( Q_cldfb, 1 );
}
diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c
index 34d5de0e2ebec0e69696786953d7761804ac3f1e..ae7c28b0f121ba3085d9a49d0fe1bf01a6942327 100644
--- a/lib_isar/lib_isar_pre_rend.c
+++ b/lib_isar/lib_isar_pre_rend.c
@@ -520,7 +520,11 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural(
Q_cldfb = q_final;
move16();
Scale_sig32( hSplitBin->hCldfbHandles->cldfbSyn[ch]->cldfb_state_fx, hSplitBin->hCldfbHandles->cldfbSyn[ch]->p_filter_length, sub( sub( Q_cldfb, 1 ), hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1
+#else
cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1
+#endif
Q_out[ch] = sub( Q_cldfb, 1 );
move16();
hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state = Q_out[ch];
@@ -577,7 +581,11 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural(
Q_cldfb = q_final;
move16();
Scale_sig32( hSplitBin->hCldfbHandles->cldfbSyn[ch]->cldfb_state_fx, hSplitBin->hCldfbHandles->cldfbSyn[ch]->p_filter_length, sub( sub( Q_cldfb, 1 ), hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1
+#else
cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1
+#endif
Q_out[ch] = sub( Q_cldfb, 1 );
move16();
hSplitBin->hCldfbHandles->cldfbSyn[ch]->Q_cldfb_state = Q_out[ch];
diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c
index b224564f3bad4430481149ae5c789ec66a6a7fe5..08d70218c7ca8fa06e7e27e686e09b7ce7144bbb 100644
--- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c
+++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c
@@ -3689,15 +3689,23 @@ static void ivas_dirac_dec_binaural_process_output_fx(
if ( recompute == 1 )
{
/* Inverse filter bank */
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, cldfbSynDec[chA] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 );
move16();
}
#else
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, cldfbSynDec[chA] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 );
move16();
-#endif
+#endif /* SPLIT_REND_WITH_HEAD_ROT */
}
}
#ifdef SPLIT_REND_WITH_HEAD_ROT
diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c
index 6cf11887e247d3145595ff8c24455f75a7cf10f9..1b4ee91b20b3edc92728aad7dcf97d6766a8c469 100644
--- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c
+++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c
@@ -1333,22 +1333,22 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx(
sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); /*h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev->q_com*/
}
- /*Directional gain*/
- FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
+ FOR( l = 0; l < num_freq_bands; l++ )
{
- FOR( l = 0; l < num_freq_bands; l++ )
- {
- aux_buf[l] = L_sub( ONE_IN_Q30, diffuseness[l] ); // Q30
- move32();
- ratio_float[l] = L_sub( ONE_IN_Q31, h_dirac_output_synthesis_state.direct_power_factor_fx[num_freq_bands + l] ); // Q31
- move32();
- ratio_float[l + num_freq_bands] = L_sub( ONE_IN_Q31, ratio_float[l] ); // Q31
- move32();
- }
+ aux_buf[l] = L_sub( ONE_IN_Q30, diffuseness[l] ); // Q30
+ move32();
+ ratio_float[l] = L_sub( ONE_IN_Q31, h_dirac_output_synthesis_state.direct_power_factor_fx[num_freq_bands + l] ); // Q31
+ move32();
+ ratio_float[l + num_freq_bands] = L_sub( ONE_IN_Q31, ratio_float[l] ); // Q31
+ move32();
+ }
- v_mult_fixed( aux_buf, ratio_float, ratio_float, num_freq_bands ); //(Q30, Q31) -> Q30
- v_mult_fixed( aux_buf, &ratio_float[num_freq_bands], &ratio_float[num_freq_bands], num_freq_bands ); //(Q30, Q31) -> Q30
+ v_mult_fixed( aux_buf, ratio_float, ratio_float, num_freq_bands ); //(Q30, Q31) -> Q30
+ v_mult_fixed( aux_buf, &ratio_float[num_freq_bands], &ratio_float[num_freq_bands], num_freq_bands ); //(Q30, Q31) -> Q30
+ /*Directional gain*/
+ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
+ {
v_mult_fixed( ratio_float, // Q30
&h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31
&h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], //(Q30, Q31) -> Q30
@@ -1642,6 +1642,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx(
}
/*Directional stream*/
+ Word16 offset = shl( i_mult( buf_idx, i_mult( num_freq_bands, num_protos_dir ) ), Q1 );
FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
{
IF( hodirac_flag )
@@ -1709,7 +1710,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx(
ELSE
{
p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f_fx +
- shl( i_mult( buf_idx, i_mult( num_freq_bands, num_protos_dir ) ), Q1 ) +
+ offset +
shl( i_mult( proto_direct_index[ch_idx], num_freq_bands ), Q1 );
IF( EQ_16( proto_direct_index[ch_idx], 0 ) )
{
@@ -1781,11 +1782,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx(
}
ELSE
{
- FOR( l = 0; l < num_freq_bands_diff; l++ )
- {
- p_gains_diff++;
- p_gains_diff_prev++;
- }
+ p_gains_diff += num_freq_bands_diff;
+ p_gains_diff_prev += num_freq_bands_diff;
}
}
@@ -3725,7 +3723,7 @@ void ivas_lfe_synth_with_filters_fx(
/* Delay the separated channel to sync the LFE synthesis with the DirAC rendering */
delay = hMasaLfeSynth->delayBuffer_syncDirAC_size;
move16();
- delay_signal_fx( data_fx[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncDirAC_fx, delay ); /*q11*/
+ delay_signal32_fx( data_fx[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncDirAC_fx, delay ); /*q11*/
/* Filterbank for dividing the separated channel to LFE frequencies and higher frequencies */
lowpassCoef_fx_exp = 15;
@@ -3884,7 +3882,7 @@ void ivas_lfe_synth_with_filters_fx(
/* Delay the separated channel to match the delay of the lowpass filter */
delay = hMasaLfeSynth->delayBuffer_syncLp_size;
move16();
- delay_signal_fx( data_fx[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncLp_fx, delay ); /*q11*/
+ delay_signal32_fx( data_fx[separateChannelIndex], output_frame, hMasaLfeSynth->delayBuffer_syncLp_fx, delay ); /*q11*/
return;
}
diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c
index 031a398559667c2aa3cf1bc56a6390463e556889..4e0d3ab71e1f9eba35f4b6b6f05e73752ca4f5cf 100644
--- a/lib_rend/ivas_dirac_rend_fx.c
+++ b/lib_rend/ivas_dirac_rend_fx.c
@@ -870,6 +870,9 @@ ivas_error ivas_dirac_alloc_mem_fx(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
}
hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len = imult1616( imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, num_protos_dir ), num_freq_bands );
+#ifdef MSAN_FIX
+ set_zero_fx( hDirAC_mem->proto_direct_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len );
+#endif
move16();
hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q = Q31;
move16();
@@ -4212,7 +4215,11 @@ static void ivas_masa_ext_dirac_render_sf_fx(
ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; // q_cldfb
}
Word16 out_size = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, 0, hMasaExtRend->cldfbSynRend[idx_in] );
+#else /* OPT_SBA_AVOID_SPAR_RESCALE */
cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, hMasaExtRend->cldfbSynRend[idx_in] );
+#endif /* OPT_SBA_AVOID_SPAR_RESCALE */
scale_sig32( &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, sub( 11, q_out ) ); // q11
idx_in++;
}
diff --git a/lib_rend/ivas_td_decorr_fx.c b/lib_rend/ivas_td_decorr_fx.c
index 0c842e5bd97cc89da8857bff6bd6449d11fb62b7..14795da41b11854851fec67f7a8b67321ef0c517 100644
--- a/lib_rend/ivas_td_decorr_fx.c
+++ b/lib_rend/ivas_td_decorr_fx.c
@@ -485,7 +485,7 @@ void ivas_td_decorr_process_fx(
/* Look-ahead delay */
Copy32( pcm_in[0], ppOut_pcm[0], output_frame );
- delay_signal_fx( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset );
+ delay_signal32_fx( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset );
/* In ducking gains */
IF( hTdDecorr->ducking_flag )
diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c
index e198586df4a3b9b6ecea3fe642f137c5fbe76df0..0dbbef51712484f5af76415e6cabe0502eb9c09c 100644
--- a/lib_rend/lib_rend.c
+++ b/lib_rend/lib_rend.c
@@ -9347,7 +9347,11 @@ void IVAS_REND_cldfbSynthesis_wrapper(
{
Scale_sig32( h_cldfb->cldfb_state_fx, h_cldfb->p_filter_length, sub( sub( Q_cldfb, 1 ), h_cldfb->Q_cldfb_state ) );
+#ifdef OPT_SBA_AVOID_SPAR_RESCALE
+ cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, timeOut, samplesToProcess, 0, h_cldfb ); // Q_cldfb - 1
+#else
cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, timeOut, samplesToProcess, h_cldfb ); // Q_cldfb - 1
+#endif
*Q_out = sub( Q_cldfb, 1 );
move16();
h_cldfb->Q_cldfb_state = *Q_out;