Loading lib_com/ivas_cnst.h +2 −2 Original line number Diff line number Diff line Loading @@ -636,8 +636,8 @@ typedef enum #define SBA_DIRAC_NRG_SMOOTH_LONG 10 #define SBA_DIRAC_NRG_SMOOTH_SHORT 3 #define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX ((Word16)0x2666) #define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX ((Word32)0x0000B6D8) #define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX ((Word16)0x2667) #define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX ((Word32)0x5B6DB6DB) /* PLC for DFT Stereo residual */ #define STEREO_DFT_RES_N_PEAKS_MAX 15 /*Maximum number of peaks within residual signal in each frame (res_cod_band_max == 6 in 48kHz)*/ Loading lib_com/ivas_prot_fx.h +3 −2 Original line number Diff line number Diff line Loading @@ -475,7 +475,8 @@ void filter_with_allpass_fx( const Word32 *sig, /* i : allpass input signal */ Word32 *out, /* o : filtered output */ const int16_t len, /* i : length of input */ basic_allpass_t *ap /* i/o: basic allpass structure */ basic_allpass_t *ap, /* i/o: basic allpass structure */ Word16 q_shift ); Word32 stereo_dft_dmx_swb_nrg_fx( Loading Loading @@ -1524,7 +1525,7 @@ void ivas_hq_pred_hb_bws_fx( ); void synchro_synthesis_fixed_clean( const Word16 ivas_total_brate, /* i : IVAS total bitrate */ const Word32 ivas_total_brate, /* i : IVAS total bitrate */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i/o: output synthesis signal */ const Word16 output_frame, /* i : Number of samples */ Loading lib_com/lerp.c +105 −7 Original line number Diff line number Diff line Loading @@ -383,6 +383,102 @@ static void lerp_proc(Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 buf } static void lerp_proc32(Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize) { Word16 i, idx, n; Word16 diff; Word32 pos, shift; Word32 buf[2 * L_FRAME_MAX]; Word32 *ptr; ptr = f_out; test(); test(); test(); IF (((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f))) { ptr = buf; move16(); } IF(EQ_16(bufferNewSize, bufferOldSize)) { Copy32(f, f_out, bufferNewSize); return; } shift = L_shl(L_deposit_l(div_s(bufferOldSize, shl(bufferNewSize, 4))), 4 - shift_e + 16); pos = L_sub(L_shr(shift, 1), 32768l/*1.0f Q15*/); /* Adjust interpolation shift to avoid accessing beyond end of input buffer. */ if (LT_32(shift, 19661l/*0.3f Q16*/)) { pos = L_sub(pos, 8520l/*0.13f Q16*/); } assert(pos_e == shift_e); /* first point of interpolation */ IF(pos < 0) { diff = shr(extract_l(pos), 1); /*buf[0]=f[0]+pos*(f[1]-f[0]);*/ move16(); *ptr++ = L_add_sat(f[0], Mpy_32_16_1(L_sub(f[1], f[0]), diff)); } ELSE { idx = extract_h(pos); diff = lshr(extract_l(pos), 1); move16(); *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff)); } pos = L_add(pos, shift); idx = s_max(0, extract_h(pos)); n = sub(bufferNewSize, 1); FOR(i = 1; i < n; i++) { diff = lshr(extract_l(pos), 1); IF (LT_32(pos , 0)) { diff = sub(16384/*0.5f Q15*/, diff); } move16(); *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff)); pos = L_add(pos, shift); idx = extract_h(pos); } /* last point */ IF (GT_32(pos, L_deposit_h(sub(bufferOldSize, 1)))) { idx = sub(bufferOldSize, 2); } assert(idx <= 2 * L_FRAME_MAX); /* diff = t - point;*/ diff = lshr(extract_l(L_shr(L_sub(pos, L_deposit_h(idx)), 1)), 1); move16(); *ptr++ = L_add_sat(f[idx], L_shl_sat(Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff), 1)); test(); test(); test(); IF(((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f))) { Copy32(buf, f_out, bufferNewSize); } } #ifdef IVAS_FLOAT_FIXED static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 bufferNewSize, const Word16 bufferOldSize ); Loading @@ -397,10 +493,12 @@ void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOld { Word16 tmpNewSize; Word16 guard_bits = s_max(find_guarded_bits_fx(bufferNewSize / bufferOldSize), find_guarded_bits_fx(bufferOldSize / bufferNewSize)) + 1; q -= guard_bits; IF (getScaleFactor32(f, bufferOldSize) < guard_bits) { *q -= guard_bits; FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f[ind] = L_shr(f[ind], guard_bits); FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f_out[ind] = L_shr(f_out[ind], guard_bits); } IF ( 128 * bufferNewSize > bufferOldSize * 507 ) { Loading Loading @@ -457,7 +555,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe tmpNewSize = bufferNewSize; } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; Loading @@ -474,7 +572,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe tmpNewSize = bufferNewSize; } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; Loading @@ -483,7 +581,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe } ELSE { L_lerp_proc_fx( f, f_out, bufferNewSize, bufferOldSize ); lerp_proc32(f, f_out, bufferNewSize, bufferOldSize); } return; Loading lib_com/prot.h +8 −0 Original line number Diff line number Diff line Loading @@ -500,6 +500,14 @@ void delay_signal_fx( Word32 mem[], /* i/o: synchronization memory */ const int16_t delay /* i : delay in samples */ ); void delay_signal_q_adj_fx( Word32 x[], /* i/o: signal to be delayed */ const int16_t len, /* i : length of the input signal */ Word32 mem[], /* i/o: synchronization memory */ const int16_t delay, /* i : delay in samples */ const Word16 q_x, const Word16 q_mem ); #endif ivas_error push_indice( Loading lib_com/prot_fx2.h +1 −1 Original line number Diff line number Diff line Loading @@ -2400,7 +2400,7 @@ void calc_normal_length_fx( Word16 Q_syn ); Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ const Word32 *sp, /* i : i signal */ const Word16 exp_sp, /* i : Exp of inp signal */ const Word16 N /* i : signal length */ Loading Loading
lib_com/ivas_cnst.h +2 −2 Original line number Diff line number Diff line Loading @@ -636,8 +636,8 @@ typedef enum #define SBA_DIRAC_NRG_SMOOTH_LONG 10 #define SBA_DIRAC_NRG_SMOOTH_SHORT 3 #define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX ((Word16)0x2666) #define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX ((Word32)0x0000B6D8) #define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX ((Word16)0x2667) #define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX ((Word32)0x5B6DB6DB) /* PLC for DFT Stereo residual */ #define STEREO_DFT_RES_N_PEAKS_MAX 15 /*Maximum number of peaks within residual signal in each frame (res_cod_band_max == 6 in 48kHz)*/ Loading
lib_com/ivas_prot_fx.h +3 −2 Original line number Diff line number Diff line Loading @@ -475,7 +475,8 @@ void filter_with_allpass_fx( const Word32 *sig, /* i : allpass input signal */ Word32 *out, /* o : filtered output */ const int16_t len, /* i : length of input */ basic_allpass_t *ap /* i/o: basic allpass structure */ basic_allpass_t *ap, /* i/o: basic allpass structure */ Word16 q_shift ); Word32 stereo_dft_dmx_swb_nrg_fx( Loading Loading @@ -1524,7 +1525,7 @@ void ivas_hq_pred_hb_bws_fx( ); void synchro_synthesis_fixed_clean( const Word16 ivas_total_brate, /* i : IVAS total bitrate */ const Word32 ivas_total_brate, /* i : IVAS total bitrate */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i/o: output synthesis signal */ const Word16 output_frame, /* i : Number of samples */ Loading
lib_com/lerp.c +105 −7 Original line number Diff line number Diff line Loading @@ -383,6 +383,102 @@ static void lerp_proc(Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 buf } static void lerp_proc32(Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize) { Word16 i, idx, n; Word16 diff; Word32 pos, shift; Word32 buf[2 * L_FRAME_MAX]; Word32 *ptr; ptr = f_out; test(); test(); test(); IF (((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f))) { ptr = buf; move16(); } IF(EQ_16(bufferNewSize, bufferOldSize)) { Copy32(f, f_out, bufferNewSize); return; } shift = L_shl(L_deposit_l(div_s(bufferOldSize, shl(bufferNewSize, 4))), 4 - shift_e + 16); pos = L_sub(L_shr(shift, 1), 32768l/*1.0f Q15*/); /* Adjust interpolation shift to avoid accessing beyond end of input buffer. */ if (LT_32(shift, 19661l/*0.3f Q16*/)) { pos = L_sub(pos, 8520l/*0.13f Q16*/); } assert(pos_e == shift_e); /* first point of interpolation */ IF(pos < 0) { diff = shr(extract_l(pos), 1); /*buf[0]=f[0]+pos*(f[1]-f[0]);*/ move16(); *ptr++ = L_add_sat(f[0], Mpy_32_16_1(L_sub(f[1], f[0]), diff)); } ELSE { idx = extract_h(pos); diff = lshr(extract_l(pos), 1); move16(); *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff)); } pos = L_add(pos, shift); idx = s_max(0, extract_h(pos)); n = sub(bufferNewSize, 1); FOR(i = 1; i < n; i++) { diff = lshr(extract_l(pos), 1); IF (LT_32(pos , 0)) { diff = sub(16384/*0.5f Q15*/, diff); } move16(); *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff)); pos = L_add(pos, shift); idx = extract_h(pos); } /* last point */ IF (GT_32(pos, L_deposit_h(sub(bufferOldSize, 1)))) { idx = sub(bufferOldSize, 2); } assert(idx <= 2 * L_FRAME_MAX); /* diff = t - point;*/ diff = lshr(extract_l(L_shr(L_sub(pos, L_deposit_h(idx)), 1)), 1); move16(); *ptr++ = L_add_sat(f[idx], L_shl_sat(Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff), 1)); test(); test(); test(); IF(((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f))) { Copy32(buf, f_out, bufferNewSize); } } #ifdef IVAS_FLOAT_FIXED static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 bufferNewSize, const Word16 bufferOldSize ); Loading @@ -397,10 +493,12 @@ void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOld { Word16 tmpNewSize; Word16 guard_bits = s_max(find_guarded_bits_fx(bufferNewSize / bufferOldSize), find_guarded_bits_fx(bufferOldSize / bufferNewSize)) + 1; q -= guard_bits; IF (getScaleFactor32(f, bufferOldSize) < guard_bits) { *q -= guard_bits; FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f[ind] = L_shr(f[ind], guard_bits); FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f_out[ind] = L_shr(f_out[ind], guard_bits); } IF ( 128 * bufferNewSize > bufferOldSize * 507 ) { Loading Loading @@ -457,7 +555,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe tmpNewSize = bufferNewSize; } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; Loading @@ -474,7 +572,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe tmpNewSize = bufferNewSize; } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; Loading @@ -483,7 +581,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe } ELSE { L_lerp_proc_fx( f, f_out, bufferNewSize, bufferOldSize ); lerp_proc32(f, f_out, bufferNewSize, bufferOldSize); } return; Loading
lib_com/prot.h +8 −0 Original line number Diff line number Diff line Loading @@ -500,6 +500,14 @@ void delay_signal_fx( Word32 mem[], /* i/o: synchronization memory */ const int16_t delay /* i : delay in samples */ ); void delay_signal_q_adj_fx( Word32 x[], /* i/o: signal to be delayed */ const int16_t len, /* i : length of the input signal */ Word32 mem[], /* i/o: synchronization memory */ const int16_t delay, /* i : delay in samples */ const Word16 q_x, const Word16 q_mem ); #endif ivas_error push_indice( Loading
lib_com/prot_fx2.h +1 −1 Original line number Diff line number Diff line Loading @@ -2400,7 +2400,7 @@ void calc_normal_length_fx( Word16 Q_syn ); Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ const Word32 *sp, /* i : i signal */ const Word16 exp_sp, /* i : Exp of inp signal */ const Word16 N /* i : signal length */ Loading