lavf/hls: add hls_ts_option
authorSteven Liu <lingjiujianke@gmail.com>
Fri, 12 Sep 2014 10:04:52 +0000 (18:04 +0800)
committerStefano Sabatini <stefasab@gmail.com>
Tue, 16 Sep 2014 14:30:03 +0000 (16:30 +0200)
Same as COMMITID 4f5493fe2380ad4aba67759baa7d7d4437f2e776.

Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
doc/muxers.texi
libavformat/hlsenc.c
libavformat/version.h

index 40ae857040df4270af92758c0f1011e2024857d8..5f8d75f3f192353fda997a6d6b3f901872584697 100644 (file)
@@ -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
index c03737a3848769b019127f95d444e24848aea3fb..6fe5bd6ce2ac8cbb0dd0aa2e1a796482813d1c93 100644 (file)
@@ -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"},
index f5808eb6e058672c383bb26f66d8fa0964f47827..a8696026819e69a56665bd02297eb6dd0eee5968 100644 (file)
@@ -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, \