[Speex-dev] Encoding and decoding problem in speex 1.0.4

Vinod Vijayan vinod at speechdesk.com
Wed Jan 5 01:36:24 PST 2005


Hi,
  I am using the speex 1.0.4 library from Windows.
  I have posted my problem before but didn't get a solution. I am doing an
VOIP project
  in which i am recording sound and streaming it to the peer. I wanted to
encode and decode
  wav files that brought me to this site.

  I am recording sound in the following format:-

  m_WaveFormatEx.wFormatTag          = WAVE_FORMAT_PCM;
  m_WaveFormatEx.nChannels           = 1;
  m_WaveFormatEx.wBitsPerSample      = 8;
  m_WaveFormatEx.cbSize              = 0;
  m_WaveFormatEx.nSamplesPerSec      = 8000;
  m_WaveFormatEx.nBlockAlign         = 1;
  m_WaveFormatEx.nAvgBytesPerSec     = 8000;

  The recording is as follows :-

  When the buffer(size = 2000 bytes) gets filled with sound data a
function with the body shown
  below is called.

  LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
  if(lpHdr->dwBytesRecorded==0 || lpHdr==NULL)
    return ERROR_SUCCESS;
  ::waveInUnprepareHeader(m_hRecord, lpHdr, sizeof(WAVEHDR));

  Here lpHdr->lpData contains the audio data in a character array.

  Now here I want to use Speex codec for encoding the data so the encoding
function is
  called (I am thankful to Tay YueWeng for the function).


  char *encode(char *buffer, int &encodeSize)
  {
      char   *encodedBuffer = new char[RECBUFFER/2];            /*
RECBUFFER = 2000 */
      short   speexShort;
      float  speexFloat[RECBUFFER/2];
      void   *mEncode       = speex_encoder_init(&speex_nb_mode);

      /*Initialization of the structure that holds the bits*/
      speex_bits_init(&mBits);

      // Convert the audio to a short then to a float buffer
      int    halfBufferSize = RECBUFFER/2;

      for (int i = 0; i < halfBufferSize; i++)
      {
  	  memcpy(&speexShort, &buffer[i*2], sizeof(short));
          speexFloat[i]     = speexShort;
      }

      // Encode the sound data using the float buffer
      speex_bits_reset(&mBits);
      speex_encode(mEncode, speexFloat, &mBits);
      encodeSize            = speex_bits_write(&mBits, encodedBuffer,
RECBUFFER/2);

      /*Destroy the encoder state*/
      speex_encoder_destroy(mEncode);
     /*Destroy the bit-stream struct*/
      speex_bits_destroy(&mBits);

      // Return the encoded buffer
      return encodedBuffer;
  }

  Here i noticed that though my captured audio data is 2000 bytes the
compressed form is
  always 38 bytes. In the speexFloat array above i get values in the range
-32767 to +32767.
  Is it correct. Also after calling the 'speex_encode' function the first
160 values in the
  input float array i.e. speexFloat is changed (why does it happen?Is
anything abnormal).

  Further after calling the above function for testing I decode the
returned encoded data
  immediately by calling the decoding function shown bellow :-

  char *decode (char *buffer, int encodeSize)
   {
     char *decodedBuffer   = new char[RECBUFFER];
     short speexShort;
     float speexFloat[RECBUFFER/2];
     // Decode the sound data into a float buffer
     void  *mDecode        = speex_decoder_init(&speex_nb_mode);

     /*Initialization of the structure that holds the bits*/
     speex_bits_init(&mBits);

     int    halfBufferSize = RECBUFFER/2;
     speex_bits_reset(&mBits);
     speex_bits_read_from(&mBits, buffer, encodeSize);
     speex_decode(mDecode, &mBits, speexFloat);
     // Convert from float to short to char

     for (int i = 0; i < halfBufferSize; i++)
      {
         speexShort = speexFloat[i];
	 memcpy(&decodedBuffer[i*2], &speexShort, sizeof(short));
      }

     /*Destroy the decoder state*/
     speex_encoder_destroy(mDecode);
     /*Destroy the bit-stream truct*/
     speex_bits_destroy(&mBits);

     // Return the buffer
    return decodedBuffer;
  }

 After decoding using the above function only the first 160 values in the
decodedBuffer array is
 changed. i.e i encoded an 2000 byte audio data to get a 38 byte encoded
audio data. On decoding
 the 38 byte audio data i get an decompressed 160 byte data. I don't
understand whats going
 wrong. I checked all the messages posted in this newsgroup and did'nt
find an answer so i am
 posting this code hoping that it gets solved soon.  Thanks in advance.


More information about the Speex-dev mailing list