[FFmpeg-devel] [PATCH] add hls_ts_option into hlsenc

Stefano Sabatini stefasab at gmail.com
Tue Sep 16 15:05:17 CEST 2014


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 <lingjiujianke at 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.
>  
> + at 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. 



More information about the ffmpeg-devel mailing list