Hi all. I'm trying to decode speex using version 1.1.10's libspeex with
fixed_point enabled. copied the sample in the manual (1.1.11) with minor
revisions. While running the program, encountered this warning:
"Packet is larger than allocated buffer : 38"
when calling speex_bits_read_from (&bits, cbits, nBytes)
then my program terminated unexpectedly with errors (Unhandled exception at
0x10225e1f ( msvcr80d.dll) in sampleDEC.exe: 0xC0000005: Access violation
reading location 0x645c3a63.)
I declared cbits as char *cbits [500]. nBytes is 38, bit rate is 15000 bps.
I'm decoding a 'speex' file created using a program much like
sampleENC. Can
anyone tell me what is wrong and how I can correct the problem? Thank you.
For your reference I'm attaching the code. Please feel free to ask me
questions if the information I provided is lacking. By the way, I am
compiling for Windows using VS2005 Beta2.
Thanks,
Mon
#define FIXED_POINT
int main (int argc, char ** argv)
{
printf ("sampleDEC.exe started!\n"); /**/
int nBytes, FrameSize, BitRate;
FILE *fin, *fout;
char *inFile, *outFile, *PEnhancement;
short out [500];
char cbits [500];
void *state;
SpeexBits bits;
state = speex_decoder_init (&speex_nb_mode);
speex_decoder_ctl (state, SPEEX_GET_FRAME_SIZE, &FrameSize);
inFile = argv [1];
outFile = argv [2];
PEnhancement = argv [3];
fout = fopen (outFile, "w");
if (fout == NULL)
{
printf ("Error creating file\n");
return 1;
}
printf ("Successfully opened %s for writing! \n", outFile); /**/
fin = fopen (inFile, "rb");
if (fin == NULL)
{
printf ("Error opening file\n");
return 1;
}
printf ("Successfully opened %s for decoding!\n\n", inFile); /**/
fseek (fin,(sizeof(char))*12+sizeof(int),SEEK_SET); // because of the
way I encoded a PCM file
speex_decoder_ctl (state, SPEEX_GET_BITRATE, &BitRate);
printf ("decoding... BIT RATE: %i\n",BitRate);
switch (*PEnhancement)
{ // Here I use BitRate to toggle Perceptual Enhancement
case 'Y':
BitRate = 1;
break;
case 'y':
BitRate = 1;
break;
case 'N':
BitRate = 0;
break;
case 'n':
BitRate = 0;
break;
default:
BitRate = 1;
break;
}
speex_decoder_ctl (state, SPEEX_SET_ENH, &BitRate);
BitRate = 0; // Henceforth BitRate is used to count the number of frames
decoded
while (1)
{
fread(&nBytes, sizeof(int), 1, fin);
if (feof(fin))
break;
fread(cbits, sizeof(char), nBytes, fin);
speex_bits_read_from(&bits, cbits, nBytes);
speex_decode_int(state, &bits, out);
fwrite(out, sizeof(short), FrameSize, fout);
BitRate++;
}
printf ("nBytes is %i.\n",nBytes);
printf ("Decoded %i frames\n",BitRate);
speex_encoder_destroy(state);
speex_bits_destroy(&bits);
fclose (fin);
fclose(fout);
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://lists.xiph.org/pipermail/speex-dev/attachments/20051206/a588485a/attachment.html
Correction: speex_encoder_destroy(state); should be: speex_decoder_destroy(state); in my message below. Mon On 12/6/05, Mo Win <mowin.dev@gmail.com> wrote:> > Hi all. I'm trying to decode speex using version 1.1.10's libspeex with > fixed_point enabled. copied the sample in the manual (1.1.11) with minor > revisions. While running the program, encountered this warning: > > "Packet is larger than allocated buffer : 38" > > when calling speex_bits_read_from (&bits, cbits, nBytes) > > then my program terminated unexpectedly with errors (Unhandled exception > at 0x10225e1f ( msvcr80d.dll) in sampleDEC.exe: 0xC0000005: Access > violation reading location 0x645c3a63.) > > I declared cbits as char *cbits [500]. nBytes is 38, bit rate is 15000 > bps. I'm decoding a 'speex' file created using a program much like > sampleENC. Can anyone tell me what is wrong and how I can correct the > problem? Thank you. For your reference I'm attaching the code. Please feel > free to ask me questions if the information I provided is lacking. By the > way, I am compiling for Windows using VS2005 Beta2. > > Thanks, > Mon > > #define FIXED_POINT > > int main (int argc, char ** argv) > { > printf ("sampleDEC.exe started!\n"); /**/ > > int nBytes, FrameSize, BitRate; > FILE *fin, *fout; > char *inFile, *outFile, *PEnhancement; > short out [500]; > char cbits [500]; > void *state; > SpeexBits bits; > > state = speex_decoder_init (&speex_nb_mode); > speex_decoder_ctl (state, SPEEX_GET_FRAME_SIZE, &FrameSize); > > inFile = argv [1]; > outFile = argv [2]; > PEnhancement = argv [3]; > > fout = fopen (outFile, "w"); > if (fout == NULL) > { > printf ("Error creating file\n"); > return 1; > } > printf ("Successfully opened %s for writing! \n", outFile); /**/ > > fin = fopen (inFile, "rb"); > if (fin == NULL) > { > printf ("Error opening file\n"); > return 1; > } > printf ("Successfully opened %s for decoding!\n\n", inFile); /**/ > > fseek (fin,(sizeof(char))*12+sizeof(int),SEEK_SET); // because of the > way I encoded a PCM file > > speex_decoder_ctl (state, SPEEX_GET_BITRATE, &BitRate); > printf ("decoding... BIT RATE: %i\n",BitRate); > > switch (*PEnhancement) > { // Here I use BitRate to toggle Perceptual Enhancement > case 'Y': > BitRate = 1; > break; > case 'y': > BitRate = 1; > break; > case 'N': > BitRate = 0; > break; > case 'n': > BitRate = 0; > break; > default: > BitRate = 1; > break; > } > speex_decoder_ctl (state, SPEEX_SET_ENH, &BitRate); > > BitRate = 0; // Henceforth BitRate is used to count the number of > frames decoded > > while (1) > { > fread(&nBytes, sizeof(int), 1, fin); > > if (feof(fin)) > break; > > fread(cbits, sizeof(char), nBytes, fin); > > speex_bits_read_from(&bits, cbits, nBytes); > > speex_decode_int(state, &bits, out); > > fwrite(out, sizeof(short), FrameSize, fout); > BitRate++; > } > > printf ("nBytes is %i.\n",nBytes); > printf ("Decoded %i frames\n",BitRate); > > speex_encoder_destroy(state); > speex_bits_destroy(&bits); > > fclose (fin); > fclose(fout); > > return 0; > } > > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20051206/dee6c1db/attachment.htm