Handling auto-detecting of frame size in decoder

This commit is contained in:
Jean-Marc Valin 2011-01-31 15:56:38 -05:00
parent cf60e7adec
commit 53fb0f775e
2 changed files with 17 additions and 10 deletions

View file

@ -62,20 +62,19 @@ int main(int argc, char *argv[])
short *in, *out; short *in, *out;
int mode=MODE_HYBRID; int mode=MODE_HYBRID;
double bits=0; double bits=0;
if (argc != 6 && argc != 7) if (argc != 5 && argc != 6)
{ {
fprintf (stderr, "Usage: test_opus <rate (kHz)> <channels> <frame size> " fprintf (stderr, "Usage: test_opus <rate (kHz)> <channels> "
" <bytes per packet> [<VBR rate (kb/s)>] [<packet loss rate>] " "[<packet loss rate>] "
"<input> <output>\n"); "<input> <output>\n");
return 1; return 1;
} }
rate = atoi(argv[1]); rate = atoi(argv[1]);
channels = atoi(argv[2]); channels = atoi(argv[2]);
frame_size = atoi(argv[3]);
if (argc >= 7) if (argc >= 7)
loss = atoi(argv[4]); loss = atoi(argv[3]);
inFile = argv[argc-2]; inFile = argv[argc-2];
fin = fopen(inFile, "rb"); fin = fopen(inFile, "rb");
@ -94,7 +93,7 @@ int main(int argc, char *argv[])
dec = opus_decoder_create(rate, channels); dec = opus_decoder_create(rate, channels);
out = (short*)malloc(frame_size*channels*sizeof(short)); out = (short*)malloc(960*channels*sizeof(short));
while (!stop) while (!stop)
{ {
len = ((fgetc(fin)<<8)&0xFF00) | (fgetc(fin)&0xFF); len = ((fgetc(fin)<<8)&0xFF00) | (fgetc(fin)&0xFF);
@ -102,11 +101,11 @@ int main(int argc, char *argv[])
break; break;
bits += len*8; bits += len*8;
err = fread(data, 1, len, fin); err = fread(data, 1, len, fin);
opus_decode(dec, rand()%100<loss ? NULL : data, len, out, frame_size); frame_size = opus_decode(dec, rand()%100<loss ? NULL : data, len, out, 960);
count++; count+=frame_size;
fwrite(out, sizeof(short), frame_size*channels, fout); fwrite(out, sizeof(short), frame_size*channels, fout);
} }
fprintf (stderr, "average bit-rate: %f kb/s\n", bits*rate/(frame_size*(double)count)); fprintf (stderr, "average bit-rate: %f kb/s\n", bits*rate/((double)count));
opus_decoder_destroy(dec); opus_decoder_destroy(dec);
fclose(fin); fclose(fin);
fclose(fout); fclose(fout);

View file

@ -120,6 +120,14 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
ec_dec_init(&dec,&buf); ec_dec_init(&dec,&buf);
} }
if (audiosize > frame_size)
{
fprintf(stderr, "PCM buffer too small");
return -1;
} else {
frame_size = audiosize;
}
if (st->mode != MODE_CELT_ONLY) if (st->mode != MODE_CELT_ONLY)
{ {
DecControl.API_sampleRate = st->Fs; DecControl.API_sampleRate = st->Fs;
@ -188,7 +196,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
for (i=0;i<frame_size*st->channels;i++) for (i=0;i<frame_size*st->channels;i++)
pcm[i] += pcm_celt[i]; pcm[i] += pcm_celt[i];
} }
return celt_ret; return celt_ret<0 ? celt_ret : audiosize;
} }