Merge commit '22f4d9c303ede1a240538fd105c97047db40dc86'
authorHendrik Leppkes <h.leppkes@gmail.com>
Tue, 27 Oct 2015 11:50:56 +0000 (12:50 +0100)
committerHendrik Leppkes <h.leppkes@gmail.com>
Tue, 27 Oct 2015 11:50:56 +0000 (12:50 +0100)
* commit '22f4d9c303ede1a240538fd105c97047db40dc86':
  img2enc: Make sure the images are atomically written

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavformat/img2enc.c

@@@ -36,20 -32,17 +36,22 @@@ typedef struct VideoMuxData 
      const AVClass *class;  /**< Class for private options. */
      int img_number;
      int is_pipe;
 +    int split_planes;       /**< use independent file for each Y, U, V plane */
      char path[1024];
+     char tmp[1024];
      int update;
 +    int use_strftime;
 +    const char *muxer;
  } VideoMuxData;
  
  static int write_header(AVFormatContext *s)
  {
      VideoMuxData *img = s->priv_data;
 +    AVStream *st = s->streams[0];
 +    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(st->codec->pix_fmt);
  
      av_strlcpy(img->path, s->filename, sizeof(img->path));
+     snprintf(img->tmp, sizeof(img->tmp), "%s.tmp", s->filename);
  
      /* find format */
      if (s->oformat->flags & AVFMT_NOFILE)
@@@ -95,14 -67,14 +97,14 @@@ static int write_packet(AVFormatContex
          } else if (av_get_frame_filename(filename, sizeof(filename), img->path, img->img_number) < 0 &&
                     img->img_number > 1) {
              av_log(s, AV_LOG_ERROR,
 -                   "Could not get frame filename number %d from pattern '%s'\n",
 +                   "Could not get frame filename number %d from pattern '%s' (either set updatefirst or use a pattern like %%03d within the filename pattern)\n",
                     img->img_number, img->path);
 -            return AVERROR(EIO);
 +            return AVERROR(EINVAL);
          }
 -        for (i = 0; i < 3; i++) {
 +        for (i = 0; i < 4; i++) {
-             if (avio_open2(&pb[i], filename, AVIO_FLAG_WRITE,
+             if (avio_open2(&pb[i], img->tmp, AVIO_FLAG_WRITE,
                             &s->interrupt_callback, NULL) < 0) {
-                 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", filename);
+                 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", img->tmp);
                  return AVERROR(EIO);
              }
  
      }
      avio_flush(pb[0]);
      if (!img->is_pipe) {
 -        avio_close(pb[0]);
 -        ff_rename(img->tmp, filename);
 +        avio_closep(&pb[0]);
++        ff_rename(img->tmp, filename, s);
      }
  
      img->img_number++;