[FFmpeg-devel] [PATCH] add hls_ts_option into hlsenc
Steven Liu
lingjiujianke at gmail.com
Fri Sep 12 04:48:44 CEST 2014
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..5a4ec2b 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,23 @@ 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:
if (ret) {
+ av_dict_free(&options);
av_free(hls->basename);
+ av_opt_free(&hls->format_options);
if (hls->avf)
avformat_free_context(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)
More information about the ffmpeg-devel
mailing list