changeset 10116:6cade2cdd63b libavcodec

Store the frame size in the LibSpeexContext in case the header does not exist.
author jbr
date Sat, 29 Aug 2009 21:04:18 +0000
parents 0b76ca7e07b5
children d0f2f4e4436c
files libspeexdec.c
diffstat 1 files changed, 8 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }