Loading lib_com/delay_comp.c +10 −10 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ *--------------------------------------------------------------------------*/ /*! r: delay value in ns */ #ifndef IVAS_FLOAT_FIXED int32_t get_delay( const int16_t enc_dec, /* i : encoder/decoder flag */ const int32_t io_fs, /* i : input/output sampling frequency */ Loading Loading @@ -111,13 +112,7 @@ int32_t get_delay( return delay; } /*-------------------------------------------------------------------------- * get_delay_fx() * * Function returns various types of delays in the codec in ns. *--------------------------------------------------------------------------*/ #else Word32 get_delay_fx( /* o : delay value in ms */ const Word16 what_delay, /* i : what delay? (ENC or DEC) */ const Word32 io_fs, /* i : input/output sampling frequency */ Loading @@ -130,6 +125,7 @@ Word32 get_delay_fx( /* o : delay value in ms ) { Word32 delay = 0; move32(); IF( EQ_16( what_delay, ENC ) ) { Loading @@ -141,17 +137,19 @@ Word32 get_delay_fx( /* o : delay value in ms ELSE { delay = IVAS_ENC_DELAY_NS; move32(); test(); IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay = 0; /* All delay is compensated in the decoder with MASA */ move32(); } } test(); IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) { /* compensate for DirAC/SPAR filterbank delay */ delay += IVAS_FB_ENC_DELAY_NS; delay = L_add( delay, IVAS_FB_ENC_DELAY_NS ); } } ELSE Loading @@ -172,6 +170,7 @@ Word32 get_delay_fx( /* o : delay value in ms ELSE /* IVAS */ { delay = IVAS_DEC_DELAY_NS; move32(); #ifdef SPLIT_REND_WITH_HEAD_ROT Loading @@ -181,7 +180,7 @@ Word32 get_delay_fx( /* o : delay value in ms IF( hCldfb != NULL ) { /* compensate for filterbank delay */ delay += IVAS_FB_DEC_DELAY_NS; delay = L_add( delay, IVAS_FB_DEC_DELAY_NS ); } #ifdef SPLIT_REND_WITH_HEAD_ROT } Loading @@ -189,10 +188,11 @@ Word32 get_delay_fx( /* o : delay value in ms test(); IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ delay = L_add( delay, IVAS_ENC_DELAY_NS ); /* Compensate also the encoder delay in the decoder with MASA */ } } } return delay; } #endif lib_com/ivas_qmetadata_com.c +12 −11 Original line number Diff line number Diff line Loading @@ -466,6 +466,7 @@ void ivas_qmetadata_close( *------------------------------------------------------------------------*/ /*! r: codeword index */ #ifndef IVAS_FLOAT_FIXED int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ Loading @@ -484,8 +485,7 @@ int16_t masa_sq( return -1; } #ifdef IVAS_FLOAT_FIXED #else Word16 masa_sq_fx( const Word32 in, /* i : input value */ const Word32 *threshold, /* i : partition */ Loading Loading @@ -728,7 +728,7 @@ ivas_error only_reduce_bits_direction_fx( return IVAS_ERR_OK; } #endif #else ivas_error only_reduce_bits_direction( int16_t *reduce_bits_out, IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Loading Loading @@ -834,6 +834,7 @@ ivas_error only_reduce_bits_direction( return IVAS_ERR_OK; } #endif /*--------------------------------------------------------------- Loading Loading @@ -940,6 +941,7 @@ void update_bits_next_block( * Inverse DCT transform for 4D vector *---------------------------------------------------------------*/ #ifndef IVAS_FLOAT_FIXED void invdct4_transform( float *v, /* i : input vector */ uint8_t *invdct_v /* o : inverse transformed vector */ Loading Loading @@ -976,8 +978,7 @@ void invdct4_transform( return; } #ifdef IVAS_FLOAT_FIXED #else void invdct4_transform_fx( Word32 *v_fx, /* i : input vector */ UWord8 *invdct_v, /* o : inverse transformed vector */ Loading Loading @@ -1052,7 +1053,7 @@ void masa_compensate_two_dir_energy_ratio_index_fx( return; } #endif #else void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ Loading Loading @@ -1091,7 +1092,7 @@ void masa_compensate_two_dir_energy_ratio_index( return; } #endif /*--------------------------------------------------------------- * set_qmetadata_maxbit_req() Loading Loading @@ -1144,6 +1145,7 @@ void ivas_set_qmetadata_maxbit_req( * *------------------------------------------------------------------------*/ #ifndef IVAS_FLOAT_FIXED void ivas_qmetadata_azimuth_elevation_to_direction_vector( const float az, /* i : azimuth */ const float el, /* i : elevation */ Loading @@ -1160,8 +1162,7 @@ void ivas_qmetadata_azimuth_elevation_to_direction_vector( return; } #ifdef IVAS_FLOAT_FIXED #else void ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( const Word32 az, /* i : azimuth */ const Word32 el, /* i : elevation */ Loading @@ -1171,8 +1172,8 @@ void ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( Word16 radius_length; Word16 elevation_fx, azimuth_fx; elevation_fx = extract_l( L_shr( Mpy_32_16_1( el, 91 ), 7 ) ); azimuth_fx = extract_l( L_shr( Mpy_32_16_1( az, 91 ), 7 ) ); elevation_fx = extract_l( L_shr( Mpy_32_32( el, 5965232 ), 7 ) ); azimuth_fx = extract_l( L_shr( Mpy_32_32( az, 5965232 ), 7 ) ); dv[2] = L_shl( getSineWord16R2( elevation_fx ), Q15 ); /* Q30 */ move32(); Loading lib_com/ivas_stereo_dft_com.c +65 −75 Original line number Diff line number Diff line Loading @@ -43,13 +43,13 @@ #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Loading Loading @@ -195,80 +195,7 @@ void stereo_dft_config_fx( return; } /*------------------------------------------------------------------------- * stereo_dft_band_config() * * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #endif /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ #else void stereo_dft_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t brate, /* i : IVAS/CPE/nominal total bitrate */ Loading Loading @@ -378,6 +305,7 @@ void stereo_dft_config( return; } #endif /*------------------------------------------------------------------------- * stereo_dft_band_config() Loading @@ -385,6 +313,67 @@ void stereo_dft_config( * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( enc_dec == ENC ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( enc_dec == ENC ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #else int16_t stereo_dft_band_config( int16_t *band_limits, /* o : DFT band limits */ const int16_t band_res, /* i : DFT band resolution */ Loading Loading @@ -437,3 +426,4 @@ int16_t stereo_dft_band_config( return ( nbands ); } #endif lib_com/ivas_stereo_mdct_bands_com.c +49 −31 Original line number Diff line number Diff line Loading @@ -84,47 +84,54 @@ void stereo_mdct_init_bands_fx( IF( tmp_tcx_mode > 0 ) { tcx_mode = tmp_tcx_mode; L_frameTCX = ( tcx_mode == TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); move16(); L_frameTCX = EQ_16( tcx_mode, TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); move16(); } ELSE { /*transition frame*/ L_frameTCX = L_frame + L_frame / 4; L_frameTCX = add( L_frame, L_frame / 4 ); tcx_mode = TCX_20_CORE; move16(); } /* select table */ IF( L_frame == L_FRAME48k ) IF( EQ_16( L_frame, L_FRAME48k ) ) { sfbParam.steBands = mdctStereoBands_32000_640; cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0]; move16(); sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; } ELSE { IF( element_brate < IVAS_96k ) IF( LT_32( element_brate, IVAS_96k ) ) { sfbParam.steBands = mdctStereoBands_32000_640; SWITCH( L_frame ) { case L_FRAME32k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1]; move16(); BREAK; case L_FRAME25_6k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2]; move16(); BREAK; case L_FRAME16k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3]; move16(); BREAK; default: assert( !"Subband division not defined for this frame size" ); return; } sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; } ELSE { Loading @@ -145,33 +152,40 @@ void stereo_mdct_init_bands_fx( return; } sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10; cnt = 64; move16(); } } /* calc sfb offsets */ specStartOffset = 0; move16(); FOR( i = 0; i < cnt; i++ ) { sfbOffset[i] = min( specStartOffset, L_frameTCX ); specStartOffset += sfbWidths[i]; sfbOffset[i] = s_min( specStartOffset, L_frameTCX ); move16(); specStartOffset = add( specStartOffset, sfbWidths[i] ); IF( sfbOffset[i] >= L_frameTCX ) IF( GE_16( sfbOffset[i], L_frameTCX ) ) { BREAK; } } *sfbCnt = i; sfbOffset[*sfbCnt] = min( specStartOffset, L_frameTCX ); move16(); sfbOffset[*sfbCnt] = s_min( specStartOffset, L_frameTCX ); move16(); IF( igf ) { Word16 sfbOldCnt = *sfbCnt; Word16 igfSfbStep = hIgfGrid->infoIsRefined ? 2 : 1; Word16 k; move16(); move16(); /* modify sfb bands according to igf grid */ assert( hIgfGrid != NULL ); Loading @@ -179,44 +193,49 @@ void stereo_mdct_init_bands_fx( /* find sfb where IGF starts */ FOR( i = 0; i <= *sfbCnt; i++ ) { IF( sfbOffset[i] >= hIgfGrid->startLine ) IF( GE_16( sfbOffset[i], hIgfGrid->startLine ) ) { /* set band border to igf start line */ sfbOffset[i] = hIgfGrid->startLine; move16(); *sfbCnt = i; move16(); BREAK; } } /* change bands above the igf start line to match igf bands */ for ( i = 1, k = igfSfbStep; i < hIgfGrid->swb_offset_len; i++, k += igfSfbStep ) FOR( ( i = 1, k = igfSfbStep ); i < hIgfGrid->swb_offset_len; ( i++, k += igfSfbStep ) ) { sfbOffset[*sfbCnt + i] = hIgfGrid->swb_offset[k]; sfbOffset[add( *sfbCnt, i )] = hIgfGrid->swb_offset[k]; move16(); } *sfbCnt += ( hIgfGrid->swb_offset_len - 1 ); *sfbCnt = add( *sfbCnt, sub( hIgfGrid->swb_offset_len, 1 ) ); move16(); /* better save than sorry, overwrite anything that is left above */ FOR( i = *sfbCnt + 1; i < sfbOldCnt + 1; i++ ) { sfbOffset[i] = 0; move16(); } } ELSE { IF( sfbOffset[*sfbCnt] < L_frameTCX ) IF( LT_16( sfbOffset[*sfbCnt], L_frameTCX ) ) { Word16 nMissingBins = L_frameTCX - sfbOffset[*sfbCnt]; IF( sfbWidths[i] / 2 < nMissingBins ) Word16 nMissingBins = sub( L_frameTCX, sfbOffset[*sfbCnt] ); if ( LT_16( sfbWidths[i] / 2, nMissingBins ) ) { ( *sfbCnt )++; } sfbOffset[*sfbCnt] = L_frameTCX; move16(); } } return; } #endif #else void stereo_mdct_init_bands( const int16_t L_frame, /* i : frame length */ const int16_t tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ Loading Loading @@ -365,6 +384,7 @@ void stereo_mdct_init_bands( } return; } #endif /*-------------------------------------------------------------------* * stereo_mdct_init_igf_start_band() Loading @@ -389,20 +409,21 @@ void stereo_mdct_init_igf_start_band_fx( FOR( i = 0; i < stbParams->sfbCnt; i++ ) { IF( igfStartLine == stbParams->sfbOffset[i] ) IF( EQ_16( igfStartLine, stbParams->sfbOffset[i] ) ) { stbParams->sfbIgfStart = i; move16(); BREAK; } } stbParams->nBandsStereoCore = stbParams->sfbIgfStart; move16(); return; } #endif #else void stereo_mdct_init_igf_start_band( STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ const float transFac, /* i : transform factor */ Loading @@ -413,11 +434,7 @@ void stereo_mdct_init_igf_start_band( int16_t i, bitRateIndex, igfStartLine; const int16_t *swb_offset; #ifdef IVAS_FLOAT_FIXED bitRateIndex = IGF_MapBitRateToIndex( element_brate, bwidth, IVAS_CPE_MDCT, 0 ); #else bitRateIndex = IGF_MapBitRateToIndex_flt( element_brate, bwidth, IVAS_CPE_MDCT, 0 ); #endif swb_offset = &swb_offset_LB_new[bitRateIndex][1]; igfStartLine = IGF_ApplyTransFac_flt( swb_offset[0], transFac ); Loading @@ -435,3 +452,4 @@ void stereo_mdct_init_igf_start_band( return; } #endif lib_com/ivas_stereo_mdct_stereo_com.c +12 −15 Original line number Diff line number Diff line Loading @@ -42,14 +42,13 @@ #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED #define POINT_2_Q15 6554 /*-------------------------------------------------------------------* * splitAvailableBits() * * split available bits between channels based on the split ratio *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void splitAvailableBits_fx( const Word16 total_bits, /* i : total available bits for TCX coding */ const Word16 split_ratio, /* i : split ratio */ Loading @@ -60,25 +59,22 @@ void splitAvailableBits_fx( { assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; /* *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; */ *bits_ch0 = extract_l( L_mult0( split_ratio, total_bits ) / SMDCT_BITRATE_RATIO_RANGE ); move16(); /* for SBA mode bias the distribution towards the W channel */ if ( split_ratio < 7 && isSBAStereoMode ) test(); IF( LT_16( split_ratio, 7 ) && isSBAStereoMode ) { //*bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); *bits_ch0 += (Word16) ( Mpy_32_16_1( 6554, *bits_ch0 ) ); // 0.2 in Q15 *bits_ch0 = add( *bits_ch0, extract_l( Mpy_32_16_1( 6554 /* 0.2 in Q15 */, *bits_ch0 ) ) ); move16(); } *bits_ch1 = total_bits - *bits_ch0; *bits_ch1 = sub( total_bits, *bits_ch0 ); move16(); return; } #endif /*-------------------------------------------------------------------* * splitAvailableBits() * * split available bits between channels based on the split ratio *-------------------------------------------------------------------*/ #else void splitAvailableBits( const int16_t total_bits, /* i : total available bits for TCX coding */ const int16_t split_ratio, /* i : split ratio */ Loading @@ -99,3 +95,4 @@ void splitAvailableBits( return; } #endif Loading
lib_com/delay_comp.c +10 −10 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ *--------------------------------------------------------------------------*/ /*! r: delay value in ns */ #ifndef IVAS_FLOAT_FIXED int32_t get_delay( const int16_t enc_dec, /* i : encoder/decoder flag */ const int32_t io_fs, /* i : input/output sampling frequency */ Loading Loading @@ -111,13 +112,7 @@ int32_t get_delay( return delay; } /*-------------------------------------------------------------------------- * get_delay_fx() * * Function returns various types of delays in the codec in ns. *--------------------------------------------------------------------------*/ #else Word32 get_delay_fx( /* o : delay value in ms */ const Word16 what_delay, /* i : what delay? (ENC or DEC) */ const Word32 io_fs, /* i : input/output sampling frequency */ Loading @@ -130,6 +125,7 @@ Word32 get_delay_fx( /* o : delay value in ms ) { Word32 delay = 0; move32(); IF( EQ_16( what_delay, ENC ) ) { Loading @@ -141,17 +137,19 @@ Word32 get_delay_fx( /* o : delay value in ms ELSE { delay = IVAS_ENC_DELAY_NS; move32(); test(); IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay = 0; /* All delay is compensated in the decoder with MASA */ move32(); } } test(); IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) { /* compensate for DirAC/SPAR filterbank delay */ delay += IVAS_FB_ENC_DELAY_NS; delay = L_add( delay, IVAS_FB_ENC_DELAY_NS ); } } ELSE Loading @@ -172,6 +170,7 @@ Word32 get_delay_fx( /* o : delay value in ms ELSE /* IVAS */ { delay = IVAS_DEC_DELAY_NS; move32(); #ifdef SPLIT_REND_WITH_HEAD_ROT Loading @@ -181,7 +180,7 @@ Word32 get_delay_fx( /* o : delay value in ms IF( hCldfb != NULL ) { /* compensate for filterbank delay */ delay += IVAS_FB_DEC_DELAY_NS; delay = L_add( delay, IVAS_FB_DEC_DELAY_NS ); } #ifdef SPLIT_REND_WITH_HEAD_ROT } Loading @@ -189,10 +188,11 @@ Word32 get_delay_fx( /* o : delay value in ms test(); IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ delay = L_add( delay, IVAS_ENC_DELAY_NS ); /* Compensate also the encoder delay in the decoder with MASA */ } } } return delay; } #endif
lib_com/ivas_qmetadata_com.c +12 −11 Original line number Diff line number Diff line Loading @@ -466,6 +466,7 @@ void ivas_qmetadata_close( *------------------------------------------------------------------------*/ /*! r: codeword index */ #ifndef IVAS_FLOAT_FIXED int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ Loading @@ -484,8 +485,7 @@ int16_t masa_sq( return -1; } #ifdef IVAS_FLOAT_FIXED #else Word16 masa_sq_fx( const Word32 in, /* i : input value */ const Word32 *threshold, /* i : partition */ Loading Loading @@ -728,7 +728,7 @@ ivas_error only_reduce_bits_direction_fx( return IVAS_ERR_OK; } #endif #else ivas_error only_reduce_bits_direction( int16_t *reduce_bits_out, IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ Loading Loading @@ -834,6 +834,7 @@ ivas_error only_reduce_bits_direction( return IVAS_ERR_OK; } #endif /*--------------------------------------------------------------- Loading Loading @@ -940,6 +941,7 @@ void update_bits_next_block( * Inverse DCT transform for 4D vector *---------------------------------------------------------------*/ #ifndef IVAS_FLOAT_FIXED void invdct4_transform( float *v, /* i : input vector */ uint8_t *invdct_v /* o : inverse transformed vector */ Loading Loading @@ -976,8 +978,7 @@ void invdct4_transform( return; } #ifdef IVAS_FLOAT_FIXED #else void invdct4_transform_fx( Word32 *v_fx, /* i : input vector */ UWord8 *invdct_v, /* o : inverse transformed vector */ Loading Loading @@ -1052,7 +1053,7 @@ void masa_compensate_two_dir_energy_ratio_index_fx( return; } #endif #else void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ Loading Loading @@ -1091,7 +1092,7 @@ void masa_compensate_two_dir_energy_ratio_index( return; } #endif /*--------------------------------------------------------------- * set_qmetadata_maxbit_req() Loading Loading @@ -1144,6 +1145,7 @@ void ivas_set_qmetadata_maxbit_req( * *------------------------------------------------------------------------*/ #ifndef IVAS_FLOAT_FIXED void ivas_qmetadata_azimuth_elevation_to_direction_vector( const float az, /* i : azimuth */ const float el, /* i : elevation */ Loading @@ -1160,8 +1162,7 @@ void ivas_qmetadata_azimuth_elevation_to_direction_vector( return; } #ifdef IVAS_FLOAT_FIXED #else void ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( const Word32 az, /* i : azimuth */ const Word32 el, /* i : elevation */ Loading @@ -1171,8 +1172,8 @@ void ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( Word16 radius_length; Word16 elevation_fx, azimuth_fx; elevation_fx = extract_l( L_shr( Mpy_32_16_1( el, 91 ), 7 ) ); azimuth_fx = extract_l( L_shr( Mpy_32_16_1( az, 91 ), 7 ) ); elevation_fx = extract_l( L_shr( Mpy_32_32( el, 5965232 ), 7 ) ); azimuth_fx = extract_l( L_shr( Mpy_32_32( az, 5965232 ), 7 ) ); dv[2] = L_shl( getSineWord16R2( elevation_fx ), Q15 ); /* Q30 */ move32(); Loading
lib_com/ivas_stereo_dft_com.c +65 −75 Original line number Diff line number Diff line Loading @@ -43,13 +43,13 @@ #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void stereo_dft_config_fx( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const Word32 brate, /* i : IVAS/CPE/nominal total bitrate */ Loading Loading @@ -195,80 +195,7 @@ void stereo_dft_config_fx( return; } /*------------------------------------------------------------------------- * stereo_dft_band_config() * * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( EQ_16( enc_dec, ENC ) ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #endif /*------------------------------------------------------------------------- * stereo_dft_config() * * DFT Stereo Configuration function *------------------------------------------------------------------------*/ #else void stereo_dft_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t brate, /* i : IVAS/CPE/nominal total bitrate */ Loading Loading @@ -378,6 +305,7 @@ void stereo_dft_config( return; } #endif /*------------------------------------------------------------------------- * stereo_dft_band_config() Loading @@ -385,6 +313,67 @@ void stereo_dft_config( * Stereo DFT bands condfiguration *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED Word16 stereo_dft_band_config_fx( Word16 *band_limits, /* o : DFT band limits */ const Word16 band_res, /* i : DFT band resolution */ const Word16 NFFT, /* i : analysis/synthesis window length */ const Word16 enc_dec /* i : flag to indicate enc vs dec */ ) { Word16 nbands; /*sanity check*/ assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) { IF( EQ_16( band_res, 0 ) ) { assert( 0 && "stereo DFT: band config failed!\n" ); } ELSE IF( EQ_16( band_res, 1 ) ) { IF( enc_dec == ENC ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb4[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB4_BANDS ) ) && "stereo DFT: band config failed!\n" ); } ELSE { IF( enc_dec == ENC ) { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 2 ), 26214 /* 1.60000002 in Q14 */ ) ); move16(); } ELSE { band_limits[nbands] = round_fx( L_mult0( shl( dft_band_limits_erb8[nbands], 1 ), 26214 /* 0.800000012 in Q14 */ ) ); move16(); } assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } nbands = sub( nbands, 1 ); band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); return ( nbands ); } #else int16_t stereo_dft_band_config( int16_t *band_limits, /* o : DFT band limits */ const int16_t band_res, /* i : DFT band resolution */ Loading Loading @@ -437,3 +426,4 @@ int16_t stereo_dft_band_config( return ( nbands ); } #endif
lib_com/ivas_stereo_mdct_bands_com.c +49 −31 Original line number Diff line number Diff line Loading @@ -84,47 +84,54 @@ void stereo_mdct_init_bands_fx( IF( tmp_tcx_mode > 0 ) { tcx_mode = tmp_tcx_mode; L_frameTCX = ( tcx_mode == TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); move16(); L_frameTCX = EQ_16( tcx_mode, TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); move16(); } ELSE { /*transition frame*/ L_frameTCX = L_frame + L_frame / 4; L_frameTCX = add( L_frame, L_frame / 4 ); tcx_mode = TCX_20_CORE; move16(); } /* select table */ IF( L_frame == L_FRAME48k ) IF( EQ_16( L_frame, L_FRAME48k ) ) { sfbParam.steBands = mdctStereoBands_32000_640; cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0]; move16(); sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; } ELSE { IF( element_brate < IVAS_96k ) IF( LT_32( element_brate, IVAS_96k ) ) { sfbParam.steBands = mdctStereoBands_32000_640; SWITCH( L_frame ) { case L_FRAME32k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1]; move16(); BREAK; case L_FRAME25_6k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2]; move16(); BREAK; case L_FRAME16k: cnt = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3] ); cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3]; move16(); BREAK; default: assert( !"Subband division not defined for this frame size" ); return; } sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; } ELSE { Loading @@ -145,33 +152,40 @@ void stereo_mdct_init_bands_fx( return; } sfbWidths = ( tcx_mode == TCX_20_CORE ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10 ); sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10; cnt = 64; move16(); } } /* calc sfb offsets */ specStartOffset = 0; move16(); FOR( i = 0; i < cnt; i++ ) { sfbOffset[i] = min( specStartOffset, L_frameTCX ); specStartOffset += sfbWidths[i]; sfbOffset[i] = s_min( specStartOffset, L_frameTCX ); move16(); specStartOffset = add( specStartOffset, sfbWidths[i] ); IF( sfbOffset[i] >= L_frameTCX ) IF( GE_16( sfbOffset[i], L_frameTCX ) ) { BREAK; } } *sfbCnt = i; sfbOffset[*sfbCnt] = min( specStartOffset, L_frameTCX ); move16(); sfbOffset[*sfbCnt] = s_min( specStartOffset, L_frameTCX ); move16(); IF( igf ) { Word16 sfbOldCnt = *sfbCnt; Word16 igfSfbStep = hIgfGrid->infoIsRefined ? 2 : 1; Word16 k; move16(); move16(); /* modify sfb bands according to igf grid */ assert( hIgfGrid != NULL ); Loading @@ -179,44 +193,49 @@ void stereo_mdct_init_bands_fx( /* find sfb where IGF starts */ FOR( i = 0; i <= *sfbCnt; i++ ) { IF( sfbOffset[i] >= hIgfGrid->startLine ) IF( GE_16( sfbOffset[i], hIgfGrid->startLine ) ) { /* set band border to igf start line */ sfbOffset[i] = hIgfGrid->startLine; move16(); *sfbCnt = i; move16(); BREAK; } } /* change bands above the igf start line to match igf bands */ for ( i = 1, k = igfSfbStep; i < hIgfGrid->swb_offset_len; i++, k += igfSfbStep ) FOR( ( i = 1, k = igfSfbStep ); i < hIgfGrid->swb_offset_len; ( i++, k += igfSfbStep ) ) { sfbOffset[*sfbCnt + i] = hIgfGrid->swb_offset[k]; sfbOffset[add( *sfbCnt, i )] = hIgfGrid->swb_offset[k]; move16(); } *sfbCnt += ( hIgfGrid->swb_offset_len - 1 ); *sfbCnt = add( *sfbCnt, sub( hIgfGrid->swb_offset_len, 1 ) ); move16(); /* better save than sorry, overwrite anything that is left above */ FOR( i = *sfbCnt + 1; i < sfbOldCnt + 1; i++ ) { sfbOffset[i] = 0; move16(); } } ELSE { IF( sfbOffset[*sfbCnt] < L_frameTCX ) IF( LT_16( sfbOffset[*sfbCnt], L_frameTCX ) ) { Word16 nMissingBins = L_frameTCX - sfbOffset[*sfbCnt]; IF( sfbWidths[i] / 2 < nMissingBins ) Word16 nMissingBins = sub( L_frameTCX, sfbOffset[*sfbCnt] ); if ( LT_16( sfbWidths[i] / 2, nMissingBins ) ) { ( *sfbCnt )++; } sfbOffset[*sfbCnt] = L_frameTCX; move16(); } } return; } #endif #else void stereo_mdct_init_bands( const int16_t L_frame, /* i : frame length */ const int16_t tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ Loading Loading @@ -365,6 +384,7 @@ void stereo_mdct_init_bands( } return; } #endif /*-------------------------------------------------------------------* * stereo_mdct_init_igf_start_band() Loading @@ -389,20 +409,21 @@ void stereo_mdct_init_igf_start_band_fx( FOR( i = 0; i < stbParams->sfbCnt; i++ ) { IF( igfStartLine == stbParams->sfbOffset[i] ) IF( EQ_16( igfStartLine, stbParams->sfbOffset[i] ) ) { stbParams->sfbIgfStart = i; move16(); BREAK; } } stbParams->nBandsStereoCore = stbParams->sfbIgfStart; move16(); return; } #endif #else void stereo_mdct_init_igf_start_band( STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ const float transFac, /* i : transform factor */ Loading @@ -413,11 +434,7 @@ void stereo_mdct_init_igf_start_band( int16_t i, bitRateIndex, igfStartLine; const int16_t *swb_offset; #ifdef IVAS_FLOAT_FIXED bitRateIndex = IGF_MapBitRateToIndex( element_brate, bwidth, IVAS_CPE_MDCT, 0 ); #else bitRateIndex = IGF_MapBitRateToIndex_flt( element_brate, bwidth, IVAS_CPE_MDCT, 0 ); #endif swb_offset = &swb_offset_LB_new[bitRateIndex][1]; igfStartLine = IGF_ApplyTransFac_flt( swb_offset[0], transFac ); Loading @@ -435,3 +452,4 @@ void stereo_mdct_init_igf_start_band( return; } #endif
lib_com/ivas_stereo_mdct_stereo_com.c +12 −15 Original line number Diff line number Diff line Loading @@ -42,14 +42,13 @@ #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED #define POINT_2_Q15 6554 /*-------------------------------------------------------------------* * splitAvailableBits() * * split available bits between channels based on the split ratio *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void splitAvailableBits_fx( const Word16 total_bits, /* i : total available bits for TCX coding */ const Word16 split_ratio, /* i : split ratio */ Loading @@ -60,25 +59,22 @@ void splitAvailableBits_fx( { assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; /* *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; */ *bits_ch0 = extract_l( L_mult0( split_ratio, total_bits ) / SMDCT_BITRATE_RATIO_RANGE ); move16(); /* for SBA mode bias the distribution towards the W channel */ if ( split_ratio < 7 && isSBAStereoMode ) test(); IF( LT_16( split_ratio, 7 ) && isSBAStereoMode ) { //*bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); *bits_ch0 += (Word16) ( Mpy_32_16_1( 6554, *bits_ch0 ) ); // 0.2 in Q15 *bits_ch0 = add( *bits_ch0, extract_l( Mpy_32_16_1( 6554 /* 0.2 in Q15 */, *bits_ch0 ) ) ); move16(); } *bits_ch1 = total_bits - *bits_ch0; *bits_ch1 = sub( total_bits, *bits_ch0 ); move16(); return; } #endif /*-------------------------------------------------------------------* * splitAvailableBits() * * split available bits between channels based on the split ratio *-------------------------------------------------------------------*/ #else void splitAvailableBits( const int16_t total_bits, /* i : total available bits for TCX coding */ const int16_t split_ratio, /* i : split ratio */ Loading @@ -99,3 +95,4 @@ void splitAvailableBits( return; } #endif