OSDN Git Service

libxvid: cleanup on error pathes
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 2 Mar 2013 19:39:38 +0000 (20:39 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 2 Mar 2013 19:39:38 +0000 (20:39 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/libxvid.c

index fac2e8c..05a12db 100644 (file)
@@ -73,6 +73,8 @@ struct xvid_ff_pass1 {
     struct xvid_context *context;   /**< Pointer to private context */
 };
 
+static int xvid_encode_close(AVCodecContext *avctx);
+
 /*
  * Xvid 2-Pass Kludge Section
  *
@@ -477,7 +479,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
         if( x->twopassbuffer == NULL || x->old_twopassbuffer == NULL ) {
             av_log(avctx, AV_LOG_ERROR,
                 "Xvid: Cannot allocate 2-pass log buffers\n");
-            return -1;
+            goto fail;
         }
         x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0;
 
@@ -492,21 +494,21 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
         if( fd == -1 ) {
             av_log(avctx, AV_LOG_ERROR,
                 "Xvid: Cannot write 2-pass pipe\n");
-            return -1;
+            goto fail;
         }
         x->twopassfd = fd;
 
         if( avctx->stats_in == NULL ) {
             av_log(avctx, AV_LOG_ERROR,
                 "Xvid: No 2-pass information loaded for second pass\n");
-            return -1;
+            goto fail;
         }
 
         if( strlen(avctx->stats_in) >
               write(fd, avctx->stats_in, strlen(avctx->stats_in)) ) {
             av_log(avctx, AV_LOG_ERROR,
                 "Xvid: Cannot write to 2-pass pipe\n");
-            return -1;
+            goto fail;
         }
 
         rc2pass2.filename = x->twopassfile;
@@ -606,13 +608,16 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
     xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL);
     if( xerr ) {
         av_log(avctx, AV_LOG_ERROR, "Xvid: Could not create encoder reference\n");
-        return -1;
+        goto fail;
     }
 
     x->encoder_handle = xvid_enc_create.handle;
     avctx->coded_frame = &x->encoded_picture;
 
     return 0;
+fail:
+    xvid_encode_close(avctx);
+    return -1;
 }
 
 static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt,