Message ID | CAAMvbhFbaW2Nv81hd4TeJ=OwchczZvJ_ydNqKO7eo2u2xuHROg@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] libavformat/segment: strftime date sub-directories | expand |
Context | Check | Description |
---|---|---|
andriy/configurex86 | warning | Failed to apply patch |
andriy/configureppc | warning | Failed to apply patch |
Hi, This is a follow on from: https://patchwork.ffmpeg.org/project/ffmpeg/patch/CAAMvbhG9QsKSXfUzrt3REsRR89J5scYd84ec6OLEARqx4CUD-A@mail.gmail.com/ On Tue, 21 Dec 2021 at 21:39, James Dutton <james.dutton@gmail.com> wrote: > > 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.dutton@gmail.com> > --- > libavformat/segment.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/libavformat/segment.c b/libavformat/segment.c > index e9b0aa4fa8..86ca243ae6 100644 > --- a/libavformat/segment.c > +++ b/libavformat/segment.c > @@ -198,12 +198,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 > with use_localtime_mkdir\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.25.1
diff --git a/libavformat/segment.c b/libavformat/segment.c index e9b0aa4fa8..86ca243ae6 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -198,12 +198,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 with use_localtime_mkdir\n", dir); + av_free(fn_copy); + return AVERROR(errno); + } + av_free(fn_copy); } else if (av_get_frame_filename(buf, sizeof(buf),
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.dutton@gmail.com> --- libavformat/segment.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) s->url, seg->segment_idx) < 0) { av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->url);