diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2014-09-06 15:43:11 +0200 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2014-09-07 13:17:46 +0200 |
commit | 4f5493fe2380ad4aba67759baa7d7d4437f2e776 (patch) | |
tree | 0d85d88df25cdbb9581f8887dd54c3a54d01e0b2 /libavformat | |
parent | 2c5c37ade115b5efa3f77ce11bc2c4e46b384959 (diff) | |
download | ffmpeg-4f5493fe2380ad4aba67759baa7d7d4437f2e776.tar.gz |
lavf/segment: add segment_format_options option
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/segment.c | 25 | ||||
-rw-r--r-- | libavformat/version.h | 2 |
2 files changed, 24 insertions, 3 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index 3ee7d7d206..00e5881d5a 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -72,7 +72,9 @@ typedef struct { int segment_count; ///< number of segment files already written AVOutputFormat *oformat; AVFormatContext *avf; - char *format; ///< format to use for output segment files + char *format; ///< format to use for output segment files + char *format_options_str; ///< format options to use for output segment files + AVDictionary *format_options; char *list; ///< filename for the segment list file int list_flags; ///< flags affecting list generation int list_size; ///< number of entries for the segment list file @@ -563,6 +565,7 @@ static int seg_write_header(AVFormatContext *s) { SegmentContext *seg = s->priv_data; AVFormatContext *oc = NULL; + AVDictionary *options = NULL; int ret; seg->segment_count = 0; @@ -594,6 +597,15 @@ static int seg_write_header(AVFormatContext *s) } } + if (seg->format_options_str) { + ret = av_dict_parse_string(&seg->format_options, seg->format_options_str, "=", ":", 0); + if (ret < 0) { + av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n", + seg->format_options_str); + goto fail; + } + } + if (seg->list) { if (seg->list_type == LIST_TYPE_UNDEFINED) { if (av_match_ext(seg->list, "csv" )) seg->list_type = LIST_TYPE_CSV; @@ -645,7 +657,14 @@ static int seg_write_header(AVFormatContext *s) goto fail; } - if ((ret = avformat_write_header(oc, NULL)) < 0) { + av_dict_copy(&options, seg->format_options, 0); + ret = avformat_write_header(oc, &options); + if (av_dict_count(options)) { + av_log(s, AV_LOG_ERROR, + "Some of the provided format options in '%s' are not recognized\n", seg->format_options_str); + } + av_dict_free(&options); + if (ret < 0) { avio_close(oc->pb); goto fail; } @@ -799,6 +818,7 @@ fail: if (seg->list) avio_close(seg->list_pb); + av_dict_free(&seg->format_options); av_opt_free(seg); av_freep(&seg->times); av_freep(&seg->frames); @@ -820,6 +840,7 @@ fail: static const AVOption options[] = { { "reference_stream", "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, CHAR_MIN, CHAR_MAX, E }, { "segment_format", "set container format used for the segments", OFFSET(format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, + { "segment_format_options", "set list of options for the container format used for the segments", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_list", "set the segment list filename", OFFSET(list), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_list_flags","set flags affecting segment list generation", OFFSET(list_flags), AV_OPT_TYPE_FLAGS, {.i64 = SEGMENT_LIST_FLAG_CACHE }, 0, UINT_MAX, E, "list_flags"}, diff --git a/libavformat/version.h b/libavformat/version.h index 44810a2272..da1c5b968d 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 56 #define LIBAVFORMAT_VERSION_MINOR 4 -#define LIBAVFORMAT_VERSION_MICRO 100 +#define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ |