|
|
|
@@ -260,6 +260,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) |
|
|
|
{ |
|
|
|
@@ -1687,19 +1710,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) { |
|
|
|
@@ -3007,6 +3026,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); |
|
|
|
|