Testing the range coder final state
authorKoen Vos <koen.vos@skype.net>
Thu, 3 Feb 2011 14:31:12 +0000 (09:31 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 3 Feb 2011 14:31:12 +0000 (09:31 -0500)
silk
src/opus.h
src/opus_decoder.c
src/opus_decoder.h
src/opus_encoder.c
src/opus_encoder.h
src/test_opus.c

diff --git a/silk b/silk
index 4e28e74..a81e6dc 160000 (submodule)
--- a/silk
+++ b/silk
@@ -1 +1 @@
-Subproject commit 4e28e7426638655959294670c36d0c52be44fb74
+Subproject commit a81e6dc2bc337c25156e6e908e45cbf7a5e0f104
index f4a054b..e25fa21 100644 (file)
@@ -47,6 +47,8 @@ extern "C" {
 #define __check_int(x) (((void)((x) == (int)0)), (int)(x))
 #define __check_int_ptr(ptr) ((ptr) + ((ptr) - (int*)(ptr)))
 
+#define OPUS_TEST_RANGE_CODER_STATE     1
+
 #define MODE_SILK_ONLY 1000
 #define MODE_HYBRID    1001
 #define MODE_CELT_ONLY 1002
@@ -104,8 +106,9 @@ typedef struct OpusDecoder OpusDecoder;
 
 OpusEncoder *opus_encoder_create(int Fs, int channels);
 
+/* returns length of data payload (in bytes) */
 int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
-               unsigned char *data, int bytes_per_packet);
+               unsigned char *data, int max_data_bytes);
 
 void opus_encoder_destroy(OpusEncoder *st);
 
@@ -113,6 +116,7 @@ void opus_encoder_ctl(OpusEncoder *st, int request, ...);
 
 OpusDecoder *opus_decoder_create(int Fs, int channels);
 
+/* returns (CELT) error code */
 int opus_decode(OpusDecoder *st, const unsigned char *data, int len,
                short *pcm, int frame_size);
 
@@ -120,6 +124,12 @@ void opus_decoder_ctl(OpusDecoder *st, int request, ...);
 
 void opus_decoder_destroy(OpusDecoder *st);
 
+#if OPUS_TEST_RANGE_CODER_STATE
+int opus_encoder_get_final_range(OpusEncoder *st);
+int opus_decoder_get_final_range(OpusDecoder *st);
+#endif
+
+
 #ifdef __cplusplus
 }
 #endif
index 5dd3b5a..cb6fef2 100644 (file)
@@ -73,6 +73,7 @@ OpusDecoder *opus_decoder_create(int Fs, int channels)
 
        return st;
 }
+
 int opus_decode(OpusDecoder *st, const unsigned char *data,
                int len, short *pcm, int frame_size)
 {
@@ -199,6 +200,11 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
         for (i=0;i<frame_size*st->channels;i++)
             pcm[i] = ADD_SAT16(pcm[i], pcm_celt[i]);
     }
+
+#if OPUS_TEST_RANGE_CODER_STATE
+    st->rangeFinal = dec.rng;
+#endif
+
        return celt_ret<0 ? celt_ret : audiosize;
 
 }
@@ -247,3 +253,10 @@ void opus_decoder_destroy(OpusDecoder *st)
 {
        free(st);
 }
+
+#if OPUS_TEST_RANGE_CODER_STATE
+int opus_decoder_get_final_range(OpusDecoder *st)
+{
+    return st->rangeFinal;
+}
+#endif
index 8086b90..e6f0534 100644 (file)
@@ -45,6 +45,10 @@ struct OpusDecoder {
     int          bandwidth;
     /* Sampling rate (at the API level) */
     int          Fs;
+
+#ifdef OPUS_TEST_RANGE_CODER_STATE
+    int          rangeFinal;
+#endif
 };
 
 inline short ADD_SAT16(a, b) {
index ba0cdc4..a6fda2e 100644 (file)
@@ -74,7 +74,7 @@ OpusEncoder *opus_encoder_create(int Fs, int channels)
     st->silk_mode.packetLossPercentage  = 0;
     st->silk_mode.useInBandFEC          = 0;
     st->silk_mode.useDTX                = 0;
-    st->silk_mode.complexity            = 2;
+    st->silk_mode.complexity            = 10;
 
     /* Create CELT encoder */
        /* Initialize CELT encoder */
@@ -246,6 +246,10 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
     data[0] |= (st->stream_channels==2)<<2;
     /*printf ("%x\n", (int)data[0]);*/
 
+#if OPUS_TEST_RANGE_CODER_STATE
+    st->rangeFinal = enc.rng;
+#endif
+
     return ret+1;
 }
 
@@ -374,3 +378,9 @@ void opus_encoder_destroy(OpusEncoder *st)
        free(st);
 }
 
+#if OPUS_TEST_RANGE_CODER_STATE
+int opus_encoder_get_final_range(OpusEncoder *st)
+{
+    return st->rangeFinal;
+}
+#endif
index 9636e2a..364f348 100644 (file)
@@ -54,6 +54,10 @@ struct OpusEncoder {
     int          bitrate_bps;
 
     short        delay_buffer[ENCODER_DELAY_COMPENSATION*2];
+
+#ifdef OPUS_TEST_RANGE_CODER_STATE
+    int          rangeFinal;
+#endif
 };
 
 
index d837205..17d66aa 100644 (file)
@@ -53,7 +53,7 @@ void print_usage( char* argv[] )
     fprintf(stderr, "-vbr                 : enable variable bitrate (recommended for SILK)\n" );
     fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB>  : audio bandwidth (from narrowband to fullband)\n" );
     fprintf(stderr, "-max_payload <bytes> : maximum payload size in bytes, default: 1024\n" );
-    fprintf(stderr, "-complexity <comp>   : SILK complexity, 0: low, 1: medium, 2: high; default: 2\n" );
+    fprintf(stderr, "-complexity <comp>   : complexity, 0 (lowest) ... 10 (highest); default: 10\n" );
     fprintf(stderr, "-inbandfec           : enable SILK inband FEC\n" );
     fprintf(stderr, "-dtx                 : enable SILK DTX\n" );
     fprintf(stderr, "-loss <perc>         : simulate packet loss, in percent (0-100); default: 0\n" );
@@ -93,6 +93,7 @@ int main(int argc, char *argv[])
    short *in, *out;
    int mode;
    double bits=0.0, bits_act=0.0, bits2=0.0, nrg;
+   int bandwidth=-1;
 
    if (argc < 8 )
    {
@@ -108,10 +109,10 @@ int main(int argc, char *argv[])
 
    /* defaults: */
    use_vbr = 0;
-   int bandwidth=-1;
+   bandwidth=-1;
    internal_sampling_rate_Hz = sampling_rate;
    max_payload_bytes = MAX_PACKET;
-   complexity = 2;
+   complexity = 10;
    use_inbandfec = 0;
    use_dtx = 0;
    packet_loss_perc = 0;
@@ -147,7 +148,7 @@ int main(int argc, char *argv[])
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-inbandfec" ) == 0 ) {
             use_inbandfec = 1;
             args++;
-        } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-fec") == 0 ) {
+        } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-dtx") == 0 ) {
             use_dtx = 1;
             args++;
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) {
@@ -195,7 +196,7 @@ int main(int argc, char *argv[])
 
    if (mode==MODE_SILK_ONLY)
    {
-       if (bandwidth == BANDWIDTH_SUPERWIDEBAND || bandwidth == BANDWIDTH_SUPERWIDEBAND)
+       if (bandwidth == BANDWIDTH_SUPERWIDEBAND || bandwidth == BANDWIDTH_FULLBAND)
        {
            fprintf (stderr, "Predictive mode only supports up to wideband\n");
            return 1;
@@ -268,6 +269,14 @@ int main(int argc, char *argv[])
       fwrite(out+skip, sizeof(short), (write_samples-skip)*channels, fout);
       skip = 0;
 
+#if OPUS_TEST_RANGE_CODER_STATE
+      /* compare final range encoder rng values of encoder and decoder */
+      if( opus_decoder_get_final_range( dec ) != opus_encoder_get_final_range( enc ) ) {
+          fprintf (stderr, "Error: Range coder state mismatch between encoder and decoder.\n");
+          return 0;
+      }
+#endif
+
       /* count bits */
       bits += len*8;
       nrg = 0.0;