[FFmpeg-devel] [PATCH] Adding mkdir option for img2enc (4th attempt)
Dr. Alan Barclay
alan at escribe.co.uk
Sun Feb 4 14:51:59 EET 2018
On 17/01/2018 11:15, Carl Eugen Hoyos wrote:
> 2018-01-17 11:56 GMT+01:00 Dr. Alan Barclay <alan at escribe.co.uk>:
>
>> Attached in a further patch - adding the error checks.
>
> Please merge this patch into your previous patch.
Both patches updated.
Alan.
> And please avoid top-posting here, Carl Eugen
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
--
Dr. Alan Barclay
Electric Scribe Ltd.
118 Stanley Street
Aberdeen AB10 6UQ, U.K.
+44 1224 591779 office
+44 7803 606485 mobile
alan at escribe.co.uk
-------------- next part --------------
From 79d3ef8419e806abbc6c55fc563d04a6879feb15 Mon Sep 17 00:00:00 2001
From: "Dr. Alan Barclay" <alan at escribe.co.uk>
Date: Sun, 4 Feb 2018 12:07:55 +0000
Subject: [PATCH 1/2] Move mkdir_p(), renamed ff_mkdir_p(), from hlsenc.c to
utils.c.
---
libavformat/hlsenc.c | 37 ++-----------------------------------
libavformat/internal.h | 7 +++++++
libavformat/utils.c | 33 +++++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 35 deletions(-)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index cc13c94e97..a51248ec02 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -225,39 +225,6 @@ typedef struct HLSContext {
AVIOContext *sub_m3u8_out;
} HLSContext;
-static int mkdir_p(const char *path) {
- int ret = 0;
- char *temp = av_strdup(path);
- char *pos = temp;
- char tmp_ch = '\0';
-
- if (!path || !temp) {
- return -1;
- }
-
- if (!strncmp(temp, "/", 1) || !strncmp(temp, "\\", 1)) {
- pos++;
- } else if (!strncmp(temp, "./", 2) || !strncmp(temp, ".\\", 2)) {
- pos += 2;
- }
-
- for ( ; *pos != '\0'; ++pos) {
- if (*pos == '/' || *pos == '\\') {
- tmp_ch = *pos;
- *pos = '\0';
- ret = mkdir(temp, 0755);
- *pos = tmp_ch;
- }
- }
-
- if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
- ret = mkdir(temp, 0755);
- }
-
- av_free(temp);
- return ret;
-}
-
static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename,
AVDictionary **options) {
HLSContext *hls = s->priv_data;
@@ -1504,7 +1471,7 @@ static int hls_start(AVFormatContext *s, VariantStream *vs)
return AVERROR(ENOMEM);
}
dir = av_dirname(fn_copy);
- if (mkdir_p(dir) == -1 && errno != EEXIST) {
+ if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
av_log(oc, AV_LOG_ERROR, "Could not create directory %s with use_localtime_mkdir\n", dir);
av_free(fn_copy);
return AVERROR(errno);
@@ -1730,7 +1697,7 @@ static int format_name(char *buf, int buf_len, int index)
}
dir = av_dirname(mod_buf_dup);
- if (mkdir_p(dir) == -1 && errno != EEXIST) {
+ if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
ret = AVERROR(errno);
goto fail;
}
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 1e2a3e05a1..2e8fa85d08 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -703,4 +703,11 @@ int ff_unlock_avformat(void);
*/
void ff_format_set_url(AVFormatContext *s, char *url);
+/**
+ * Make the specified directory.
+ *
+ * @param path path for directory
+ */
+int ff_mkdir_p(const char *path);
+
#endif /* AVFORMAT_INTERNAL_H */
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 28ea071409..11bacdf1b4 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -5658,3 +5658,36 @@ FF_DISABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
#endif
}
+
+int ff_mkdir_p(const char *path) {
+ int ret = 0;
+ char *temp = av_strdup(path);
+ char *pos = temp;
+ char tmp_ch = '\0';
+
+ if (!path || !temp) {
+ return -1;
+ }
+
+ if (!strncmp(temp, "/", 1) || !strncmp(temp, "\\", 1)) {
+ pos++;
+ } else if (!strncmp(temp, "./", 2) || !strncmp(temp, ".\\", 2)) {
+ pos += 2;
+ }
+
+ for ( ; *pos != '\0'; ++pos) {
+ if (*pos == '/' || *pos == '\\') {
+ tmp_ch = *pos;
+ *pos = '\0';
+ ret = mkdir(temp, 0755);
+ *pos = tmp_ch;
+ }
+ }
+
+ if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
+ ret = mkdir(temp, 0755);
+ }
+
+ av_free(temp);
+ return ret;
+}
--
2.11.0
-------------- next part --------------
From 0b35e014cf36499f0b4b5e064b7f0ce71287649a Mon Sep 17 00:00:00 2001
From: "Dr. Alan Barclay" <alan at escribe.co.uk>
Date: Sun, 4 Feb 2018 12:21:51 +0000
Subject: [PATCH 2/2] Adding mkdir option for img2enc.
---
libavformat/img2enc.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
index a09cc8ec50..8f3fd98018 100644
--- a/libavformat/img2enc.c
+++ b/libavformat/img2enc.c
@@ -42,6 +42,7 @@ typedef struct VideoMuxData {
char target[4][1024];
int update;
int use_strftime;
+ int use_mkdir;
int frame_pts;
const char *muxer;
int use_rename;
@@ -114,6 +115,20 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
img->img_number, img->path);
return AVERROR(EINVAL);
}
+ if (img->use_mkdir) {
+ const char *temp_path;
+ char *temp_filename = av_strdup(filename);
+ if (!temp_filename) {
+ return AVERROR(ENOMEM);
+ }
+ temp_path = av_dirname(temp_filename);
+ if (ff_mkdir_p(temp_path) == -1 && errno != EEXIST) {
+ av_log(s, AV_LOG_ERROR, "Could not create directory %s\n", temp_path);
+ av_free(temp_filename);
+ return AVERROR(errno);
+ }
+ av_free(temp_filename);
+ }
for (i = 0; i < 4; i++) {
snprintf(img->tmp[i], sizeof(img->tmp[i]), "%s.tmp", filename);
av_strlcpy(img->target[i], filename, sizeof(img->target[i]));
@@ -212,6 +227,7 @@ static const AVOption muxoptions[] = {
{ "update", "continuously overwrite one file", OFFSET(update), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
{ "start_number", "set first number in the sequence", OFFSET(img_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
{ "strftime", "use strftime for filename", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
+ { "mkdir", "make sub-dirs as required", OFFSET(use_mkdir), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
{ "frame_pts", "use current frame pts for filename", OFFSET(frame_pts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
{ "atomic_writing", "write files atomically (using temporary files and renames)", OFFSET(use_rename), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
{ NULL },
--
2.11.0
More information about the ffmpeg-devel
mailing list