diff options
author | Pedro E. M. Brito <pedroembrito@gmail.com> | 2014-12-28 05:35:34 -0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-12-28 21:48:44 +0100 |
commit | 202947a0665ea523022afb0a6c50eed96bcd6b69 (patch) | |
tree | dfa83a970318a43357fb5330304d2ad3c3c26fbe /libavformat/segment.c | |
parent | 6a6a0620e2f8cf051131ac1cadbb0c43f1db8b03 (diff) | |
download | ffmpeg-202947a0665ea523022afb0a6c50eed96bcd6b69.tar.gz |
libavformat/segment.c: Add strftime expansion for segment filename templates
Allows expansion of the filename template with strftime() with the option
-strftime 1 (disabled by default). This allows segments to be named by time of
creation, adding some flexibility.
Fixes Ticket 4104 (add strftime to segment muxer)
Signed-off-by: Pedro E. M. Brito <pedroembrito@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r-- | libavformat/segment.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index 56ffcdcd7c..97a0db21d4 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -90,6 +90,7 @@ typedef struct { AVIOContext *list_pb; ///< list file put-byte context char *time_str; ///< segment duration specification string int64_t time; ///< segment duration + int use_strftime; ///< flag to expand filename with strftime char *times_str; ///< segment times specification string int64_t *times; ///< list of segment interval specification @@ -179,8 +180,17 @@ static int set_segment_filename(AVFormatContext *s) if (seg->segment_idx_wrap) seg->segment_idx %= seg->segment_idx_wrap; - if (av_get_frame_filename(oc->filename, sizeof(oc->filename), - s->filename, seg->segment_idx) < 0) { + if (seg->use_strftime) { + time_t now0; + struct tm *tm, tmpbuf; + time(&now0); + tm = localtime_r(&now0, &tmpbuf); + if (!strftime(oc->filename, sizeof(oc->filename), s->filename, tm)) { + av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n"); + return AVERROR(EINVAL); + } + } else if (av_get_frame_filename(oc->filename, sizeof(oc->filename), + s->filename, seg->segment_idx) < 0) { av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->filename); return AVERROR(EINVAL); } @@ -876,6 +886,7 @@ static const AVOption options[] = { { "segment_list_entry_prefix", "set base url prefix for segments", OFFSET(entry_prefix), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_start_number", "set the sequence number of the first segment", OFFSET(segment_idx), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, { "segment_wrap_number", "set the number of wrap before the first segment", OFFSET(segment_idx_wrap_nb), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, + { "strftime", "set filename expansion with strftime at segment creation", OFFSET(use_strftime), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, E }, { "individual_header_trailer", "write header/trailer to each segment", OFFSET(individual_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, { "write_header_trailer", "write a header to the first segment and a trailer to the last one", OFFSET(write_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, |