[opus] Suggested patch, opus_encoder.c, decide_dtx_mode()

Felicia Lim flim at google.com
Thu Jul 6 18:07:13 UTC 2017


Thanks Andrew, this has now been merged.

On Wed, Jul 5, 2017 at 9:36 PM Andrew Larkin <andrewl at arcadius.com.au>
wrote:

> While porting opus 1.2.1 to esp32, my compiler had a grumble (error) about
> possible use of uninitialized variables in decide_dtx_mode()
>
> Existing code:
>
> --------SNIP---------
> /* Decides if DTX should be turned on (=1) or off (=0) */
> static int decide_dtx_mode(float activity_probability,    /* probability
> that current frame contains speech/music */
>                            int *nb_no_activity_frames,    /* number of
> consecutive frames with no activity */
>                            opus_val32 peak_signal_energy, /* peak energy of
> desired signal detected so far */
>                            const opus_val16 *pcm,         /* input pcm
> signal */
>                            int frame_size,                /* frame size */
>                            int channels,
>                            int is_silence,                 /* only digital
> silence detected in this frame */
>                            int arch
>                           )
> {
>    int is_noise;
>    opus_val32 noise_energy;
>    int is_sufficiently_quiet;
>
>    if (!is_silence)
>    {
>       is_noise = activity_probability < DTX_ACTIVITY_THRESHOLD;
>       if (is_noise)
>       {
>          noise_energy = compute_frame_energy(pcm, frame_size, channels,
> arch);
>          is_sufficiently_quiet = peak_signal_energy >=
> (PSEUDO_SNR_THRESHOLD
> * noise_energy);
>       }
>    }
>
>    if (is_silence || (is_noise && is_sufficiently_quiet))
>    {
>       /* The number of consecutive DTX frames should be within the allowed
> bounds */
>       (*nb_no_activity_frames)++;
>
>       if (*nb_no_activity_frames > NB_SPEECH_FRAMES_BEFORE_DTX)
>       {
>          if (*nb_no_activity_frames <= (NB_SPEECH_FRAMES_BEFORE_DTX +
> MAX_CONSECUTIVE_DTX))
>             /* Valid frame for DTX! */
>             return 1;
>          else
>             (*nb_no_activity_frames) = NB_SPEECH_FRAMES_BEFORE_DTX;
>       }
>    } else
>       (*nb_no_activity_frames) = 0;
>
>    return 0;
> }
> --------SNIP---------
>
> The problem is in the case of function parameter is_silence != 0, the code:
>
> if (is_silence || (is_noise && is_sufficiently_quiet))
>
> is using uninitialized local variables "is_noise" and
> "is_sufficiently_quiet". The compiler complaint is valid.
>
> While this will have no functional effect due to the state of "is_silence",
> the problem can be addressed by restructuring the code.  The proposed new
> code also eliminates unnecessary temporary variables and reduces operators
> as well.
>
> New code:
>
> --------SNIP---------
> /* Decides if DTX should be turned on (=1) or off (=0) */
> static int decide_dtx_mode(float activity_probability,    /* probability
> that current frame contains speech/music */
>                            int *nb_no_activity_frames,    /* number of
> consecutive frames with no activity */
>                            opus_val32 peak_signal_energy, /* peak energy of
> desired signal detected so far */
>                            const opus_val16 *pcm,         /* input pcm
> signal */
>                            int frame_size,                /* frame size */
>                            int channels,
>                            int is_silence,                 /* only digital
> silence detected in this frame */
>                            int arch
>                           )
> {
>    opus_val32 noise_energy;
>
>    if (!is_silence)
>    {
>       if( activity_probability < DTX_ACTIVITY_THRESHOLD )   /* is_noise */
>       {
>          noise_energy = compute_frame_energy(pcm, frame_size, channels,
> arch);
>          is_silence = peak_signal_energy >= (PSEUDO_SNR_THRESHOLD *
> noise_energy);  /* but is_sufficiently_quiet */
>       }
>    }
>
>    if (is_silence)
>    {
>
>       /* The number of consecutive DTX frames should be within the allowed
> bounds */
>       (*nb_no_activity_frames)++;
>
>       if (*nb_no_activity_frames > NB_SPEECH_FRAMES_BEFORE_DTX)
>       {
>          if (*nb_no_activity_frames <= (NB_SPEECH_FRAMES_BEFORE_DTX +
> MAX_CONSECUTIVE_DTX))
>             /* Valid frame for DTX! */
>             return 1;
>          else
>             (*nb_no_activity_frames) = NB_SPEECH_FRAMES_BEFORE_DTX;
>       }
>    } else
>       (*nb_no_activity_frames) = 0;
>
>    return 0;
> }
> --------SNIP---------
>
>
> _______________________________________________
> opus mailing list
> opus at xiph.org
> http://lists.xiph.org/mailman/listinfo/opus
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.xiph.org/pipermail/opus/attachments/20170706/df3aa671/attachment.html>


More information about the opus mailing list