| Index: src/analysis.c
|
| diff --git a/src/analysis.c b/src/analysis.c
|
| index 778a62aabfc29470c5c6b4f51b6ef97852ca3d8e..2ee853376a3e13ddcb1ffaed64f549bf858477bb 100644
|
| --- a/src/analysis.c
|
| +++ b/src/analysis.c
|
| @@ -189,7 +189,7 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int
|
| info_out->music_prob = psum;
|
| }
|
|
|
| -void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix)
|
| +static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix)
|
| {
|
| int i, b;
|
| const kiss_fft_state *kfft;
|
| @@ -263,6 +263,15 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
|
| downmix(x, &tonal->inmem[240], remaining, offset+ANALYSIS_BUF_SIZE-tonal->mem_fill, c1, c2, C);
|
| tonal->mem_fill = 240 + remaining;
|
| opus_fft(kfft, in, out);
|
| +#ifndef FIXED_POINT
|
| + /* If there's any NaN on the input, the entire output will be NaN, so we only need to check one value. */
|
| + if (celt_isnan(out[0].r))
|
| + {
|
| + info->valid = 0;
|
| + RESTORE_STACK;
|
| + return;
|
| + }
|
| +#endif
|
|
|
| for (i=1;i<N2;i++)
|
| {
|
| @@ -334,6 +343,16 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
|
| tE += binE*tonality[i];
|
| nE += binE*2.f*(.5f-noisiness[i]);
|
| }
|
| +#ifndef FIXED_POINT
|
| + /* Check for extreme band energies that could cause NaNs later. */
|
| + if (!(E<1e9f) || celt_isnan(E))
|
| + {
|
| + info->valid = 0;
|
| + RESTORE_STACK;
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| tonal->E[tonal->E_count][b] = E;
|
| frame_noisiness += nE/(1e-15f+E);
|
|
|
| @@ -611,8 +630,6 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
|
| /*printf("%d %d\n", info->bandwidth, info->opus_bandwidth);*/
|
| info->noisiness = frame_noisiness;
|
| info->valid = 1;
|
| - if (info_out!=NULL)
|
| - OPUS_COPY(info_out, info, 1);
|
| RESTORE_STACK;
|
| }
|
|
|
| @@ -631,7 +648,7 @@ void run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, co
|
| pcm_len = analysis_frame_size - analysis->analysis_offset;
|
| offset = analysis->analysis_offset;
|
| do {
|
| - tonality_analysis(analysis, NULL, celt_mode, analysis_pcm, IMIN(480, pcm_len), offset, c1, c2, C, lsb_depth, downmix);
|
| + tonality_analysis(analysis, celt_mode, analysis_pcm, IMIN(480, pcm_len), offset, c1, c2, C, lsb_depth, downmix);
|
| offset += 480;
|
| pcm_len -= 480;
|
| } while (pcm_len>0);
|
|
|