Nikola Pajkovsky <nik...@pajkovsky.cz> writes: > Nikola Pajkovsky <nik...@pajkovsky.cz> writes: > >> Nikola Pajkovsky <nik...@pajkovsky.cz> writes: >> >> Ping? > > Ping. Steven, Andreas, can you look at the the latest iteration of the > path?
Hey, is there any problem with the patch? >>> init.mp4 can be expanded with strftime() the same way as >>> hls_segment_filename. >>> >>> Signed-off-by: Nikola Pajkovsky <nik...@pajkovsky.cz> >>> --- >>> v2: fix memleak on strftime failure >>> v3: use av_free() insted of free() >>> >>> doc/muxers.texi | 7 ++++++ >>> libavformat/hlsenc.c | 54 +++++++++++++++++++++++++++++++++++--------- >>> 2 files changed, 50 insertions(+), 11 deletions(-) >>> >>> diff --git a/doc/muxers.texi b/doc/muxers.texi >>> index 813b4678f409..179b9239517b 100644 >>> --- a/doc/muxers.texi >>> +++ b/doc/muxers.texi >>> @@ -859,6 +859,13 @@ fmp4 files may be used in HLS version 7 and above. >>> @item hls_fmp4_init_filename @var{filename} >>> Set filename to the fragment files header file, default filename is >>> @file{init.mp4}. >>> >>> +Use @code{-strftime 1} on @var{filename} to expand the segment filename >>> with localtime. >>> +@example >>> +ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 >>> -hls_fmp4_init_filename "%s_init.mp4" out.m3u8 >>> +@end example >>> +This will produce init like this >>> +@file{1602678741_init.mp4} >>> + >>> @item hls_fmp4_init_resend >>> Resend init file after m3u8 file refresh every time, default is @var{0}. >>> >>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c >>> index cbfd8f7c0d41..3457ed5201bf 100644 >>> --- a/libavformat/hlsenc.c >>> +++ b/libavformat/hlsenc.c >>> @@ -259,6 +259,29 @@ typedef struct HLSContext { >>> int has_video_m3u8; /* has video stream m3u8 list */ >>> } HLSContext; >>> >>> +static int strftime_expand(const char *fmt, char **dest) >>> +{ >>> + int r = 1; >>> + time_t now0; >>> + struct tm *tm, tmpbuf; >>> + char *buf; >>> + >>> + buf = av_mallocz(MAX_URL_SIZE); >>> + if (!buf) >>> + return AVERROR(ENOMEM); >>> + >>> + time(&now0); >>> + tm = localtime_r(&now0, &tmpbuf); >>> + r = strftime(buf, MAX_URL_SIZE, fmt, tm); >>> + if (!r) { >>> + av_free(buf); >>> + return AVERROR(EINVAL); >>> + } >>> + *dest = buf; >>> + >>> + return r; >>> +} >>> + >>> static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char >>> *filename, >>> AVDictionary **options) >>> { >>> @@ -1660,19 +1683,15 @@ static int hls_start(AVFormatContext *s, >>> VariantStream *vs) >>> ff_format_set_url(oc, filename); >>> } else { >>> if (c->use_localtime) { >>> - time_t now0; >>> - struct tm *tm, tmpbuf; >>> - int bufsize = strlen(vs->basename) + MAX_URL_SIZE; >>> - char *buf = av_mallocz(bufsize); >>> - if (!buf) >>> - return AVERROR(ENOMEM); >>> - time(&now0); >>> - tm = localtime_r(&now0, &tmpbuf); >>> - ff_format_set_url(oc, buf); >>> - if (!strftime(oc->url, bufsize, vs->basename, tm)) { >>> + int r; >>> + char *expanded = NULL; >>> + >>> + r = strftime_expand(vs->basename, &expanded); >>> + if (r < 0) { >>> av_log(oc, AV_LOG_ERROR, "Could not get segment filename >>> with strftime\n"); >>> - return AVERROR(EINVAL); >>> + return r; >>> } >>> + ff_format_set_url(oc, expanded); >>> >>> err = sls_flag_use_localtime_filename(oc, c, vs); >>> if (err < 0) { >>> @@ -2980,6 +2999,19 @@ static int hls_init(AVFormatContext *s) >>> return ret; >>> } >>> >>> + if (hls->use_localtime) { >>> + int r; >>> + char *expanded = NULL; >>> + >>> + r = strftime_expand(vs->fmp4_init_filename, &expanded); >>> + if (r < 0) { >>> + av_log(s, AV_LOG_ERROR, "Could not get segment >>> filename with strftime\n"); >>> + return r; >>> + } >>> + av_free(vs->fmp4_init_filename); >>> + vs->fmp4_init_filename = expanded; >>> + } >>> + >>> p = strrchr(vs->m3u8_name, '/'); >>> if (p) { >>> char tmp = *(++p); -- Nikola _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".