| @@ -56,6 +56,8 @@ following directive is recognized: | |||||
| Path to a file to read; special characters and spaces must be escaped with | Path to a file to read; special characters and spaces must be escaped with | ||||
| backslash or single quotes. | backslash or single quotes. | ||||
| All subsequent directives apply to that file. | |||||
| @item @code{ffconcat version 1.0} | @item @code{ffconcat version 1.0} | ||||
| Identify the script type and version. It also sets the @option{safe} option | Identify the script type and version. It also sets the @option{safe} option | ||||
| to 1 if it was to its default -1. | to 1 if it was to its default -1. | ||||
| @@ -64,6 +66,11 @@ To make FFmpeg recognize the format automatically, this directive must | |||||
| appears exactly as is (no extra space or byte-order-mark) on the very first | appears exactly as is (no extra space or byte-order-mark) on the very first | ||||
| line of the script. | line of the script. | ||||
| @item @code{duration @var{dur}} | |||||
| Duration of the file. This information can be specified from the file; | |||||
| specifying it here may be more efficient or help if the information from the | |||||
| file is not available or accurate. | |||||
| @end table | @end table | ||||
| @subsection Options | @subsection Options | ||||
| @@ -20,6 +20,7 @@ | |||||
| #include "libavutil/avstring.h" | #include "libavutil/avstring.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "libavutil/parseutils.h" | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| @@ -174,6 +175,20 @@ static int concat_read_header(AVFormatContext *avf) | |||||
| } | } | ||||
| if ((ret = add_file(avf, filename, &file, &nb_files_alloc)) < 0) | if ((ret = add_file(avf, filename, &file, &nb_files_alloc)) < 0) | ||||
| FAIL(ret); | FAIL(ret); | ||||
| } else if (!strcmp(keyword, "duration")) { | |||||
| char *dur_str = get_keyword(&cursor); | |||||
| int64_t dur; | |||||
| if (!file) { | |||||
| av_log(avf, AV_LOG_ERROR, "Line %d: duration without file\n", | |||||
| line); | |||||
| FAIL(AVERROR_INVALIDDATA); | |||||
| } | |||||
| if ((ret = av_parse_time(&dur, dur_str, 1)) < 0) { | |||||
| av_log(avf, AV_LOG_ERROR, "Line %d: invalid duration '%s'\n", | |||||
| line, dur_str); | |||||
| FAIL(ret); | |||||
| } | |||||
| file->duration = dur; | |||||
| } else if (!strcmp(keyword, "ffconcat")) { | } else if (!strcmp(keyword, "ffconcat")) { | ||||
| char *ver_kw = get_keyword(&cursor); | char *ver_kw = get_keyword(&cursor); | ||||
| char *ver_val = get_keyword(&cursor); | char *ver_val = get_keyword(&cursor); | ||||