diff --git a/src/analysis.c b/src/analysis.c index 22a8fa7913e87fdcfa9dcf926c09a656ee7cbb36..08975992c9e0344bb929da9708554d9788aba419 100644 --- a/src/analysis.c +++ b/src/analysis.c @@ -185,19 +185,21 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info, CELTEnc for (i=0;i<N2;i++) { float w = analysis_window[i]; - in[i].r = MULT16_16(w, x[i]); - in[i].i = MULT16_16(w, x[N-N2+i]); - in[N-i-1].r = MULT16_16(w, x[N-i-1]); - in[N-i-1].i = MULT16_16(w, x[2*N-N2-i-1]); + in[i].r = MULT16_16(w, tonal->inmem[i]); + in[i].i = MULT16_16(w, x[i]); + in[N-i-1].r = MULT16_16(w, x[N2-i-1]); + in[N-i-1].i = MULT16_16(w, x[N-i-1]); + tonal->inmem[i] = x[N2+i]; } } else { for (i=0;i<N2;i++) { float w = analysis_window[i]; - in[i].r = MULT16_16(w, x[2*i]+x[2*i+1]); - in[i].i = MULT16_16(w, x[2*(N-N2+i)]+x[2*(N-N2+i)+1]); - in[N-i-1].r = MULT16_16(w, x[2*(N-i-1)]+x[2*(N-i-1)+1]); - in[N-i-1].i = MULT16_16(w, x[2*(2*N-N2-i-1)]+x[2*(2*N-N2-i-1)+1]); + in[i].r = MULT16_16(w, tonal->inmem[i]); + in[i].i = MULT16_16(w, x[2*i]+x[2*i+1]); + in[N-i-1].r = MULT16_16(w, x[2*(N2-i-1)]+x[2*(N2-i-1)+1]); + in[N-i-1].i = MULT16_16(w, x[2*(N-i-1)]+x[2*(N-i-1)+1]); + tonal->inmem[i] = x[2*(N2+i)]+x[2*(N2+i)+1]; } } opus_fft(kfft, in, out); diff --git a/src/analysis.h b/src/analysis.h index bf8ad40a72d0e396e07b74356b64317f08245c5f..951ded50c0bcd53401464a1ed3d8db8a6cfa4003 100644 --- a/src/analysis.h +++ b/src/analysis.h @@ -36,6 +36,7 @@ typedef struct { float angle[240]; float d_angle[240]; float d2_angle[240]; + float inmem[240]; float prev_band_tonality[NB_TBANDS]; float prev_tonality; float E[NB_FRAMES][NB_TBANDS]; diff --git a/src/opus_encoder.c b/src/opus_encoder.c index ec7d6e7bb20f52acb9a14d228c3e50efb60d043e..87f0147a39c1d5b6098507b6d47d90d2170b17f8 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -592,18 +592,32 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ lsb_depth = IMIN(lsb_depth, st->lsb_depth); #ifndef FIXED_POINT - perform_analysis = st->silk_mode.complexity >= 7 && frame_size >= st->Fs/100 && st->Fs==48000; + /* Only perform analysis for 10- and 20-ms frames. We don't have enough buffering for shorter + ones and longer ones will be split if they're in CELT-only mode. */ + perform_analysis = st->silk_mode.complexity >= 7 + && (frame_size >= st->Fs/100 || frame_size >= st->Fs/50) + && st->Fs==48000; + if (perform_analysis) + { + int nb_analysis_frames; + nb_analysis_frames = frame_size/(st->Fs/100); + for (i=0;i<nb_analysis_frames;i++) + tonality_analysis(&st->analysis, &analysis_info, celt_enc, pcm+i*(st->Fs/100)*st->channels, st->channels, lsb_depth); + if (st->signal_type == OPUS_AUTO) + st->voice_ratio = (int)floor(.5+100*(1-analysis_info.music_prob)); + st->detected_bandwidth = analysis_info.opus_bandwidth; + } else { + analysis_info.valid = 0; + st->voice_ratio = -1; + st->detected_bandwidth = 0; + } #endif + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) delay_compensation = 0; else delay_compensation = st->delay_compensation; - if (perform_analysis) - { - total_buffer = IMAX(st->Fs/200, delay_compensation); - } else { - total_buffer = delay_compensation; - } + total_buffer = delay_compensation; extra_buffer = total_buffer-delay_compensation; st->bitrate_bps = user_bitrate_to_bitrate(st, frame_size, max_data_bytes); @@ -975,22 +989,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ dc_reject(pcm, 3, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); } -#ifndef FIXED_POINT - if (perform_analysis) - { - int nb_analysis_frames; - nb_analysis_frames = frame_size/(st->Fs/100); - for (i=0;i<nb_analysis_frames;i++) - tonality_analysis(&st->analysis, &analysis_info, celt_enc, pcm_buf+i*(st->Fs/100)*st->channels, st->channels, lsb_depth); - if (st->signal_type == OPUS_AUTO) - st->voice_ratio = (int)floor(.5+100*(1-analysis_info.music_prob)); - st->detected_bandwidth = analysis_info.opus_bandwidth; - } else { - analysis_info.valid = 0; - st->voice_ratio = -1; - st->detected_bandwidth = 0; - } -#endif + /* SILK processing */ HB_gain = Q15ONE;