[Speex-dev] decoded sample is completely differen from original one

Andre Kirchner supercroc1974 at yahoo.com
Thu Nov 13 15:09:22 PST 2008


Hi all,

I have just started playing with speex, and come up with the following code, which just encode a frame of 160 shorts, and the decode it.

For some reason the decoded sample is completely different than the original one. is my code wrong? If so what? Or is it a reasonable which depends of values that weren't correctly set?

Thanks,

Andre


#include <stdio.h>
#include <tchar.h>

#include <speex/speex.h>

#define FRAME_SIZE   160

#define QUALITY      8
#define ENHANCEMENT  1

int encode(int * nbBytes, char * encSamples)
{
   void      * state;
   SpeexBits   bits;

   int quality = QUALITY;

   spx_int16_t   input[] = {0x703B, 0x7361, 0x7567, 0x3969, 0x6874, 0x3B76, 0x3020, 0x3534,
                            0x3871, 0x7967, 0x3B75, 0x6C6F, 0x7261, 0x7965, 0x2038, 0x3B67,
                            0x7639, 0x3238, 0x3634, 0x6879, 0x3B20, 0x6F74, 0x6C69, 0x7276,
                            0x7771, 0x6564, 0x6E76, 0x6B2C, 0x206A, 0x6168, 0x6662, 0x763B,
                            0x6F2E, 0x7569, 0x7720, 0x7134, 0x2736, 0x3079, 0x3239, 0x5D75,
                            0x6D20, 0x5B79, 0x7530, 0x3160, 0x7120, 0x2765, 0x3974, 0x7570,
                            0x6867, 0x5B62, 0x3032, 0x3834, 0x7579, 0x5B67, 0x6F27, 0x7169,
                            0x6733, 0x6879, 0x633B, 0x696F, 0x7175, 0x6576, 0x2772, 0x3039,
                            0x6A62, 0x3471, 0x5D74, 0x2D67, 0x7539, 0x7168, 0x656D, 0x3527,
                            0x6967, 0x3930, 0x6A68, 0x626D, 0x7227, 0x6577, 0x7030, 0x6879,
                            0x276D, 0x725B, 0x3577, 0x2069, 0x2762, 0x696F, 0x7765, 0x7468,
                            0x766A, 0x3067, 0x3927, 0x3477, 0x7579, 0x7027, 0x7769, 0x6562,
                            0x276A, 0x6C67, 0x766B, 0x6E63, 0x716A, 0x6576, 0x3B6C, 0x6F69,
                            0x6772, 0x3B68, 0x5B77, 0x3470, 0x6733, 0x6A68, 0x7170, 0x6F6B,
                            0x6A67, 0x6E66, 0x3B63, 0x276D, 0x6F20, 0x716C, 0x6869, 0x3874,
                            0x3979, 0x7220, 0x7663, 0x6874, 0x716A, 0x6570, 0x7775, 0x6A72,
                            0x7666, 0x3063, 0x7139, 0x772D, 0x7533, 0x7974, 0x696F, 0x2770,
                            0x6372, 0x6B67, 0x6577, 0x2762, 0x6F34, 0x6220, 0x345D, 0x7730,
                            0x3638, 0x7935, 0x7475, 0x5B63, 0x306E, 0x3371, 0x7738, 0x7432,
                            0x5B79, 0x676E, 0x665D, 0x6376, 0x696F, 0x6830, 0x6577, 0x6D74};

   state = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_NB));
   speex_encoder_ctl(state, SPEEX_SET_QUALITY, &quality);

   speex_bits_init(&bits);
   speex_bits_reset(&bits);

   speex_encode_int(state, &input[0], &bits);
   speex_bits_insert_terminator(&bits);

   * nbBytes = speex_bits_write(&bits, encSamples, FRAME_SIZE);
   
   speex_encoder_destroy(state);
   speex_bits_destroy(&bits);

   return 0;
}


int decode(int nbBytes, char * encSamples)
{
   spx_int16_t   output[FRAME_SIZE];

   void        * state;
   SpeexBits     bits;

   int enhancement = ENHANCEMENT;

   state = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB));
   speex_decoder_ctl(state, SPEEX_SET_ENH, &enhancement);

   speex_bits_init(&bits);

   speex_bits_read_from(&bits, encSamples, nbBytes);

   speex_decode_int(state, &bits, output);

   for(int i = 0; i < FRAME_SIZE; i++)
   {
      printf(" %04X", (short)output[i] & 0xFFFF);
      if((i + 1) % 8 == 0)
      {
         printf("\n");
      }
   }
   
   speex_decoder_destroy(state);
   speex_bits_destroy(&bits);

   return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
   int  nbBytes;
   char encSamples[FRAME_SIZE];

   encode(&nbBytes, encSamples);
   decode(nbBytes, encSamples);

    return 0;
}


      


More information about the Speex-dev mailing list