shithub: opus

Download patch

ref: 787eee29b87f06390fb3a2f615a525205a84d1f4
parent: fab6397ae6b7ba9f500c87ea8b457570804b8bb0
author: Felicia Lim <[email protected]>
date: Wed Apr 6 07:23:21 EDT 2016

Turn on CELT's PLC only if there are >=2 packets received consecutively.

Avoids generating comfort noise with unwanted tones in DTX mode.

--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -82,6 +82,7 @@
    int error;
    int last_pitch_index;
    int loss_count;
+   int skip_plc;
    int postfilter_period;
    int postfilter_period_old;
    opus_val16 postfilter_gain;
@@ -164,8 +165,6 @@
    st->signalling = 1;
    st->arch = opus_select_arch();
 
-   st->loss_count = 0;
-
    opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
 
    return OPUS_OK;
@@ -447,7 +446,7 @@
 
    loss_count = st->loss_count;
    start = st->start;
-   noise_based = loss_count >= 5 || start != 0;
+   noise_based = loss_count >= 5 || start != 0 || st->skip_plc;
    if (noise_based)
    {
       /* Noise-based PLC/CNG */
@@ -832,6 +831,10 @@
       return frame_size/st->downsample;
    }
 
+   /* Check if there are at least two packets received consecutively before
+    * turning on the pitch-based PLC */
+   st->skip_plc = st->loss_count != 0;
+
    if (dec == NULL)
    {
       ec_dec_init(&_dec,(unsigned char*)data,len);
@@ -1198,6 +1201,7 @@
                ((char*)&st->DECODER_RESET_START - (char*)st));
          for (i=0;i<2*st->mode->nbEBands;i++)
             oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
+         st->skip_plc = 1;
       }
       break;
       case OPUS_GET_PITCH_REQUEST: