Store the frame size in the LibSpeexContext in case the header does not exist.
authorJustin Ruggles <justin.ruggles@gmail.com>
Sat, 29 Aug 2009 21:04:18 +0000 (21:04 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Sat, 29 Aug 2009 21:04:18 +0000 (21:04 +0000)
Originally committed as revision 19741 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/libspeexdec.c

index 4241de2..88bf85f 100644 (file)
@@ -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;
 }