On date Thursday 2014-09-11 19:52:07 +0800, Steven Liu encoded: > > Signed-off-by: Steven Liu <qi....@chinacache.com>
> Signed-off-by: Stefano Sabatini <stefa...@gmail.com> Probably you should remove this, and mention the equivalent commit in my patch (referencing the hash is fine). > --- > doc/muxers.texi | 5 +++++ > libavformat/hlsenc.c | 24 ++++++++++++++++++++++-- > 2 files changed, 27 insertions(+), 2 deletions(-) > > 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..c993d44 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,13 +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) > - goto fail; > + 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); > + } > + av_dict_free(&options); > > + if (ret < 0) { > + goto fail; > + } I think this is more correct: 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); otherwise it won't fail in case you have unprocessed options (e.g. in case of typos), and the user will probably not notice that and get an unexpected result. [...] Should be good otherwise. -- FFmpeg = Fast and Friendly Mind-dumbing Powered Elastic Guru _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel