[Speex-dev] Decoding only a certain frame results in different values than when decoding the entire file

Hermann Weber
Thu, 22 Dec 2011 19:55:18 -0000

To make it complete, here is the code that I am using to encode a large
file:

int __stdcall SpxEncode(unsigned char* inBuf, unsigned char* outBuf,
unsigned int inlen)
{
     //char *testFile;
     //FILE *ftest;
     //testFile = "test";
     //ftest = fopen(testFile, "wb");
     //fwrite(inBuf,1,inlen,ftest);

     //take every 320 bytes
     //copy every short to float array, and make sure to put null in
unused area

     float input[MAX_FRAME_SIZE];
     char cbits[MAX_FRAME_BYTES];
     unsigned int inBufpos = 0, j, outBufpos = 0;
     short *sinBuf;

     sinBuf = (short*) inBuf;

     do
     {
         j = 0;
         do
             {
             //copy to float array
             input[j] = sinBuf[inBufpos];
             inBufpos++; j++;
             }
         while ((inBufpos % 160 != 0) && (inBufpos != (inlen/2)));

         //fill the rest with null
         if (inBufpos == (inlen/2))
             for (j=(inBufpos%160); j<160; j++)    input[j] = 0;

         speex_bits_reset(&bits);
         speex_encode(encstate, input, &bits);

         /*Copy the bits to an array of char that can be written*/
         speex_bits_write(&bits, cbits, MAX_FRAME_BYTES);
         for (j=0; j<62; j++)
             {
             outBuf[outBufpos] = cbits[j];
             outBufpos++;
             }

     }
     while (inBufpos != (inlen/2));

     //fwrite(outBuf, 1, outBufpos, ftest);
     //fclose(ftest);
     return 42;
}