Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@amazon.com>2023-12-18 03:03:22 +0300
committerJean-Marc Valin <jmvalin@amazon.com>2023-12-18 23:15:20 +0300
commit33efff9ce6c8359e443001205cb852b1a0d08912 (patch)
tree26f8f124c0df879f26fb7f6ca650fae0b2732cb3
parent320d06f111102084c5dcf5cb8a85658daf8a4125 (diff)
More activity handling to opus_encode_native_process()
-rw-r--r--src/opus_encoder.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index b203d487..822bbb58 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -993,7 +993,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,
@@ -1025,8 +1025,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);
@@ -1088,20 +1086,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)
{
@@ -1580,8 +1564,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,
@@ -1593,7 +1580,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)
@@ -1628,7 +1615,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;
@@ -1645,7 +1632,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;
@@ -1667,6 +1654,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);
@@ -1682,6 +1670,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)
{