From 2c21e8b1a490dcfb8999bb44e20e59f657939acc Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 12 Sep 2014 18:04:52 +0800 Subject: [PATCH] lavf/hls: add hls_ts_option Same as COMMITID 4f5493fe2380ad4aba67759baa7d7d4437f2e776. Signed-off-by: Stefano Sabatini --- doc/muxers.texi | 5 +++++ libavformat/hlsenc.c | 22 ++++++++++++++++++++-- libavformat/version.h | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 40ae857040..5f8d75f3f1 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -224,6 +224,11 @@ Set the segment length in seconds. Default value is 2. Set the maximum number of playlist entries. If set to 0 the list file will contain all the segments. Default value is 5. +@item hls_ts_options @var{options_list} +Set output format options using a :-separated list of key=value +parameters. Values containing @code{:} special characters must be +escaped. + @item hls_wrap @var{wrap} Set the number after which the segment filename number (the number specified in each segment file) wraps. If set to 0 the number will be 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"}, diff --git a/libavformat/version.h b/libavformat/version.h index f5808eb6e0..a869602681 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 56 #define LIBAVFORMAT_VERSION_MINOR 4 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MICRO 102 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \