OSDN Git Service

libxvid: remove temporary files at the end
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 2 Mar 2013 19:22:08 +0000 (20:22 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 2 Mar 2013 19:30:28 +0000 (20:30 +0100)
Fixes Ticket924

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/libxvid.c

index dae8ac8..1528e14 100644 (file)
@@ -60,6 +60,7 @@ struct xvid_context {
     char *twopassbuffer;           /**< Character buffer for two-pass */
     char *old_twopassbuffer;       /**< Old character buffer (two-pass) */
     char *twopassfile;             /**< second pass temp file name */
+    int twopassfd;
     unsigned char *intra_matrix;   /**< P-Frame Quant Matrix */
     unsigned char *inter_matrix;   /**< I-Frame Quant Matrix */
 };
@@ -356,6 +357,8 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
     xvid_enc_create_t xvid_enc_create = { 0 };
     xvid_enc_plugin_t plugins[7];
 
+    x->twopassfd = -1;
+
     /* Bring in VOP flags from ffmpeg command-line */
     x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */
     if( xvid_flags & CODEC_FLAG_4MV )
@@ -491,6 +494,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
                 "Xvid: Cannot write 2-pass pipe\n");
             return -1;
         }
+        x->twopassfd = fd;
 
         if( avctx->stats_in == NULL ) {
             av_log(avctx, AV_LOG_ERROR,
@@ -500,13 +504,11 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)  {
 
         if( strlen(avctx->stats_in) >
               write(fd, avctx->stats_in, strlen(avctx->stats_in)) ) {
-            close(fd);
             av_log(avctx, AV_LOG_ERROR,
                 "Xvid: Cannot write to 2-pass pipe\n");
             return -1;
         }
 
-        close(fd);
         rc2pass2.filename = x->twopassfile;
         plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2;
         plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
@@ -741,6 +743,11 @@ static av_cold int xvid_encode_close(AVCodecContext *avctx) {
         av_free(x->old_twopassbuffer);
         avctx->stats_out = NULL;
     }
+    if (x->twopassfd>=0) {
+        unlink(x->twopassfile);
+        close(x->twopassfd);
+        x->twopassfd = -1;
+    }
     av_free(x->twopassfile);
     av_free(x->intra_matrix);
     av_free(x->inter_matrix);