Fixes a bug that was falsely triggering DTX for 60 ms stereo
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 28 Sep 2011 18:23:01 +0000 (14:23 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Wed, 28 Sep 2011 18:23:01 +0000 (14:23 -0400)
There's still a range coder mismatch on the first frame when using FEC.

silk/enc_API.c
silk/fixed/encode_frame_FIX.c
silk/float/encode_frame_FLP.c

index ccf98b6..5f9009b 100644 (file)
@@ -139,6 +139,8 @@ opus_int silk_Encode(
     silk_encoder *psEnc = ( silk_encoder * )encState;
     opus_int16 buf[ MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ];
 
+    psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFramesEncoded = 0;
+
     /* Check values in encoder control structure */
     if( ( ret = check_control_input( encControl ) != 0 ) ) {
         silk_assert( 0 );
@@ -358,13 +360,13 @@ opus_int silk_Encode(
                         silk_assert( 0 );
                     }
                 }
-
+                psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
                 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
                 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
             }
 
             /* Insert VAD and FEC flags at beginning of bitstream */
-            if( *nBytesOut > 0 ) {
+            if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
                 flags = 0;
                 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
                     for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
index 55cf539..6f4367f 100644 (file)
@@ -189,16 +189,8 @@ TOC(ENCODE_PULSES)
     /* Finalize payload                     */
     /****************************************/
     psEnc->sCmn.first_frame_after_reset = 0;
-    if( ++psEnc->sCmn.nFramesEncoded >= psEnc->sCmn.nFramesPerPacket ) {
-        /* Payload size */
-        *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );
-
-        /* Reset the number of frames in payload buffer */
-        psEnc->sCmn.nFramesEncoded = 0;
-    } else {
-        /* No payload this time */
-        *pnBytesOut = 0;
-    }
+    /* Payload size */
+    *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );
 TOC(ENCODE_FRAME)
 
 #ifdef SAVE_ALL_INTERNAL_DATA
index a50b0a1..053bcae 100644 (file)
@@ -186,16 +186,8 @@ TOC(ENCODE_PULSES)
     /* Finalize payload                     */
     /****************************************/
     psEnc->sCmn.first_frame_after_reset = 0;
-    if( ++psEnc->sCmn.nFramesEncoded >= psEnc->sCmn.nFramesPerPacket ) {
-        /* Payload size */
-        *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );
-
-        /* Reset the number of frames in payload buffer */
-        psEnc->sCmn.nFramesEncoded = 0;
-    } else {
-        /* No payload this time */
-        *pnBytesOut = 0;
-    }
+    /* Payload size */
+    *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );
 TOC(ENCODE_FRAME)
 
 #ifdef SAVE_ALL_INTERNAL_DATA