diff --git a/src/opus_encoder.c b/src/opus_encoder.c index e23a43f2c675fba57147fbec5bcccffef45bed40..bc5d591d38089663f2b0afeeabe8f5c6f6dc3317 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -1044,7 +1044,7 @@ static opus_int32 opus_encode_native_process(OpusEncoder *st, const opus_val16 * AnalysisInfo *analysis_info, int is_silence, #endif int redundancy, int celt_to_silk, int prefill, opus_int32 max_data_bytes, - opus_int activity, opus_int32 equiv_rate, int to_celt); + opus_int32 equiv_rate, int to_celt); opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, @@ -1076,8 +1076,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ #ifdef ENABLE_DRED opus_int32 dred_bitrate_bps; #endif - opus_int activity = VAD_NO_DECISION; - ALLOC_STACK; max_data_bytes = IMIN(1276, out_data_bytes); @@ -1139,20 +1137,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (!is_silence) st->voice_ratio = -1; - if (is_silence) - { - activity = !is_silence; - } else if (analysis_info.valid) - { - activity = analysis_info.activity_probability >= DTX_ACTIVITY_THRESHOLD; - if (!activity) - { - /* Mark as active if this noise frame is sufficiently loud */ - opus_val32 noise_energy = compute_frame_energy(pcm, frame_size, st->channels, st->arch); - activity = st->peak_signal_energy < (PSEUDO_SNR_THRESHOLD * noise_energy); - } - } - st->detected_bandwidth = 0; if (analysis_info.valid) { @@ -1631,8 +1615,11 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ frame_redundancy = redundancy && (frame_to_celt || (!to_celt && i==0)); #ifndef DISABLE_FLOAT_API - /* Get analysis for current frame. */ - tonality_get_info(&st->analysis, &analysis_info, enc_frame_size); + if (analysis_read_pos_bak != -1) { + is_silence = is_digital_silence(pcm, frame_size, st->channels, lsb_depth); + /* Get analysis for current frame. */ + tonality_get_info(&st->analysis, &analysis_info, enc_frame_size); + } #endif tmp_len = opus_encode_native_process(st, pcm+i*(st->channels*enc_frame_size), enc_frame_size, tmp_data+i*bytes_per_frame, float_api, first_frame, @@ -1644,7 +1631,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ is_silence, #endif frame_redundancy, celt_to_silk, prefill, bytes_per_frame, - activity, equiv_rate, frame_to_celt + equiv_rate, frame_to_celt ); if (tmp_len<0) @@ -1679,7 +1666,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ is_silence, #endif redundancy, celt_to_silk, prefill, max_data_bytes, - activity, equiv_rate, to_celt + equiv_rate, to_celt ); RESTORE_STACK; return ret; @@ -1696,7 +1683,7 @@ static opus_int32 opus_encode_native_process(OpusEncoder *st, const opus_val16 * AnalysisInfo *analysis_info, int is_silence, #endif int redundancy, int celt_to_silk, int prefill, opus_int32 max_data_bytes, - opus_int activity, opus_int32 equiv_rate, int to_celt) + opus_int32 equiv_rate, int to_celt) { void *silk_enc; CELTEncoder *celt_enc; @@ -1718,6 +1705,7 @@ static opus_int32 opus_encode_native_process(OpusEncoder *st, const opus_val16 * int curr_bandwidth; int delay_compensation; int total_buffer; + opus_int activity = VAD_NO_DECISION; VARDECL(opus_val16, pcm_buf); VARDECL(opus_val16, tmp_prefill); @@ -1733,6 +1721,23 @@ static opus_int32 opus_encode_native_process(OpusEncoder *st, const opus_val16 * total_buffer = delay_compensation; frame_rate = st->Fs/frame_size; + +#ifndef DISABLE_FLOAT_API + if (is_silence) + { + activity = !is_silence; + } else if (analysis_info->valid) + { + activity = analysis_info->activity_probability >= DTX_ACTIVITY_THRESHOLD; + if (!activity) + { + /* Mark as active if this noise frame is sufficiently loud */ + opus_val32 noise_energy = compute_frame_energy(pcm, frame_size, st->channels, st->arch); + activity = st->peak_signal_energy < (PSEUDO_SNR_THRESHOLD * noise_energy); + } + } +#endif + /* For the first frame at a new SILK bandwidth */ if (st->silk_bw_switch) {