In data Friday 2014-09-12 18:07:01 +0800, Steven Liu ha scritto: > I have refine the patch as Stefano's suggestion:-) [...]
> From 85e2e8afff26b8aa7f45ad463b3142919bb431a8 Mon Sep 17 00:00:00 2001 > From: Steven Liu <lingjiujia...@gmail.com> > Date: Fri, 12 Sep 2014 18:04:52 +0800 > Subject: [PATCH] add hls_ts_option into hlsenc > > same as COMMITID 4f5493fe2380ad4aba67759baa7d7d4437f2e776 > --- > doc/muxers.texi | 5 +++++ > libavformat/hlsenc.c | 24 +++++++++++++++++++++++- > 2 files changed, 28 insertions(+), 1 deletion(-) > > diff --git a/doc/muxers.texi b/doc/muxers.texi > index 57e81f4..cc62705dc 100644 > --- a/doc/muxers.texi > +++ b/doc/muxers.texi > @@ -220,6 +220,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 11f1e5b..72ed45a 100644 > --- a/libavformat/hlsenc.c > +++ b/libavformat/hlsenc.c > @@ -63,6 +63,8 @@ typedef struct HLSContext { > > char *basename; > char *baseurl; > + char *format_options_str; > + AVDictionary *format_options; > > AVIOContext *pb; > } HLSContext; > @@ -204,12 +206,21 @@ 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; > hls->recording_time = hls->time * AV_TIME_BASE; > hls->start_pts = AV_NOPTS_VALUE; > > + 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; > @@ -248,11 +259,21 @@ 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; > + } > > + if (ret < 0) { > + goto fail; > + } > > fail: > + > + av_dict_free(&options); > if (ret) { > av_free(hls->basename); > if (hls->avf) > @@ -338,6 +359,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}, > { NULL }, > -- > 1.8.5.2 (Apple Git-48) LGTM, I'm going to push it soon. Thanks. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel