summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
diff options
context:
space:
mode:
authorNikola Pajkovsky <nikola@pajkovsky.cz>2020-10-27 12:28:59 +0100
committerliuqi05 <liuqi05@kuaishou.com>2020-12-08 21:02:23 +0800
commit3ffed80ebadbd8c10167fd6297d0c2d4797ec6f7 (patch)
tree20cb6747b58640b56a837d4de4d650dc27b93878 /libavformat/hlsenc.c
parent45a673ebee2e603a87c0ecb259c0027c14321018 (diff)
hlsenc: expand hls_fmp4_init_filename with strftime()
the init.mp4 can be expanded with strftime the same way as hls_segment_filename. Signed-off-by: Nikola Pajkovsky <nikola@pajkovsky.cz> Signed-off-by: liuqi05 <liuqi05@kuaishou.com>
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r--libavformat/hlsenc.c54
1 files changed, 43 insertions, 11 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 9bce374605..cafe0e8c69 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -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);