summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
diff options
context:
space:
mode:
authorChristian Suloway <csuloway@row44.com>2014-12-05 21:20:15 +0000
committerMichael Niedermayer <michaelni@gmx.at>2014-12-06 02:28:23 +0100
commit1c639fa6e02ed122dc41c318acb875f8d76537c5 (patch)
tree64ed755930c2e99d7df802f0cb4e613af9afa711 /libavformat/hlsenc.c
parentce800d4695b71f707db93bf97db02dd2b6ff0243 (diff)
avformat/hlsenc: added segment filename option
This option allows segment filenames to be specified. Unless -hls_flags single_file is set the filename is used as a string format with the segment number. Example: ffmpeg -f lavfi -i testsrc -c:v h264 -map 0 -hls_segment_filename bar%03d.ts foo.m3u8 Signed-off-by: Christian Suloway <csuloway@globaleagleent.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r--libavformat/hlsenc.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index e13f438a2f..d5ea990476 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -59,6 +59,7 @@ typedef struct HLSContext {
int max_nb_segments; // Set by a private option.
int wrap; // Set by a private option.
uint32_t flags; // enum HLSFlags
+ char *segment_filename;
int allowcache;
int64_t recording_time;
@@ -237,15 +238,12 @@ static int hls_write_header(AVFormatContext *s)
char *p;
const char *pattern = "%d.ts";
AVDictionary *options = NULL;
- int basename_size = strlen(s->filename) + strlen(pattern) + 1;
+ int basename_size;
hls->sequence = hls->start_sequence;
hls->recording_time = hls->time * AV_TIME_BASE;
hls->start_pts = AV_NOPTS_VALUE;
- if (hls->flags & HLS_SINGLE_FILE)
- pattern = ".ts";
-
if (hls->format_options_str) {
ret = av_dict_parse_string(&hls->format_options, hls->format_options_str, "=", ":", 0);
if (ret < 0) {
@@ -270,21 +268,30 @@ static int hls_write_header(AVFormatContext *s)
goto fail;
}
- hls->basename = av_malloc(basename_size);
-
- if (!hls->basename) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- strcpy(hls->basename, s->filename);
+ if (hls->segment_filename) {
+ hls->basename = av_strdup(hls->segment_filename);
+ if (!hls->basename) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ } else {
+ if (hls->flags & HLS_SINGLE_FILE)
+ pattern = ".ts";
- p = strrchr(hls->basename, '.');
+ basename_size = strlen(s->filename) + strlen(pattern) + 1;
+ hls->basename = av_malloc(basename_size);
+ if (!hls->basename) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
- if (p)
- *p = '\0';
+ av_strlcpy(hls->basename, s->filename, basename_size);
- av_strlcat(hls->basename, pattern, basename_size);
+ p = strrchr(hls->basename, '.');
+ if (p)
+ *p = '\0';
+ av_strlcat(hls->basename, pattern, basename_size);
+ }
if ((ret = hls_mux_init(s)) < 0)
goto fail;
@@ -410,6 +417,7 @@ static const AVOption options[] = {
{"hls_wrap", "set number after which the index wraps", OFFSET(wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E},
{"hls_allow_cache", "explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments", OFFSET(allowcache), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, E},
{"hls_base_url", "url to prepend to each playlist entry", OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
+ {"hls_segment_filename", "filename template for segment files", OFFSET(segment_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"hls_flags", "set flags affecting HLS playlist and media file generation", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX, E, "flags"},
{"single_file", "generate a single media file indexed with byte ranges", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SINGLE_FILE }, 0, UINT_MAX, E, "flags"},