libvorbis: do not flush libvorbis analysis if dsp state was not initialized
authorJustin Ruggles <justin.ruggles@gmail.com>
Wed, 29 Feb 2012 00:51:25 +0000 (19:51 -0500)
committerJustin Ruggles <justin.ruggles@gmail.com>
Wed, 29 Feb 2012 19:54:23 +0000 (14:54 -0500)
Fixes a segfault if init() fails before initializing the dsp state

libavcodec/libvorbis.c

index 7b44c1f..d783942 100644 (file)
@@ -52,6 +52,7 @@ typedef struct OggVorbisContext {
     uint8_t buffer[BUFFER_SIZE];        /**< output packet buffer           */
     int buffer_index;                   /**< current buffer position        */
     int eof;                            /**< end-of-file flag               */
+    int dsp_initialized;                /**< vd has been initialized        */
     vorbis_comment vc;                  /**< VorbisComment info             */
     ogg_packet op;                      /**< ogg packet                     */
     double iblock;                      /**< impulse block bias option      */
@@ -148,7 +149,8 @@ static av_cold int oggvorbis_encode_close(AVCodecContext *avctx)
     OggVorbisContext *s = avctx->priv_data;
 
     /* notify vorbisenc this is EOF */
-    vorbis_analysis_wrote(&s->vd, 0);
+    if (s->dsp_initialized)
+        vorbis_analysis_wrote(&s->vd, 0);
 
     vorbis_block_clear(&s->vb);
     vorbis_dsp_clear(&s->vd);
@@ -177,6 +179,7 @@ static av_cold int oggvorbis_encode_init(AVCodecContext *avctx)
         ret = vorbis_error_to_averror(ret);
         goto error;
     }
+    s->dsp_initialized = 1;
     if ((ret = vorbis_block_init(&s->vd, &s->vb))) {
         ret = vorbis_error_to_averror(ret);
         goto error;