summaryrefslogtreecommitdiff
path: root/libavformat/hlsenc.c
diff options
context:
space:
mode:
authorSteven Liu <lingjiujianke@gmail.com>2014-09-12 18:04:52 +0800
committerStefano Sabatini <stefasab@gmail.com>2014-09-16 16:30:03 +0200
commit2c21e8b1a490dcfb8999bb44e20e59f657939acc (patch)
treec6e27e129493db35798d744b982f88ac7f4eef7f /libavformat/hlsenc.c
parent3a0c70f1e374ebb3b76cfec149dfa8d688829ee0 (diff)
lavf/hls: add hls_ts_option
Same as COMMITID 4f5493fe2380ad4aba67759baa7d7d4437f2e776. Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r--libavformat/hlsenc.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index c03737a384..6fe5bd6ce2 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -73,6 +73,8 @@ typedef struct HLSContext {
char *basename;
char *baseurl;
+ char *format_options_str;
+ AVDictionary *format_options;
AVIOContext *pb;
} HLSContext;
@@ -226,6 +228,7 @@ static int hls_write_header(AVFormatContext *s)
int ret, i;
char *p;
const char *pattern = "%d.ts";
+ AVDictionary *options = NULL;
int basename_size = strlen(s->filename) + strlen(pattern) + 1;
hls->sequence = hls->start_sequence;
@@ -235,6 +238,14 @@ static int hls_write_header(AVFormatContext *s)
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) {
+ av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n", hls->format_options_str);
+ goto fail;
+ }
+ }
+
for (i = 0; i < s->nb_streams; i++)
hls->has_video +=
s->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO;
@@ -273,11 +284,17 @@ static int hls_write_header(AVFormatContext *s)
if ((ret = hls_start(s)) < 0)
goto fail;
- if ((ret = avformat_write_header(hls->avf, NULL)) < 0)
+ av_dict_copy(&options, hls->format_options, 0);
+ ret = avformat_write_header(hls->avf, &options);
+ if (av_dict_count(options)) {
+ av_log(s, AV_LOG_ERROR, "Some of provided format options in '%s' are not recognized\n", hls->format_options_str);
+ ret = AVERROR(EINVAL);
goto fail;
-
+ }
fail:
+
+ av_dict_free(&options);
if (ret) {
av_free(hls->basename);
if (hls->avf)
@@ -375,6 +392,7 @@ static const AVOption options[] = {
{"start_number", "set first number in the sequence", OFFSET(start_sequence),AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, E},
{"hls_time", "set segment length in seconds", OFFSET(time), AV_OPT_TYPE_FLOAT, {.dbl = 2}, 0, FLT_MAX, E},
{"hls_list_size", "set maximum number of playlist entries", OFFSET(max_nb_segments), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E},
+ {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"hls_wrap", "set number after which the index wraps", OFFSET(wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 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_flags", "set flags affecting HLS playlist and media file generation", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX, E, "flags"},