diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 4241de2ab4..88bf85f209 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -29,6 +29,7 @@ typedef struct { SpeexStereoState stereo; void *dec_state; SpeexHeader *header; + int frame_size; } LibSpeexContext; @@ -52,7 +53,7 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) 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 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) 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 @@ static int libspeex_decode_frame(AVCodecContext *avctx, 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 @@ static int libspeex_decode_frame(AVCodecContext *avctx, 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; }