From 22f4d9c303ede1a240538fd105c97047db40dc86 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Tue, 20 Oct 2015 19:49:13 +0200 Subject: img2enc: Make sure the images are atomically written Users that want to generate a live-preview and serve it would otherwise get partial images. --- libavformat/img2enc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'libavformat/img2enc.c') diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c index eeb19c0e25..d5b664658f 100644 --- a/libavformat/img2enc.c +++ b/libavformat/img2enc.c @@ -33,6 +33,7 @@ typedef struct VideoMuxData { int img_number; int is_pipe; char path[1024]; + char tmp[1024]; int update; } VideoMuxData; @@ -41,6 +42,7 @@ static int write_header(AVFormatContext *s) VideoMuxData *img = s->priv_data; 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) @@ -70,9 +72,9 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR(EIO); } for (i = 0; i < 3; 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); } @@ -121,6 +123,7 @@ error: avio_flush(pb[0]); if (!img->is_pipe) { avio_close(pb[0]); + ff_rename(img->tmp, filename); } img->img_number++; -- cgit v1.2.3