# HG changeset patch # User jbr # Date 1251579858 0 # Node ID 6cade2cdd63b2ea6f24211ece058d6c3f64c96ca # Parent 0b76ca7e07b5dc3e1d4f142ce16ff19c10ad6efa Store the frame size in the LibSpeexContext in case the header does not exist. diff -r 0b76ca7e07b5 -r 6cade2cdd63b libspeexdec.c --- a/libspeexdec.c Sat Aug 29 16:55:55 2009 +0000 +++ b/libspeexdec.c Sat Aug 29 21:04:18 2009 +0000 @@ -29,6 +29,7 @@ SpeexStereoState stereo; void *dec_state; SpeexHeader *header; + int frame_size; } LibSpeexContext; @@ -52,7 +53,7 @@ if (s->header) { avctx->sample_rate = s->header->rate; avctx->channels = s->header->nb_channels; - avctx->frame_size = s->header->frame_size; + avctx->frame_size = s->frame_size = s->header->frame_size; if (s->header->frames_per_packet) avctx->frame_size *= s->header->frames_per_packet; @@ -76,8 +77,10 @@ return -1; } - if (!s->header) + if (!s->header) { speex_decoder_ctl(s->dec_state, SPEEX_GET_FRAME_SIZE, &avctx->frame_size); + s->frame_size = avctx->frame_size; + } if (avctx->channels == 2) { SpeexCallback callback; @@ -100,7 +103,7 @@ int16_t *output = data, *end; int i, num_samples; - num_samples = s->header->frame_size * avctx->channels; + num_samples = s->frame_size * avctx->channels; end = output + *data_size / sizeof(*output); speex_bits_read_from(&s->bits, buf, buf_size); @@ -115,12 +118,12 @@ break; if (avctx->channels == 2) - speex_decode_stereo_int(output, s->header->frame_size, &s->stereo); + speex_decode_stereo_int(output, s->frame_size, &s->stereo); output += num_samples; } - avctx->frame_size = s->header->frame_size * i; + avctx->frame_size = s->frame_size * i; *data_size = avctx->channels * avctx->frame_size * sizeof(*output); return buf_size; }