On 26 September 2018 at 00:18, Steven Liu <l...@chinaffmpeg.org> wrote:

>
>
> > On Sep 26, 2018, at 06:49, James Courtier-Dutton <james.dut...@gmail.com>
> wrote:
> > On 25 September 2018 at 23:24, Steven Liu <l...@chinaffmpeg.org> wrote:
> yes, the error message is confusing, maybe change it here is better.
> >
> > +            av_log(oc, AV_LOG_ERROR, "Could not create directory %s\n",
> dir);
> >
>
>
Attached patch has the changed error message.
From 8d8ea7d1f87a77ee23b6681a714da378b5361e4d Mon Sep 17 00:00:00 2001
From: James Courtier-Dutton <james.dut...@gmail.com>
Date: Wed, 26 Sep 2018 10:05:13 +0100
Subject: [PATCH] avformat/segment: strftime date sub-directories

Automatically create sub-directories if needed based on date.
E.g.
ffmpeg ... -timelimit 2147483647 -f segment -strftime 1 -segment_time 10 "%Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv"

Signed-off-by: James Courtier-Dutton <james.dut...@gmail.com>
---
 libavformat/segment.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/libavformat/segment.c b/libavformat/segment.c
index 7fb4dc7..0e17380 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -200,12 +200,27 @@ static int set_segment_filename(AVFormatContext *s)
     if (seg->use_strftime) {
         time_t now0;
         struct tm *tm, tmpbuf;
+        const char *dir;
+        char *fn_copy;
         time(&now0);
         tm = localtime_r(&now0, &tmpbuf);
         if (!strftime(buf, sizeof(buf), s->url, tm)) {
             av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n");
             return AVERROR(EINVAL);
         }
+        /* Automatically create directories if needed */
+        /* E.g. %Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv */
+        fn_copy = av_strdup(buf);
+        if (!fn_copy) {
+            return AVERROR(ENOMEM);
+        }
+        dir = av_dirname(fn_copy);
+        if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
+            av_log(oc, AV_LOG_ERROR, "Could not create directory %s\n", dir);
+            av_free(fn_copy);
+            return AVERROR(errno);
+        }
+        av_free(fn_copy);
     } else if (av_get_frame_filename(buf, sizeof(buf),
                                      s->url, seg->segment_idx) < 0) {
         av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->url);
-- 
2.7.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to